写篇文章让自己记住计网——(4)http报文

110 阅读6分钟

http报文的知识可以说是承前启后关键点,包含了http请求类型以及http版本等基础知识。较为复杂-分为上下两部分 如果基础比较薄弱,建议简单了解一下本系列的前几篇文章再这篇文章

http报文

http报文,即网络中两个终端(电脑)之间遵守http协议进行数据交互的信息

通用报文结构

下面说到的请求,也可以换成响应

--报文组成

  • 报文具体是多行字符串
  • 报文组成:请求行、请求头部、空行、请求包体
  • 起始行头部字段并成为 请求头 或者 响应头,统称为 Header
  • 头部字段的结构是常见键值对形式
  • 空行的通常是作为结尾的标志,所以get请求没有实体但是还是需要空行。
  • 请求包体也叫做实体消息正文body
  • 发送http报文时可以没有body,但是必须要有header,而他们之间的空行是必须的 image.png --该图片引用自www.jianshu.com/p/291e36358… ,仅用于学习,侵权必删--
  • 每个报文的起始行都是由三个字段组成:方法、URL路由和 HTTP 版本字段。url就是浏览器中地址栏内的字符串(发起请求时url参数:http+ip地址+端口号+路由?参数)。
    GET /index.html HTTP/1.1

我们可以测试,使用xhr发送一个http请求,打开开发者管理工具,进入network选项面板,然后可以看到我们的请求信息,方法method、url字段和http版本字段(Protocol)。(如果没有对应列,可以右键Header Options选择要显示的信息)

image.png

  • 请求头部组成复杂,选择常用的组成进行讲解是最好的,未讲解到的部分遇到可以自行查询。

--头部字段

我们将上面图片中的http请求选中,右侧会出现详细信息:

image.png

1. Host 主机名

请求的主机名,通常和url中的主机名一致。

2. Content-type 请求实体的数据类型标识

告诉请求的接收方请求的body如何解析。(详细请看 写篇文章之计网——(6)HTTP Content-type

3. User-Agent 用户代码模式

请求通过这个信息字段告诉服务器你是通过什么工具(浏览器、其他程序)发送的请求。如下图,字段由 Mozilla/5.0(默认)+平台信息+浏览器引擎版本+浏览器版本 四个部分组成。

image.png

部分参考:HTTP请求头之User-Agent

----Mozilla/5.0

由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla 浏览器。此事导致如今User-Agent里通常都带有Mozilla字样,出于对历史的尊重,大家都会默认填写该部分。

----平台信息

平台这部分可由多个字符串组成,用英文半角分号分开。 这里图片可以分析:Windows NT 10.0是☞操作系统的版本,对应的是win10,而Win64; x64是☞操作系统是64位的。(具体可以自行查询)

----浏览器引擎版本

解释: AppleWebKit/537.36 (KHTML, like Gecko)...Safari/537.36,历史上,苹果依靠了WebKit内核开发出Safari浏览器,WebKit包含了WebCore引擎,而WebCore又从KHTML衍生而来。由于历史原因,KHTML引擎需要声明自己是“类似Gecko”的,因此引擎部分这么写。再后来,Google开发Chrome也是用了WebKit内核,于是也跟着这么写。借用Littern的一句话:“Chrome 希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢又伪装自己是KHTML,KHTML呢又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。”。不过,后来Chrome 28某个版本改用了blink内核,但还是保留了这些字符串。而且,最近的几十个版本中,这部分已经固定,没再变过。

----浏览器版本

Chrome/92.0.4515.159 Safari/537.36,其中标准信息为浏览器名字版本号,4515是持续增大的一个数字,而159则是修补漏洞的小版本。不深入的话学到这里就可以了。

4. Connection 后续连接

该字段信息告诉服务器连接(一次三次握手和四次挥手)的后续动作,这里使用keep-alive☞的是保持持续连接http 1.1下服务器会在没有请求一段时间后自动断开网络连接;而close☞的是非持久连接,它要求服务器在发送完响应的对象后就关闭连接。只有这两种。

5. Accept 指定 MIME 类型

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

Accept:*/* 的意思就是支持任意的类型,具体的类别和写法自信查询,罗列大量参数未必助于理解。下面只给予一行☞定支持类型的示例:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

6. Content-Length 实体大小

☞示实体body的大小,以字节为单位。这里的实体bodyForm Data为:name:juejinjin age:12 ,所以我们看到Content-Length: 21 。

剩下部分头部字段我们在区分请求响应报文时讲解。

浏览器-客户端向服务端发送的是http报文;服务器-服务端向客户端发送的也是http报文。虽然都是遵守http协议规范,但是具体的标准并不一致。

请求报文

由客户端向服务端发送的http报文叫做请求报文,我们一般常说的都是请求报文(http请求)。
起初网站只有静态html文件,从客户端发送的http报文负责请求服务端发送网页资源到客户端(浏览器渲染绘制),所以这个http报文叫作“请求”可以说是十分形象。

请求报文起始行请求行

--请求报文的头部字段补充

7. Accept-Encoding 压缩编码

☞定了对实体body的编码方式。网络连接后发送过程中实体body是该编码方式存在。

该字段的常见编码:gzip、compress、deflate、identity
区别于请求报文,响应报文的对应字段名是Content-Encoding

8. Accept-Language 自然语言集

http请求告诉服务器浏览器能接受的自然语言集,即人类听说读写的语言,中文、英文。

》截取上面get请求图片中的信息:(权重值 q来表示相对优先级,不细讲)

    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

9. cookie 字段

满足domain参数对应服务器域名时请求会自动携带cookie信息,通过头部字段中的cookie字段进行携带。

image.png

get 和post

  • 请求行的中请求方法,区别是getpost(还有其他请求方式

  • 请求报文结构上get不包含请求实体,post包含。

官方要求,GET请求不应携带请求体,服务器应忽略(或者说丢弃)GET请求的请求体。但是作为规范,具体的实现是可以不遵守的。postman软件以前是不支持get请求使用body,现在支持了不代表是规范的。

响应报文留到下篇文章讲解