是什么

  • 定义:TCP 传输控制协议通过 三次握手 建立连接,利用基于滑动窗口的 流量控制(rwnd) 与基于慢开始/拥塞避免的 拥塞控制(cwnd) 协同决定发送速率,最终通过 四次挥手 释放连接的端到端全生命周期通信机制。

  • 大白话:发送方每发一步都要看两张“脸色”——网路堵不堵(cwnd 拥塞窗口)和对方的接收抽屉还剩多大空位(rwnd 接收窗口),哪边更小、更受限就听哪边的;发完数据再按严格的四次挥手流程彻底关门。

核心内容

1. 专业英文缩写全称对照表(考研高频)

英文缩写英文全称 (Full Name)中文名称大白话通俗解释
cwndCongestion Window拥塞窗口发送端自己估算的网络承载能力。“网路有多畅通,我就能发多少”。
rwndReceive Window接收窗口接收端在确认报文(ACK)里通知发送端的剩余缓存空位。“我这里还剩多大抽屉,你就最多塞多少”。
swndSend Window发送窗口发送方当前真正被允许发送的字节数。取决于两者的最小值:
MSSMaximum Segment Size最大报文段长TCP 报文段中应用层有效数据载荷的最大长度(不含 TCP 首部和 IP 首部)。
RTTRound-Trip Time往返时间发送方发送数据开始,到收到接收方的确认(ACK)总共经历的时延。
ssthreshSlow Start Threshold慢开始门限拥塞控制算法的分水岭。 用慢开始(指数涨); 用拥塞避免(线性加 1)。
ISNInitial Sequence Number初始序号TCP 建立连接(握手阶段)双方随机生成的第一个序列号起始值。
MSLMaximum Segment Lifetime最长报文段寿命报文段在网络中能够存活的最大时间。主动断开方必须等待 2MSL 时间才真正关闭。

2. 核心数学公式与控制机制

(1) 发送窗口确定规则

发送方的实际发送窗口大小受限于接收端处理能力与网络承载能力两者的较小值:

(2) 慢开始算法的底层增长机制

很多同学以为慢开始是“每过一个 RTT 翻倍”,其实翻倍只是宏观现象,底层触发规则是按单包 ACK 累加的

底层规则:在慢开始阶段(),发送方每收到一个对新数据段的 ACK,拥塞窗口就增加 1 个 MSS

  • 若当前轮发了 个段并全部收到确认,则 在该轮中累计增加 次,宏观上刚好从 (翻倍)。

  • 但若只收到当前轮中的前 个 ACK,拥塞窗口并不是翻倍,而是精确增加

(3) “只存入无取出”的接收窗口衰减模型

当接收端应用层进程由于繁忙或阻塞不读取缓存中的数据时,每接收 1 个数据段(大小为 MSS),可用接收缓存就消耗 1 个 MSS:

  • 当缓存被全部占满时,,此时即便网络畅通,,发送方被迫暂停发送新数据。

(4) 序号计算核心逻辑

  • SYN 报文段与 FIN 报文段虽不携带数据,但必须虚拟消耗 1 个序号

  • 若连接建立时发送方初始序号为 ,握手完成后应用层数据的第 1 个字节序号必定是:

  • 传输完 字节的数据后,下一个待发送的字节序号为:

3. 多轮传输时延与窗口变化过程

当忽略线路上的传输时延、仅考虑往返传播时延(RTT)时,每轮数据段从发出到全部确认耗时 1 个 RTT。

时间轴 (轮次)cwnd (拥塞窗口)rwnd (接收窗口)实际发送量 swnd = min(cwnd, rwnd)累计传输总量状态说明
第 1 个 RTT1 KB20 KB发送 1 KB (1个段)累计 1 KB收到 1 个 ACK
第 2 个 RTT2 KB19 KB发送 2 KB (2个段)累计 3 KB收到 2 个 ACK
第 3 个 RTT4 KB17 KB发送 4 KB (4个段)累计 7 KB收到 4 个 ACK
第 4 个 RTT8 KB13 KB发送 8 KB (8个段)累计 15 KB收到 8 个 ACK
第 5 个 RTT16 KB5 KB发送 5 KB (5个段)累计 20 KB发送量受限于 rwnd,S 缓存存满
第 5 轮结束21 KB0 KB0 KB (发送窗口关闭)总耗时 = 5 RTT收到最后 5 个 ACK,通告 rwnd=0
  • 平均传输速率计算:

4. 连接释放(挥手)最短时间流程

若 S(服务器)在收到连接断开请求后没有后续数据需要发送,第 2 次挥手(ACK)与第 3 次挥手(FIN)可以合并同包发出(捎带确认),耗时最短。

sequenceDiagram
    autonumber

    actor H3 as H3(客户端 / 主动关闭)
    actor S as S(服务器 / 被动关闭)

    Note over H3,S: t 时刻:通信结束,开始释放 TCP 连接

    H3->>S: FIN<br/>客户端发送 FIN
    Note right of H3: 单向传播:0.5 RTT

    Note over S: 收到 FIN<br/>无后续数据可发送
    S-->>H3: ACK + FIN<br/>确认客户端 FIN,并发送自身 FIN
    Note right of S: 单向传播:0.5 RTT

    Note over H3: 收到服务器 FIN<br/>立即回复最终 ACK
    H3->>S: ACK<br/>最终确认
    Note right of H3: 单向传播:0.5 RTT

    Note over S: 收到最终 ACK<br/>状态进入 CLOSED
    Note over H3: 状态进入 TIME_WAIT<br/>等待 2MSL 后关闭

    Note over H3,S: 服务器侧完成关闭耗时:1.5 RTT
  • 服务器端释放的最短时间推导

例题

题目

(2016年408统考第47题)假设 H3 访问 Web 服务器 S 时,S 为新建的 TCP 连接分配了 20KB()的接收缓存,最大段长 ,平均往返时间 。H3 建立连接时的初始序号为 100,且持续以 MSS 大小的段向 S 发送数据,拥塞窗口初始阈值为 32KB;S 对收到的每个段进行确认,并通告新的接收窗口。假定 TCP 连接建立完成后,S 端的 TCP 接收缓存仅有数据存入而无数据取出。请回答下列问题:

  1. 在 TCP 连接建立过程中,H3 收到的 S 发送过来的第二次握手 TCP 段的 SYN 和 ACK 标志位的值分别是多少?确认序号是多少?

  2. H3 收到的第 8 个确认段所通告的接收窗口是多少?此时 H3 的拥塞窗口变为多少?H3 的发送窗口变为多少?

  3. H3 的发送窗口等于 0 时,下一个待发送的数据段序号是多少?H3 从发送第 1 个数据段到发送窗口等于 0 时刻为止,平均数据传输速率是多少?(忽略段的传输时延)

  4. 若 H3 与 S 之间的通信已经结束,在 时刻 H3 请求断开该连接,则从 时刻起,S 释放该连接的最短时间是多少?

分析

  1. 第二次握手:连接建立确认报文标志位必为 SYN=1, ACK=1。H3 初始序号为 100,因 SYN 报文段虚拟消耗 1 个序号,S 确认号为

  2. 各窗口计算

    • 收到 8 个确认段说明 S 已经存入了 8 个数据段(),可用接收缓存

    • 慢开始阶段每收到 1 个 ACK,拥塞窗口 增加 1 个 MSS(1KB)。H3 初始 ,收到 8 个确认后

    • 发送窗口

  3. 窗口为 0 与平均速率

    • 发送窗口为 0 意味着接收缓存存满 20KB()。数据起始序号为 101,下一个待发送序号为

    • 传输轮次:1KB 2KB 4KB 8KB(前4轮累计15KB);第5轮受限于接收窗口仅能发 5KB(累计20KB)。共历时 5 个 RTT()。

    • 速率计算需把字节数乘以 8 转为比特,再除以 1 秒。

  4. 释放最短时间:H3 发出 FIN(0.5 RTT),S 收到且无数据要发,将 ACK 与自身 FIN 合并发出(0.5 RTT),H3 收到后发出最终 ACK 到达 S(0.5 RTT),S 收到确认立即释放连接,耗时 1.5 RTT。

答案

1)

在 TCP 连接建立过程中,第二次握手为服务器 S 发送给 H3 的确认与建立请求段:

因 H3 的初始序号为 100,且 SYN 段需消耗 1 个序号,故确认序号为:

2)

S 初始接收缓存大小为 20KB。收到第 8 个确认段表明 S 已存入 8 个大小为 1KB 的数据段,且无数据取出。通告的接收窗口为:

慢开始阶段每收到 1 个对新数据段的确认,拥塞窗口 增加 1 个 MSS(1KB)。H3 初始 ,收到 8 个确认段后:

H3 的发送窗口由拥塞窗口和接收窗口共同决定:

3)

S 的接收缓存总共可存放 20KB 数据,对应数据量为:

由于连接建立后第 1 个数据段起始序号为 101,故发送窗口等于 0 时,下一个待发送的数据段序号为:

各轮传输过程如下:

  • 第 1 轮传输:H3 发送 1 个段,耗时 1 个 RTT,累计发送 1KB;

  • 第 2 轮传输:H3 发送 2 个段,耗时 1 个 RTT,累计发送 3KB;

  • 第 3 轮传输:H3 发送 4 个段,耗时 1 个 RTT,累计发送 7KB;

  • 第 4 轮传输:H3 发送 8 个段,耗时 1 个 RTT,累计发送 15KB;

  • 第 5 轮传输:因通告 ,H3 发送最后 5 个段,耗时 1 个 RTT,S 缓存存满通告

总耗时为:

平均数据传输速率为:

4)

时刻起释放连接的最短流程为:

  1. 时刻 H3 发送连接释放段 FIN,经 到达 S;

  2. S 收到后,若无后续数据发送,可将针对该段的 ACK 与 S 自身的 FIN 段合并发送给 H3,经 到达 H3;

  3. H3 收到后立即发送最终 ACK,经 到达 S,S 收到后立即释放连接。

时刻起到 S 释放连接的最短时间为:

⚠️ 易错点

Warning

  • 慢开始的更新粒度是“按报文确认数”而非“按轮数”:慢开始算法每收到 1 个新段 ACK,拥塞窗口加 1 个 MSS。本题中收到第 8 个确认段,增加量就是 ,当前 。切勿误当成“过完 8 轮翻倍 8 次”。

  • 连接释放中主动方与被动方的等待时延不同

    • 主动关闭方(发起方,本题的 H3):发出最终 ACK 后必须在 TIME_WAIT 状态等待 2MSL 才能真正关闭。

    • 被动关闭方(接收方,本题的 S):只要收到最终 ACK 就立即进入 CLOSED 状态释放资源,不需要等待 2MSL。看清题目问的是 S 还是 H3。

  • 挥手最短时间的前提是合并报文(捎带确认):题目问“最短时间”,S 收到 FIN 后若无数据可发,会将第 2 次挥手(ACK)与第 3 次挥手(FIN)合并同包发送,跳过单向传输耗时,因此总耗时缩短为

  • 速率换算必须带比特系数:网络传输速率的基本单位是 (bit/s),算出的数据量是字节(Byte),必须严格乘以 8。,切勿直接写成