Skip to content

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 为什么要支持“半关闭”?
    允许一端停止发送但继续接收(例如客户端发送完请求后仍要接收服务端的响应),提高灵活性;若不支持半关闭,无法表达“我不再发数据但还要收”的常见模式。