《计算机网络-自顶向下方法》3.9 小结 · 课后习题 · Wireshark实验

  哈喽各位小伙伴!第3章运输层的学习到这里就要告一段落啦!这一章的内容真的很多,从运输层概述到多路复用分解,从 UDP 到可靠数据传输原理,从 TCP 到拥塞控制,还有 QUIC 等新协议。今天我们就来好好复盘一下,做做习题,再用 Wireshark 亲手抓几个包,把理论和实践结合起来!

一、本章知识树

  先来看一下这一章的"知识树",帮大家梳理一下整体脉络:

  • 运输层概述:运输层 vs 网络层、逻辑通信、TCP vs UDP
  • 多路复用与分解:端口号、UDP 二元组、TCP 四元组
  • UDP:无连接、8字节首部、检验和、端到端原则
  • 可靠数据传输原理:rdt1.0→rdt3.0、流水线、GBN、选择重传
  • TCP:报文段结构、RTT估计、可靠传输、流量控制、连接管理
  • 拥塞控制:拥塞原因、端到端 vs 网络辅助、TCP 拥塞控制(慢启动/拥塞避免/快速恢复)、AIMD、公平性、CUBIC/BBR
  • 运输层演化:QUIC 协议、HTTP/3、连接迁移、多路复用

二、重要知识点回顾

1. 运输层 vs 网络层

  网络层 负责主机之间的逻辑通信,运输层负责应用进程之间的逻辑通信。网络层是"送货到小区",运输层是"送货到家门"。运输层只在端系统中实现,路由器不参与运输层的处理。

2. 多路复用与分解

  多路复用 :发送方多个应用进程共用一个运输层。

多路分解:接收方运输层把数据分发给正确的应用进程。

  端口号就是用来做这件事的:

  • UDP 分解:只用目的端口号(二元组:目的IP、目的端口)
  • TCP 分解:用四元组(源IP、源端口、目的IP、目的端口)

3. UDP

  UDP 很简单:无连接、不保证可靠、没有拥塞控制、首部只有8字节。但正因为简单,它速度快、开销小,适合 DNS、视频会议、直播等场景。UDP 的检验和是端到端原则的体现------哪怕链路层已经校验过了,运输层还要再校验一遍。

4. 可靠数据传输原理

  这是本章的重点也是难点。我们从最简单的 rdt1.0 开始,一步步加入功能:

  • rdt1.0:完美信道,啥也不用管
  • rdt2.0:比特差错,加了检验和、确认、重传
  • rdt2.1/2.2:处理重复的 ACK,加了序号
  • rdt3.0:处理丢包,加了定时器和超时重传
  • 流水线:提高效率,不用等一个确认再发下一个
  • GBN(回退N步):滑动窗口,累积确认,丢了就全部重传
  • 选择重传:只重传丢的,窗口内各自独立确认

5. TCP

  TCP 是本章的重头戏:

  • 报文段结构:源端口、目的端口、序号、确认号、首部长度、标志位、接收窗口、检验和、紧急数据指针、选项
  • RTT 估计:SampleRTT → EstimatedRTT → DevRTT → TimeoutInterval
  • 可靠传输:基于流水线的 GBN + 选择重传的混合体,超时重传 + 快速重传
  • 流量控制:接收窗口 rwnd,防止发送方发太快把接收方缓存撑爆
  • 连接管理:三次握手建立连接,四次挥手关闭连接,SYN 洪泛攻击

6. 拥塞控制

  拥塞控制也是本章的重点:

  • 拥塞的代价:丢包、时延增加、资源浪费
  • 两种方法:端到端拥塞控制(TCP 用的)和 网络辅助拥塞控制(ATM 等)
  • TCP 拥塞控制四件套:慢启动、拥塞避免、快速重传、快速恢复
  • AIMD 原则:加性增乘性减,实现公平性
  • 现代算法:CUBIC(Linux 默认)、BBR(Google 的)
  • ECN:显式拥塞通知,网络设备直接标记拥塞

7. QUIC 与运输层演化

  QUIC 是下一代传输协议,基于 UDP,提供 TCP 的可靠性和更多特性:0-RTT/1-RTT 握手、多路复用、连接迁移、内置加密。HTTP/3 就是基于 QUIC 的。

三、课后习题精选

复习题

1. 为什么运输层能够提供逻辑通信?

  运输层在端系统之间运行,它把应用进程的数据封装起来,通过网络层发送出去。对于应用进程来说,就好像两个进程之间有一条直接的"管道"一样,不用关心底下的网络是怎么传的。这就是逻辑通信的含义------不是真的有一条物理线路,而是从效果上看起来像有。

2. UDP 和 TCP 最主要的区别是什么?

  最大的区别就是可靠性。TCP 提供可靠的、按序的、面向连接的服务,还有流量控制和拥塞控制。UDP 提供无连接的、不可靠的数据报服务,啥额外功能都没有。

  但 UDP 也不是一无是处:它简单、开销小、速度快,而且应用层可以更灵活地控制什么时候发、发多少。对于实时应用来说,UDP 往往是更好的选择。

3. 为什么需要端口号?

  因为一台主机上同时跑着很多应用进程,每个进程都可能在收发网络数据。网络层只能把数据送到主机,但是送给哪个进程呢?这就需要端口号来区分了。端口号就像楼里的房间号,网络层把包裹送到楼里,运输层再根据房间号送到具体的住户。

4. 什么是停等协议?它有什么问题?

  停等协议就是发一个分组,等确认,确认到了再发下一个。就像寄快递,寄一个等对方说收到了,再寄下一个。

  问题就是效率太低了!如果信道的时延带宽积很大,发送方大部分时间都在等确认,信道利用率很低。所以才有了流水线协议(GBN、选择重传),一次发多个,提高效率。

5. TCP 的三次握手能不能改成两次?为什么?

  不能!主要是为了防止过期的连接请求建立无效连接。如果只有两次握手,假设客户端发了一个 SYN,但是在路上堵了很久,客户端以为丢了就重发了一个。后来第一个 SYN 又到了服务器,服务器收到就会建立连接,但客户端根本不想建立这个连接,服务器就白白浪费资源了。

  三次握手的第三次 ACK 就是让客户端确认"我确实想要建立这个连接",这样服务器才会真正建立连接。

6. 流量控制和拥塞控制有什么区别?

  流量控制是接收方对发送方的限制,防止发送方发太快把接收方的缓存撑爆。这是端到端的问题。

  拥塞控制是防止网络中间的路由器过载,是全局的问题。流量控制是"你别把我撑着了",拥塞控制是"别把路堵死了"。

7. 为什么 TCP 拥塞控制用 AIMD(加性增乘性减)?

  AIMD 有几个好处:

  • 公平性:多个流竞争同一条链路的带宽时,AIMD 能让它们最终均分带宽
  • 简单:实现简单,不需要复杂的计算
  • 分布式:每个发送方自己控制,不需要网络设备参与

  慢启动是为了快速探测网络容量,拥塞避免阶段的 AIMD 是为了稳定地在公平点附近振荡。

习题

1. 假设一个 UDP 客户端向服务器发送了一个 UDP 数据报,源端口是 12345,目的端口是 53。服务器回复的时候,源端口和目的端口分别是什么?

  答:服务器回复时,源端口是 53(服务器自己的端口),目的端口是 12345(客户端的端口)。就像你写信给别人,收信人地址写对方的,回信的时候对方把你的地址写在收信人位置。

2. 考虑一个 GBN 协议,发送窗口大小是 4,序号范围是 0-7。假设当前发送了 0、1、2 号分组,收到了 0 和 1 的 ACK,此时发送方还能发哪些序号的分组?

  答:GBN 的发送窗口是 base, base+N-1。初始 base=0,窗口是 0, 1, 2, 3。收到 0 的 ACK 后 base 变成 1,窗口是 1, 2, 3, 4。收到 1 的 ACK 后 base 变成 2,窗口是 2, 3, 4, 5

  已经发了 0、1、2,所以还能发 3、4、5。

3. 假设 TCP 的 MSS 是 1000 字节,拥塞窗口是 10 个 MSS,RTT 是 100ms。此时的吞吐量大约是多少?

  答:吞吐量 = 拥塞窗口大小 / RTT = (10 × 1000 × 8) / 0.1 = 800,000 bps = 800 kbps。

  或者更简单地说,每 100ms 发 10 × 1000 = 10,000 字节,每秒就是 100,000 字节 = 800 kbps。

4. 如果 TCP 在拥塞避免阶段,cwnd = 20 MSS,此时检测到丢包(三个重复 ACK),cwnd 和 ssthresh 变成多少?(假设是 TCP Reno,有快速恢复)

  答:ssthresh = cwnd / 2 = 10 MSS。然后进入快速恢复,cwnd = ssthresh + 3 = 13 MSS(因为收到了3个重复ACK)。之后每收到一个重复 ACK,cwnd 增加 1 MSS。等到收到新的 ACK 时,cwnd = ssthresh = 10 MSS,进入拥塞避免阶段。

  如果是超时导致的丢包,那就不一样了:ssthresh = cwnd / 2 = 10 MSS,cwnd = 1 MSS,重新进入慢启动。

四、编程作业思路

  教材第3章的编程作业通常是用套接字写一个可靠数据传输的程序,比如实现一个简单的 GBN 或选择重传协议。这里给大家一些思路:

1. 可靠文件传输

  目标是在不可靠的 UDP 之上实现可靠的文件传输。你需要实现:

  • 序号:给每个数据编号,接收方知道哪个收到了哪个没收到
  • 确认 ACK:接收方发回确认,告诉发送方哪些收到了
  • 超时重传:发送方设定时器,超时了就重传
  • 校验和:检查数据有没有出错(可选,题目可能已经提供了丢包模拟)

  可以先实现 GBN,再试试选择重传。GBN 相对简单,用累积确认就行。选择重传稍微复杂一点,接收方需要缓存乱序到达的分组。

2. 实现建议

  1. 先用 UDP 把基本的收发跑通

  2. 加入序号和 ACK 机制

  3. 加入定时器和超时重传

  4. 测试丢包场景,看能不能正确重传

  5. 加上流量控制(可选)

  做这个作业的时候,你会深刻体会到可靠数据传输的复杂性,也会更加理解 TCP 为什么要设计成那样。

五、Wireshark 实验

实验一:探究 TCP

  第一个实验是抓 TCP 的包,看看 TCP 连接是怎么建立的,数据是怎么传输的,连接又是怎么关闭的。

实验步骤
  1. 打开 Wireshark,选择你的网卡,开始抓包
  2. 设置过滤条件 :输入 tcp,只看 TCP 包
  3. 访问一个网站:在浏览器里打开一个网页(比如 http://example.com
  4. 停止抓包,找到 TCP 三次握手的包
观察内容

1. 三次握手

  找到三个连续的包:

  • 第一个包:SYN 标志位为 1,客户端 → 服务器
  • 第二个包:SYN 和 ACK 标志位都为 1,服务器 → 客户端
  • 第三个包:ACK 标志位为 1,客户端 → 服务器

  看看这三个包的序号(Sequence Number)和确认号(Acknowledgment Number),理解三次握手的过程。

2. 数据传输

  看看后面的数据包:

  • 序号是怎么增长的?(每次增加发送的数据字节数)
  • 确认号是怎么变化的?(确认号 = 对方的序号 + 收到的字节数)
  • 接收窗口(Window Size)有多大?

3. 四次挥手

  找到连接关闭的包:

  • 第一个 FIN 包:一方说"我说完了"
  • 第二个 ACK 包:另一方说"好的,我知道了"
  • 第三个 FIN 包:另一方说"我也说完了"
  • 第四个 ACK 包:一方说"好的,再见"

  注意,有时候服务器会把 FIN 和 ACK 合并成一个包(第二个和第三个合并),看起来像三次挥手,这是正常的。

4. 流量控制

  看看 Window Size 字段的值在传输过程中有没有变化。如果接收方处理不过来,窗口会不会变小?

5. 拥塞控制(选做)

  这个观察起来比较难,因为你看不到对方的 cwnd。但是你可以用 Wireshark 的"Follow TCP Stream"功能,看看数据传输的速率变化,大概感受一下拥塞控制的效果。

实验二:探究 UDP

  第二个实验是抓 UDP 的包,感受一下 UDP 的简单。

实验步骤
  1. 打开 Wireshark,开始抓包
  2. 设置过滤条件 :输入 udp 或者 dns(DNS 用的是 UDP)
  3. 发起一个 DNS 查询 :在命令行里输入 nslookup www.baidu.com 或者直接访问一个新网站
  4. 停止抓包,找到 UDP 包
观察内容

1. UDP 首部格式

  点开一个 UDP 包,看看 UDP 的首部:

  • 源端口(Source Port)
  • 目的端口(Destination Port)
  • 长度(Length)
  • 检验和(Checksum)

  对比一下 TCP 的首部,是不是简单多了?TCP 首部通常有 20 多字节,而 UDP 只有 8 字节。

2. DNS 查询和响应

  找到 DNS 查询和响应的包:

  • 查询包:客户端 → DNS 服务器(目的端口 53)
  • 响应包:DNS 服务器 → 客户端(源端口 53)

  看看 DNS 查询是用 UDP 发的,响应也是用 UDP 回来的。没有握手,没有确认,发出去就完事了。

3. 有没有丢包?

  多做几次 DNS 查询,看看有没有丢包的情况。一般来说局域网内不太容易丢包,但如果你在弱网环境下,可能会看到 DNS 查询超时重传的情况------这就是应用层自己实现可靠性的例子。

  你也可以试试发一个很大的 DNS 查询,看看会不会用 TCP 来传(DNS 超过 512 字节会改用 TCP)。

六、学习建议

  第3章内容很多,也比较难,这里给大家一些学习建议:

  1. 画图理解:很多概念(比如三次握手、滑动窗口、拥塞控制)画个图就清楚了。光看文字可能会晕。
  2. 抓包实践:一定要用 Wireshark 亲手抓包看看,理论联系实践,印象才深刻。
  3. 动手编程:如果有时间,最好把编程作业做了。自己实现一遍可靠数据传输,比看十遍书都管用。
  4. 对比学习:TCP vs UDP、GBN vs 选择重传、流量控制 vs 拥塞控制、慢启动 vs 拥塞避免......对比着学,理解更透彻。
  5. 多看几遍:这一章比较难,看一遍不懂很正常。多看几遍,每一遍都会有新的收获。

七、小结

  好啦,第3章运输层的内容到这里就全部结束了!这一章是计算机网络的核心章节之一,也是面试常考的重点。希望大家通过这一章的学习,对运输层有了深入的理解。

  回顾一下我们学了什么:

  • 运输层的作用和两种协议(TCP、UDP)
  • 多路复用与分解的原理
  • UDP 的特点和检验和
  • 可靠数据传输的原理(从 rdt 到 GBN 到选择重传)
  • TCP 的方方面面(报文段、RTT、可靠传输、流量控制、连接管理)
  • 拥塞控制的原理和 TCP 拥塞控制
  • 运输层的演化和 QUIC 协议

  学完这一章,你应该能看懂很多网络问题了------为什么网页加载慢?为什么视频会卡?为什么换 WiFi 的时候应用会断连?这些问题的答案都在运输层里。

  下一章我们将学习网络层,看看数据是怎么从一个网络走到另一个网络的。路由算法、IP 地址、路由器......更多精彩内容等着你!大家加油!

相关推荐
Chengbei1143 分钟前
SRC报告成稿 Skill(SRC/0day 提交稿、分层验证门、Step 式 PoC、截图铁律)
网络·人工智能·安全·web安全·自动化·系统安全
小雪崩1 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
Doraemomo1 小时前
网络编程-复习
网络
2601_966377131 小时前
云上系统零改造过密评|数达安全发布通关四件套
网络·安全
bksczm2 小时前
Linux 五种 I/O 模型与多路复用详解
运维·服务器·网络
蒸蒸yyyyzwd2 小时前
cpp选手秋招学习笔记day24-cs144项目总结
运维·服务器·网络
数据知道3 小时前
静态分析入门——PE 结构、字符串、导入表快速定性
网络·安全·web安全·网络安全
CCYe、3 小时前
新模型上线、旧模型下线:企业AI网关如何管住模型版本
java·网络·数据库·人工智能
葡萄城技术团队3 小时前
从设备协议数据到完整OEE:机加工车间设备效率分析的技术实现路径
网络