计算机网络复习
IP协议
多HTTP请求问题
- 收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
答:
前提条件:从HTTP/1.1开始,TCP连接是默认持续连接的,首部字段Connection:keep-alive,关闭时请求中写明Connection:close。
HTTP/1.1支持了管道传输pipeline,即在同一个TCP连接内,客户端可以发起多个请求,但是服务器会按请求的顺序响应。如果前面的请求处理的慢,会造成队头阻塞,性能一般。
如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP/2:
- 如果能则使用 Multiplexing 在该连接上进行多路传输(不过未必所有挂在该域名的资源都使用同一个 TCP 连接获取,但 Multiplexing 很可能被用到);
- 如果不能使用 HTTP/2,或者使用不了HTTPS (因为HTTP/2都是在HTTPS上实现的),则即为HTTP/1.1,HTTP/1.1的每个TCP连接在同一时刻只处理一个请求,则浏览器会在一个Host上建立多个TCP连接,连接的最大数量取决于浏览器设置。这些TCP连接会在空闲的时候被浏览器用来发送新的请求,若所有的TCP连接都在占用,则只能等待。
HTTP/2 的改进
- HTTP/2基于HTTPS,安全性有保障。
- 头部压缩:如果同时发出多个请求,它们的头一样或者相似的话,HTTP/2协议会消除重复。
- HPACK算法:在Client和Server同时维护索引表,分为静态索引表与动态索引表,静态索引表来定义常用的HTTP Header,请求时只需发送索引位置即可。不在静态表中的值用动态索引表,通过huffman编码动态缓存到索引来压缩头部。动态表与静态表共通组成了索引表的索引空间。 https://www.jianshu.com/p/f44b930cfcac
- 采用了二进制形式,头和数据题都是二进制,统称为帧 frame。二进制对计算机友好,增加了数据传输效率。
多路复用:HTTP/2同一个TCP连接中可并发多个请求或响应,不会产生队头阻塞。
数据流:HTTP/2同一个TCP连接中可并发多个请求或响应,每个数据包可能属于不同的请求或响应。
- 每个请求或响应对应的数据包,称一个数据流 Stream,每个Stream有独立编号,其中客户端发送的为奇数,服务器发送的为偶数。
- 客户端可以指定数据流的优先级。
服务器推送:Server主动向Client发送消息。
HTTP/2 的缺陷
多个HTTP请求复用一个TCP连接,下层的TCP协议不知道有多少个HTTP请求,一旦发生丢包,就会触发TCP的重传机制,阻塞所有HTTP请求。
HTTP/3 的改进
把 TCP 改成了 UDP ,UDP 本身不管顺序、丢包,是不可靠传输。
但基于 UDP 的 QUIC协议 实现类似 TCP 的可靠传输。
- 当某个流丢包,只阻塞该流,其他流不受影响。
- 使用了 TLS/1.3 和头部压缩算法 QPack
- QUIC建立连接减少了交互次数。
QUIC是新协议,很多网络设备不支持,还在普及。