父文章 通过异常流程深入了解 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/