TCP 连接管理
TCP 是面向连接的协议,因此每个 TCP 连接都有三个阶段:连接建立、数据传送和连接释放。TCP 连接的管理就是使运输连接的建立和释放都能正常进行。
这是第 5 章真题最密集的一节:建立连接的报文段字段(2011、2012、2016、2019),序号分析(2020、2023),释放时的状态变化(2021)和时间分析(2016、2022、2024)都考过。本页 3 道错题全部是序号计算。 算序号只需记住一条:SYN 和 FIN 各消耗一个序号,纯确认不消耗。
机制
连接建立前要解决的问题
在 TCP 连接建立的过程中,要解决以下三个问题:
- 要使每一方能够确知对方的存在。
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项等)。
- 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
TCP 把连接作为最基本的抽象,每条 TCP 连接有两个端点,TCP 连接的端点不是主机,不是主机的 IP 地址,不是应用进程,也不是传输层的协议端口。TCP 连接的端口即为套接字(Socket),每一条 TCP 连接唯一地被通信的两个端点(两个套接字)所确定。还应注意:同一个 IP 地址可以有多个不同的 TCP 连接,而同一个端口号也可以出现在多个不同的 TCP 连接中(套接字见 5.1.2)。
TCP 连接的建立采用客户/服务器模式。主动发起连接建立的应用进程称为客户(Client),而被动等待连接建立的应用进程称为服务器(Server)。
TCP 连接的建立:三次握手
连接建立前,服务器处于 LISTEN(收听)状态,等待客户的连接请求(TCP 连接建立的报文段中各字段的分析 2011、2012、2016、2019 年考过)。
sequenceDiagram participant A as 客户机 A participant B as 服务器 B Note over A: CLOSED → 主动打开 Note over B: CLOSED → 被动打开 → LISTEN A->>B: ① SYN=1, seq=x Note over A: SYN-SENT B->>A: ② SYN=1, ACK=1, seq=y, ack=x+1 Note over B: SYN-RCVD A->>B: ③ ACK=1, seq=x+1, ack=y+1 Note over A: ESTABLISHED Note over B: ESTABLISHED
- 第一步:客户机首先向服务器发送连接请求报文段。请求报文段的 SYN 位置 1,同时选择一个初始序号 seq=
。TCP 规定,SYN 报文段(SYN=1 的报文段)不能携带数据,但要消耗一个序号。这时,客户机进入 SYN-SENT(同步已发送)状态。 - 第二步:服务器收到连接请求报文段后,如同意建立连接,则向客户机发回确认。确认报文段的 SYN 位和 ACK 位都置 1,确认号 ack=
,同时选择一个初始序号 seq= 。确认报文段不能携带数据,但也要消耗一个序号。 这时,服务器进入 SYN-RCVD(同步收到)状态。 - 第三步:客户机收到确认报文段后,还要向服务器给出确认。确认报文段的 ACK 位置 1,确认号 ack=
,序号 seq= 。该报文段可以携带数据。若不携带数据,则不消耗序号,下一个数据报文段的序号仍为 。 这时,客户机进入 ESTABLISHED(已建立连接)状态。
当服务器收到来自客户机的确认后,也进入 ESTABLISHED 状态。成功进行以上三步后,就建立了 TCP 连接,接下来就可以传送应用层数据。TCP 提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
TCP 连接的释放:四次挥手
参与 TCP 连接的两个进程中的任何一个都能终止该连接(TCP 连接建立、数据传送、连接释放的报文段中序号字段的分析 2020、2023 年考过)。
sequenceDiagram participant A as 客户机 A participant B as 服务器 B Note over A,B: ESTABLISHED,数据传送 A->>B: ① FIN=1, seq=u Note over A: FIN-WAIT-1 B->>A: ② ACK=1, seq=v, ack=u+1 Note over B: CLOSE-WAIT(通知应用进程) Note over A: FIN-WAIT-2 B-->>A: 半关闭:B 仍可继续发送数据 B->>A: ③ FIN=1, ACK=1, seq=w, ack=u+1 Note over B: LAST-ACK A->>B: ④ ACK=1, seq=u+1, ack=w+1 Note over A: TIME-WAIT,等待 2MSL 后 CLOSED Note over B: CLOSED
- 第一步:客户机打算关闭连接时,向服务器发送连接释放报文段,并停止发送数据,主动关闭 TCP 连接。该报文段的 FIN 位置 1,序号 seq=
,它等于前面已传送过的数据的最后一个字节的序号加 1。FIN 报文段即使不携带数据,也要消耗一个序号。 这时,客户机进入 FIN-WAIT-1(终止等待 1)状态。TCP 是全双工的,即可以想象为一条 TCP 连接上有两条数据通路,发送 FIN 的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。 - 第二步:服务器收到连接释放报文段后即发出确认。该报文段的 ACK 位置 1,确认号 ack=
,序号 seq= ,等于它前面已传送过的数据的最后一个字节的序号加 1。然后服务器进入 CLOSE-WAIT(关闭等待)状态。此时,从客户机到服务器这个方向的连接就释放了,但从服务器到客户机这个方向的连接并未关闭,TCP 连接处于半关闭状态。客户机收到来自服务器的确认后,进入 FIN-WAIT-2(终止等待 2)状态,等待服务器发出的连接释放报文段。 - 第三步(TCP 连接释放过程中状态的变化 2021 年考过):若服务器已经没有要向客户机发送的数据,就向其发送连接释放报文段。该报文段的 FIN 位和 ACK 位都置 1,序号 seq=
(处于半关闭状态的服务器可能又发送了一些数据),还必须重复发送上次已发送的确认号 ack= 。这时服务器进入 LAST-ACK(最后确认)状态。 - 第四步(TCP 连接释放的过程及状态变化的时间分析 2016、2022、2024 年考过):客户机收到连接释放报文段后,必须发出确认,之后进入 TIME-WAIT(时间等待)状态。该报文段的 ACK 位置 1,确认号 ack=
,序号 seq= 。服务器收到该确认报文段后就进入 CLOSED(连接关闭)状态。客户机进入 TIME-WAIT 状态后,还要经过时间等待计时器设置的时间 2MSL(Maximum Segment Lifetime,最长报文段寿命)后,才进入 CLOSED 状态。
若服务器收到连接释放请求后不再发送数据,则从客户机发出 FIN 报文段时刻算起,客户机释放连接的最短时间为 1RTT + 2MSL,服务器释放连接的最短时间为 1.5RTT。
除时间等待计时器外,TCP 还使用一个保活计时器,以避免客户机突然出现故障,而导致服务器一直无效等待。服务器每收到一次客户的数据,就会重置保活计时器,若计时到期后还没有收到客户的数据,服务器就每隔 75 秒发送一个探测报文段。若连续发送 10 个探测报文段后仍未收到客户的响应,则服务器认为客户机出了故障,关闭这个连接。
小结
| 报文段 | 标志 | 序号 | 确认号 | 消耗序号 | |
|---|---|---|---|---|---|
| 建立 ① | 客户 → 服务器 | SYN=1 | —— | 1 | |
| 建立 ② | 服务器 → 客户 | SYN=1,ACK=1 | 1 | ||
| 建立 ③ | 客户 → 服务器 | ACK=1 | 不带数据则 0 | ||
| 释放 ① | 客户 → 服务器 | FIN=1 | —— | 1 | |
| 释放 ② | 服务器 → 客户 | ACK=1 | 0 | ||
| 释放 ③ | 服务器 → 客户 | FIN=1,ACK=1 | 1 | ||
| 释放 ④ | 客户 → 服务器 | ACK=1 | 0 |
释放 ① 的”确认号”一栏为”——“,是就教材的示意图而言的;按 5.3.2 的规定,连接建立后所有报文段的 ACK 都置 1,所以实际的 FIN 报文段也带有确认号。
计算模板
由序号求数据量
- 建立连接时 SYN 的序号为
,则第一个数据字节的序号为 。 - 释放连接时 FIN 的序号为
,则最后一个数据字节的序号为 。 - 已发送的数据字节数
(假设无重传)。
边界
错题复盘:第三次握手不带数据就不消耗序号,第一个数据报文段的序号是初始序号加 1
王道 5.3.7 第 28 题:甲发起与乙的 TCP 连接,甲选择的初始序号为 200,若甲和乙建立连接过程中最后一个报文段不携带数据,则 TCP 连接建立后,甲给乙发送的数据报文段的序号为(A. 203 B. 202 C. 201 D. 200)。答案 C。
第一次握手 SYN 报文段 seq=200,消耗一个序号;第三次握手 seq=201,不携带数据,不消耗序号。所以连接建立后甲发送的第一个数据报文段的序号仍为 201。
选 B、A 是把第二次、第三次握手也算进了甲的序号——第二次握手是乙发的,消耗的是乙的序号;第三次握手不带数据,什么都不消耗。
错题复盘:SYN 与 FIN 各占一个序号,数据字节数 = FIN 序号 − SYN 序号 − 1
2020 年统考真题(王道 5.3.7 第 54 题):若主机甲与主机乙建立 TCP 连接时,发送的 SYN 段中的序号为 1000,在断开连接时,主机甲发送给主机乙的 FIN 段中的序号为 5001,则在无任何重传的情况下,甲向乙已经发送的应用层数据的字节数为(A. 4002 B. 4001 C. 4000 D. 3999)。答案 C。
SYN 段的序号 1000 被 SYN 本身占用,第一个数据字节的序号为 1001;FIN 段的序号 5001 等于已传送数据最后一个字节的序号加 1,所以最后一个数据字节的序号为 5000。数据字节为 1001~5000,共
字节。 直接相减
是把 SYN 当成了数据;再加 1 得 4002 是端点都算。套公式 最稳。
错题复盘:服务器的 FIN 报文段 ack 一定是 x+1,但 seq 不一定是 y
王道 5.3.7 第 25 题:某客户与服务器建立 TCP 连接,当连接断开时,客户先向服务器发送一个标志 FIN=1 的报文段 A,此报文段中 seq 值为
,ack 值为 。一段时间后,客户收到了服务器发来的一个标志 FIN=1 的报文段 B,则下列关于报文段 B 的说法中,正确的是(A. B 中的 seq 值一定为 B. B 中的 seq 值一定为 C. B 中的 ack 值一定为 D. B 中的 ack 值一定为 )。答案 D。 客户发出 FIN 后就不再发送数据(半关闭),报文段 A 本身消耗一个序号,所以服务器此后所有报文段(包括 B)的确认号一定是
——第三次挥手要”重复发送上次已发送的确认号”。 服务器的序号则不确定:报文段 A 的 ack 值为
,说明客户期望服务器下一个字节是 ;但服务器在 CLOSE-WAIT 的半关闭状态下还可以继续发送数据,发多少都有可能,所以 B 的 seq 值只能写成 ,不一定等于 或 。
SYN 报文段不能携带数据,但要消耗一个序号;FIN 报文段即使不携带数据,也要消耗一个序号。 第三次握手的 ACK 可以携带数据,不携带则不消耗序号。
TCP 连接的端点是套接字。 不是主机、不是 IP 地址、不是进程、也不是端口;同一端口可以出现在多条连接中(服务器的 80 端口同时与许多客户相连)。
先发 FIN 的一方进入 TIME-WAIT。 教材中是客户机,但主动关闭的一方可以是任何一端;等待 2MSL 的是主动关闭方。
半关闭期间,被动关闭方仍可发送数据。 所以第三次挥手的序号
释放连接的最短时间:主动关闭方 1RTT + 2MSL,被动关闭方 1.5RTT(在被动方收到 FIN 后不再发数据的前提下)。
口径差异:为什么要等 2MSL,保活计时器多久触发
教材口径:客户机进入 TIME-WAIT 后,经过 2MSL 才进入 CLOSED;保活计时器到期后每隔 75 秒发一个探测报文段,连续 10 个无响应则关闭连接。
标准口径:等待 2MSL 有两个目的——若最后一个 ACK 丢失,服务器会重传 FIN,客户机还在 TIME-WAIT 就能再次确认;同时让本连接中所有迟到的报文段在网络中消失,不会混入之后用同一对套接字建立的新连接。MSL 的取值由实现决定,Linux 的 TIME-WAIT 固定为 60 秒。保活计时器在实际系统中默认空闲 2 小时才开始探测,Linux 默认间隔 75 秒、探测 9 次,均可调整。
考试按教材口径作答。
对照速查
| 说法 | 对错 |
|---|---|
| TCP 连接的端点是主机的 IP 地址 | ❌(套接字) |
| 同一个端口号可以出现在多个 TCP 连接中 | ✅ |
| SYN 报文段可以携带数据 | ❌(不能携带,但消耗一个序号) |
| 第三次握手的报文段可以携带数据 | ✅ |
| 第三次握手不带数据时,下一个数据报文段的序号仍为 | ✅ |
| 不带数据的 FIN 报文段不消耗序号 | ❌(消耗一个) |
| 客户机发送 FIN 后,服务器就不能再发送数据 | ❌(半关闭,服务器仍可发送) |
| 服务器收到最后的 ACK 后进入 TIME-WAIT | ❌(直接 CLOSED;TIME-WAIT 在主动关闭方) |
| 主动关闭方释放连接的最短时间是 1RTT + 2MSL | ✅ |
| 服务器第三次挥手报文段的确认号与第二次相同 | ✅ |
考点
- 三次握手:SYN=1,seq=x → SYN=1,ACK=1,seq=y,ack=x+1 → ACK=1,seq=x+1,ack=y+1(2011、2012、2016、2019)
- 四次挥手的序号、确认号(2020、2023)与状态(2021):FIN-WAIT-1、CLOSE-WAIT、FIN-WAIT-2、LAST-ACK、TIME-WAIT
- SYN、FIN 消耗序号;纯 ACK 不消耗
- 2MSL;释放时间 1RTT + 2MSL 与 1.5RTT(2016、2022、2024)
- 连接端点 = 套接字;保活计时器
链接
- 🏠 返回总览:计算机网络第 5 章:传输层总览
- ⬅️ 上一节:5.3.1~5.3.2 TCP 的特点与报文段
- ➡️ 下一节:5.3.4 TCP 可靠传输
- 🔗 5.1.2 套接字
- 📖 名词库:第 5 章名词库