hushicai / hushicai.github.io

Blog
https://hushicai.github.io
27 stars 1 forks source link

HTTP协议的那些事儿 #13

Open hushicai opened 6 years ago

hushicai commented 6 years ago

HTTP(HyperText Transfer Protocol),超文本传输协议,互联网上应用最为广泛的一种网络协议,主要有HTTP/1.0HTTP/1.1以及HTTP/2.0三个版本。

HTTP/1.0

HTTP/1.0规定客户端与服务器只保持短暂的连接,客户端的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后,立即断开TCP连接。

HTTP/1.0其实也可以在header中设置Connection:Keep-Alive,这样就可以在一定时间内复用TCP连接,具体复用时间的长短可以由服务器控制,一般在15s左右。

但由于连接存活时间比较短,在弱网络场景下,例如移动端,请求比较分散并且时间跨度相对较大,实际上作用非常有限,因此并不能很好地复用TCP连接。

连接无法复用会导致每次请求都经历三次握手和慢启动(slow start),三次握手在高延迟的场景下影响较明显,慢启动则对大文件类请求影响较大。

HTTP/1.0还有另外一个问题,Head Of Line Blocking

假设有5个请求同时发出,对于HTTP 1.0的实现,在第一个请求没有收到回复之前,后续从应用层发出的请求只能排队,请求2,3,4,5只能等请求1的response回来之后才能逐个发出。

这会导致带宽无法被充分利用,以及后续正常请求被阻塞。

HTTP/1.1

HTTP/1.1默认启用Connection:Keep-Alive,解决了TCP连接无法复用的问题,如果要关闭TCP连接复用,需要显式地设置Connection:Close

HTTP/1.1还设计了一个pipelining机制,尝试解决Head Of Line Blocking问题:

上面的例子,对于pipelining的实现,请求2,3,4,5不用等请求1的response返回之后才发出,而是几乎在同一时间把请求发向了服务器,2,3,4,5及所有后续共用该连接的请求节约了等待的时间,极大的降低了整体延迟。

但是由于pipelining存在不少缺陷,例如服务器的response还是要求返回,遵循FIFO(First In First Out)原则,也就是说如果请求1的response没有回来,2,3,4,5的response也不会被送回来,Head Of Line Blocking问题并没有完全得到解决。

HTTP/2.0

HTTP/2.0最大的亮点在于多路复用(MultiPlexing)!

众所周知,在 HTTP/1.x协议中 ,客户端在同一时间,针对同一域名下的请求有一定数量限制,超过限制数目的请求会被阻塞。

而多路复用技术则允许同时通过单个TCP连接发起多重的请求-响应消息,因此HTTP/2.0可以很容易地实现多流并行而无需建立多个TCP连接。

多路复用技术通过多个请求stream共享一个TCP连接的方式,同时也解决了HTTP/1.x的Head Of Line Blocking问题,降低了延迟,提高了带宽的利用率。

References

hushicai commented 5 years ago

HTTP/2.0 相比1.0有哪些重大改进?