http keep-alive如何工作?

时间:2013-12-24 16:31:35

标签: sockets http

  

将保持活动添加到HTTP以基本上减少重要性   快速创建和关闭每个套接字连接的开销   新的要求。以下是它在HTTP中的工作原理的摘要   1.0和1.1:

     

HTTP 1.0 HTTP 1.0规范并没有真正深入研究如何   Keep-Alive应该有效。基本上,支持Keep-Alive的浏览器   在请求中添加一个额外的标题:

     

连接:Keep-Alive当服务器处理请求时   生成响应,它还为响应添加标头:     连接:保持活动完成后,套接字连接是   没有像以前那样关闭,但在发送回复后保持打开状态。什么时候   客户端发送另一个请求,它重用相同的连接。该   连接将继续重用,直到客户端或   服务器决定会话结束,其中一个会断开连接。

以上解释comes from here。但我不明白一件事

  

完成此操作后,套接字连接不像以前那样关闭,但是   发送回复后保持打开状态。

据我所知,我们只是发送tcp数据包来发出请求和响应,这个socket connection如何帮助以及它是如何工作的?我们仍然需要发送数据包,但它怎么能以某种方式建立持久连接?这看起来很不真实。

4 个答案:

答案 0 :(得分:54)

建立新的TCP连接(DNS查找,TCP握手,SSL / TLS握手等)存在开销。如果没有保持活动状态,则每个HTTP请求都必须建立新的TCP连接,然后在发送/接收响应后关闭连接。保持活动允许将现有TCP连接重用于多个请求/响应,从而避免所有这些开销。这就是使连接“持久”的原因。

在HTTP 0.9和1.0中,默认情况下,服务器在向客户端发送响应后关闭其TCP连接的末尾。客户端必须在收到响应后关闭其TCP连接的末尾。在HTTP 1.0(但不是0.9)中,客户端可以通过在请求中包含Connection: keep-alive标头来明确要求服务器不要关闭其连接的结尾。如果服务器同意,则它在响应中包含Connection: keep-alive标头,并且不会关闭其连接的结尾。然后,客户端可以重新使用相同的TCP连接来发送其下一个请求。

在HTTP 1.1中,keep-alive是默认行为,除非客户端明确要求服务器通过在其请求中包含Connection: close标头来关闭连接,或者服务器决定包含Connection: close 1}}响应中的标题。

答案 1 :(得分:21)

让我们做个比喻。 HTTP包括发送请求和获取响应。这类似于向某人询问问题并收到回复。

问题是问题和答案需要通过网络。要通过网络进行通信,请使用TCP(套接字)。这类似于使用手机向某人提问并让此人回答。

当您加载包含2个图像的页面时,HTTP 1.0包含在

  • 拨打电话
  • 要求提供页面
  • 获取页面
  • 结束通话
  • 拨打电话
  • 询问第一张图片
  • 获取第一张图片
  • 结束通话
  • 拨打电话
  • 要求第二张图片
  • 获取第二张图片
  • 结束通话

拨打电话并结束需要时间和资源。控制数据(如电话号码)必须通过网络传输。通过一个电话来获取页面和两个图像会更有效。这就是keep-alive允许做的事情。随着保持活跃,以上变为

  • 拨打电话
  • 要求提供页面
  • 获取页面
  • 询问第一张图片
  • 获取第一张图片
  • 要求第二张图片
  • 获取第二张图片
  • 结束通话

答案 2 :(得分:12)

这确实是网络问题,但毕竟这可能是合适的。

混淆源于面向数据包和面向流的连接之间的区别。

互联网经常被称为" TCP / IP"网络。在低级别(IP,因特网协议),因特网是面向分组的。主机将数据包发送到其他主机。

然而,除了IP之外,我们还有TCP(传输控制协议)。互联网这一层的全部目的是隐藏底层媒体的面向数据包的性质,并将两个主机(主机和端口,更准确)之间的连接呈现为数据流,类似于文件或管道。然后我们可以在OS API中打开一个套接字来表示该连接,我们可以将该套接字视为文件描述符(字面意思是Unix中的FD,非常类似于Windows中的文件HANDLE)。

大多数其他Internet客户端 - 服务器协议(HTTP,Telnet,SSH,SMTP)都位于TCP之上。因此,客户端打开一个连接(套接字),将其请求(作为底层IP中的一个或多个口袋传输)写入套接字,从套接字读取响应(并且响应可以包含来自多个IP数据包的数据,如然后...然后选择是为下一个请求保持连接打开或关闭它。 Pre-KeepAlive HTTP始终关闭连接。新客户端和服务器可以保持打开状态。

KeepAlive的优势在于建立连接非常昂贵。对于简短的请求和响应,它可能需要比实际数据交换更多的数据包。

轻微的缺点可能是服务器现在必须告诉客户端响应结束的位置。服务器不能简单地发送响应并关闭连接。它必须告诉客户:"读取20KB,这将是我的回复结束"。因此,响应的大小必须由服务器预先知道并作为更高级协议的一部分传送给客户端(例如,HTTP中的Content-Length:)。或者,服务器可以发送分隔符以指定响应的结束 - 这一切都取决于TCP之上的协议。

答案 3 :(得分:1)

你可以这样理解:

HTTP使用TCP作为传输。在通过TCP发送和接收数据包之前,

  1. 客户需要发送连接请求
  2. 服务器响应
  3. 完成数据传输传输
  4. 连接已关闭。
  5. 但是,如果我们使用保持活动功能,则在接收数据后不会关闭连接。连接保持活动状态。

    这有助于提高下次调用的性能,因为与服务器的连接已经存在,所以不会发生Connect建立。这意味着花费的时间更少。虽然连接的时间很短,但它确实会在每个ms计数的系统中产生很大的差异。