每条消息创建新TCP连接的性能含义

时间:2011-10-06 00:43:26

标签: performance sockets networking service tcp

过去,我们的服务器应用程序的设计是为了让客户端创建一个TCP连接,保持此连接无限期建立并在需要时发送消息。这些消息可能以高音量突发或其间有较长的空闲时段。我们现在切换到不同的连接协议,客户端将为每条消息创建一个新连接,然后在发送后断开连接。

我有几个问题:

  1. 我知道3-shake握手有一些开销来建立连接。但这个开销是否显着(cpu,内存,带宽等)?

  2. 对于已经空闲几分钟的已建立TCP连接而不是创建新连接并发送消息,传输的消息延迟是否存在差异?

  3. 如果我正在尝试确定切换到新连接协议与旧设备相比对性能的影响,是否还有其他因素/注意事项?

  4. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

打开和关闭大量TCP会话可能会影响连接跟踪防火墙和负载平衡器,导致它们变慢甚至失败并拒绝连接。有些像Linux iptables conntrack一样,对跟踪连接的数量有中等的默认值。

如果程序过快地循环消息,程序可能会耗尽可用的本地端口号。在将套接字视为“已关闭”之前,存在TCP超时。通常有一个操作系统计时器来清理这些关闭的连接。如果打开太多套接字太快,操作系统可能没有时间清理。

握手会为您的带宽成本增加额外的80个字节。 TCP连接关闭也涉及FIN或RST数据包,尽管这些标志可能与数据包结合使用。

如果为邮件发件人打开Nagle算法,则已建立的TCP会话的延迟可能会略高一些。 Nagle使OS在发送部分填充的数据包之前等待更多数据。正在关闭的TCP会话将刷新所有数据。通过使用TCP_NODELAY标志禁用Nagle,可以在打开的会话中产生相同的效果。