Go: HTTP何时才会复用TCP 连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go: HTTP何时才会复用TCP 连接相关的知识,希望对你有一定的参考价值。

参考技术A

几乎每个IT的同学都知道 HTTP底层是 TCP,也知道多个HTTP请求可以复用一个TCP连接,但究其细节又不甚了解。

那么HTTP 请求何时才能复用一个TCP连接呢?我们先做个例子

输出的结果如下

也就是说底层并没有复用。也可以通过命令行查看连接,的确是建立了两条连接。

仔细阅读 go的http包,可以发现

只有当前一次的请求的数据被读完并且关闭请求后,才能复用

我们改造一下这个例子

输出的结果如下

通过Linux系统查看也只有一个连接。

TCP连接复用

转自网络:看到一陌生名词,记录一下

TCP连接复用技术通过将前端多个客户的HTTP请求复用到后端与服务器建立的一个TCP连接上。这种技术能够大大减小服务器的性能负载,减少与服务器之间新建TCP连接所带来的延时,并最大限度的降低客户端对后端服务器的并发连接数请求,减少服务器的资源占用。
      一般情况下,客户端在发送HTTP请求之前需要先与服务器进行TCP三次握手,建立TCP连接,然后发送HTTP请求。服务器收到HTTP请求后进行处理,并将处理的结果发送回客户端,然后客户端和服务器互相发送FIN并在收到FIN的ACK确认后关闭连接。在这种方式下,一个简单的HTTP请求需要十几个TCP数据包才能处理完成。
      采用TCP连接复用技术后,客户端(如:ClientA)与负载均衡设备之间进行三次握手并发送HTTP请求。负载均衡设备收到请求后,会检测服务器是否存在空闲的长连接,如果不存在,服务器将建立一个新连接。当HTTP请求响应完成后,客户端则与负载均衡设备协商关闭连接,而负载均衡则保持与服务器之间的这个连接。当有其它客户端(如:ClientB)需要发送HTTP请求时,负载均衡设备会直接向与服务器之间保持的这个空闲连接发送HTTP请求,避免了由于新建TCP连接造成的延时和服务器资源耗费。

技术分享图片

这里主要是多了一层负载均衡,负责保持与后端服务器的tcp连接。



以上是关于Go: HTTP何时才会复用TCP 连接的主要内容,如果未能解决你的问题,请参考以下文章

012_TCP keepalive 和 http keep-alive

TCP连接复用

Go http client 连接池不复用的问题

http2多路复用

TCP连接与OKHTTP复用连接池

okhttp 3.10连接复用原理