TCP 三次握手 / 四次挥手基础问答
三次握手基础
-
TCP 三次握手的完整流程是怎样的?
1) 客户端发送 SYN(同步序列号)并进入SYN_SENT。
2) 服务端收到后回 SYN+ACK,记录半连接进入SYN_RCVD。
3) 客户端收到后回 ACK,双方进入ESTABLISHED,服务端将连接从半连接队列转入全连接队列。 -
每一次握手分别起什么作用?
第一次:客户端表明要建立连接并告知自己的初始序列号。
第二次:服务端确认收到客户端 SYN(ACK=客户端 ISN+1),同时告知自己的 ISN(SYN)。
第三次:客户端确认收到服务端的 SYN+ACK,告知服务端“你可以开始发数据了”,确保服务端不会因旧 SYN 重放而误建连接。 -
三次握手中 SYN、ACK 各自代表什么含义?
SYN 标志位表示“我要同步序列号、请求建立连接”;ACK 标志位表示当前报文包含确认号ack,确认对端的数据或 SYN。 -
初始序列号(ISN)是做什么用的?
确定双方发送序列空间起点,防止旧连接的延迟报文被当作新连接数据;通常基于时间/随机函数生成以降低序列号预测风险。 -
SYN 包里通常会携带哪些 TCP 选项?
常见有 MSS、窗口扩大因子(Window Scale)、时间戳(RFC 7323,用于 RTT 估计/PAWS 防旧包)、SACK 允许、TCP Fast Open(如启用)。这些只在握手时协商,后续沿用。
四次挥手基础
-
TCP 四次挥手的完整流程是怎样的?
1) 主动关闭方发送 FIN,进入FIN_WAIT_1。
2) 被动关闭方回 ACK,进入CLOSE_WAIT;主动方收到后进入FIN_WAIT_2。
3) 被动关闭方处理完剩余数据后发送 FIN,进入LAST_ACK。
4) 主动关闭方回 ACK,进入TIME_WAIT;等待 2MSL 后真正关闭。被动方收到 ACK 即CLOSED。 -
为什么断开连接比建立连接多一次?
关闭是全双工的,每个方向都需要单独发 FIN/收 ACK,拆成两对消息以允许一端先“说完再挂断”;因此需要四次而非三次。 -
FIN 和 ACK 在挥手中的角色分别是什么?
FIN 表示“我这一侧的数据发送完毕,关闭发送方向”;ACK 确认对端 FIN 已收到,避免重复挥手和旧 FIN 干扰。 -
TCP 为什么要支持“半关闭”?
允许一端停止发送但继续接收(例如客户端发送完请求后仍要接收服务端的响应),提高灵活性;若不支持半关闭,无法表达“我不再发数据但还要收”的常见模式。