本人在“极客时间”上购买了一套“趣谈网络协议”的课程,本文为该课程第14讲(第14讲 HTTP协议)的课程笔记。
第十四讲 HTTP协议
1.最常用的协议-HTTP协议
- HTTP协议为应用层协议
- http://www.163.com 是个 URL,叫作统一资源定位符。之所以叫统一,是因为它是有格式的。HTTP 称为协议,www.163.com 是一个域名,表示互联网上的一个位置。有的 URL 会有更详细的位置标识,例如 http://www.163.com/index.html 。正是因为这个东西是统一的,所以当你把这样一个字符串输入到浏览器的框里的时候,浏览器才知道如何进行统一处理。
2.HTTP请求的准备
- DNS域名解析
- 发送请求前,需要建立TCP连接,HTTP基于TCP协议。
3.HTTP 请求的构建
![](https://img.haomeiwen.com/i5769065/0b6e76874b791db7.png)
1)请求行
- URL
- 版本:HTTP 1.1
- 方法: GET/POST/DELETE/PUT
2)首部字段
- Accept-Charset
- Content-Type
- Cache-control:用来控制缓存的
- If-Modified-Since:关于缓存的
-
缓存相关
4.HTTP请求的发送和返回
1)发送
- HTTP 协议是基于 TCP 协议的。所以它使用面向连接的方式发送请求,通过 stream 二进制流的方式传给对方。
-
到了 TCP 层,它会把二进制流变成一个的报文段发送给服务器。
2)HTTP返回的构建
返回格式
5.HTTP2.0
1)2.0与1.0的对比
- HTTP 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP 的头,在实时性、并发性上都存在问题。
- HTTP 2.0 会对 HTTP 的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。
2)特点
- HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己的 ID,而且流可以是客户端发往服务端,也可以是服务端发往客户端。它其实只是一个虚拟的通道。流是有优先级的。
- HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。
- 通过这两种机制,HTTP 2.0 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。
3)举例 - 假设我们的一个页面要发送三个独立的请求,一个获取 css,一个获取 js,一个获取图片 jpg。
- 如果使用 HTTP 1.1 就是串行的
-
但是如果使用 HTTP 2.0,就可以在一个连接里,客户端和服务端都可以同时发送多个请求或回应,而且不用按照顺序一对一对应。
-
HTTP 2.0 其实是将三个请求变成三个流,将数据分成帧,乱序发送到一个 TCP 连接中。
4)HTTP2.0优点
HTTP 2.0 成功解决了 HTTP 1.1 的队首阻塞问题,同时,也不需要通过 HTTP 1.x 的 pipeline 机制用多条 TCP 连接来实现并行请求与响应;减少了 TCP 连接数对服务器性能的影响,同时将页面的多个数据 css、js、 jpg 等通过一个数据链接进行传输,能够加快页面组件的传输速度。
6.QUIC协议(基于UDP)
1)QUIC协议解决了如下问题
- 由于HTTP 2.0 是基于 TCP 协议的,并且TCP 协议在处理包时是有严格顺序的。
- 当其中一个数据包遇到问题,TCP 连接需要等待这个包完成重传之后才能继续进行。虽然 HTTP 2.0 通过多个 stream,使得逻辑上一个 TCP 连接上的并行内容,进行多路数据的传输,然而这中间并没有关联的数据。一前一后,前面 stream 2 的帧没有收到,后面 stream 1 的帧也会因此阻塞。
2)QUIC协议的运行机制
- 自定义连接机制(不以四元组标识,以一个随机ID标识)
- 自定义重传机制
- TCP 为了保证可靠性,通过使用序号和应答机制,来解决顺序问题和丢包问题。
- tcp重传包序号相同,QUIC重传包序号不同
- 无阻塞的多路复用
- 有了自定义的连接和重传机制,我们就可以解决上面 HTTP 2.0 的多路复用问题。
- 同 HTTP 2.0 一样,同一条 QUIC 连接上可以创建多个 stream,来发送多个 HTTP 请求。
- 但QUIC 是基于 UDP 的,一个连接上的多个 stream 之间没有依赖。
- 这样,假如 stream2 丢了一个 UDP 包,后面跟着 stream3 的一个 UDP 包,虽然 stream2 的那个包需要重传,但是 stream3 的包无需等待,就可以发给用户。
- 自定义流量控制
- TCP 的流量控制是通过滑动窗口协议。
- QUIC 的流量控制也是通过 window_update,来告诉对端它可以接受的字节数。
- 但 QUIC 的窗口是适应自己的多路复用机制的,不但在一个连接上控制窗口,还在一个连接中的每个 stream 控制窗口。
7.总结
- HTTP 协议虽然很常用,也很复杂,重点记住 GET、POST、 PUT、DELETE 这几个方法,以及重要的首部字段;
- HTTP 2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能;
- QUIC 协议通过基于 UDP 自定义的类似 TCP 的连接、重试、多路复用、流量控制技术,进一步提升性能。
网友评论