HTTP协议

2019-11-28  本文已影响0人  浮萍向北

HTTP请求报文

HTTP请求报文.jpg

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

HTTP 请求发送

HTTP.jpg

从上图我们看出一个请求从我们电脑里发出请求包括的内容:MAC 头 IP 头 TCP 头 HTTP。

HTTP 协议是基于TCP 协议的,所以它使用的面向连接的方式发送请求,通过 stream 二进制流的方式传给对方。 到了TCP 层 它会把二进制流变成一个的报文段发送给服务器。

在发送给每个报文段的时候,都需要对方回应一个ACK,来保证报文可靠的到达了对方。如果没有回应,那么TCP 这一层会进行重新传输,直到可以到达。同一个包有可能被传了多次,但HTTP 这一层不需要知道这一点,因为是TCP 在这一层埋头苦干。

TCP 层发送一个报文的时候,都需要加上自己的地址(即源地址)和它想要去的地方(即目标地址),将这两个信息放到IP头里面,交给 iP 层进行传输。

IP 层需要查看目标地址和自己是否是在一个局域网。如果是,就发送ARP 协议来请求这个目标地址对应的MAC 地址, 然后将这个源 MAC 和网关 MAC 放入 MAC 头 发送出去。
网关收到包发现MAC 符合,取出目标IP 地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的 MAC 地址, 将包发给下一跳路由器。

这样路由器一跳一跳终于到达目标的局域网。 这个时候 最后一跳的路由器发现目标地址就在自己的某一个出口的局域网上。于是就在这个局域网上发送ARP 获得这个目标地址的MAC 地址,将包发送出去。
目标地址大学MAC 地址符合,就将包收起来; 发现 IP 地址 符合,根据 IP 头中的协议项,知道自己上一层是TCP 协议,于是解析 TCP 的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个ACK,如果不是就丢弃。

TCP 头里面还有端口号,HTTP 的服务器正在监听这个端口号。于是,目标机器自然知道是HTTP 服务器这个进程想要这个包,于是将包发给HTTP 服务器。HTTP 服务器的进程看到 原来这个请求是要访问一个网页,于是就把这个网页发给客户端。

HTTP 返回报文

HTTP 返回报文.jpg

HTTP 返回头格式和请求头大致一样包括 状态行、请求头、请求体。

HTTP 2.0

随着HTTP 协议不断的,在HTTP1.1基础上便有了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 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打散乱序发送, 然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

HTTP 1.1 是串行的。 HTTP 2.0 是并行的。

来自趣谈网络协议 https://time.geekbang.org/column/intro/85

上一篇 下一篇

猜你喜欢

热点阅读