保持连接头的澄清

107

我被要求建立一个网站,其中一位共同开发者告诉我我需要包含keep-alive头。

我阅读了很多相关文献,但仍有疑问。

msdn ->

当客户端请求Web页面内容时,开放连接可以提高性能,因为服务器可以更快地返回每个请求的内容。否则,服务器必须为每个请求打开一个新连接

观察以下截图

enter image description here

  • 当IIS(F)发送keep alive头信息(或用户发送keep-alive)时,这是不是意味着(E,C,B)保存一个仅供我的会话使用的连接?
  • 这些信息保存在哪里(“此连接属于“Royi””)?
  • 这是否意味着没有其他人可以使用该连接?
  • 如果是这样-那么keep alive-header是否减少了重叠连接用户的数量?
  • 如果是这样,连接保存时间有多长?(换句话说,如果我设置keep alive,“保持”的时间是多久?)

附言:对于那些感兴趣的人:

点击此示例页面将返回keep alive header。


2
我在讲座中见过这个,但我不太确定。我认为保持连接只存在于服务器和用户端。毕竟,在它们之间的所有内容都不应该知道它是HTTP,更不用说查看头文件了。 - Noctua
从MSDN引用的语句是胡言乱语。如果没有保持连接,那么客户端必须打开一个新连接。 - user207421
如果你正在构建一个网站,而不是一个Web服务器或客户端,那么保持连接头已经为你完成了。 - user207421
1个回答

150
这些信息(“此连接是计算机 A 和服务器 F 之间的连接”)存储在哪里?
TCP连接由源IP和端口以及目标IP和端口识别。您的操作系统、所有中间会话感知设备和服务器的操作系统都将通过此来识别连接。
HTTP使用请求-响应:客户端连接到服务器,执行请求并获取响应。如果没有保持活动状态,则与HTTP服务器的连接在每个响应后关闭。使用HTTP keep-alive,您可以保持底层TCP连接打开,直到满足某些条件为止。
这允许在单个TCP连接上进行多个请求-响应对,消除了TCP相对较慢的连接启动的一些问题。
当IIS(F)发送保持活动标题(或用户发送保持活动)时,是否意味着(E,C,B)保存连接?
不是。路由器不需要记住会话。实际上,属于同一TCP会话的多个TCP数据包不需要全部经过相同的路由器-这是由TCP管理的。路由器只选择最佳的IP路径并转发数据包。保持活动状态仅适用于客户端、服务器和任何其他中间会话感知设备。
这只适用于我的会话吗?

这是否意味着其他人不能使用该连接?

这就是TCP连接的意图:它是一个端到端的连接,只用于这两个参与方。

如果是这样的话-保持活动标头-是否减少了重叠连接用户的数量?

请定义“重叠连接”。请参阅HTTP持久连接以了解一些优缺点,例如:

  • 较低的CPU和内存使用量(因为同时打开的连接较少)。
  • 启用请求和响应的HTTP流水线。
  • 减少网络拥塞(较少的TCP连接)。
  • 在后续请求中减少延迟(无需握手)。

如果是这样的话,连接会保存多长时间?(换句话说,如果我设置keep-alive,“保持”多久?)

典型的keep-alive响应如下:

Keep-Alive: timeout=15, max=100

请参考超文本传输协议(HTTP)Keep-Alive头部的示例(HTTP/2的草案,其中保持连接头部的解释比26162086更详细):

  • 主机将timeout参数的值设置为主机允许空闲连接保持打开状态的时间。如果主机未发送或接收任何数据,则连接处于空闲状态。

  • max参数指示客户端将发出的请求的最大数量,或服务器将允许在持久连接上进行的请求的最大数量。一旦发送了指定数量的请求和响应,包含该参数的主机可能会关闭连接。

然而,服务器可以在任意时间或请求次数之后自由关闭连接(只要它返回当前请求的响应即可)。这是如何实现的取决于您的HTTP服务器。


是的,这是正确的。当使用 keep-alive 时,客户端将会少建立同时连接,它会串行地发送请求,而非并行。 :) - CodeCaster
1
那么你的意思是,如果服务器可以同时处理100个连接,并且所有这些连接都使用keep-alive,则第101个连接会被丢弃吗? - Royi Namir
1
@Royi 不,我不知道浏览器对于给定主机会建立多少个保持连接的连接,我也不是想说浏览器只会打开一个。同时发出的请求数量是有限的并且因浏览器而异。我的意思是,如果浏览器使用保持连接的连接,它可以通过在每个打开的连接上发送多个请求,从而可以使用较少的连接,例如在N / M或甚至只有M个连接上发送N个请求,因为默认情况下,在每个响应后连接都会关闭。 - CodeCaster
1
我知道。(:-)) 你在评论中说:_当使用keep-alive时,客户端将建立较少的并发连接,它会按顺序而非并行方式发送请求_。我只是不明白它与keepalive有什么关系。 - Royi Namir
5
E、C、B不保存会话。它们是路由器,没有任何会话表也不需要,因为来自同一TCP客户端到服务器的多个数据包可能会跟随不同路径。路由器的作用是选择最佳IP路径并相应地转发数据包,因此数据包既不会到达传输层(TCP / UDP),也不会到达应用层以查看保持活动标题。因此,基本上保持活动在客户端和服务器之间显式地进行,并且隐含地允许会话感知设备(例如防火墙)打开到该显式的客户端到服务器会话。 - Amine Kadimi
显示剩余16条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接