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

时间:2024-11-06 11:10:24

 父文章 通过异常流程深入了解 tcp,状态_个人渣记录仅为自己搜索用的博客-****博客

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 /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.

  参考文章:   /2013/07/linux-default-socket-timeout/

                    /mei922/article/details/4801858   TCP连接状态详解

                    /

                 /ipsysctl-tutorial/chunkyhtml/