1. TCP连接建立与断开过程
建立:
首先,客户端主动进行连接,客户端处于SYN_SENT状态,发送同步码SYN=J,服务器收到SYN后状态为SYN_RCVD;
然后,server发送SYN=K , ACK=J+1(对SYN=J进行确认),client接受SYN和ACK建立连接,处于ESDABULISHED状态;
client 发送 ACK=K+1(确认K收到),server收到ACK建立连接ESDABLISHED;
断开:
client端发起连接断开请求,发送FIN=M,处于FIN_WAIT_1状态,server接收FIN处于CLOSE_WAIT(被动关闭)状态
server发送ACK=M+1,client接收ACK后处于FIN_WAIT_2(不再发送数据,可以接收数据,等待server发送结束);
server发送FIN=N,处于LAST_ACK状态
client接收到FIN发送ACK=N+1,状态置为TIME_WAIT,TIME_WAIT会保持2MSL时间
server接收到ACK,关闭连接,状态为CLOSED
2. TIME_WAIT状态
首先发起关闭连接的一方在收到另一方的关闭信号时,会将自身的状态置为TIME_WAIT,TIME_WAIT状态会持续2MSL时间,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接。因此,在websocket微服务进程被关闭后端口依旧会被占用,导致服务不能立即重启。
3. MSL时间
MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。
linux系统默认MSL为60秒,通过如下命令可以查看MSL时长
root@i-1fslvdlf:~# cat /proc/sys/net/ipv4/tcp_fin_timeout
60