0
点赞
收藏
分享

微信扫一扫

怎么提升TCP四次挥手性能?

福福福福福福福福福 2022-02-23 阅读 79

close 和 shutdown 函数都可以关闭连接,但这两种方式关闭的连接,不只功能上有差异,控制它们的 Linux 参数也不相同。close 函数会让连接变为孤儿连接,shutdown 函数则允许在半关闭的连接上长时间传输数据。TCP 之所以具备这个功能,是因为它是全双工协议,但这也造成四次挥手非常复杂。

四次挥手中你可以用 netstat 命令观察到 6 种状态。其中,你多半看到过 TIME_WAIT 状态。网上有许多文章介绍怎样减少 TIME_WAIT 状态连接的数量,也有文章说 TIME_WAIT 状态是必不可少、不能优化掉的。这两种看似自相矛盾的观点之所以存在,就在于优化连接关闭时,不能仅基于主机端的视角,还必须站在整个网络的层次上,才能给出正确的解决方案。

Linux 为四次挥手提供了很多控制参数,有些参数的名称与含义并不相符。例如tcp_orphan_retries 参数中有 orphan 孤儿,却同时对非孤儿连接也生效。而且,错误地配置这些参数,不只无法针对高并发场景提升性能,还会降低资源的使用效率,甚至引发数据错误。

我们将基于四次挥手的流程,介绍 Linux 下的优化方法。

四次挥手的流程

为什么建立连接是三次握手,而关闭连接需要四次挥手呢?

这是因为 TCP 不允许连接处于半打开状态时就单向传输数据,所以在三次握手建立连接时,服务器会把 ACK 和 SYN 放在一起发给客户端,其中,ACK 用来打开客户端的发送通道,SYN 用来打开服务器的发送通道。这样,原本的四次握手就降为三次握手了。

举报

相关推荐

0 条评论