← Back to Learning Notes

2 题型 - 连接控制

Chinese-language Computer Science 408 note: 2 题型 - 连接控制. Original source available where applicable.

On this page

This note is currently available in Chinese. The original wording, formulas and diagrams are preserved to avoid an unverified technical translation.

描述:TCP 连接控制题把三次握手、四次挥手、序号/确认号、状态机、慢开始窗口和 RTT/MSL 时间计算组合在一起。核心规则是:SYN、FIN 各占一个序号,纯 ACK 不占序号;仅当 ACK=1 时确认号字段有效,有效的累计确认号表示下一期待的连续字节序号。

TIP · 章节导航:返回第五章:运输层总纲

2.1 序号与确认号规则

2.1.1 序号消耗

报文段 是否消耗序号 消耗量
携带 $L$ B 数据 是 $L$
SYN=1 是 1
FIN=1 是 1
不带数据的纯 ACK 否 0

SYN 或 FIN 即使不携带数据,也各占用一个序号。

2.1.2 确认号

若已经按序收到对方截至序号 $x$ 的所有内容,则:

$$ ack=x+1 $$

只有 ACK=1 时确认号字段才有效。TCP 的确认是累计确认:确认号只推进到当前连续、无缺口的数据前缀之后,也就是首个尚未按序收到的字节序号,而不是“本次收到的报文段序号”。收到更高序号的失序报文段时,累计确认号不能越过缺口;启用 SACK 后可以额外报告已经收到的失序数据块,但不改变累计确认号本身的含义。

2.2 三次握手

设客户端初始序号为 $x$,服务器初始序号为 $y$:

次序 方向 标志与序号 发送后/收到后的典型状态
1 客户端 -> 服务器 SYN=1, seq=x 客户端 SYN-SENT
2 服务器 -> 客户端 SYN=1, ACK=1, seq=y, ack=x+1 服务器 SYN-RCVD
3 客户端 -> 服务器 ACK=1, seq=x+1, ack=y+1 双方进入 ESTABLISHED

为使时间最短,第三次握手的 ACK 可以同时携带第一个数据段;纯 ACK 本身不消耗序号,数据按长度消耗序号。

三次握手用于确认双方收发能力并同步初始序号,不能简化为只有两次报文交换。

2.3 四次挥手与状态

设客户端主动关闭:

步骤 方向 典型报文 主动方状态 被动方状态
1 主动方 -> 被动方 FIN=1, ACK=1 FIN-WAIT-1 收到后 CLOSE-WAIT
2 被动方 -> 主动方 ACK=1 收到后 FIN-WAIT-2 CLOSE-WAIT
3 被动方 -> 主动方 FIN=1, ACK=1 - 发送后 LAST-ACK
4 主动方 -> 被动方 ACK=1 TIME-WAIT 收到后 CLOSED

若被动方没有剩余数据且立即同意关闭,第 2 步 ACK 与第 3 步 FIN 可以合并成一个 FIN+ACK 报文段。逻辑上仍完成了对主动 FIN 的确认和被动方向的关闭,只是时间题中可按三段报文达到最短时间。

主动关闭方在发送最后 ACK 后进入 TIME-WAIT,等待 $2MSL$:

  • 若最后 ACK 丢失,可以再次响应对方重传的 FIN。
  • 让本连接产生的旧重复报文段在网络中消失,避免影响后续同四元组连接。

2.4 TCP 状态路径

2.4.1 主动打开、主动关闭方

CLOSED -> SYN-SENT -> ESTABLISHED
-> FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT -> CLOSED

2.4.2 被动打开、被动关闭方

CLOSED -> LISTEN -> SYN-RCVD -> ESTABLISHED
-> CLOSE-WAIT -> LAST-ACK -> CLOSED

正确拼写是 ESTABLISHED;原资料图中的 ESTANLISHE 是排版错误。

2.5 窗口与慢开始

发送方允许的在途数据窗口上限满足:

$$ swnd=\min(cwnd,rwnd) $$

若已有 $FlightSize$ 字节发出但尚未确认,则在窗口数值和确认状态不变的这一时刻,还可继续发送的字节数为 $\max(0,swnd-FlightSize)$;不能把整个 swnd 都当作剩余可发送量。

  • $cwnd$ 是拥塞窗口,由发送方拥塞控制决定。
  • $rwnd$ 是接收窗口,由接收方通告,承担流量控制。
  • 慢开始阶段,若每轮数据均被正常确认,$cwnd$ 可按 RTT 近似从 1、2、4、8 MSS 增长。
  • 实际一次能发送的数据仍受 $rwnd$ 限制。

本资料的时间题均按“忽略报文段发送时延、无重传、及时确认、为取得最短时间而允许捎带/合并”处理。

2.6 2024 年真题:3000 B 数据传输总时间

2.6.1 条件

数据量 = 3000 B
RTT = 10 ms
MSL = 30 s
MSS = 1000 B
初始 cwnd = 1 MSS
H 在数据传输完成后主动关闭

2.6.2 最短过程

  1. 第 1 个 RTT 完成三次握手;第三个报文段捎带 1 MSS 数据。
  2. 第 2 个 RTT 结束时,第 1 MSS 得到确认,$cwnd$ 从 1 增至 2。
  3. H 连续发送余下 2 MSS;第 3 个 RTT 结束时全部得到确认。
  4. H 立即发送 FIN;S 没有数据待发,把 ACK 与自己的 FIN 合并。
  5. 第 4 个 RTT 结束时 H 收到 FIN+ACK,发送最后 ACK 并进入 TIME-WAIT。
  6. H 再等待 $2MSL$ 后进入 CLOSED。

因此:

$$ T_H=4RTT+2MSL =4\times10\ \mathrm{ms}+2\times30\ \mathrm{s} =60.04\ \mathrm{s} $$

答案:D,60.04 s。

2.7 模拟题三:11 KB、接收窗口 4 KB

2.7.1 条件

数据量 = 11 KB
RTT = 10 ms
MSL = 30 s
MSS = 1 KB
接收窗口 rwnd = 4 KB = 4 MSS
每批数据都立即确认

慢开始与接收窗口共同限制发送量:

轮次 cwnd rwnd swnd 本轮发送
第 1 轮 1 MSS 4 MSS 1 MSS 1 KB
第 2 轮 2 MSS 4 MSS 2 MSS 2 KB
第 3 轮 4 MSS 4 MSS 4 MSS 4 KB
第 4 轮 8 MSS 4 MSS 4 MSS 4 KB

总量:

$$ 1+2+4+4=11\ \mathrm{KB} $$

三次握手的第三段捎带第 1 MSS。全部数据确认、最短释放并进入 TIME-WAIT 后:

$$ T_H=6RTT+2MSL =6\times10\ \mathrm{ms}+60\ \mathrm{s} =60.06\ \mathrm{s} $$

服务器 S 不进入 TIME-WAIT;最终 ACK 再经过半个 RTT 到达 S:

$$ T_S=6.5RTT=65\ \mathrm{ms} $$

H 的答案:C,60.06 s。

2.8 模拟题四:512 B 传输全过程

2.8.1 条件

A 为客户端,初始序号 100
B 为服务器,初始序号 200
A 向 B 发送 512 B
发送窗口 swnd = 100 B
每个满段携带 100 B
A 的第 2 个 TCP 报文段不携带数据
B 只发送确认,不发送应用数据

2.8.2 建立连接

  1. A 第 1 段:SYN=1, seq=100。
  2. B 第 1 段:SYN=1, ACK=1, seq=200, ack=101。
  3. A 第 2 段:ACK=1, seq=101, ack=201,不带数据。
  4. B 收到 A 的 SYN 并发送 SYN+ACK 后,处于 SYN-RCVD。

2.8.3 数据序号

512 B 按 100 B 窗口拆为:

A 的报文段 数据范围 seq 数据长度 B 返回的累计 ack
A-3 101-200 101 100 B 201
A-4 201-300 201 100 B 301
A-5 301-400 301 100 B 401
A-6 401-500 401 100 B 501
A-7 501-600 501 100 B 601
A-8 601-612 601 12 B 613

A 第 8 段因此满足:

ACK=1, seq=601, 数据长度=12 B

按标准 TCP 规则,B 在此之前只发送不带数据的 ACK,纯 ACK 不消耗序号,所以 A 第 8 段的 ack 应仍为 201。

原 PDF 答案把第(5)问写成 ack=202,但这与题干“B 仅给 A 发送确认”、图中 B 的 seq=201 以及“纯 ACK 不占序号”相冲突。标准推导应为 ack=201;这里保留该原答案差异,避免复习时把它当作 TCP 规则。

2.8.4 释放连接

B 确认全部 512 B 后返回 ack=613。随后:

  1. A 第 9 段发送连接释放请求:FIN=1, ACK=1, seq=613, ack=201;A 进入 FIN-WAIT-1。
  2. B 确认 A 的 FIN:ACK=1, seq=201, ack=614;A 收到后进入 FIN-WAIT-2,B 处于 CLOSE-WAIT。
  3. B 发送自己的 FIN:FIN=1, ACK=1, seq=201, ack=614;B 进入 LAST-ACK。B 的纯 ACK 没有消耗序号,所以 FIN 仍可使用 seq=201。
  4. A 最后一段:ACK=1, seq=614, ack=202;A 进入 TIME-WAIT。

这里最终 ack=202 是正确的,因为 B 的 FIN 从序号 201 开始并占用一个序号。

2.8.5 原题七问汇总

问题 结果
(1)A 第 1 段 SYN=1, seq=100
(2)B 第 1 段 SYN=1, ACK=1, seq=200, ack=101
(3)A 第 2 段 ACK=1, seq=101, ack=201
(4)B 的状态 SYN-RCVD
(5)A 第 8 段 ACK=1, seq=601, ack=201,12 B;原 PDF 写 ack=202
(6)A 第 9 段 释放段,FIN=1, ACK=1;发送后 FIN-WAIT-1
(7)A 最后一段 ACK=1, seq=614, ack=202;发送后 TIME-WAIT

2.9 忽略发送时延时的时序等价

当题目明确忽略 TCP 报文段的发送时延时,在时序图中:

  • 第三次握手 ACK 与紧接着的 HTTP 请求可以画成两条近乎重合的线。
  • 若允许捎带,也可把 ACK 与应用数据画在同一个 TCP 报文段中。
  • 两种画法的传播时间计算可以等价,但是否为同一报文段必须服从题目对“是否携带数据”的明确说明。

2.10 解题步骤

  1. 先画三次握手,给双方写出初始序号,并让 SYN 各消耗 1。
  2. 数据阶段按字节累计序号;先确认 ACK=1,再把累计确认号写为当前连续无缺口前缀之后的下一期待序号。
  3. 在途数据窗口上限用 $\min(cwnd,rwnd)$;若已有未确认数据,先扣除其占用量,再按 MSS 和剩余数据量分批。
  4. 时间题先数到主动方进入 TIME-WAIT 的 RTT,再额外加 $2MSL$。
  5. 释放阶段检查 ACK 与 FIN 是否可合并;SYN、FIN 占序号,纯 ACK 不占。
  6. 状态题分别沿主动方和被动方状态链判断,不能混用 FIN-WAIT 与 CLOSE-WAIT。

2.11 易错点

  • 第三次握手 ACK 可以携带数据,但若题目明确“不携带”,第一个数据段要另算。
  • 慢开始窗口增长还要受接收窗口限制,不能只看 cwnd。
  • SYN 和 FIN 即使没有数据也各占一个序号;纯 ACK 不占序号。
  • 主动关闭方进入 TIME-WAIT,被动关闭方通常进入 CLOSE-WAIT、LAST-ACK。
  • 题目问主动方最终 CLOSED 时间时,必须加 $2MSL$;问被动方则通常不加。
  • 不要把 RTT 当作单程时延,单程传播时间通常是 $RTT/2$。
  • 原资料 512 B 题第(5)问的 ack=202 与标准 TCP 规则冲突,标准答案应为 201;最终 ACK 的 ack=202 则正确。

相关知识

2.12 本节复盘

  • 三次握手依次为 SYN、SYN+ACK、ACK;SYN 占一个序号。
  • 四次挥手中主动方经历 FIN-WAIT-1 -> FIN-WAIT-2 -> TIME-WAIT,并等待 $2MSL$。
  • 发送窗口满足 $swnd=\min(cwnd,rwnd)$;慢开始在题目模型中按 1、2、4 MSS 增长。
  • 2024 年 3000 B 题最短时间为 $4RTT+2MSL=60.04$ s,答案 D。
  • 11 KB、rwnd=4 KB 题按 1+2+4+4 KB 发送,H 最短 60.06 s,答案 C。
  • 512 B 题最后 12 B 的序号为 601-612,A 的 FIN 序号为 613,最终 ACK 为 seq=614, ack=202。
  • 纯 ACK 不消耗序号;原 PDF 在 A 第 8 段确认号上存在一处与标准规则不一致的答案,复习时应采用 ack=201。