图写的比较直白,一般都能看懂!如下图:
关于TIME_WAIT状态的出现,简单描述就是:
通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。客户端主动关闭连接时,会发送最后一个ACK后,然后会进入TIME_WAIT状态,再停留2个MSL时间进入CLOSED状态。(至于为什么是2MSL,解释比较多,暂未确定具体原因!有知道的可以留言回复)
架构设计上前端采用Nginx + 后线服务这种组合的时候,有时会碰到一个问题就是TIME_WAIT数量告警。(此解决方案查看这篇文章Nginx + 网关后线服务出现TIME_WAIT告警的解决办法)
# 查看默认的MSL值(60s)
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
# 修改默认60为240
$ echo 240 > /proc/sys/net/ipv4/tcp_fin_timeout
# 重新加载配置文件
$ sysctl -p /etc/sysctl.conf
# 查看是否已经生效
$ sysctl -a | grep tcp_fin_timeout
net.ipv4.tcp_fin_timeout = 240
MSL:(Maximum Segment Lifetime)
一个数据分片(报文)在网络中能够生存的最长时间。
TCP标志位:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)
Client TCP状态演进过程:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
Server TCP状态演进过程:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
状态含义如下:
LISTEN - 侦听来自远方TCP端口的连接请求;
SYN-SENT -在发送连接请求后等待匹配的连接请求;
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求;
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
CLOSING -等待远程TCP对连接中断的确认;
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;
CLOSED - 没有任何连接状态;