Linux动手实践time_wait和相关解决方法
1.time_wait相关理论知识
参考http://huoding.com/2013/12/31/316和网上许多资料
2.实验所用的操作系统
模拟服务端:CentOS release 5.10 (Final) 192.168.10.5
模拟客户端:CentOS release 6.4 (Final) 192.168.10.16
3.实践time_wait用到的相关工具
1.监听一个端口并提供echo服务(模拟服务端)
nc -l port
2.使用指定的本地tcp端口连接一个远程ip和端口并接受命令准备发送echo消息(模拟客户端)
nc remote_ip remote_port -p source_port
3.maintcpclient程序,功能与2类似,多了用SO_REUSEADDR方式先bind本地端口
执行make-tcpclient.sh编译出maintcpclient程序
(附源代码https://files.cnblogs.com/files/dodng/client.tar.gz)
4.开启和使用tcp_timestamps,tcp_tw_recycle和tcp_tw_reuse
vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1(1开启,0关闭,下同)
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 1
执行/sbin/sysctl -p生效
4.动手实践time_wait和相关解决方法
1.出现time_wait状态
注意先关闭tcp_tw_reuse和tcp_tw_recycle
10.5使用nc -l 8088监听8088端口并开启服务
10.16使用nc 192.168.10.5 8088 -p 10086连接
当建立连接时可以在10.5(服务端)或10.16(客户端)执行主动断开连接(Ctrl-C),netstat -anpt | grep 8088可以看到time_wait状态
2.服务端一个连接出现time_wait状态,一个相同4元组的新连接incoming能否使用
注意先关闭tcp_tw_reuse和tcp_tw_recycle
10.5使用nc -l 8088监听8088端口并开启服务
10.16使用nc 192.168.10.5 8088 -p 10086连接
当建立连接时在10.5(服务端)执行主动断开连接(Ctrl-C),netstat -anpt | grep 8088可以看到time_wait状态
在time_wait存在服务端时,继续在10.5使用nc -l 8088监听8088端口并开启服务
继续在10.16使用nc 192.168.10.5 8088 -p 10086连接
在10.5上可见time_wait状态变为ESTABLISHED
结论:可见,incoming新连接默认可以复用服务端time_wait状态连接
3.tcp_tw_recycle对于time_wait影响
通过实验1,可观察time_wait状态持续时间很长,至少30s
服务器和客户端都开启tcp_timestamps,服务端10.5开启tcp_tw_recycle
10.5使用nc -l 8088监听8088端口并开启服务
10.16使用nc 192.168.10.5 8088 -p 10086连接
在10.5开启另一个窗口2执行shell 命令“while true;do netstat -anpt | grep 8088;sleep 1;done”
当建立连接时可以在10.5(服务端)执行主动断开连接(Ctrl-C),观察窗口2,:与实验1相比time_wait状态出现很短
结论:tcp_tw_recycle加速了time_wait状态连接的回收,回收时间理论上是一个RTO,从2MSL变为1RTO
注意:2端任何一方关闭了tcp_timestamps功能,tcp_tw_recycle都无效,即tcp_tw_recycle依赖tcp_timestamps
4.tcp_tw_reuse对于time_wait影响
服务器和客户端都开启tcp_timestamps,服务端10.5开启tcp_tw_reuse
通过实验2,可知incoming可复用time_wait状态,这次主要测试outgoing可否复用
10.5使用nc -l 8088监听8088端口并开启服务
10.16使用./maintcpclient
在10.5开启另一个窗口2执行shell 命令“while true;do netstat -anpt | grep 8088;sleep 1;done”
当建立连接时可以在10.16(客户端)执行主动断开连接(Ctrl-C),观察窗口2:出现time_wait状态
再次在10.16使用./maintcpclient,观察窗口2:timw_wait状态被ESTABLISHED状态取代
在10.16上取消tcp_tw_reuse和tcp_timestamps,从新实验,运行./maintcpclient报错errno:99
结论:tcp_tw_reuse 对于outgoing创建新连接可复用time_wait状态连接。

浙公网安备 33010602011771号