TCP 三次握手与四次挥手详解
TCP 是面向连接的可靠传输协议,在正式传输数据之前,通信双方需要先建立连接;数据传输完成后,再通过一系列报文释放连接。这篇笔记整理一下这两个过程。
一、三次握手
- 客户端发送
SYN报文,携带初始序列号seq=x,进入 SYN_SENT 状态; - 服务端收到后回复
SYN+ACK,seq=y, ack=x+1,进入 SYN_RCVD 状态; - 客户端回复
ACK,ack=y+1,双方进入 ESTABLISHED 状态。
为什么是三次而不是两次?核心原因是双方都需要确认“对方能收到我的数据,我也能收到对方的数据”,同时防止已经失效的旧连接请求突然到达服务端,造成资源浪费。
二、四次挥手
- 主动关闭方发送
FIN,进入 FIN_WAIT_1; - 被动方回复
ACK,进入 CLOSE_WAIT,主动方进入 FIN_WAIT_2; - 被动方数据发送完毕后发送
FIN,进入 LAST_ACK; - 主动方回复
ACK,进入 TIME_WAIT,等待 2MSL 后关闭。
三、关于 TIME_WAIT
TIME_WAIT 的存在有两个作用:一是保证最后一个 ACK 能到达对端,若丢失可以重传;二是让本次连接中残留的报文在网络中自然消失,避免影响后续新连接。
可以用下面的命令查看当前各状态的连接数量:
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c
小结:握手保证“双向可达”,挥手保证“双向关闭”,TIME_WAIT 保证“干净收尾”。
上一篇:没有了下一篇:关于坚持写博客这件事