计算机网络 · 2027 考研计算机 408

第 5 章 传输层

目标院校:四川大学 / 电子科技大学 | 建议用时:概念 4 小时 + 例题练习 4 小时

本章地位:传输层是 408 计算机网络部分分值最重、大题最密集的一章:三次握手 / 四次挥手的序号推演、滑动窗口的吞吐率与信道利用率计算、拥塞窗口增长表推演(慢启动 / 拥塞避免 / 快重传 / 快恢复),都是反复出现的真题原型。复习抓三条线——概念线(端到端、复用分用、端口号、UDP 与 TCP 对比)、连接管理线(握手挥手每一步的 SYN / ACK / FIN 置位与 seq、ack 取值,为什么不是两次握手、TIME_WAIT 等 2MSL 的两个理由)、计算线(发送窗口 \(=\min(\text{rwnd},\text{cwnd})\),窗口与 RTT 求吞吐率 / 利用率,按事件序列逐轮推 cwnd 表)。所有例题都按「列公式 → 代数值 → 验算」完整走一遍。

考点常考题型热度本章位置
端到端通信、复用与分用、端口号分类与常用端口选择★★★★5.1
UDP 特点、首部与伪首部校验选择★★★★5.2
TCP 首部字段(序号 / 确认号 / 六个控制位 / 窗口)选择★★★★★5.3.1 / 5.3.2
三次握手、四次挥手、TIME_WAIT 2MSL选择 / 综合★★★★★5.3.3 / 5.3.4
累计确认、超时重传与快重传、SACK选择★★★★5.4.1
滑动窗口、发送窗口 = min(rwnd, cwnd)、吞吐率与利用率计算计算 / 大题★★★★★5.4.2
流量控制:零窗口、坚持定时器选择 / 计算★★★5.5
拥塞控制四算法与 cwnd 增长表推演大题 / 选择★★★★★5.6

5.1 传输层的功能与端口

5.1.1 端到端通信:从「主机到主机」到「进程到进程」

两层逻辑通信的分工网络层(IP 层)把分组从源主机送到目的主机,是主机到主机的逻辑通信;传输层则把报文段最终交给目的主机上的某个应用进程,是进程到进程(端到端)的逻辑通信。两台主机间通信的实质是「两台主机上的应用进程在通信」,路由器只工作在下三层,看不到传输层——这是判断「谁参与端到端通信」的关键。
传输层的功能① 提供应用进程间的逻辑通信(端到端,屏蔽下面网络的细节);② 复用与分用(见 5.1.2);③ 对收到的报文段进行差错检测(校验和,UDP / TCP 都有,而 IP 数据报只校验首部);④ 提供两种协议供选择:TCP(面向连接、可靠)与 UDP(无连接、不可靠);⑤ TCP 还额外提供连接管理、可靠传输、流量控制、拥塞控制。
易错① 「网络层已经提供端到端通信,传输层多余」——错:网络层只到主机,到进程的「最后一公里」靠端口号完成分用;
② 复用与分用是传输层独有的功能表述,数据链路层、网络层不讲这对概念;
③ 传输层差错检测针对整个报文段(首部+数据),IP 首部校验和只查首部——细节常做辨析选项。

5.1.2 复用与分用

复用与分用复用(multiplexing):发送方不同的应用进程都可以使用同一个传输层协议传送数据(当然要加上适当的首部,如端口号);分用(demultiplexing):接收方传输层剥去报文段首部后,能根据目的端口号把数据正确交付到相应的应用进程。
一句话:发送方多进程「共用」传输层发送叫复用,接收方传输层按端口「分发」数据叫分用。
一句话记忆分用的依据是端口号(目的端口);就像小区门卫(网络层)把快递送到楼(主机),传输层再按门牌号(端口号)送到户(进程)。

5.1.3 端口号分类与常用端口 · 套接字

端口号端口号是传输层的地址,用 16 bit 表示(0~65535),是逻辑端口 / 协议端口,不是物理接口。按 IANA 规定分三类:
  1. 熟知端口(well-known,0~1023):分配给 TCP/IP 最重要的一些应用程序,固定使用;
  2. 登记端口 / 注册端口(1024~49151):供没有熟知端口的应用程序登记使用,如 MySQL 3306;
  3. 短暂端口 / 动态端口(49152~65535):仅在客户进程运行时临时分配,通信结束即收回,是「客户的端口」。
应用端口号应用端口号
FTP 数据连接 / 控制20 / 21DNS53
SSH22TFTP69
Telnet23HTTP80
SMTP25POP3110
SNMP161HTTPS443
口诀「FTP 二十二十一,SSH 二十二,Telnet 二十三,SMTP 二十五,DNS 五十三,TFTP 六十九,HTTP 八十,POP3 一百一,SNMP 一百六十一,HTTPS 四百四十三」。选择题每年都从中抽一个,务必背熟。注意 FTP 控制连接 21、数据连接 20,别记反。
套接字套接字(Socket)\(=\)(IP 地址 : 端口号),唯一标识网络中的一个通信端点,如 192.168.1.10:80。一条 TCP 连接由四元组(源 IP、源端口、目的 IP、目的端口)唯一确定;同理,全网的 UDP 通信端点也由二元组(IP, 端口)标识。
例 1 真题风格 端口与套接字辨析

(1) 下列端口号中,属于「短暂端口」范围的是( )
A. 80 B. 1024 C. 40000 D. 65535
(2) 主机甲(IP 为 X)上的浏览器访问服务器乙(IP 为 Y)的 80 端口,甲的临时端口为 51000。该 TCP 连接的套接字对是什么?同一台服务器能否同时服务成千上万个这样的连接?

查看解答

(1) C。短暂端口范围是 49152~65535,40000 属于登记端口(1024~49151),80 属于熟知端口。注意边界:1024 是登记端口的第一号,65535 是短暂端口的最后一号。

(2) 套接字对为 (X:51000, Y:80)(源 IP、源端口、目的 IP、目的端口)。能——每个客户端连接的目的端口虽都是 80,但源 IP 或源端口不同,四元组就不同,服务器为每个四元组维持一条独立的连接,这正是服务器端能并发服务万千客户端的原理。

5.2 UDP 协议

5.2.1 UDP 的特点与首部格式

UDP 特点UDP(User Datagram Protocol)只在 IP 数据报服务上增加了端口复用分用和差错检测两个功能,特点是:
  1. 无连接:发送前无需建立连接,发送结束后也不释放,开销小、时延低;
  2. 尽最大努力交付:不保证可靠交付,主机不维持复杂的连接状态表;
  3. 面向报文:应用层交多长的报文,UDP 就照样发送多长的报文段,一次交付一个完整报文,既不合并也不拆分(对比:IP 层可能因 MTU 分片);报文太长时 IP 层分片效率低,太短时首部相对开销大——应用程序要自己选好报文大小;
  4. 无拥塞控制:网络拥塞也不会降低发送速率,适合实时应用(IP 电话、视频会议)容忍丢包但不接受时延抖动;
  5. 支持一对一、一对多、多对一、多对多的交互通信(TCP 只能一对一);
  6. 首部开销小,只有 8 B(TCP 首部最少 20 B)。
发送 UDP 数据报时临时加上「伪首部」参与校验和计算(不传输、不下发) 源 IP 地址(4 B) 目的 IP 地址(4 B) 全 0(1 B)未用字段 协议 17(1 B)UDP 的协议号 UDP 长度(2 B) 伪首部 源端口2 B 目的端口2 B 长度(首部+数据)2 B,最小值为 8 校验和2 B 首部 8 B 应用数据(报文整体交付,不拆分不合并) · 校验和覆盖「伪首部 + UDP 首部 + UDP 数据」,按 16 bit 字做二进制反码求和再取反; · 数据部分字节数为奇数时先补一个全 0 字节凑偶再算(填充不传输);伪首部仅供计算,不向下传也不向上交。
图 5-1 UDP 用户数据报的首部(8 B)与伪首部(12 B):伪首部只在计算校验和时临时出现,目的是让校验同时检查「送没送到正确的主机(IP)与正确的协议(17)」

5.2.2 伪首部与校验和计算

校验要点① UDP 校验和是可选的(全 0 表示不校验;若计算结果恰为全 0,则存储全 1,因为全 0 有专用含义);
② 计算范围 = 伪首部(12 B)+ UDP 用户数据报(首部 8 B + 数据);伪首部包含源 IP、目的 IP、全 0、协议号 17、UDP 长度;
③ 接收方把伪首部再加上重算一遍,结果为全 1(取反后全 0)才收下,否则悄悄丢弃(UDP 差错处理就这一招:丢弃,或丢弃并告诉应用层,没有重传)。
例 2 真题风格 UDP 长度与封装计算

某应用层进程把一个 \(1000\,\text{B}\) 的报文交付给 UDP 发送(IP 首部 20 B,忽略以太网封装)。求:(1) UDP 用户数据报的总长度与其首部中「长度」字段的值;(2) 校验和计算覆盖的字节数;(3) 若报文改为 \(1001\,\text{B}\),校验和计算与(2)有何不同?

查看解答

(1) UDP 数据报 = 首部 8 B + 数据 1000 B \(=1008\) B;「长度」字段填 1008(指 UDP 首部+数据的总长,不是数据长度,也不是 IP 数据报长度)。

(2) 覆盖 = 伪首部 12 + UDP 数据报 1008 \(=1020\) B。

(3) 1001 B 为奇数,计算校验和时要在数据末尾补一个全 0 字节凑成偶数字节,覆盖 \(12+8+1001+1=1022\) B;但「长度」字段和实际传输长度仍按 1001 B 计,填充字节不传输。

套路总结:长度字段 = 8+数据;校验覆盖 = 12+8+数据(奇数补 0 只影响计算)。

UDP 适用场景适合一次性传送少量数据(如 DNS 查询:一问一答,建连接得不偿失)、实时性要求高、容忍丢包的场景(流媒体、IP 电话、视频会议)、以及广播 / 组播场景。典型 UDP 应用:DNS、RIP、DHCP(BootP)、SNMP、TFTP、实时音视频。一句话:快、省、敢丢就用 UDP。
练习 1

判断正误:(1) UDP 提供复用分用与差错检测功能;(2) UDP 校验和出错时由接收端请求重传;(3) UDP 适合传送电话会议的音视频数据;(4) 应用层交给 UDP 一个 10000 B 的长报文,UDP 会把它拆成多个报文段提高效率。

查看答案

(1) 对。(2) 错,UDP 无重传机制,校验错就丢弃(可选地上报应用层)。(3) 对,实时应用宁可丢包也不要重传带来的时延。(4) 错,UDP 面向报文,原样发送整个报文,不拆分(拆分是应用层或 IP 分片的事)。

5.3 TCP 报文段与连接管理 高频大题

5.3.1 TCP 的特点与报文段首部

TCP 特点TCP(Transmission Control Protocol)是面向连接的传输层协议:
  1. 面向连接:必须先三次握手建立连接,传输数据,最后挥手释放;
  2. 每条 TCP 连接只能点对点(一对一),不支持一对多、多播、广播;
  3. 可靠交付:无差错、不丢失、不重复、按序到达(手段见 5.4);
  4. 全双工:两端都设有发送缓存和接收缓存,双向可同时传输;
  5. 面向字节流:TCP 把应用层交下来的数据看成一连串无结构的字节流,自行划分报文段(受 MSS、窗口控制),应用进程写入的字节与对方读出的字节完全一样但边界不保证一致。
源端口(16 bit)2 B 目的端口(16 bit)2 B 序号 seq(32 bit)本报文段数据部分第一个字节的序号——面向字节流的核心 确认号 ack(32 bit)期望收到对方下一个报文段数据的第一个字节的序号(累计确认) 数据偏移(4 bit)首部长度,单位 4 B 保留(6 bit)置 0 URG ACK PSH RST SYN FIN六个控制位,各 1 bit 窗口(16 bit)接收窗口 rwnd,通知对方 校验和(16 bit)同 UDP,要加伪首部(协议号 6) 紧急指针(16 bit)URG=1 时有效,指出紧急数据末尾 选项(长度可变,0~40 B)+ 填充MSS、窗口扩大、时间戳、SACK 等;须补齐为 4 B 的整数倍 固定首部 20 B + 选项最长 40 B ⇒ 首部共 20~60 B;「数据偏移」字段最大 15,15×4 B = 60 B。 六控制位速记:URG 紧急、ACK 确认(连接建立后所有报文段都置 1)、PSH 推送、RST 复位、SYN 同步 / 建连、FIN 终止 / 释放。
图 5-2 TCP 报文段首部(固定 20 B,加选项最多 60 B):考得最狠的四个字段是序号、确认号、六个控制位、窗口——三次握手与四次挥手全靠它们
易错① 窗口字段是自己的接收窗口(用来通知对方「你可以发多少」),不是自己的发送窗口,更不是拥塞窗口;
② 数据偏移的单位是 4 B,不是 1 B,也不是 8 B;
③ URG 与紧急指针配合让紧急数据「插队」发送,但紧急数据仍在报文段中,不会单独成段;PSH 是让接收方尽快上交应用进程;
④ TCP 校验和同样要加伪首部(协议号为 6),UDP / TCP 都检查「整个报文段+伪首部」。

5.3.2 序号与确认号:面向字节流

序号机制TCP 给数据流中每一个字节都编一个序号:序号字段 seq = 本报文段所发送数据的第一个字节的序号;确认号字段 ack = 期望收到对方下一个报文段数据的第一个字节的序号,含义是「ack 之前的字节全部正确收到」(累计确认)。
  • 设上一段末字节序号为 \(n\),则下一段 seq \(=n+1\),对方确认 ack \(=n+1\);
  • SYN 和 FIN 各消耗一个序号(即使不携带数据),纯 ACK 报文段不消耗序号;携带数据的 SYN 段消耗「1+数据字节数」;
  • MSS(最大报文段长度)指报文段中数据部分的最大长度,不含首部;以太网典型 MSS = 1460 B(MTU 1500 − IP 头 20 − TCP 头 20)。
例 3 高频考点 序号与确认号推演

主机甲向主机乙发送 TCP 报文段:第一个报文段携带 100 B 数据,seq = 101;第二个报文段携带 200 B 数据。乙正确收到这两个报文段后发回确认,确认号是多少?若第二个报文段丢失、第一个正确到达,乙的确认号又是多少?

查看解答

第一段数据字节序号 101~200,第二段 seq = 201,字节 201~400。

两段都收到:乙期望下一个字节是 401,ack = 401(累计确认:401 之前的都收到了)。

第二段丢失:乙只收到 101~200,仍只能确认 ack = 201——虽然后面的没到,但累计确认只能确认连续收到的部分。

套路总结:ack = 已连续收到的最后字节序号 + 1 = 下一段的 seq。

5.3.3 三次握手建立连接

客户 A 服务器 B ① SYN=1, seq=x (不携带数据,消耗序号 x) SYN-SENT ② SYN=1, ACK=1, seq=y, ack=x+1 SYN-RCVD (SYN 消耗 y, 期望收 x+1) ③ ACK=1, seq=x+1, ack=y+1(可携带数据) ESTABLISHED ESTABLISHED CLOSED→主动打开 LISTEN(被动打开) 第①②步的 SYN 各消耗一个序号:A 的数据从 x+1 起,B 的数据从 y+1 起
图 5-3 三次握手:① 客户 SYN=1, seq=x;② 服务器 SYN=1, ACK=1, seq=y, ack=x+1;③ 客户 ACK=1, seq=x+1, ack=y+1,此后双方 ESTABLISHED,③ 可捎带数据而②不能捎带客户方向的数据
为什么不能是两次握手?核心答案:防止「已失效的连接请求报文段」突然又传送到 B,产生错误连接、浪费资源。设 A 的某连接请求因网络滞留迟到,A 已超时放弃;若只需两次握手,该失效请求到达 B 并被确认后,B 就单方面认为连接建立,一直等待 A 的数据,白占资源;而三次握手下,B 收不到 A 的第三次确认(A 不会理会 B 的确认),就知道连接未建成。同时三次握手也双方都确认了「对方的收发能力正常」并同步了起始序号 x、y。
一句记牢SYN=1 的报文段不能携带数据,但要消耗一个序号;第三次握手报文段可以携带数据,若不携带数据则不消耗序号(seq=x+1 只是「准备好了」的下一个发送序号)。另外两次握手也不能「同步双方起始序号」——B 无法确认 B→A 方向可靠。

5.3.4 四次挥手释放连接 · TIME_WAIT

客户 A 服务器 B ① FIN=1, seq=u (数据已发完,消耗序号 u) FIN-WAIT-1 ② ACK=1, ack=u+1 (B 还有数据要发,先不 FIN) CLOSE-WAIT FIN-WAIT-2(半关闭) ③ FIN=1, ACK=1, seq=w, ack=u+1 (数据发完) LAST-ACK ④ ACK=1, ack=w+1 (A 发出后进入 TIME-WAIT) TIME-WAIT 等 2MSL 后 CLOSED 收到 ④ 即 CLOSED TIME-WAIT = 2MSL,然后才真正关闭MSL:最长报文段寿命(典型 30 s~2 min)
图 5-4 四次挥手:① A FIN=1, seq=u;② B ACK=1, ack=u+1(B 进入 CLOSE-WAIT,A 半关闭);③ B 数据发完后 FIN=1, ACK=1, seq=w, ack=u+1;④ A ACK=1, ack=w+1,等 2MSL 后关闭
TIME_WAIT = 2MSL 的两个理由① 保证最后一个 ACK 能到达 B:若 ④ 丢失,B 超时重传 FIN,A 还在 TIME_WAIT 就能重发确认;若 A 直接关闭,B 将收不到确认无法正常关闭;
② 让本连接持续时间内产生的所有报文段都从网络中消失,使下一个新连接不会收到旧连接的迟到报文段。
另外:FIN 比 SYN 多一次挥手,是因为 TCP 全双工——B 收到 FIN 后可能还有数据没发完,得先 ACK、等数据发完再发自己的 FIN,ACK 与 FIN 分开发就成了四次。
两个一句话考点同时打开:双方同时发 SYN(各自主动打开),每个方向都要「SYN→SYN+ACK」两步,状态经 SYN-SENT 直接进 SYN-RCVD,最终仍建立一条连接,说明「三次握手」的本质是「每个方向 SYN + ACK 各一次」。半关闭:A 发 FIN 并收到确认后进入 FIN-WAIT-2,A 不再发数据但仍能收 B 的数据——TCP 半关闭(half-close)。
例 4 真题风格 握手全程序号推演

主机甲(客户)与主机乙(服务器)建立 TCP 连接,甲选择的初始序号 \(x=1000\),乙选择的初始序号 \(y=5000\)。(1) 写出三次握手中每个报文段的 SYN / ACK 置位与 seq、ack 值;(2) 第三次握手中甲捎带了 200 B 数据,该数据字节的序号范围?随后甲又发送 300 B 数据,该段的 seq 是多少?(3) 若乙随后发送第一段 500 B 数据,其 seq 是多少?

查看解答

(1) ① 甲→乙:SYN=1, seq=1000;② 乙→甲:SYN=1, ACK=1, seq=5000, ack=1001;③ 甲→乙:ACK=1, seq=1001, ack=5001。

(2) SYN 消耗序号 1000,所以数据从 1001 开始:第一段数据序号 1001~1200;第三段 seq = 1201(下一字节序号 = 1200+1)。

(3) 乙的 SYN 消耗序号 5000,乙发送数据从 5001 开始,该段 seq = 5001。

验算:甲③的 ack=5001 = 乙的数据起始序号 ✓;乙对甲捎带数据的确认应为 ack=1201 ✓,与(2)第二段 seq 一致。

练习 2

(1) 三次握手中,「主机的收发能力都正常」是在第几步之后双方才都确认的?(2) 四次挥手中 B 的 CLOSE-WAIT 状态意味着什么?(3) 判断:连接建立后传送的每个 TCP 报文段 ACK 都置 1;TIME_WAIT 只出现在主动关闭方。

查看答案

(1) 第三次握手完成后:①后 B 知道 A 能发;②后 A 知道 B 能收能发;③后 B 才知道 A 能收。

(2) B 已收到 A 的 FIN 并发出确认,但自己还有数据要继续发送,等数据发完再发 FIN——这是需要四次(而非三次)挥手的根源。

(3) 对;对——TIME_WAIT(2MSL)只在主动关闭(先发 FIN)的一端出现。

5.4 TCP 可靠传输

5.4.1 可靠传输的手段与重传机制

五个手段TCP 在不可靠的 IP 服务之上实现可靠传输,靠五件事:校验(与 UDP 类似,加伪首部查整个报文段)、序号(给字节编号,解决失序与重复)、确认(累计确认)、重传(超时重传+快重传)、纠错即丢弃错段等待重传。核心机制是自动重传请求 ARQ:发送后启动定时器,收不到确认就重传。
累计确认与捎带确认累计确认:确认号表示「到此为止的字节全部正确收到」,一个确认可以「顺带确认」前面所有已到报文段;优点是确认开销小、即使某个确认丢失也可能不打紧(后续确认覆盖),缺点是无法告知发送方「后面哪些已到」——这由 SACK(选择性确认)选项弥补:在选项字段中标注已收到的不连续字节块边界,让发送方只重传真正缺的部分。
捎带确认:接收方不单独发确认,而是搭在自己反方向发送的数据报文段的 ack 字段里捎回去(TCP 全双工,双向都有数据时几乎总是捎带),确认本身不消耗序号。
超时重传与快重传超时重传:每发送一个报文段就启动一个重传定时器,超过重传超时时间 RTO 未收到确认即重传。RTO 必须自适应网络往返时延:RTO 应略大于加权平均往返时间 RTTs(平滑往返时间), \[ \text{RTT}s=\text{RTT}s_{\text{旧}}\times(1-\alpha)+\text{新RTT样本}\times\alpha,\qquad \text{RTO}=\text{RTT}s+4\times\text{RTT}_d \] 其中 RTTd 是 RTT 偏差的加权平均,\(0\le\alpha<1\)(标准推荐 \(\alpha=1/8\))。
快重传:接收方收到失序报文段就重复发送对最后一个连续字节的确认;发送方一连收到 3 个重复(冗余)的 ACK,不等超时立即重传缺的报文段——比等 RTO 快得多,是轻度拥塞的信号(用途见 5.6 快恢复)。

5.4.2 滑动窗口与发送窗口(核心公式)

字节流按序号排列(每格代表一个报文段),发送窗口随确认向前滑动 已发送已收到确认 已发送未收到确认 允许发送尚未发送 窗口外:暂不允许发送收到新确认后才能进入窗口 发送窗口 = min(接收方通告的 rwnd,发送方的 cwnd) 后沿:收到确认向前移 前沿:窗口增大才右移 发送方规则:只要「已发送未确认 + 新可发送」不超窗口就可连续发送,无需停等每段确认——这正是提高利用率的关键(rwnd 由接收方流量控制决定,见 5.5;cwnd 由发送方拥塞控制决定,见 5.6)
图 5-5 TCP 滑动窗口:发送窗口内的数据可连续发送;收到新的累计确认后沿右移,窗口扩大时前沿右移
例 5 高频大题 窗口 · RTT 求吞吐率与信道利用率

主机甲通过一条 TCP 连接向主机乙发送数据:发送速率(链路带宽)\(R=8\,\text{Mb/s}\),MSS \(=1000\,\text{B}\),发送窗口固定为 \(5000\,\text{B}\)(5 个报文段),往返时延 RTT \(=24\,\text{ms}\),忽略确认帧发送时延与处理时延,不发生差错。(1) 连续发送一个窗口的数据需多久?(2) 第一段报文的确认何时到达?(3) 此后的稳态周期多长、吞吐率多少?(4) 信道利用率是多少?(5) 要让利用率达到 100%,窗口至少多大?

查看解答

(1) 单段发送时延:

\[ T_L=\frac{1000\times8}{8\times10^{6}}=10^{-3}\,\text{s}=1\,\text{ms} \]

一个窗口 5 段连续发送完需 \(5\times1=5\) ms。

(2) 从 t=0 发第一段:第一段最后一位于 1 ms 时发出,经 RTT=24 ms 后确认返回,即 \(1+24=25\) ms 时刻到达。

(3) 稳态周期:发 5 ms → 等到 25 ms 窗口前移 → 再发 5 ms…周期 \(=1+24=25\) ms,每周期运走 \(5\times1000\,\text{B}=40\,000\) bit:

\[ \text{吞吐率}=\frac{40000}{25\times10^{-3}}=1.6\times10^{6}\ \text{bps}=1.6\ \text{Mb/s} \]

(4) 利用率 = 有数据可发的时间占比:

\[ U=\frac{5}{25}=20\% \]

(5) 连续发送要求「发完窗口用时 ≥ 确认到达时间」,即 \(W\times1\ge 25\),\(W\ge25\) 段,窗口至少 \(25\times1000=25\,000\,\text{B}\)(此时吞吐率打满 8 Mb/s)。

套路总结:单段发送时延 \(T_L=\text{MSS}\times8/R\);周期 \(=T_L+\text{RTT}\);吞吐率 \(=\) 窗口字节数 \(\div\) 周期;利用率 \(U=\) 发送窗口段数 \(\times T_L\div(T_L+\text{RTT})\),上限 100%。

练习 3

接例 5 的连接:若甲的拥塞窗口 cwnd \(=3000\,\text{B}\),乙通告的接收窗口 rwnd \(=4000\,\text{B}\),甲的发送窗口是多少?此时再求一遍吞吐率。

查看答案

发送窗口 \(=\min(4000,3000)=3000\,\text{B}=3\) 段;周期仍为 25 ms,每周期发 3 段:

\[ \text{吞吐率}=\frac{3\times8000}{25\times10^{-3}}=0.96\ \text{Mb/s},\qquad U=\frac{3}{25}=12\% \]

可见瓶颈从「窗口太小填不满管道」变成了「拥塞窗口更小」,永远取两者较小值。

5.5 TCP 流量控制

流量控制流量控制是点对点(端到端)的:抑制发送方速率,使不超过接收方的接收处理能力(接收缓存)。手段就是接收窗口 rwnd:接收方把「当前还能接收的字节数」写进 TCP 首部的窗口字段通告对方;发送方发送窗口 \(=\min(\text{rwnd},\text{cwnd})\),永不发超过 rwnd 的在途未确认数据。
零窗口与坚持定时器接收缓存被占满时通告 rwnd = 0,发送方停止发送。之后接收方腾出缓存后发出的「窗口增大」通知若丢失,双方就会互相死等:B 等 A 发数据、A 等 B 的非零窗口通知——死锁。TCP 的解法:A 收到零窗口通知即启动坚持定时器,定时器到点就发送零窗口探测报文段(仅 1 B 数据),B 的响应中携带最新窗口值;探测有丢失也能靠下一次探测弥补,死锁解除(探测报文即使遇 rwnd=0 也会被接收缓存接收并确认,不会被丢弃)。
例 6 真题风格 通告窗口序列推演

主机甲向主机乙发送数据,乙的接收缓存为 4000 B,甲的拥塞窗口恒为 6000 B(不构成瓶颈)。乙按缓存占用情况依次通告接收窗口:收到 2000 B 数据后通告 rwnd₁;甲再发 2000 B 后(应用进程尚未读取)通告 rwnd₂;随后乙的应用进程取走 2000 B 再通告 rwnd₃;全部取走后通告 rwnd₄。求 rwnd₁~rwnd₄ 及甲对应的发送窗口,并说明 rwnd₂ 之后甲的动作。

查看解答

发送窗口恒取 \(\min(6000,\text{rwnd})\),逐项代入:

时刻事件乙缓存占用通告 rwnd甲发送窗口
0初始,缓存空0 B4000 Bmin(6000, 4000) = 4000 B
1乙收到 2000 B2000 Brwnd₁ = 2000 B2000 B
2又收到 2000 B4000 Brwnd₂ = 00,停止发送,启动坚持定时器
3应用取走 2000 B2000 Brwnd₃ = 2000 B2000 B,恢复发送
4应用再取走 2000 B0 Brwnd₄ = 4000 B4000 B

验算:每行 rwnd = 4000 − 占用,占用 = 已收 − 已取,逐行核对无误 ✓。rwnd₂ = 0 后若 rwnd₃ 的通告丢失,甲的坚持定时器到点即发 1 B 探测报文,避免死锁。

套路总结:rwnd = 接收缓存总量 − (已收到未读取的占用);发送窗口 = min(rwnd, cwnd),rwnd=0 停发+探测。

易错:流量控制 vs 拥塞控制流量控制怕接收方撑死(点对点,依据 rwnd);拥塞控制怕网络堵死(全局性,依据 cwnd,由发送方自行推断)。两者都通过限制发送窗口起作用,且发送窗口取二者较小值——「接收方和网络至少一个受不了就慢下来」。另一个常考细节:rwnd=0 时接收方仍须接收并确认「零窗口探测报文段」与「重传报文段」。

5.6 TCP 拥塞控制 高频大题

5.6.1 四个算法:慢启动 / 拥塞避免 / 快重传 / 快恢复

拥塞与拥塞控制拥塞(congestion):对网络中某一资源的需求超过了该资源所能提供的部分,网络性能急剧恶化的现象(吞吐量随负载增大反而下降,甚至趋零)。拥塞控制是全局性的:涉及所有主机、路由器,目的是防止过多的数据注入网络。TCP 拥塞控制采用闭环控制思路——发送方维护拥塞窗口 cwnd,根据「网络反馈」(超时 / 冗余 ACK)动态调整,并始终满足: \[ \text{发送窗口}=\min(\text{接收窗口 rwnd},\ \text{拥塞窗口 cwnd}) \] 判断拥塞的两种信号:重传定时器超时(重度拥塞,连 ACK 都回不来了)与收到 3 个冗余 ACK(轻度拥塞,网络还能传一些数据)——两种信号的处理完全不同,是大题的关键分岔。
四个算法(408 标准口径)以传输轮次为单位(一轮 = 一个 RTT,拥塞窗口单位为报文段个数(每段一个 MSS)):
  1. 慢启动(slow start):cwnd 从 1 个 MSS 开始,每收到一个新确认 cwnd 加 1 个 MSS,每轮翻倍(1→2→4→8…,指数增长);「慢」指起点低而非增长慢。
  2. 拥塞避免(congestion avoidance):当 cwnd 达到慢启动门限 ssthresh 后转入,每轮 cwnd 只加 1 个 MSS(线性增长,加法增大)。
  3. 超时(重传定时器溢出)→ 乘法减小 + 从头再来:置 \( \text{ssthresh}=\max(\text{当前 cwnd}\times\tfrac{1}{2},\ 2)\)(减半,但不能小于 2 个 MSS),然后 cwnd 重置为 1,重新慢启动。
  4. 快重传 + 快恢复:收到 3 个冗余 ACK 时立即快重传丢失段;同时 \(\text{ssthresh}=\text{当前 cwnd}\times\frac{1}{2}\),但不回到 1,而是直接置 cwnd = 新 ssthresh,就地进入拥塞避免(快恢复)。
传输轮次(每 RTT 一轮)→ 拥塞窗口 cwnd(MSS)→ 0 4 8 12 16 ssthresh = 8 6 慢启动(每轮×2) 拥塞避免(每轮 +1) 超时! ssthresh=8, cwnd=1 3 个冗余 ACK! ssthresh=6, cwnd=6(快恢复) 再次慢启动
图 5-6 TCP 拥塞控制典型曲线(对应例 7):慢启动指数增长到 ssthresh=8 后线性加法增大;cwnd=16 时超时 → 门限减半为 8、cwnd 归 1 重新慢启动;再次线性增长到 12 时收到 3 个冗余 ACK → 门限减半为 6、cwnd 直接设为 6 继续拥塞避免
超时 vs 3 个冗余 ACK(必考对比)两者都把 ssthresh 减半(乘法减小),差别在 cwnd 的处置:超时说明网络可能已经瘫了,反应最重——cwnd=1,重新慢启动;3 个冗余 ACK说明网络仍在传数据(ACK 都回得来),只是轻度拥塞——cwnd=新 ssthresh,直接拥塞避免(快恢复)。另外注意:每次超时 / 3ACK 后的新 ssthresh 都要重新计算(用当时的 cwnd),大题就在这里设数。

5.6.2 拥塞窗口推演例题(大题题型)

推演三步法① 每轮开始按当前 cwnd 发送,事件都发生在「该轮发送结束后」;② 慢启动每轮翻倍,一旦 cwnd 达到 ssthresh 就改拥塞避免(每轮 +1);③ 遇事件先算新 ssthresh = 当前 cwnd ÷ 2(不足 2 取 2),再问自己:超时还是 3 个冗余 ACK?超时 cwnd=1 回慢启动;3ACK 则 cwnd=新 ssthresh 直接拥塞避免。
例 7 高频大题 超时 + 3 冗余 ACK 混合推演

TCP 连接建立后,发送方 cwnd = 1 MSS,ssthresh = 8 MSS。传输过程中:第 12 轮发送结束时(cwnd=16)重传定时器超时;恢复后第 20 轮发送结束时(cwnd=12)连续收到 3 个冗余 ACK。(1) 推演第 1~21 轮的 cwnd 变化表(每轮发送的 MSS 数与轮末 cwnd);(2) 前 20 轮共发送多少个报文段?(3) 第 21 轮结束时的 cwnd?

查看解答

(1) 事件一(超时,cwnd=16):新 ssthresh \(=16\div2=8\),cwnd 归 1 回慢启动;事件二(3 个冗余 ACK,cwnd=12):新 ssthresh \(=12\div2=6\),cwnd=6 直接拥塞避免。

轮次本轮发送(MSS)轮末 cwnd阶段 / 事件
1~31、2、42、4、8慢启动翻倍;第 3 轮末达 8 = ssthresh
4~118、9、10、11、12、13、14、159、10、11、12、13、14、15、16拥塞避免(每轮 +1)
12161超时:ssthresh=8,cwnd=1
13~161、2、4、82、4、8、9慢启动翻倍;第 16 轮初已到 8,改线性
17~209、10、11、1210、11、12、6拥塞避免;第 20 轮末 3 冗余 ACK:ssthresh=6,cwnd=6
2167快恢复后就地拥塞避免(+1)

(2) 各轮发送量求和:

\[ (1+2+4)+(8+9+\cdots+16)+(1+2+4+8)+(9+10+11+12) \]

\[ =7+108+15+42=172\ \text{个报文段} \]

验算:轮 4~12 共 9 项等差,\((8+16)\times9\div2=108\) ✓;三次分段和 7+15+42=64,64+108=172 ✓。

(3) 第 21 轮按 cwnd=6 发送、线性增长,轮末 cwnd = 7(ssthresh 保持 6)。

套路总结:表格分四段(慢启动段 / 线性段 / 事件行 / 新一轮慢启动段),每段单独求和再相加,绝不能一个数一个数硬加到昏。

例 8 真题风格 先 3ACK 后超时(顺序颠倒)

仍设 cwnd = 1 MSS、ssthresh = 8 MSS 起步。这次:第 6 轮发送结束时(cwnd=10)先收到 3 个冗余 ACK;恢复后第 9 轮发送结束时(cwnd=8)发生超时。(1) 推演第 1~13 轮 cwnd 变化表;(2) 前 13 轮共发送多少个报文段?

查看解答

(1) 事件一(3ACK,cwnd=10):ssthresh \(=10\div2=5\),cwnd=5,直接拥塞避免;事件二(超时,cwnd=8):ssthresh \(=8\div2=4\),cwnd=1,重新慢启动。

轮次本轮发送(MSS)轮末 cwnd阶段 / 事件
1~31、2、42、4、8慢启动;第 3 轮末达 8
4~68、9、109、10、5拥塞避免;第 6 轮末 3 冗余 ACK:ssthresh=5,cwnd=5
7~95、6、76、7、1快恢复后拥塞避免;第 9 轮末超时:ssthresh=4,cwnd=1
10~121、2、42、4、5慢启动;第 12 轮初 cwnd=4 达 ssthresh,轮末只 +1
1356拥塞避免(+1)

(2) 分段求和:

\[ (1+2+4+8)+(9+10)+(5+6+7)+(1+2+4+5)=15+19+18+12=64\ \text{个报文段} \]

验算:15+19=34,34+18=52,52+12=64 ✓。

易错:第 12 轮开始时 cwnd 已等于 ssthresh=4,本轮发送 4 个后是「到达门限后的第一轮」,按拥塞避免只加 1 得 5——不要错翻倍成 8。

口径与歧义说明① 408 按教材口径:门限减半即 \(\text{ssthresh}=\text{cwnd}/2\)(乘法减小因子 1/2),不足 2 个 MSS 时取 2;奇数减半出现 .5 时真题通常给偶数,若真遇到按题干四舍五入口径处理;
② 慢启动翻倍若会「越过」新 ssthresh(如 4 翻到 8 越过 5),通用处理是增长到 ssthresh 即止、转入拥塞避免,命题一般回避这种设计(门限设成 4、8、16 等恰好可达的值);
③ 快恢复后 cwnd=新 ssthresh,不是旧 ssthresh,更不是 cwnd/2 再 +1。

5.7 章末自测 真题风格

限时 50 分钟,先做后看答案。难度:★★ 基础 / ★★★ 强化 / ★★★★ 冲刺。自检标准:12 题对 10 题以上;自测 11、12 两道大题必须全对——三次握手序号推演与拥塞窗口增长表是本章在真题里的大题原型,错一道回看 5.3.3 与 5.6.2。

自测 1(选择 · ★★)

关于网络层与传输层提供的逻辑通信,正确的是( )
A. 网络层提供进程到进程的通信 B. 传输层提供主机到主机的通信
C. 传输层提供应用进程之间的端到端通信 D. 路由器参与传输层的端到端通信

查看答案

C。网络层是主机到主机,传输层是进程到进程(端到端);路由器只实现下三层,不参与传输层通信。

自测 2(选择 · ★★★)

下列协议与其默认(熟知)端口号的对应关系中,错误的是( )
A. FTP 控制连接——21 B. SMTP——25 C. DNS——53 D. Telnet——25

查看答案

D。Telnet 是 23,25 是 SMTP。顺带复习:FTP 数据 20 / 控制 21、SSH 22、TFTP 69、HTTP 80、POP3 110、SNMP 161、HTTPS 443。

自测 3(选择 · ★★★ 易错)

下列关于 UDP 的叙述中,错误的是( )
A. UDP 面向报文,对应用层交下的报文既不合并也不拆分
B. UDP 支持一对一、一对多、多对一和多对多通信
C. UDP 首部共 8 B,校验和字段可置 0 表示不校验
D. UDP 校验出错时接收方向发送方请求重传

查看答案

D。UDP 无重传机制:校验出错直接丢弃(可选地上报应用层)。C 正确——校验和是可选的,全 0 表示不校验。

自测 4(选择 · ★★★)

关于 TCP 报文段首部,下列叙述错误的是( )
A. 序号字段指本报文段数据部分的第一个字节的序号
B. 窗口字段通知对方自己的接收窗口大小
C. 校验和字段仅校验 TCP 首部
D. FIN=1 的报文段即使不携带数据也消耗一个序号

查看答案

C。TCP 校验和覆盖整个报文段(首部+数据),且要加上伪首部(协议号 6)一起算。B 易混:窗口是「我能收」的 rwnd,不是发送窗口。

自测 5(选择 · ★★★★ 高频考点)

TCP 采用三次握手建立连接的原因,不包括( )
A. 防止已失效的连接请求报文段又传送到服务器而建立无效连接、浪费资源
B. 让双方都确认彼此的收发能力正常
C. 同步双方的初始序号
D. 为协商 MSS 与窗口扩大因子预留传输轮次

查看答案

D。MSS 等选项在第二次握手(SYN+ACK)中即可捎带协商,无需专门一轮;A、B、C 是「为什么不能两次握手」的标准三点。

自测 6(选择 · ★★★)

主动关闭方在发送最后一个 ACK 后要等待 2MSL,下列不属于其目的的是( )
A. 保证最后的 ACK 若丢失可响应对方重传的 FIN,使对方正常关闭
B. 让本连接产生的所有报文段从网络中消失,避免影响新连接
C. 等待本方向尚未发送完的数据发完 D. 给网络足够时间清除迟到的旧报文段

查看答案

C。能发 FIN 说明本方数据早已发完(FIN 在数据之后);2MSL 的两个理由是 A 与 B(B、D 同义)。另外记住:MSL = 最长报文段寿命,2MSL = 往返。

自测 7(选择 · ★★★★)

TCP 发送方连续收到 3 个重复(冗余)的 ACK 后的正确动作是( )
A. 将 ssthresh 减半、cwnd 置 1,重新慢启动
B. 立即重传丢失的报文段;ssthresh 减半,cwnd = 新 ssthresh,进入拥塞避免
C. 忽略冗余 ACK,等待重传定时器超时
D. 将 cwnd 减半并继续按原窗口发送

查看答案

B。快重传 + 快恢复:立即重传+门限减半+cwnd = 新 ssthresh。A 是「超时」的处置;3 冗余 ACK 说明只是轻度拥塞,不回 1。

自测 8(选择 · ★★★ 计算)

主机甲的拥塞窗口为 24 KB,接收方乙通告的接收窗口为 16 KB,则甲的实际发送窗口为( )
A. 24 KB B. 16 KB C. 20 KB D. 40 KB

查看答案

B。发送窗口 \(=\min(\text{rwnd},\text{cwnd})=\min(16,24)=16\) KB。C 是「取平均」陷阱,D 是「取和」陷阱。

自测 9(选择 · ★★★★ 计算)

TCP 连接中发送速率 \(8\,\text{Mb/s}\),MSS \(=1000\,\text{B}\),发送窗口固定 \(6000\,\text{B}\),RTT \(=23\,\text{ms}\),忽略确认发送时延与处理时延,则信道利用率约为( )
A. 20% B. 25% C. 30% D. 100%

查看答案

B。单段发送时延 \(T_L=1000\times8/8\times10^{6}=1\) ms;周期 \(=1+23=24\) ms;窗口 6 段连续发 6 ms,\(U=6/24=25\%\)。若误写周期为 23 ms(漏加单段发送时延)会得约 26%,选不出精确项。

自测 10(选择 · ★★★ 计算)

某 UDP 用户数据报的数据部分为 100 B,则其校验和的计算范围共覆盖( )
A. 108 B B. 120 B C. 100 B D. 112 B

查看答案

B。覆盖 = 伪首部 12 + UDP 首部 8 + 数据 100 = 120 B。A 少了伪首部,C 只有数据,D 是把伪首部记成 4 B 的错法。

自测 11(综合 · ★★★★★ 冲刺 大题原型)

主机甲(客户)与主机乙(服务器)建立 TCP 连接:甲选择的初始序号 \(x=2000\),乙选择的初始序号 \(y=7000\)。(1) 逐步写出三次握手中每个报文段的首部关键信息(SYN / ACK 置位、seq、ack);(2) 第三次握手报文段捎带 100 B 数据,写出该段 seq 与数据序号范围,以及乙对它的确认号;(3) 随后乙发送第一个 400 B 的数据报文段,写出其 seq 与甲的确认号;(4) 用一句话回答:若改用两次握手会出什么问题?

查看解答

(1) ① 甲→乙:SYN=1, seq=2000;② 乙→甲:SYN=1, ACK=1, seq=7000, ack=2001;③ 甲→乙:ACK=1, seq=2001, ack=7001。

(2) 甲的 SYN 消耗序号 2000,数据从 2001 起:seq=2001,数据序号 2001~2100;乙的确认号 ack = 2101(= 2100 + 1)。

(3) 乙的 SYN 消耗序号 7000,乙数据从 7001 起:seq=7001,字节 7001~7400;甲的确认号 ack = 7401。

(4) 一个失效的连接请求迟到后,服务器发出确认即单方面建立连接并空等,浪费资源(还要重复释放)。

验算:③的 ack=7001 = 乙数据起始序号 ✓;(2) 的 ack=2101 = 甲下一个数据段的 seq ✓——「ack 永远指向对方的下一个字节」贯穿全题。

自测 12(综合 · ★★★★★ 冲刺 大题原型)

拥塞窗口 cwnd 初始为 1 MSS,ssthresh 初始为 4 MSS。第 7 轮发送结束时(cwnd=8)发生超时;第 12 轮发送结束时(cwnd=6)连续收到 3 个冗余 ACK。(1) 推演第 1~13 轮的 cwnd 变化表(本轮发送 MSS 数、轮末 cwnd、阶段);(2) 前 12 轮共发送多少个报文段?(3) 第 13 轮结束时的 cwnd 与 ssthresh 各是多少?

查看解答

(1) 超时(cwnd=8):ssthresh \(=8\div2=4\),cwnd=1;3 冗余 ACK(cwnd=6):ssthresh \(=6\div2=3\),cwnd=3。

轮次本轮发送(MSS)轮末 cwnd阶段 / 事件
1~21、22、4慢启动;第 2 轮末达 ssthresh=4
3~74、5、6、7、85、6、7、8、1拥塞避免;第 7 轮末超时:ssthresh=4,cwnd=1
8~91、22、4慢启动;第 9 轮末达 ssthresh=4
10~124、5、65、6、3拥塞避免;第 12 轮末 3 冗余 ACK:ssthresh=3,cwnd=3
1334快恢复后就地拥塞避免(+1)

(2) 分段求和:

\[ (1+2+4+5+6+7+8)+(1+2+4+5+6)=33+18=51\ \text{个报文段} \]

(3) 第 13 轮按 cwnd=3 发送、线性 +1,轮末 cwnd=4,ssthresh=3。

验算:轮 3~7 从 4 到 8 共 5 项和 30,加轮 1~2 的 3 得 33 ✓;轮 8~12 和 18 ✓;总数 51 ✓。

5.8 本章考点总结

考点常考题型热度核心方法 / 一句话结论
传输层功能与复用分用选择★★★★网络层主机到主机,传输层进程到进程(端到端);发送多进程共用传输层为复用,接收按目的端口分用
端口号与套接字选择★★★★熟知 0~1023 / 登记 1024~49151 / 短暂 49152~65535;背熟 FTP 20/21、SSH 22、Telnet 23、SMTP 25、DNS 53、HTTP 80、HTTPS 443、POP3 110、SNMP 161;套接字 = IP : 端口,TCP 连接由四元组唯一确定
UDP选择 / 计算★★★★无连接、尽最大努力、面向报文、支持一对多、首部 8 B;校验覆盖伪首部 12 B+UDP 报(奇数补 0 只算不传);适合 DNS / RIP / DHCP / 流媒体
TCP 特点与首部选择★★★★面向连接、一对一、可靠、全双工、面向字节流;首部 20~60 B(数据偏移单位 4 B);六控制位 URG/ACK/PSH/RST/SYN/FIN;窗口字段是自己的 rwnd
序号与确认号选择 / 计算★★★★★seq = 本段数据第一字节序号,ack = 期望的下一字节序号(累计确认);SYN、FIN 各耗一个序号;ack = 对方下一 seq
三次握手 / 四次挥手选择 / 大题★★★★★握手 SYN, seq=x → SYN+ACK, seq=y, ack=x+1 → ACK, seq=x+1, ack=y+1;两次握手防失效连接请求;挥手 ACK 与 FIN 分开(全双工);TIME_WAIT 2MSL:保 ACK 到达+旧报文消失
重传机制选择★★★★RTO 自适应 \(=\text{RTT}s+4\text{RTT}_d\);快重传:3 个冗余 ACK 立即重传;SACK 补累计确认之短
滑动窗口与吞吐 / 利用率计算 / 大题★★★★★发送窗口 \(=\min(\text{rwnd},\text{cwnd})\);\(T_L=\text{MSS}\times8/R\),周期 \(=T_L+\text{RTT}\);吞吐率 = 窗口字节 ÷ 周期,\(U=\) 发送时间 ÷ 周期,窗口够大时 U→100%
流量控制选择 / 计算★★★rwnd = 缓存总量 − 占用;rwnd=0 停发并启动坚持定时器,发 1 B 探测报文防死锁;流量控制点对点,拥塞控制全局
拥塞控制四算法大题 / 选择★★★★★慢启动每轮×2 至 ssthresh,拥塞避免每轮 +1;超时:ssthresh=cwnd/2(下限 2),cwnd=1;3 冗余 ACK:ssthresh=cwnd/2,cwnd=新 ssthresh;推演表分段求和
下一步本章过关标准:例题 8 道独立重做;自测 12 题对 10 题以上;不假思索答出三件事——「发送窗口取什么?」(min(rwnd, cwnd))、「超时与 3 冗余 ACK 的处置差在哪?」(cwnd=1 回慢启动 vs cwnd=新 ssthresh 继续)、「TIME_WAIT 等 2MSL 为什么?」(保最后 ACK 到达+旧报文消失)。随后进入 第 6 章 应用层——域名系统 DNS、FTP、电子邮件与万维网 HTTP,本章的端口号将全部派上用场。