一道网络面试题

某度面试,遇到一道面试题:如果服务器端大量出现time_wait怎么办?

一开始我是不明白为什么会出现大量time_wait。。。

事实上我连为什么TCP要有time_wait都不知道。。。

time_wait保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。

而服务器大量出现time_wait是因为服务器主动关闭了连接。

然而进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

能问出这种问题来说明面试官就是故意的,然而我水平确实渣,也没什么可抱怨的。这个问题是由epoll引出来的,我说IO,他思维能迅速跳到网络相关我也是服的,其实完全讨论的不是一个领域的问题,不过能问住我就对了。

这个问题的解决方案是

通过调整内核参数解决vi /etc/sysctl.conf编辑文件,加入以下内容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

然后执行/sbin/sysctl -p让参数生效。

net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout修改系統默认的TIMEOUT时间

修改之后,再用命令查看TIME_WAIT连接数

netstat -ae|grep “TIME_WAIT” |wc –l

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,网站访问正常。 不过很多时候,出现大量的TIME_WAIT状态的连接,往往是因为网站程序代码中没有使用mysql.colse(),才导致大量的mysql TIME_WAIT.

你可能感兴趣的:(一道网络面试题)