Linux TCP 回收与重用

Linux 内核有两个重要的设置,对于每秒处理上千个连接的高流量站点而言,是很有用处的,这两个设置就是tcp_tw_recycle 和tcp_tw_reuse。这些内核设置允许我们在有新的客户端连接时重新使用套接字(文件描述符)。尽管这两个设置看起来很相似,其实却是截然不同的,若不进行慎重的管理,内核会很快用完所有套接字并且会丢失相关的用户数据。由于客户端连接和断开有许多方式,所以,正如您所知道的,TCP/IP 也有多种状态。这些状态在netstat中是很明显的,如SYN_SENT、ESTABLISHED, 还有很流行的TIME_WAIT, 还有其它许多不常见的状态。

TIME_WAIT 状态有一个关键问题,就是它的默认值为120秒时长,它会用完所有有价值的iptables和TCP本身的资源。这样做是为了确保所有在线或通过差的网络在传输额外的数据包或重新发送的数据包时不会错误地附加到新的连接中。但是,关键的问题是,任何新的连接在这两分钟内无法使用任何套接字。尽管您可以调整窗口大小,将其设置为15-30秒,但是对于高流量系统而言,这仍旧是一个问题,因为这些站点每秒需要1000-5000个套接字,这些套接字就会处于等待状态。在此,我们来看一下两个非常重要的内核设置。

tcp_tw_reuse 设置允许在TIME_WAIT 状态下重复使用一对套接字,由内核确保不会有类似于重复序列号的问题。由于两端都使用了时间戳,所以能够避免序列号重复。也可以基于某些关闭标识如FIN(表示不会有新的流量),来重复使用套接字。

与tcp_tw_reuse设置相对的是tcp_tw_recycle,这是个设置不是很慎重并且完全取决于客户端的时间戳。这种做法对于NAT系统而言会产生问题,因为这个系统会共享套接字和时间戳,这会导致内核丢弃SYN包并忽略连接意图。这会导致随机连接错误,造成如公司或大学的NAT使用人员随机胡乱连接,甚至导致拥有许多无线连接设备的家庭也出现连接故障。

所以,从本质上来说,可以使用tcp_tw_reuse 来释放TIME_WAIT中的套接字,但是不要使用tcp_tw_recycle,因为这个设置会给管理员和用户带来无数问题。当然,对于大型站点而言,还有其它需要关注的关键内核设置,最重要的设置包括iptables conntrack 设置和TCP 内存设置。


Tags: Linux, 内核
Categories: Linux

发表评论

电子邮件地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *