首页 > 代码库 > TCP/IP 协议工作原理与Linux系统下调优

TCP/IP 协议工作原理与Linux系统下调优

TCP/IP建立连接的三次握手过程

 

建立TCP连接共需要三个packet

Client--> syn=1,ack=0,fin=0 -->  Server 

Client<--  syn=1,ack=1,fin=0 <--  Server

Client-->  syn=0,ack=1,fin=0 -->  Server

TCP/IP关闭连接的四个过程:

 

关闭TCP连接需要四个packet:

      Client-->  FIN  -->  Server 

      Client<---  ACK  <---  Server 

 Server 发送FIN给Client,Server 就置为LAST_ACK状态。

      Client--->  ACK  --->  Server 

   Client端处于FIN_WAIT_2状态,Server 程序处于CLOSE_WAIT状态。

      Client<---  FIN  <---  Server 

      Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。Server 程序处于CLOSE_WAIT状态,server还没有发FIN给Client,那么可能是在关闭连接之前还有许多数据要发送或者其他事要做,导致没有发这个FIN packet。

     一般情况一个CLOSE_WAIT会维持至少2个小时的时间。如果黑客特地写了个程序,给你server搞很多CLOSE_WAIT,消耗你的资源,那么通常是等不到释放那一刻,系统就已经解决崩溃了。

这样只能通过修改一下TCP/IP的参数,来缩短这个时间:修改tcp_keepalive_*系列参数调优来解决这个问题。

 

    1)Linux平台

修改系统的参数,系统默认超时时间的是7200秒,也就是2小时,这个太大了,对于我们这样的负荷来说,于是修改如下几个参数:

查看所有sysctl可读变量:

[root@localhost~]# sysctl –a

sysctl变量修改方法

使用sysctl命令修改系统变量,和通过编辑sysctl.conf文件来修改系统变量两种。但并不是所有的变量都可以在这个模式下设定。

注:sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示‘yes‘,用 0 来表示‘no‘)。

[root@localhost ~]#sysctl -w net.ipv4.tcp_keepalive_time=30
[root@localhost ~]#sysctl -w net.ipv4.tcp_keepalive_probes=2
[root@localhost ~]#sysctl -w net.ipv4.tcp_keepalive_intvl=2

[root@localhost~]# sysctl -a | grep keepalive

net.ipv4.tcp_keepalive_time= 30

net.ipv4.tcp_keepalive_probes= 2

net.ipv4.tcp_keepalive_intvl= 2

执行以下命令使变动立即生效
[root@localhost ~]# sysctl –p

   2)在RISC6000/AIX平台

用no命令修改如下参数: tcp_keepidle保持TCP/IP连接的时间,单位为0.5秒,缺省值为14,400,即两个小时,我们可将它设为5分钟;
tcp_keepinittcp连接初始timeout值,单位为0.5秒,缺省值为150,我们可将它设为50;
tcp_keepintvl连接间隔,单位为0.5秒,缺省值为150,我们可将它设为50;
我们也可以修改/etc/rc.net文件,
/usr/sbin/no -o tcp_keepidle=240
/usr/sbin/no -o tcp_keepinit=50
/usr/sbin/no -o tcp_keepintvl=50
注意:直接使用命令行修改,在机器重启后,会失效;修改rc.net文件,可以做到永久生效。

     3)在HP平台
对于HP-UNIX V10.20及其在此之前的版本,用/usr/contrib/binnettune命令来修改有关参数;
对于HP-UNIX V10.30及其以上版本,用/usr/bin/ndd命令来修改有关参数。

     4)在SUN Solaris平台
用ndd -set /dev/tcptcp_keepalive_interval NNN命令来修改有关参数,tcp_keepalive_interval的单位为毫秒,缺省值为7200000毫秒,即2个小时。

     5在SCO OpenServer平台
tcp_keepalive 和 tcp_keepidle 相同,其原先默认值为 7200 秒,可设为 600秒。tcp_keepintvl其原先默认值为 75 秒,可设为15秒。均以"秒"为单位。
运行命令 ifconfig 命令修改:
/etc/inconfig tcp_keepidle
/etc/inconfig tcp_keepintvl

通常,操作系统的TCP/IP参数的缺省设置是2个小时,即发送KeepAlive探测包的时间是2小时,所以需要2个小时的时间它才会获知网络连接已经断开,因此当有需要的时候我们可以通过配置TCP/IPKeepAlive参数来提高TCP/IP的响应速度。

 

本文出自 “gentoo” 博客,请务必保留此出处http://linuxgentoo.blog.51cto.com/7678232/1438890