最熟悉的陌生人, 5分钟快速理解HTTP2
最熟悉的陌生人:5 分钟快速理解 HTTP2 from : https://mp.weixin.qq.com/s/fb02vTE884Txx6npW2mfcQ 有些图裂了,看原文比较方便~ 最熟悉的陌生人系列,将带你快速理解熟悉的名词如:HTTP2、HTTP3、IPV6、BBR 等。 通读 90 年代上下的论文,你会发现,在已经基本建成的计算机科学大厦中,后辈码农只要做一些零星的修补工作就行了。 在计算机科学晴朗天空的远处,还有几朵令人不安的小小乌云。 ——皓尼・郝里斯( HioHio ) 而其中一朵小小乌云,就是前辈的协议制定实现得太牢靠了,就算有着诸多不足,还是用的好好的,让后辈没什么动力去创新替换。。 HTTP 的不足 在阅读此章时,读者可以给自己一个思考时间,锻炼设计与思考能力—— 目前在用的 HTTP 协议,你认为有哪些不足呢? 你可以重新设计一个替代它并且尽可能兼容的协议,你会怎么做呢? 可尝试自己写下设计,定会受益甚多。 TCP 连接数过多 HTTP1.0只允许一条 tcp 链接上处理一个 request,尽管后来的 HTTP1.1(现在常用的版本)允许pipelining, 管道,通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器的响应只能够一个接着一个的返回 (但各大浏览器有些不支持 / 默认关闭,因此这功能可以说是鸡肋)。 HTTP 头部过多重复 Host、Accept-Encoding、Connection、origin、content-type等等一堆头部,都在不同的请求中重复出现。 除了浪费大量流量,还会导致 TCP 的初始拥塞窗口(initcwnd)快速满了,当多个请求准备在同一个 tcp 连接上发送时,会导致大量延迟——当initcwnd >= ssthresh ( slow start threshold ) 时,tcp 就会进入 “拥塞避免算法”,把发送的速度调慢,避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。 当然初始拥塞窗口(initcwnd)也不能调太大来避免。 If the initcwnd values is large, then there will be fewer RTTs required to download the same file. But we cannot set initcwnd to a huge value as the network environment and the routers also has the limitation of having limited buffers. If exceedingly large values are set, it may lead to router buffer overflows, packet loss, packet re-transmissions. So, we need to set an optimal value for the initcwnd which is directly proportional to the network bandwidth. ...