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状态连接。

 

posted @ 2015-03-24 15:53  dodng  阅读(810)  评论(0)    收藏  举报