首页/计算机网络/05-transport/TCP三次握手和四次挥手 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP三次握手和四次挥手

重要度 ⭐⭐ 题型 选择 / 简答 计算机网络/传输层TCP连接管理三次握手四次挥手
速查
建连用三次握手(SYN → SYN+ACK → ACK),目的是同步初始序列号 ISN 并确认双方收发能力;拆连用四次挥手(FIN → ACK → FIN → ACK),因为 TCP 全双工、两个方向须独立关闭,最后还要等 2MSL

核心概念

TCP 是面向连接的传输层协议,在数据传输之前需要建立连接(三次握手),传输结束后需要释放连接(四次挥手)。连接管理是 TCP 协议的核心机制之一,也是 408 考试的高频考点。

三次握手过程

客户端发送 SYN 报文($SYN=1, seq=x$),服务器回复 SYN+ACK 报文($SYN=1, ACK=1, seq=y, ack=x+1$),客户端再发送 ACK 报文($ACK=1, seq=x+1, ack=y+1$)。三次握手的目的是同步双方的初始序列号(ISN),并确认双方的收发能力正常。之所以需要三次而不是两次,是为了防止已失效的连接请求报文到达服务器导致错误连接。

四次挥手过程

主动关闭方发送 FIN 报文($FIN=1, seq=u$),被动关闭方回复 ACK 报文($ACK=1, ack=u+1$),此时进入半关闭状态;被动关闭方发送 FIN 报文($FIN=1, seq=w$),主动关闭方回复 ACK 报文($ACK=1, ack=w+1$),并进入 TIME-WAIT 状态,等待 $2MSL$ 后关闭。四次挥手的原因是 TCP 是全双工的,每个方向的关闭需要独立进行。

连接状态迁移(客户端视角) CLOSED SYN_SENT ESTABLISHED FIN_WAIT_1 CLOSED TIME_WAIT FIN_WAIT_2 TIME_WAIT → CLOSED 需等待 2MSL
图:建连(橙色,向右)与拆连(绿色,向左)的状态迁移主线。

关键定义

概念定义
SYN同步位,用于连接建立时同步序列号
FIN终止位,表示发送方数据已发送完毕,请求释放连接
ACK确认位,表示确认号字段有效
seq序列号,表示本报文段数据的第一个字节的编号
ack确认号,表示期望收到对方下一个报文段的第一个字节的编号
MSL最大报文段生存时间(Maximum Segment Lifetime)
TIME-WAIT主动关闭方发送最后一个 ACK 后进入的状态,等待 $2MSL$
SYN 洪泛攻击攻击者伪造大量 SYN 报文但不完成三次握手,耗尽服务器资源

常见考法

考点说明
三次握手过程描述画出握手过程,标注各报文的 SYN / ACK / seq / ack 值
为什么是三次不是两次防止已失效的连接请求被服务器误接受,浪费资源
四次挥手过程描述画出挥手过程,理解半关闭状态
TIME-WAIT 状态的作用确保最后一个 ACK 能到达对方;让旧报文段在网络中消失
SYN 洪泛攻击与 SYN Cookie理解攻击原理及防御机制
连接建立失败的处理服务器收到 SYN 后的超时重传机制

易错点

注意
  • 三次握手中第二次握手的报文同时携带 SYN 和 ACK 两个标志位,不要遗漏。
  • 四次挥手不是必然四次,中间两次可能合并为一次(被动关闭方同时发送 ACK 和 FIN),但考试中通常按四次描述。
  • TIME-WAIT 等待时间是 $2MSL$(两倍最大报文段生存时间),不是 $1MSL$。
  • 主动关闭方不一定是客户端,先调用 close() 的一方为主动关闭方。
  • 三次握手中如果第三次 ACK 丢失,服务器会超时重传 SYN+ACK,客户端不会重传 ACK(因为数据传输时会携带 ACK)。

核心结论

必背
  1. 三次握手的目的是同步双方初始序列号并确认双方收发能力,防止失效连接请求造成资源浪费。
  2. 四次挥手是因为 TCP 全双工,每个方向需独立关闭;TIME-WAIT 等待 $2MSL$ 确保可靠释放。
  3. SYN 洪泛攻击通过消耗服务器半连接队列实现 DoS,SYN Cookie 是主要防御手段。
  4. TCP 连接的建立和释放过程中,每一步都有超时重传机制保证可靠性。

记忆卡片

三次握手的目的?为什么不是两次?
同步双方初始序列号(ISN),确认双方收发能力;两次无法防止已失效的连接请求到达服务器导致错误连接。
TIME-WAIT 等多久?为什么?
等待 $2MSL$;确保最后一个 ACK 能到达对方(丢失可重传),并让旧报文段在网络中消失。
第二次握手报文的标志位?
$SYN=1, ACK=1$(同时携带 SYN 和 ACK 两个标志位)。
为什么释放要四次而不是三次?
TCP 是全双工的,每个方向的关闭需独立进行(FIN 只表示该方向数据发送完毕)。
SYN 洪泛攻击的原理与防御?
伪造大量 SYN 但不完成握手,耗尽半连接队列;防御用 SYN Cookie(不分配资源,把状态编码进 SYN+ACK 的序列号)。
半关闭状态出现在何时?
被动关闭方回 ACK 之后、发出自己的 FIN 之前,此时它仍可继续向对方发送数据。

交互动画 · 握手 / 挥手时序图

主动方 / CLIENT 被动方 / SERVER CLOSED LISTEN ① SYN seq=x ② SYN+ACK seq=y, ack=x+1 ③ ACK seq=x+1, ack=y+1 ④ ACK ack=w+1
点击「播放」或「下一步」开始演示
时序图:橙色 = 主动方→被动方,绿色 = 被动方→主动方;流动虚线表示"传输中",顶部胶囊实时显示两端 TCP 状态。

相关知识点

tcp-flow-and-congestion tcp-congestion-algorithm arp-protocol

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。