您的位置:首页 > 理论基础 > 计算机网络

FIN_WAIT_2 tcp状态多原因剖析和解决

2016-03-14 20:54 676 查看


a.客户端状态迁移 CLOSED->SYN_SENT->ESTABLISHED (ps:主动结束连接)->FIN_WAIT_1->FIN_WAIT_2 (如果另一方程序健壮,会发送fin过来 )->TIME_WAIT->CLOSED

b.
服务器状态迁移CLOSED->LISTEN->SYN收到 ->ESTABLISHED->CLOSE_WAIT(如果本程序健壮,会发送fin给另一方 )->LAST_ACK->CLOSED

注意:该状态流转取决于程序健壮,不会忽略关闭连接。

time_wait的状态 2msl解释 什么是2MSL http://blog.csdn.net/xiaofei0859/article/details/6044694

服务器端主动关闭连接, 产生的TIME_WAIT状态为什么会占用服务端大量端口?

程序非健壮下例子:

   服务端端口号9090

服务端关闭但客户端不关闭连接:

➜  ~ netstat -an | grep 127.0.0.1

tcp4       0      0  127.0.0.1.9090         127.0.0.1.63264        FIN_WAIT_2
tcp4       0      0  127.0.0.1.63264        127.0.0.1.9090         CLOSE_WAIT

客户端先关闭,服务端不关闭:

tcp4       0      0  127.0.0.1.9090         127.0.0.1.63697        CLOSE_WAIT

tcp4       0      0  127.0.0.1.63697        127.0.0.1.9090         FIN_WAIT_2

FIN_WAIT_2状态很多的case:

     服务端关闭,但客户端没有关闭。

解决:

    1.服务端程序读到 -1时,应该关闭连接,这样服务端就会发起fin 指令。

          进程关闭也会自动发fin 指令。

    2. tcp协议里没有针对这个状态设置超时时间,但linux服务器实现了超时回收,

         tcp_fin_timeout ,默认是60秒, 可通过 /sbin/sysctl -a | grep timeout 查看


网络超时:socket本身有 重连控制,网络拥塞控制。

会重发。

    tcp发送数据 tcp packet,会等待ack,如果等不到,会重复发数据。连续发送多遍。这个重试不需要上层业务去关心。

默认是15次,


From Linux's
tcp.7 man page:

tcp_retries2 (integer; default: 15; since Linux 2.2)
The maximum number of times a TCP packet is retransmitted in
established state before giving up.  The default value is 15, which
corresponds to a duration of approximately between 13 to 30 minutes,
depending on the retransmission timeout.  The RFC 1122 specified
minimum limit of 100 seconds is typically deemed too short.


  参考文章:   http://kimnote.com/2013/07/linux-default-socket-timeout/
                    http://blog.csdn.net/mei922/article/details/4801858   TCP连接状态详解

                    http://blog.chinaunix.net/uid-23849526-id-287997.html
                 https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html
   


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: