HTTP的秘密(3) HTTP/1.1流程及报文详解 | 8月更文挑战

1,061 阅读5分钟

了解HTTP的报文,有助于我们理解HTTP工作原理,并能够帮助我们定位问题。我将在本文中通过wireshark截取的真实信令来解析整个HTTP/1.1的流程和报文内容。

首先看一下整体HTTP请求流程:

image.png

  1. 先从DNS服务器获取目标域名的IP地址
  2. 建立到目标IP指定端口的TCP连接,3次握手
  3. 发送HTTP请求并获得服务器响应
  4. 浏览器解析HTML文件及其他页面资源并组装,渲染页面
  5. HTTP数据传输完成,TCP长连接超时自动发起释放

HTTP1.1报文

先看一下HTTP报文结构,请求和响应具有相似的结构,由以下4部分组成︰

  1. 起始行:用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
  2. 报文头部(content header):HTTP头集合指明请求或描述消息正文。
  3. 一个空行指示所有关于请求的元数据已经发送完毕。
  4. 正文(body):包含请求相关数据的正文 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头content-length来指定。

image.png

HTTP请求报文

image.png

  1. 第一行请求行:包含请求方法HEAD,这是请求目标资源的头部信息,比如文件类型,文件大小等。包含目标资源的路径/robots.txt。包含客户端期望的响应版本。

  2. 请求头:包含目标主机名称www.baidu.com; 包含之前保存的cookie;包含长连接指示keep-alive;包含接受的语言CN/EN,编码方式GZIP, 以及客户端浏览器类型Mozilla

  3. 请求正文:提供了完整的资源路径URI。需要注意,不是所有的请求都有正文body,例如获取资源的请求GET,HEAD,DELETE 和 OPTIONS,通常不需要 body。请求正文大致可分为两类:

    • Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length.
    • Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起

HTTP响应报文

image.png

上图是我从wireshark里截的实际HTTP响应message,具体分析一下:

  1. 第一行状态行:包含了响应版本,状态码和状态标识;
  2. 响应头:accept-Ranges标识服务器接受部分文件请求,单位是byte;使用gzip编码; 文件类型是文本;消息生成时间date;文本的版本etag;文本上次修改时间;服务器类型apache;以及vary这个缓存指示;
  3. 响应正文body:不是所有的响应都有正文,比如状态码201或204,通常不会有正文。正文大致可分为三类:
    • Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-Type 和 Content-Length。
    • Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked 来使用 chunks 编码。
    • Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

一个完整的HTTP请求响应流程

最后,呼应开始时的整体流程,我拿一个实际例子,看看真实网站浏览情况下的HTTP流程:

  1. 我在浏览器输入www.jianfast.com, 浏览器首先向DNS服务器查询对应的IP地址,这里DNS服务器是客户端保存的本地DNS:

image.png

  1. 浏览器收到回复IP地址是139.196.237.187

image.png

  1. 马上,浏览器就会向这个IP地址发起一个HTTP请求,首先HTTP会建立一个从客户端到服务器的TCP连接,在客户和服务器进程中都会有一个套接字(socket)与其相连。这是我截的3次握手的TCP信令,客户端的端口号是49945,这是随机分配的,服务器的端口号是80,HTTP/1.1默认端口:

image.png

  1. TCP链接建立完成后,HTTP 客户端通过端口49945向服务器端口80,发送一个 HTTP 请求报文,通过TCP进行封装数据包,输入到网络层。

image.png

  • 这是一个GET请求,获取 www.jianfast.com 的HTML文件,并向服务器说明了自己的能力和可以处理的文件类型等等
  • 网络层不关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作。 image.png
  1. 服务器收到请求后,响应了HTTP请求,并回复了响应报文: image.png
  • 报文内容显示了HTML文件的新地址location,以及长连接指示keep-alive等

image.png

  1. 假设,客户端已经接受完毕信息,客户端浏览器会把对应的资源通过显示器呈现给用户。并开始释放TCP链接,客户端会向服务器发出FIN消息:

image.png

  • 服务器发送完所有数据后,返回响应消息FIN ACK

image.png

  • 客户端收到后,回复最后的确认消息ACK

image.png

这就是本文的所有内容,掌握了整个HTTP请求响应流程的全貌之后,还需要对请求方法,请求头与响应头的含义,状态码有所了解,这些内容在MDN网站上都可以查到,我就不再罗列了。




感谢阅读,如有不准确或错误请留言指正,我会及时修正

总结不易,请勿私自转载,否则别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616

参考资料:

一次完整的http请求过程 码农家园 www.codenong.com/cs107085788…

HTTP消息 MDN developer.mozilla.org/zh-CN/docs/…