天天看点

【计算机网络】应用层协议之HTTP协议详解URLHTTP协议HTTP 2.0

URL

统一资源定位符。顾名思义,通过一个 统一的格式 表示网络上的资源。比如:https://www.baidu.com  就是一个URL。HTTP 称为协议,https://www.baidu.com 是一个域名,表示互联网上的一个位置。

HTTP协议

超文本传输协议(HyperText Transfer Protocol),也正是万维网所遵循的协议,采取C/S(客户 / 服务器)结构,使用 TCP 传输,并且是一个无状态的、请求 / 响应报文结构的协议。

下面来分析一下浏览器是如何访问百度的 。

第一步:请求前的准备工作

浏览器首先会将 https://www.baidu.com 这个域名发送给 DNS 服务器,让它解析成为 IP 地址,得到百度的 IP 地址后,根据 TCP 协议进行 TCP 连接建立(三次握手)。目前绝大多是 HTTP 协议的版本都是 1.1,因此默认的是持久性连接(对应开启 Keep-Alive)。

非持久性连接:每个 TCP 连接最多允许传输一个对象。在 HTTP 1.0 版本中默认使用。

持久性连接:每个 TCP 连接允许传输多个对象。在HTTP 1.1 版本中默认使用。

响应时间分析:

对于非持久性连接,传输一个对象需要 2 个RTT(发起、建立连接:1个RTT + 发送请求消息到接收到响应消息:1个RTT)。

对于持久性连接,在响应时间上的划分又分为 流水线持久性连接 和 无流水线持久性连接。

  • 无流水线持久性连接。每个对象耗时 1 个RTT。客户端只有收到前一个响应后才发出新的请求。
  • 流水线持久性连接。理想情况下,收到所有引用对象约 1 个RTT。客户端只要遇到一个引用对象就尽快发送请求。

第二步:HTTP请求的构建

建立 TCP 连接后,浏览器就要发送 HTTP 请求。请求格式如下:

【计算机网络】应用层协议之HTTP协议详解URLHTTP协议HTTP 2.0

HTTP 的报文大概分为三大部分。第一部分是请求行,第二部分是请求的首部,第三部分才是请求的正文实体。

请求消息的方法:
  • POST:填写表格类的的网页。在请求消息的消息体中上传客户端的输入。(往往用来创建资源的)
  • PUT:将消息体中的文件上传到 URL 字段所指定的路径。(往往是用来修改资源的)
  • GET:从服务器获取资源。
  • DELETE:删除 URL 字段所制定的资源。
  • HEAD:请 Server 不要讲所请求的对象放入响应消息中。

第三步:HTTP请求发送

HTTP 是基于 TCP协议 的,因此采用面向连接的二进制流的形式发送。应用层的消息向下传给 TCP 层,TCP 层会把二进制流变成一个一个报文段发送出去。在发送每个报文段的时候,都需要等待对方回应一个 ACK,来保证报文准确无误的到达目的主机。(这里就是TCP的细节了)。

TCP层会在报文段上添加 本地地址 和 目的地址。放到 IP 头里面,交给 IP 层进行传输。IP层需要查看目的地址是否和自己在同一个局域网。

如果在同一个局域网,则发送 ARP协议 获取目的地址的 MAC 地址,然后将 本地MAC 和 目的MAC 放入MAC 头,将给下层发送出去即可完成。

如果不在同一个局域网,则需要找到网关,通过网关发送出去。因此同样需要采用 ARP协议 来获取网关的 MAC 地址。然后将 本地MAC 和 目的MAC 放入MAC 头,将给下层发送给网关。网关收到包后发现 MAC 与自己的符合,就会取出 IP 地址,根据 路由协议 寻找下一跳路由器,获取下一跳的 MAC 地址,再发送出去。重复这个过程,直到最后一跳的路由器发现,目标地址就在自己的局域网内,于是发送 ARP协议,获取目的主机的 MAC 地址,将包发送出去。

目的主机收到包以后,发现 MAC 与自己符合,就取出 IP,又发现 IP 也符合,就根据 IP 头中的协议项,发现使用的是 TCP 协议,于是解析 TCP 协议头,根据里面的序列号判断这个包是不是我所要的。如果不是,则丢弃即可。如果是,则根据端口号,发现 HTTP 的服务器正在监听这个端口号,于是将包发给 HTTP 服务器。

HTTP 服务器进程最终发现,原来这个请求是访问一个网页,于是把网页发给客户端。

第三步:HTTP响应的构建

HTTP 的返回报文也是有一定格式的。这也是基于 HTTP 1.1 的。

【计算机网络】应用层协议之HTTP协议详解URLHTTP协议HTTP 2.0

 状态码会反映 HTTP 请求的结果。

常见状态码:
  • 200:OK
  • 301:Moved Permanently
  • 400:Bad Request
  • 404:Not found
  • 505:HTTP Version Not Supported

我们来看一下,可以按下 F12 查看响应信息。

第一次打开https://blog.csdn.net/weixin_41960890/article/details/104939240

【计算机网络】应用层协议之HTTP协议详解URLHTTP协议HTTP 2.0
 刷新一下,看看会发生什么。
【计算机网络】应用层协议之HTTP协议详解URLHTTP协议HTTP 2.0

构造好了返回的 HTTP 报文,接下来就是把这个报文发送出去。还是交给 Socket 去发送,还是交给 TCP 层,让 TCP 层将返回的 HTML,也分成一个个小的段,并且保证每个段都可靠到达。这些段加上 TCP 头后会交给 IP 层,然后把刚才的发送过程反向走一遍。虽然两次不一定走相同的路径,但是逻辑过程是一样的,一直到达客户端。

客户端发现 MAC 地址符合、IP 地址符合,于是就会交给 TCP 层。根据序列号看是不是自己要的报文段,如果是,则会根据 TCP 头中的端口号,发给相应的进程。这个进程就是浏览器,浏览器作为客户端也在监听某个端口。

当浏览器拿到了 HTTP 的报文。发现返回“200”,一切正常,于是就从正文中将 HTML 拿出来。HTML 是一个标准的网页格式。浏览器只要根据这个格式,展示出一个绚丽多彩的网页。

HTTP 2.0

HTTP 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP 的头,而且不考虑 pipeline 模式的话,每次的过程总是像上面描述的那样一去一回。这样在实时性、并发性上都存在问题。

为了解决这些问题,HTTP 2.0 会对 HTTP 的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。

另外,HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己的 ID,而且流可以是客户端发往服务端,也可以是服务端发往客户端。它其实只是一个虚拟的通道。流是有优先级的。

HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。常见的帧有 Header 帧,用于传输 Header 内容,并且会开启一个新的流。再就是 Data 帧,用来传输正文实体。多个 Data 帧属于同一个流。

通过这两种机制,HTTP 2.0 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打散乱序发送, 然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

参考:哈工大mooc、《趣谈网络协议》、《计算机网络》谢希仁。