HTTP之长连接

HTTP协议中只有请求和响应的概念,发起请求和返回响应是通过TCP Connection来完成的。

在HTTP1.1以前,默认情况下,在发起请求得到响应之后,会关闭TCP Connection,有新的HTTP请求发起时,会重新建立TCP Connection。

我们知道,建立TCP Connection时需要3次握手,耗费的时间还是比较多的,每次HTTP请求都需要重新建立TCP Connection,会降低性能。

在HTTP1.1中,在结束一次HTTP请求后,是默认保持TCP Connection的,当有新的HTTP请求发起时,会直接使用之前保持的TCP Connection。

这样,就节省了建立TCP Connection的时间,提高了性能。不过,在client和server中维持TCP Connection也是有损耗的,但是这和频繁建立TCP Connection的损耗比起来还是小很多的。

在HTTP1.1中默认开启长连接的,会在Requset head中设置Connection值为Keep-Alive,同时,返回的Request Head中也会设置Connection值为Keep-Alive。

如果要在HTTP1.1之前的HTTP版本中使用长连接,需要手动设置Request Head和Response Head的Connection为Keep-Alive。

如果要关闭长连接,可以设置Connection为close。

另外,HTTP1.1中的TCP Connection中同时只能有一个HTTP请求,所以如果有多个HTTP请求需要使用同一个TCP Connection就需要等待。这样的HTTP请求只能是串行的。

幸运的是,可以同时建立多个TCP Connection,这样,就可以变相的使得HTTP并行处理。不过,浏览器对同时建立TCP Connection的数量进行了限制,在chrome同时只能建立6个TCP Connection,如果同时有超过6个HTTP请求发起,余下的HTTP请求还是要等待有TCP Connection空余出来后才能发送。

为什么在HTTP1.1中不能在TCP Connection中实现HTTP请求的并发呢?我的理解是,在HTTP1.1中,数据通常是以字符串的形式传输的,字符串是没有上下文的概念,所以如果在TCP Connection中实现HTTP 并发执行,不能保证哪个HTTP先到达Server,会造成数据错误。

正是由于这一点,在HTTP2.0中,数据改为以二进制传输的,它是分帧传输,会有上下文的概念。这时,就可以在同一个TCP Connection中并发的发起HTTP请求,而不需要担心到达Server的先后顺序不一致导致数据错误,因为server可以根据传输过来的帧的上下文进行重新的组合,得到正确的数据。

需要注意的是,只有同一域的HTTP请求才能使用建立好的长连接,不同域的http请求一定会重新建立一个TCP Connection。

posted on 2019-02-23 11:54  西门本不吹雪  阅读(714)  评论(0编辑  收藏  举报