COMPUTER NETWORKING · A TOP-DOWN APPROACH · 8th ed · Kurose & Ross · 陈鸣 译 · 机械工业出版社(503 页)

《计算机网络:自顶向下方法》
全书知识总结
——自顶向下五层体系 · 核心协议 · 计算题型

按原书 8 章的“应用层 → 运输层 → 网络层 → 链路层 → 无线与移动 → 安全”顺序整编:每个概念先讲为什么需要它,再讲它怎么工作,配关键计算例与结构图。

8 章 · 18 图 · 27 例概念 · 机制 · 例子 · 图示时延与窗口计算 · 协议报文自顶向下 · 每章一条主线

全书知识地图

本书的编排逻辑是“先看应用怎么用网络,再逐层向下追问它是怎么被实现的”。整本书可以压缩成一句话:应用进程通过套接字把报文交给运输层,运输层把它切成报文段,网络层加上地址做成数据报,链路层封装成帧送上线,最后一跳由链路层交给主机,向上逐层拆封。

① 应用层:HTTP / SMTP / DNS / P2P / CDN(第2章)→② 运输层:UDP / TCP / 拥塞控制(第3章)→③ 网络层数据平面:IPv4 / 转发 / 调度(第4章)→④ 网络层控制平面:路由 / BGP / SDN(第5章)
⑤ 链路层:多路访问 · 以太网(第6章)→⑥ 无线与移动:802.11 · 4G/5G(第7章)→⑦ 网络安全:TLS · IPsec(第8章)
一条主线:封装与解封装每下一层都加一个首部,接收端每上一层拆一个首部。理解“首部里有什么”,就理解了这一层在干什么。
两类问题“机制”类(协议怎么保证可靠、怎么共享信道)与“计算”类(时延、吞吐量、窗口、子网、CRC)。考试基本都在问这两类。
三个反复出现的权衡可靠性与开销(TCP vs UDP)、共享与冲突(多路访问)、集中与分布(路由与 SDN)。
第8版新增视角SDN 控制平面(5.5)、HTTP/2(2.2.6)、5G(7.4.6)、NETCONF/YANG(5.7.3)、运输层演化与 QUIC(3.8)。
01

计算机网络和因特网

Computer Networks and the Internet · 组成 · 边缘 · 核心 · 时延 · 分层 · 安全

第 1 章不追求“讲透某个协议”,而是建立词汇表和坐标系:因特网由哪些部件组成、端系统怎么接入、分组在核心怎么被交换、一路会损失多少时间,以及为什么要把网络分成五层。这一章的每个概念后面都会被反复引用,所以值得读慢一点。

1.1 什么是因特网

教材给了两种互补的描述方式:一种描述它由什么构成,另一种描述它能为应用做什么。考试常问“这两种描述的区别”,答案是:前者是工程视角(部件与连接),后者是服务视角(应用能获得什么)。

具体构成描述(nuts and bolts) 因特网 = 端系统(主机、手机、服务器)+ 通信链路(双绞线、光纤、无线电)+ 分组交换机(路由器、链路层交换机)。端系统通过 ISP(因特网服务提供商)接入,ISP 之间分层互联;所有部件共同运行一套协议族 TCP/IP,其中 IP 协议负责“把异构的底层网络粘成一张网”。
服务描述(services view) 因特网是为分布式应用提供通信服务的基础设施。它给应用两种运输服务:无连接不可靠服务(UDP)与面向连接可靠服务(TCP)。注意:因特网本身不保证带宽与时延,这就是“尽力而为”的含义。

协议是本章最重要的定义,必须能一字不差地复述:

协议(protocol) 协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一条报文或其他事件所采取的动作。三个要素:语法(格式)、语义(含义)、时序(何时发、按什么顺序)。

用人类的对话类比:见面说“你好”(语法:一句问候语)、对方回“你好”(时序:一问一答、不能抢话)、如果对方没回应你会重说一遍(动作:超时重传)。计算机协议完全同构:HTTP 的请求行是语法,200/404 的含义是语义,先三次握手再发请求是时序。

例

两台主机用 TCP 传文件,至少涉及四层协议协作:HTTP 决定“要哪个文件”(应用层),TCP 保证“字节不丢不乱”(运输层),IP 负责“找到对方主机”(网络层),以太网负责“在这一段线缆上送达下一跳”(链路层)。任何一层出错,用户看到的结果都是“打不开网页”,但排查要逐层看。

1.2 网络边缘:接入与介质

边缘 = 端系统 + 接入网。端系统按角色分客户 / 服务器;P2P 中同一主机可以两者兼是。

接入网的关键差别不在于“快不快”,而在于这条线路是独享还是共享——共享就要设计多路访问协议,这是第 6 章所有冲突问题的源头。

接入方式结构与工作方式共享性 / 典型速率
DSL(数字用户线)本地电话公司的 DSLAM;话音与数据频分复用在同一对双绞线上;用户侧接 DSL 调制解调器到中心局独享;上下行不对称(如 24/2.5 Mbps)
电缆(HFC)光纤到小区 + 同轴入户,共享上行信道,需分布式多路访问下行多户共享;DOCSIS 3.0/3.1
FTTH(光纤到户)PON:OLT(局端)— 分光器 — ONT(用户);下行广播、上行 TDMA 分时每户独享逻辑带宽;1 Gbps 级
以太网 / Wi-Fi企业或家庭局域网,经交换机 / AP 接入交换以太网独享;Wi-Fi 空口共享
4G / 5G 蜂窝基站 + 全 IP 核心网,空口由基站统一调度空口共享;时延 10–50 ms(4G)

物理媒介分导引型与非导引型:双绞线便宜、易施工但衰减大;同轴带宽高、抗干扰较好;光纤衰减小、抗电磁干扰、速率极高,是骨干与 FTTH 的首选;无线电(Wi-Fi、蜂窝、卫星)无需布线但受干扰、遮挡与多径影响。

判断“共享还是独享”有一个简单办法:问“同一时刻,两个人同时发数据会不会撞车”。会撞车(同轴、Wi-Fi、蜂窝空口)就必须有 MAC 协议;不会(交换以太网、PON 的下行)就不需要冲突检测。

1.3 网络核心:分组交换与电路交换

核心 = 分组交换机组成的网状网。两种交换方式的对立,是本章计算与简答的高频点。

分组交换把长报文切成小分组,每个分组独立走链路,采用存储转发:交换机必须收完整个分组才能开始向下一段链路发送。

发送端 路由器 接收端 分组 传输时延 L/R 传播时延 d/s ① 收完整个分组 ② 再发往下一跳
← 左右滑动看全图 →
图 1-1 存储转发的两段时间:L/R 是“把比特推上链路”,d/s 是“信号在介质里跑”。两者互不相干,千万不要相加成一个“传输时间”。

分组交换的两大代价是排队时延与丢包:输出链路被占用时分组排队,缓冲区满则被丢弃。

电路交换在通信前先建立连接,预留一条路径上的资源,用 FDM(频分:每条连接分到一个频段)或 TDM(时分:每条连接分到一个时隙)切分链路。

分组交换电路交换
资源分配按需使用、统计复用建立连接时预留
时延有排队时延,随负载波动传输时延固定,无排队
适合突发型数据(Web、文件)连续恒定速率(传统语音)
缺点拥塞时丢包、首部开销静默期浪费带宽、建链慢
例 1-1(教材经典)

一条 1 Mbps 链路,用户活跃时以 100 kbps 恒定速率发送,活跃概率 10%。

电路交换:每条连接独占 100 kbps → 最多支持 10 个用户,第 11 个直接被拒绝。
分组交换:10 个用户同时活跃的概率约 0.0000000003,11 个以上几乎不可能 → 可以支持 35 个用户而几乎不拥塞。

结论:突发型流量下,统计复用能用同样带宽服务 3 倍以上的用户;代价是极端情况下会拥塞。

网络的网络是“ISP 的 ISP”的分层结构:接入 ISP(家庭/企业)→ 区域 ISP → 一级 ISP(全球骨干),彼此在 IXP(因特网交换点)对等互联(peering,互不付费)或通过提供商-客户关系(transit,付费)。今天的最大变化是内容提供商自建网络:Google、Netflix 把自己的机房与 CDN 直接接入 IXP,绕开一级 ISP,从而同时降低时延与带宽成本。

1.4 时延、丢包与吞吐量

四种时延必须能分开写、分开算,这是全书最基础的计算:

dproc:处理时延(查表、检错),通常 μs 级,可忽略(1-1)
dqueue:排队时延,取决于流量强度,最不确定(1-2)
dtrans=LR
(1-3)
dprop=ds,s≈2×108m/s
(1-4)
dnodal=dproc+dqueue+dtrans+dprop
(1-5)
主机 A 发送速率 R 主机 B ① 推比特:L/R ② 比特在介质中跑:d/s 两者串联:先“推完”,信号才“跑完”最后一个比特
← 左右滑动看全图 →
图 1-2 传输时延由分组长度与链路速率决定;传播时延由物理距离与介质决定。卫星链路 R 很大(传输快)但 d 极大(传播慢),所以“带宽大 ≠ 时延小”。
例 1-2

1500 字节分组走 1 Gbps 链路:dtrans = 12000 bit ÷ 109 bit/s = 12 μs
同一条链路长 2000 km,光纤中 s = 2×108 m/s:dprop = 2×106 ÷ 2×108 = 10 ms

传播时延约是传输时延的 830 倍。这就是“为什么跨洋访问慢,换个更快的网卡也没用”。

流量强度是排队的关键参数:La/R(L 分组长度、a 到达速率、R 链路速率)。

La/R现象直观解释
≈ 0几乎不排队路上没车
→ 1平均排队时延急剧上升车流接近饱和,一点波动就堵
> 1队列无限增长 → 缓冲区满 → 丢包到达比通过快,必然积压

丢包不是“网络坏了”,而是有限缓冲的必然结果:路由器缓冲满时尾部丢弃,TCP 会重传,实时业务则表现为卡顿。丢包与排队是在 La/R → 1 时同时恶化的,这也是“网络利用率 80% 以上事故频发”的原因。

吞吐量由瓶颈链路决定:端到端吞吐量 = minRs,Rc,各跳 R}。若服务器出口 2 Mbps、客户端接入 1 Mbps,则吞吐量就是 1 Mbps——加多少带宽在服务器侧都没用。

教材用“水管”比喻吞吐量:一条链路上最细的那一段决定流量。注意区分 吞吐量(throughput)与带宽(bandwidth):带宽是链路能力上限,吞吐量是实际达到的速率。

1.5 协议层次与封装

分层的本质是把“我能提供什么服务”与“我怎么实现”分开。这样某一层的实现可以独立替换:IPv4 换成 IPv6 时,浏览器不需要改;Wi-Fi 换成 5G 时,TCP 也不需要改。

层数据单元核心职责典型协议
应用层报文 message面向具体应用的数据交换HTTP、SMTP、DNS、P2P
运输层报文段 segment进程到进程交付、复用/分解、可靠性、拥塞控制TCP、UDP、QUIC
网络层数据报 datagram主机到主机、逻辑寻址、路由与转发IP、ICMP、路由协议
链路层帧 frame相邻结点传输、成帧、差错检测、介质访问以太网、802.11、PPP
物理层比特把比特变成信号送上介质—
应用层:报文 message TCP 首部 报文段 segment IP 首部 数据报 datagram(含原报文段) 链路首部 帧 frame 尾部
← 左右滑动看全图 →
图 1-3 封装就是把上一层整个(首部+数据)当作本层的数据,再套一个自己的首部。接收端反向逐层剥离,每层只看自己那一层首部。

分层的代价:每层都有首部开销(以太网 14 字节 + 4 字节 FCS、IP 20 字节、TCP 20 字节,传 100 字节应用数据时开销近 60%),且层与层之间的信息被隐藏,某些跨层优化(如无线链路知道丢包是误码而非拥塞)需要“层间违例”。

易错点

  • OSI 七层(应用/表示/会话/运输/网络/数据链路/物理)与五层模型的差别:因特网把表示层与会话层功能并入应用层。
  • “端到端”是运输层的说法,“逐跳/点到点”是链路层的说法,不能混用。
  • 路由器处理到网络层(不看端口),交换机只到链路层(不看 IP)。
  • 封装是每一层都发生的,不是只有链路层;解封装严格逆序。

1.6 面对攻击的网络

教材把安全放在第一章,是为了让你在读每个协议时都带着“它假设了什么”的问题。因特网最初的设计假设是“所有用户互相信任”,这是今天大部分漏洞的根源。

  • 恶意软件:病毒(需用户执行)、蠕虫(自动扫描传播)、僵尸网络(botnet,被控主机群,用于发起 DDoS 与发送垃圾邮件)。
  • DDoS:带宽泛洪(用流量淹没)、连接泛洪(SYN 洪水耗尽连接表)、应用层泛洪(大量合法 HTTP 请求打垮服务器)。
  • 嗅探:共享介质或无线空口上被动抓包,可看到明文口令 → 对策是加密(TLS、WPA)。
  • IP 哄骗:伪造源地址,让攻击看起来来自别处、并让回包打向受害者 → 对策是入口过滤(RFC 2827)。
  • 中间人:插入到通信双方之间,可窃听与篡改 → 需要鉴别与完整性(第 8 章)。
这三类攻击正好对应后文的三种防御:嗅探 → 加密(第 8.2 节)、哄骗与中间人 → 鉴别与签名(第 8.3–8.4 节)、DDoS → 过滤、任播分散、SYN cookie(第 8.6 节)。
02

应用层

Application Layer · HTTP · 邮件 · DNS · P2P · CDN · 套接字

应用层是唯一“用户看得见”的一层。这一章的抓手是“应用需要运输层提供什么”——可靠性、吞吐量、时延、安全性四个维度,决定了为什么有的应用用 TCP、有的用 UDP、有的在 UDP 上另建一套(QUIC)。

2.1 应用层原理与运输服务

客户-服务器(C/S)服务器常开、固定 IP、靠数据中心扩展;客户之间不直接通信。缺点:服务器是单点,流量大时成本高。
P2P对等方直接通信、自扩展(用户越多越快)、成本低;缺点:管理难、ISP 不友好、安全与版权问题。
混合如 Skype:登录与查找走服务器,语音/视频走 P2P——兼顾可控性与成本。

进程通信:进程通过套接字(socket)收发报文。套接字由 IP + 端口号标识;应用层协议规定报文语义,运输层只负责把字节送到对端套接字。注意:同一台主机上可以同时有多个进程使用同一端口(如多个浏览器标签),运输层靠四元组区分(源 IP、源端口、目的 IP、目的端口)。

应用丢失容忍带宽时延选用与原因
文件传输 / 邮件 / Web不容忍弹性弹性TCP:不能丢字节
流式音视频可容忍少量弹性(有下限)有上限TCP + DASH,或 UDP
实时语音 / 游戏可容忍少量低带宽即可严格UDP:重传来不及,宁可丢
DNS / SNMP可重试很小较快UDP:一问一答,自带重试

TCP 提供面向连接、可靠、流量控制、拥塞控制,但不提供时延保证与最小带宽保证;UDP 只做复用/分解与轻量检错。二者都不加密——加密由 TLS 在 TCP 之上补上(机密性、完整性、服务器鉴别)。

“TCP 可靠”≠“应用一定收到”。TCP 只保证字节流按序、不丢不重地交给对端应用;如果对端进程崩溃、或用户在收到前关掉页面,TCP 无能为力。可靠传输是“运输层保证”,不是“业务保证”。

2.2 Web 与 HTTP

HTTP 是无状态的请求-响应协议,报文是 ASCII 文本,跑在 TCP 上(默认 80;HTTPS 443)。

版本连接方式关键改进遗留问题
HTTP/1.0非持续:每个对象一条 TCP简单每对象 2 RTT 握手;服务器连接数暴涨
HTTP/1.1持续连接(默认)、可流水线省掉重复握手串行请求导致应用层队头阻塞;开多条连接绕过又浪费
HTTP/2一条 TCP 上多路复用二进制分帧、首部压缩(HPACK)、优先级TCP 层 HOL 阻塞仍在(丢一个包全体等)
HTTP/3(QUIC)基于 UDP流级独立重传,彻底消除跨流阻塞;0-RTT 建连UDP 在部分网络被限速
非持续连接(HTTP/1.0) 持续连接(HTTP/1.1) 客户服务器 客户服务器 SYN SYN 每个对象都要 2 RTT 再传对象… SYN 握手一次,后续对象复用连接
← 左右滑动看全图 →
图 2-1 非持续连接下,一个含 N 个引用对象的页面需要 (N+1) 次 TCP 握手,约 (N+1)·2RTT;持续连接只需 1 次握手,其余是“请求-响应”各 1 RTT。
例 2-1

一个基础 HTML(100 KB)引用 8 张小图(每张 50 KB),RTT = 100 ms,链路 10 Mbps,忽略 DNS。

非持续:9 次连接 × 2 RTT = 18 RTT = 1.8 s
持续(串行):1 次握手 2 RTT + 9 次请求-响应 × 1 RTT = 11 RTT = 1.1 s
再加传输时间:(100 + 8×50) KB × 8 ÷ 10 Mbps ≈ 0.4 s

所以“减少 RTT 次数”比“提高带宽”对首屏更有效——这也是 CDN 与 HTTP/2 存在的理由。

报文格式:请求报文 = 请求行(方法 URL 版本)+ 首部行 + 空行 + 实体主体;响应 = 状态行 + 首部 + 空行 + 实体。常见方法 GET / POST / HEAD / PUT / DELETE;常见状态码 200(成功)、301(永久重定向)、304(未修改)、400(请求错误)、404(不存在)、505(版本不支持)。

GET /index.html HTTP/1.1
Host: feiyang707.cn
User-Agent: Mozilla/5.0
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 4213
Cache-Control: max-age=600

Cookie 让无状态 HTTP 具备“会话”能力,四个部件缺一不可:① 响应首部 Set-Cookie;② 后续请求首部 Cookie;③ 浏览器本地存储;④ 服务器端数据库(用 ID 查用户状态)。

Web 缓存(代理服务器):浏览器先问缓存,缓存有且未过期就直接返回,没有就代为请求并存一份。配合 条件 GET(If-Modified-Since),服务器若未修改只回 304 Not Modified(无实体),省下带宽。

例 2-2(缓存降低链路负载)

某机构接入链路 15 Mbps,平均请求率 15 次/秒、平均对象 1 MB,则流量强度 ≈ 1(拥塞,时延数秒)。

加缓存后命中率 0.4:链路负载降为 0.6,时延从“秒级”降到几十毫秒;
若不装缓存而把链路升到 100 Mbps,成本远高于一台缓存服务器。

2.3 电子邮件

邮件是“推 + 拉”的组合:发件人用 SMTP(TCP 25)把邮件推给自己的邮件服务器,再由它推到收件人的邮件服务器;收件人用 POP3 / IMAP 或 Webmail 把邮件拉下来。

用户代理→SMTP→发送方邮件服务器→SMTP→接收方邮件服务器←POP3/IMAP←收件人代理

SMTP 是 ASCII 命令-响应的“对话式”协议:HELO 打招呼 → MAIL FROM → RCPT TO → DATA → . 结束。二进制附件要用 MIME 编码(base64)后再塞进 DATA。

POP3IMAP
状态保存基本在客户端,下载后可删除全部在服务器(文件夹、已读、草稿)
多设备不同步,易重复下载天然同步
适用单设备、离线阅读手机+电脑多端
为什么收件用另一个协议而不是 SMTP?因为 SMTP 是“推”协议,假设对方服务器在线;而收件人可能离线、可能换设备,需要“拉”与状态管理。协议设计永远由使用场景决定。

2.4 DNS

DNS 是分布式数据库 + 应用层协议,提供四类服务:主机名→IP、主机别名(CNAME)、邮件服务器别名(MX)、负载分配(一个域名对应多个 IP,轮转)。

层次作用规模
根 DNS返回 TLD 服务器地址全球 13 组(任播,实际数百个实例)
顶级域 TLDcom / cn / org…,返回权威服务器地址每个 TLD 一组服务器
权威 DNS保存该域的真实记录由域名持有者/托管商维护
本地 DNS(默认)ISP 提供,代替主机做查询并缓存每个 ISP 若干台
请求主机 本地 DNS 根 DNS TLD(.cn) 权威 DNS Web 服务器 递归 迭代
← 左右滑动看全图 →
图 2-2 请求主机到本地 DNS 是递归(“你帮我查到底”);本地 DNS 到根/TLD/权威是迭代(“你告诉我下一个该问谁”)。这样把查询负担放在 ISP 的服务器上,根服务器只做指路。

资源记录是四元组(Name, Value, Type, TTL):

  • A:主机名 → IPv4 地址;AAAA:主机名 → IPv6 地址
  • NS:域 → 该域权威 DNS 的主机名(用于委派)
  • CNAME:别名 → 规范名(常用于把 www 指向 CDN 给的域名)
  • MX:域 → 邮件服务器名(带优先级,数字越小越优先)
例 2-3

访问 www.feiyang707.cn,本地 DNS 无缓存时:
① 问根 → 返回 .cn 的 TLD 服务器
② 问 .cn → 返回 feiyang707.cn 的权威服务器
③ 问权威 → 返回 A 记录(如 124.223.139.45)
共 3 个 RTT;若本地 DNS 有缓存,0 RTT。

这也解释了“为什么换 DNS 服务商后要等 TTL 过期才生效”:旧记录还缓存在各级 DNS 里。

DNS 报文用 UDP/53,只有查询与回答两类报文,格式相同(标识、标志、问题数、答案数、问题段、答案段…)。缓存受 TTL 约束,是 DNS 能承受全球查询量的关键。

2.5 P2P 与 CDN

BitTorrent:文件切成固定大小的 chunk;tracker 给出一组对等方;对等方之间交换“我有哪些块”的位图。两条关键策略:最稀有优先(先请求副本最少的块,防止某些块绝迹)与 tit-for-tat(只给上传速率最高的 4 个对等方上传,定期重新评估)——用“互利”替代中心服务器。

Dcs≥max{NFus,Fdmin}
(2-1)
DP2P≥max{Fus,Fdmin,NFus+∑ui}
(2-2)
例 2-4

F = 1 GB,us = 1 Mbps,每个对等方 ui = 500 kbps,N = 1000:
C/S:NF/us ≈ 8000 s(约 2.2 小时)
P2P:NF/(us+Σui) ≈ 16 s

这就是 P2P 的“自扩展性”:用户既是消费者也是供给者。

视频流:视频编码为恒定码率(CBR)或可变码率(VBR);DASH 把视频切成 2–10 秒的块,每块存多个码率版本,客户端按实测带宽选择下一块的码率(自适应),并把缓冲维持在几十秒以内。

CDN 两种部署哲学:深入(enter deep,把服务器塞进很多 ISP 内部,离用户近、节点多、管理难)与邀请进驻(bring home,在少数 IXP 建大集群,节点少、单点容量大、成本低)。集群选择通常靠 DNS 重定向或 IP 任播。

“DNS 重定向”与“任播”的区别:前者由 DNS 返回一个特定 IP(应用层决策),后者由路由把同一 IP 的流量带到最近的一份(网络层决策)。任播更快收敛,但控制粒度粗。

2.6 套接字编程

UDPTCP
服务端socket → bind → recvfrom / sendtosocket → bind → listen → accept → recv / send
客户端socket → sendto / recvfrom(无需连接)socket → connect → send / recv
可靠性无,需应用自己处理字节流、有序、可靠
边界保留报文边界不保留,需应用层定界
# UDP 服务端核心
s = socket(AF_INET, SOCK_DGRAM)
s.bind(('', 12000))
while True:
    msg, addr = s.recvfrom(2048)
    s.sendto(msg.upper(), addr)   # 收到什么、改大写回什么

# TCP 服务端核心
s = socket(AF_INET, SOCK_STREAM)
s.bind(('', 12000)); s.listen(1)
conn, addr = s.accept()           # 阻塞直到有客户连接
data = conn.recv(1024)
conn.send(b'HTTP/1.1 200 OK

' + data)

易错点

  • TCP 是字节流,不保留报文边界——所以“发两次、收两次”不成立,必须自己加长度前缀或分隔符。
  • UDP 的 recvfrom 一次收一个报文,超长部分被截断,应用要自己定最大长度。
  • 服务器 bind 的端口是“监听端口”,客户端连接后的源端口由系统随机分配。
03

运输层

Transport Layer · UDP · 可靠传输 · TCP · 拥塞控制

运输层是全书计算最密集的一章。核心问题只有两个:怎么把数据可靠地送过去(rdt → GBN → SR → TCP),以及送得太快把网络压垮了怎么办(拥塞控制)。

3.1 运输层服务与 UDP

运输层提供进程到进程的交付,网络层只到主机。教材的经典类比:IP 是邮政系统(把信送到某栋楼),运输层是楼里的收发室(把信分给具体的人)。

多路复用与分解靠端口号实现:发送时把多个进程的数据加上端口号交给网络层(复用),接收时按四元组把报文段交给正确的套接字(分解)。TCP 用四元组(源 IP、源端口、目的 IP、目的端口)区分连接;UDP 只用二元组(目的 IP、目的端口)定位套接字。

协议连接可靠性拥塞控制首部
UDP无连接不可靠(尽力而为)无8 字节
TCP面向连接可靠、有序有(AIMD 等)20 字节起

UDP 报文段只有四个字段:源端口、目的端口、长度、校验和(各 2 字节),其余全是应用数据。

校验和:把首部与数据按 16 位求和 → 回卷进位 → 取反码;接收端再求和应为全 1(3-1)
例 3-1(校验和)

两个 16 位字:0x3A5C + 0x8F21 = 0xC97D;回卷无进位;取反码 = 0x3682,写入校验和字段。
接收端把三个字相加:0x3A5C + 0x8F21 + 0x3682 = 0xFFFF → 全 1,判定无错。

注意:校验和只能发现“多数”错误,不能纠错,也可能漏检(两个比特同时出错可能抵消)。

UDP 的价值不在“可靠”,而在轻、快、可控:无握手时延、无拥塞退让,适合 DNS、实时音视频,以及在其上自建可靠机制的应用(QUIC)。

3.2 可靠数据传输原理

教材用一串递进的协议把“可靠性”拆开讲,这条线索必须能默写:

rdt1.0 理想信道→rdt2.0 比特差错(ACK/NAK)→rdt2.1 序号防重→rdt2.2 无 NAK→rdt3.0 超时重传(停等)→流水线:GBN / SR

每一步都在修前一步的漏洞:

  • rdt2.0:接收方回 ACK/NAK,但ACK 本身也可能出错——发送方不知道对方到底收到了什么。
  • rdt2.1:加 1 位序号,接收方据此判断“是新分组还是重传”,重复分组丢弃但仍回 ACK。
  • rdt2.2:去掉 NAK,用“对上一个正确分组的 ACK”表示“我没收到新的”(冗余 ACK)。TCP 就采用这种思路。
  • rdt3.0:加计时器,超时重传。但它是停等:发一个、等一个,链路利用率极低。
停等:一次只有一个分组在途 流水线:窗口 N=4 数据ACK 等待 RTT 期间链路空闲 利用率 = (L/R)/(RTT+L/R) 连续发送 ACK 陆续返回 利用率 ≈ N·(L/R)/(RTT+L/R)
← 左右滑动看全图 →
图 3-1 停等把“等待”暴露在链路上;流水线用窗口把等待填满。窗口 N 的本质是“允许 N 个未确认分组同时在途”。
回退 N 步(GBN)选择重传(SR)
接收端缓存不缓存乱序分组,直接丢弃缓存乱序分组,逐个确认
确认方式累积确认(ack=n 表示 n 之前全收到)逐个确认
发送窗口≤ 2k−1(k 位序号)≤ 2k−1
重传代价一个丢包可能重传整窗只重传丢失的那一个
复杂度低高(需定时器与缓存管理)
例 3-2(窗口与重传)

序号 0–7(k=3),窗口 N=4,发送 0,1,2,3。分组 1 丢失,2、3 到达:

GBN:接收端丢弃 2、3,只回 ACK 0(期望 1)→ 发送方超时后重传 1,2,3(整窗)
SR:接收端缓存 2、3 并各自 ACK → 发送方只重传 1

为什么 SR 窗口只能到 2k−1?否则新旧分组序号会重叠,接收方分不清“是新包还是重传的老包”。

U=L/RRTT+L/R
(3-2)
U=N(L/R)RTT+L/R≤1
(3-3)
N≥RTT·R+LL
(3-4)
例 3-3

R = 1 Gbps,RTT = 30 ms,L = 1500 B = 12000 bit:
单个分组占用链路时间 L/R = 12 μs;RTT 期间链路可传 30 ms/12 μs = 2500 个分组
→ 要打满链路,窗口需 N ≥ 2501(实际由 TCP 窗口缩放选项支持)

3.3 TCP 连接与报文段

三次握手的目的不是“建立连接”这么笼统,而是三件具体的事:① 双方确认对方收发都正常;② 同步初始序号(ISN);③ 协商 MSS、窗口缩放、SACK 等选项。

客户服务器 SYN, seq=x ACK=x+1 (可带数据) SYNACK, seq=y, ack=x+1 —— 数据传输:seq 按字节编号,ack 表示“期望的下一个字节” —— FIN, seq=u ACK=u+1 半关闭
← 左右滑动看全图 →
图 3-2 三次握手(上三行)与四次挥手(下两行,实际是 FIN/ACK 各两次)。挥手多一次,是因为 TCP 支持半关闭:一方说“我没数据了”,另一方可能还有数据要发。
字段作用
源/目的端口复用与分解
序号 seq本报文段第一个数据字节在字节流中的编号
确认号 ack期望收到的下一个字节(累积确认)
接收窗口 rwnd流量控制:本端还能接收多少字节
标志位SYN、FIN、ACK、RST、PSH、URG、CWR、ECE
首部长度 / 选项20 字节起;MSS、窗口缩放、时间戳、SACK
例 3-4(序号与确认号)

客户 ISN = 1000,发送 500 字节 → seq=1000,len=500
服务器回 ack=1500(期望下一个字节 1500),同时自己的 seq=3000
客户再发 200 字节 → seq=1500,len=200;服务器 ack=1700

看清一点:ack 是“我期待的下一个”,不是“我收到的最后一个”,两者差 1。

RTT 估计用指数加权移动平均,超时时间再加 4 倍偏差,避免“估计得刚好、稍微抖动就误重传”:

EstimatedRTT=(1−α)EstimatedRTT+αSampleRTT,α=0.125
(3-5)
DevRTT=(1−β)DevRTT+β|SampleRTT−EstimatedRTT|,β=0.25
(3-6)
TimeoutInterval=EstimatedRTT+4DevRTT
(3-7)

Karn 算法:重传的报文段不采样(无法判断 ACK 对应哪次发送),且每次超时把超时间隔加倍(指数退避),避免在拥塞时反复猛发。

例 3-5(RTT 估计)

旧 EstimatedRTT = 100 ms,新样本 120 ms:
EstimatedRTT = 0.875×100 + 0.125×120 = 102.5 ms
若 DevRTT 原为 10 ms:DevRTT = 0.75×10 + 0.25×|120−100| = 12.5 ms
TimeoutInterval = 102.5 + 4×12.5 = 152.5 ms

3.4 TCP 可靠传输与流量控制

  • 累积确认 + 冗余 ACK:收到乱序段时重复发“期望字节”的 ACK;发送方收到 3 个冗余 ACK 就快速重传,不必等超时(超时可能长达几百毫秒)。
  • 超时重传:计时器到期仍未确认,重传最早未确认的段,并把超时间隔加倍。
  • 流量控制:接收方用 rwnd 通告缓冲余量,发送方保证 LastByteSent−LastByteAcked≤rwnd,防止“发得太快把接收端缓冲打满”。
  • 与拥塞控制的区别:流量控制保护接收方,拥塞控制保护网络;实际发送窗口取 min(cwnd, rwnd)。
例 3-6(流量控制)

接收方缓冲 4000 B,已缓存 1000 B 未读 → 通告 rwnd=3000
发送方已发未确认 2000 B;若 cwnd=3500,则还能发 min(3500,3000)−2000 = 1000 B

若接收方应用一直不读,rwnd 会降到 0,发送方停止发送并定期发零窗口探测,否则双方永久僵死。

3.5 拥塞控制

拥塞的代价有三层:① 排队时延增大;② 丢包引起重传,浪费带宽;③ 多跳场景下,上游链路已经把分组送出去,却在 downstream 被丢弃,前面的努力全白费。所以“拥塞控制”不是“别丢包”,而是“别把网络推到崩溃点”。

cwnd时间 ssthresh 慢启动(指数) 拥塞避免(线性) 超时:cwnd 归 1 3 个冗余 ACK:减半
← 左右滑动看全图 →
图 3-3 AIMD 的“锯齿”:加性增(每个 RTT 加 1 MSS)、乘性减(丢包时减半)。锯齿形状不是缺陷,而是探测可用带宽的必要代价——不知道上限在哪里,只能不断试探。
阶段触发cwnd 变化
慢启动连接开始 / 超时后每收到一个 ACK 加 1 MSS → 每 RTT 翻倍;到 ssthresh 转拥塞避免
拥塞避免cwnd ≥ ssthresh每 RTT 加 1 MSS(线性)
快速重传 / 快速恢复3 个冗余 ACKssthresh = cwnd/2,cwnd = ssthresh + 3,之后线性增长(Reno)
超时计时器到期ssthresh = cwnd/2,cwnd = 1 MSS,重回慢启动
例 3-7(窗口演化)

初始 cwnd=1,ssthresh=8(单位 MSS):
第 1–3 个 RTT:1 → 2 → 4 → 8(慢启动,翻倍)
到 8 后进入拥塞避免:8 → 9 → 10 …(每 RTT +1)
在 cwnd=12 时发生超时:ssthresh=6,cwnd=1 → 重新慢启动到 6,再线性增长
若改为 3 个冗余 ACK:ssthresh=6,cwnd=6+3=9 → 直接线性增长(不归 1)

这道题型的关键:超时 vs 冗余 ACK 的处理不同,前者“归 1 重来”,后者“减半继续”。

吞吐量≈0.75WRTT
(3-8)
吞吐量≈MSSRTT·1.22L
(3-9)

公平性:多条 TCP 共享同一瓶颈时,AIMD 会收敛到“均分带宽”(因为增得慢、减得狠,快的被惩罚得多)。但 UDP 不受约束,会挤占 TCP;RTT 小的连接增长更快,也不公平。对策:AQM(如 CoDel)、ECN(路由器用标记而不是丢包提前通知)、以及更现代的 CUBIC(按立方函数增长,长肥管道更快)与 BBR(基于带宽与 RTT 建模,不把丢包当唯一信号)。

为什么“丢包 = 拥塞”这个假设在无线链路上会失效?因为无线丢包常来自误码与切换,不是排队溢出。此时 TCP 减窗是“误判惩罚”,所以无线链路常在链路层做本地重传(让 TCP 看不到丢包),这也是“层间违例”的典型例子。
04

网络层:数据平面

The Network Layer: Data Plane · 转发 · 路由器 · IPv4 · NAT · SDN

第 4 章讲“一个分组到达路由器后,在本地怎么被送出去”(数据平面);第 5 章讲“转发表是谁算出来的”(控制平面)。这条分工是理解全书网络层的关键。

4.1 概述:转发与路由

转发(forwarding)本地动作:按转发表把分组从输入端口搬到合适的输出端口,纳秒级,硬件实现。
路由选择(routing)全网过程:运行路由协议算出端到端路径,秒级,软件/分布式。
数据平面逐包处理:查表、改 TTL、排队、调度。
控制平面决定表项:OSPF/BGP 分布式计算,或 SDN 控制器下发。

因特网的网络服务模型是尽力而为(best-effort):不保证交付、不保证时延与带宽、不保证顺序。这与 ATM 的 CBR(恒定比特率)、VBR(可变比特率)、ABR(可用比特率)承诺形成对照——ATM 用复杂信令换取 QoS 保证,最终输给了“简单 + 过量带宽”的 IP 模型。

4.2 路由器工作原理

输入端口 输入端口 交换结构 内存 / 总线 / Crossbar 输出端口 输出端口 路由处理器(控制平面) 查表(最长前缀匹配) 调度:FIFO / 优先级 / RR / WFQ 排队 → 丢包
← 左右滑动看全图 →
图 4-1 输入端口做“查表 + 排队”,交换结构把分组搬到输出端口,输出端口做“排队 + 调度”。控制平面(路由处理器)只负责把转发表写好。
  • 最长前缀匹配:在 CIDR 前缀中选最具体的一条;硬件用 TCAM 并行比较所有前缀。
  • 交换结构:经内存(一次一个,慢)、经总线、经互联网络(Crossbar,可并行);线速要求 Rswitch≥N·Rline。
  • 输入排队会产生 HOL 阻塞:队首分组要去一个忙的输出端口,后面的分组即使目标空闲也得等。
  • 输出排队超出缓冲则丢包;缓冲膨胀(bufferbloat)是缓冲配得太大导致时延长期偏高。
例 4-1(调度差异)

三个流 A、B、C 同时到达,分组大小相同,输出速率 1 包/时隙:

FIFO:按到达顺序 A B C A B C…(谁先来谁先走)
优先级(A 最高):A 全走完才轮到 B、C(A 的时延最小,C 可能饿死)
轮询 RR:A B C A B C…(公平,但 A 的突发被摊薄)
WFQ(权重 2:1:1):A 占 1/2 带宽,B、C 各 1/4(按权重分配,且保证最小速率)

4.3 IPv4 与编址

IPv4 首部(20 字节固定 + 选项):版本、首部长度、服务类型、总长度、标识/标志/片偏移(分片用)、TTL、协议、首部校验和、源/目的 IP。

概念要点
分片受 MTU 限制;片偏移以 8 字节为单位;由目的端重组;IPv6 取消路由器分片
CIDRa.b.c.d/x,前 x 位为网络前缀;路由聚合减少表项
子网与主机直连、不经过路由器的一组接口;用子网掩码 / 前缀长度描述
DHCPUDP 67/68,DISCOVER → OFFER → REQUEST → ACK 四步,即插即用
原数据报:4000 B = 20 B 首部 + 3980 B 数据 片1:20+1480,偏移 0 片2:20+1480,偏移 185 片3:20+1020,偏移 370 偏移单位 = 8 字节:1480/8 = 185;370×8 = 2960,+1020 = 3980 ✓
← 左右滑动看全图 →
图 4-2 MTU 1500 → 每片数据最多 1480 B,且必须是 8 的倍数。最后一片可以更短,靠“标志位 MF=0”标识结束。
例 4-2(子网与分片)

① 200.23.16.0/20 能分成多少个 /24?224−20 = 16 个
② 某接口 192.168.1.130/26 的子网地址?/26 块大小 64 → 192.168.1.128,可用主机 .129–.190,广播 .191
③ 3000 B 数据报(首部 20)过 MTU 1500:数据 2980 → 1480 + 1480 + 20,共 3 片

最长前缀匹配的例子:转发表同时有 200.23.16.0/20 与 200.23.18.0/23,目的地址 200.23.18.5 应选后者(更长、更具体),即使前者也能匹配。

4.4 NAT 与 IPv6

NAT 让一个公网 IP 服务多台内网主机:出方向把(源 IP, 源端口)替换成(公网 IP, 新端口)并记表,回方向按表还原。

内网主机 A10.0.0.2:3345 NAT 路由器公网 203.0.113.7 Web 服务器93.184.216.34:80 src 10.0.0.2:3345 src 203.0.113.7:5001 转换表:10.0.0.2:3345 ↔ 203.0.113.7:5001 → 93.184.216.34:80 回包 dst=5001 时,查表还原成 10.0.0.2:3345 再送入内网
← 左右滑动看全图 →
图 4-3 NAT 的本质是“用端口号复用公网 IP”,同时带来副作用:外部无法主动连入(除非端口映射),P2P 需要打洞(STUN/TURN)。

IPv6:128 位地址、固定 40 字节首部、取消首部校验和与路由器分片、加入流标签;过渡技术有双栈(同时跑 v4/v6)、隧道(6to4,把 v6 包塞进 v4)、转换(NAT64/DNS64)。

IPv4IPv6
地址长度32 位(约 43 亿)128 位
首部20 字节起,含校验和固定 40 字节,无校验和
分片路由器可分片仅源端分片(扩展首部)
配置DHCP / 手工SLAAC 无状态自动配置

4.5 泛化转发与 SDN

传统转发只看目的 IP;泛化转发用“匹配 + 动作”表:匹配任意首部字段组合(OpenFlow 的 12 元组),动作可为转发、丢弃、修改首部、送控制器、复制到多端口。

匹配(Match)动作(Action)典型用途
入端口 + 目的 MAC转发到端口 3二层交换
目的 IP 前缀改目的 MAC、转发三层路由
TCP 目的端口 80丢弃防火墙 / 策略
源 IP + 目的 IP改源 IP 后转发NAT / 负载均衡
这是 SDN 的基础:转发表不再由分布式路由协议写入,而由逻辑集中的控制器统一下发(第 5.5 节展开)。好处是全局最优与策略一致,代价是控制器可靠性与扩展性。

中间盒:NAT、防火墙、负载均衡、DPI——它们“既不是纯路由器也不是纯主机”,破坏了分层假设,是现代网络管理复杂性的主要来源。

05

网络层:控制平面

The Network Layer: Control Plane · LS · DV · OSPF · BGP · SDN · ICMP

控制平面回答一个问题:转发表里的每一条是从哪来的。答案有三条路线——每路由器独立的分布式算法(OSPF、BGP)、逻辑集中的 SDN 控制器,以及两者的混合。

5.1 控制平面概述

每路由器控制SDN 集中式控制
算法位置每个路由器自己跑路由协议远程控制器算好,下发给交换机
典型OSPF、BGPOpenFlow、Google B4
优点鲁棒、无单点故障、随网络自愈全局视图、策略易编排、可编程
缺点收敛慢、难做全局优化与流量工程控制器可靠性与扩展性挑战

两种路线的根本差别是“信息在哪”:分布式算法里,每个路由器只知道局部信息,靠邻居交换逐步收敛;SDN 里,控制器持有全网拓扑与流量矩阵,可以一次算出全局最优解。

5.2 路由选择算法

链路状态(LS):每个节点把“我连了谁、代价多少”洪泛到全网,所有节点得到同一张拓扑图,各自跑 Dijkstra 求最短路径树。

  1. 初始化:源点距离 0,其余 ∞;已确定集合 N' 只含源点。
  2. 在所有未确定节点中选距离最小的 u,加入 N'。
  3. 用 u 的邻居更新距离:若 D(v) > D(u) + c(u,v),则更新并记录前驱。
  4. 重复 2–3 直到所有节点确定。
例 5-1(Dijkstra)

拓扑:u—v(2)、u—x(1)、u—w(5)、x—v(2)、x—w(3)、x—y(1)、v—w(3)、w—y(1)、w—z(5)、y—z(2)。求 u 到各点的最短距离。

第1步:D(x)=1,D(v)=2,D(w)=5,D(y)=∞,D(z)=∞ → 取 x
第2步:经 x 更新:v=min(2,1+2)=2;w=min(5,1+3)=4;y=1+1=2 → 取 v 或 y
第3步:经 v:w=min(4,2+3)=4;经 y:w=min(4,2+1)=3,z=2+2=4
第4步:取 w(3):z=min(4,3+5)=4 → 取 z(4)
最终:x=1, v=2, y=2, w=3, z=4;路径 u→x→y→w→z

距离向量(DV):每个节点只与直接邻居交换自己的距离向量,用 Bellman-Ford 迭代:

Dx(y)=minvinN(x){c(x,v)+Dv(y)}
(5-1)

它不需要全局拓扑,但会犯一个著名错误:计数到无穷(count-to-infinity)——好消息传得快,坏消息传得慢。

例 5-2(计数到无穷)

三个节点 x—y—z 串成链,代价都是 1。y 到 x 的链路突然断开:

y 原以为“我到 x 距离 1”,现在改看邻居 z:“z 说它到 x 是 2” → y 算 1+2=3
z 看 y 变成 3 → z 算 1+3=4;y 再看 z=4 → y=5 …… 一直涨到无穷

对策:最大跳数(RIP 里 16 即不可达)、水平分割(不把路由回传给来源)、毒性逆转(把回传方向的代价设为 ∞)、触发更新(变化立即发,不等周期)。

LS(Dijkstra)DV(Bellman-Ford)
信息范围全网拓扑仅邻居的距离向量
收敛较快、可预测慢,可能计数到无穷
报文量O(nE) 洪泛随拓扑变化传播
典型协议OSPF、IS-ISRIP、BGP(路径向量改造)

5.3 AS 内部路由:OSPF

OSPF 是链路状态协议,直接承载在 IP 上(协议号 89),洪泛链路状态通告(LSA),每个路由器维护相同的链路状态数据库,再各自跑 Dijkstra。支持层次化区域:骨干区 0 + 若干非骨干区,区域间只交换汇总信息,减少洪泛范围;度量是链路代价(可配置,默认与带宽相关,不一定是跳数)。

为什么大型网络要分区?因为 LS 的洪泛量与拓扑规模成正比:几千台路由器全在一个区域,任何一条链路抖动都会引发全网重算。

5.4 AS 之间路由:BGP

BGP 是路径向量协议,运行在 TCP/179 上。它传播的不是“距离”,而是完整的 AS 路径——这既防环(看到自己就在路径里,直接丢弃),又让每个 AS 能执行策略(谁能过、走谁)。

AS1接入 ISP AS2区域 ISP AS3一级 ISP AS4 eBGPeBGPeBGP AS4 宣告 4.0.0.0/8 后,AS1 收到的路径:AS4 → AS3 → AS2 → AS1 AS1 若同时收到 “AS4 AS3 AS2” 与 “AS4 AS5 AS2”,选 AS-PATH 更短的那条(或按 LOCAL-PREF 先决策略)
← 左右滑动看全图 →
图 5-1 BGP 的 AS-PATH 是“逆向写回”的:谁把它传给你,就在路径前面加上自己的 AS 号。它同时充当“路由”和“防环标记”。
  • eBGP:AS 之间交换路由;iBGP:把从外部学到的路由分发给 AS 内所有路由器(否则内部路由器不知道出口)。
  • 路径属性:AS-PATH(经过的 AS 序列)、NEXT-HOP(下一跳 IP,iBGP 里常是边界路由器地址)、LOCAL-PREF(本地偏好,越大越优先)、MED(多出口鉴别,提示邻居走哪个入口)。
  • 热土豆路由:只求“尽快离开本 AS”,选 NEXT-HOP 最近的出口,可能造成绕路(进 AS3 又出去)。
  • IP 任播:同一地址在多地宣告,路由自然把用户送到最近的一份(DNS 根、CDN 常用)。
BGP 决策顺序:本地偏好(LOCAL-PREF)→ 最短 AS-PATH → 最近 NEXT-HOP → MED → 其他(router ID)(5-2)
BGP 的核心不是“最短路径”,而是商业策略:ISP 不愿给“客户之间”做免费中转(那会亏带宽),所以常把“从客户学到的路由”优先于“从对等方学到的路由”。这就是为什么“网络距离近”不等于“BGP 路径短”。

5.5 SDN 控制平面

SDN 的四条特征:基于流的转发、控制与数据平面分离、控制平面外部化(远程控制器)、可编程。

网络控制应用(路由 / 防火墙 / 负载均衡) SDN 控制器(全局视图 + 状态管理) 交换机 A 交换机 B 交换机 C 北向 API 南向:OpenFlow
← 左右滑动看全图 →
图 5-2 北向 API 给应用用(写策略),南向协议给交换机用(装流表)。控制器是“网络的操作系统”。

OpenFlow 流表项 = 匹配字段 + 优先级 + 计数器 + 动作集合(转发、丢弃、改字段、送控制器)。控制器与交换机之间用 OpenFlow 协议;常见控制器 ONOS、OpenDaylight,云厂商则多用自研(如 Google 的 Orion)。

例 5-3(SDN 做流量工程)

两条路径 A(1 Gbps)、B(1 Gbps),流量需求 1.6 Gbps。传统 OSPF 会把所有流量压到“最短”的那条,造成拥塞;SDN 控制器看到全局需求后,按 0.8/0.8 分流到两条路径。

这是 SDN 最典型的收益:把“最短路径路由”换成“全局最优分配”。

5.6 ICMP 与网络管理

  • ICMP:差错与控制报文(目的不可达、超时、回送请求/应答),被 ping 与 traceroute 使用;traceroute 靠逐跳递增 TTL,让每台路由器回一个“超时”。
  • SNMP:管理站—代理模型,MIB 存变量,Get/Set/Trap 操作,跑在 UDP 上;适合“读状态”,不适合“批量配置”。
  • NETCONF / YANG:面向配置(而非仅监控),XML 描述数据模型,支持事务与回滚,是现代网络自动化的基础。
例 5-4(traceroute 为什么能显示路径)

TTL=1 → 第一跳路由器减到 0,回 ICMP 超时,暴露其 IP
TTL=2 → 第二跳回超时 …… 直到到达目的主机(回“端口不可达”)
每跳通常探测 3 次,取 RTT 显示

06

链路层和局域网

The Link Layer and LANs · 差错检测 · 多路访问 · 以太网 · 交换机 · Web 全流程

链路层把“一个分组”变成“一段链路上能传输的帧”,并解决多个结点共享同一介质的冲突问题。它是五层里唯一“逐跳”而非“端到端”工作的层。

6.1 链路层概述

链路层提供的服务有四类:成帧(把比特流切成有边界的帧)、链路接入(MAC,决定谁在什么时候发)、可靠交付(可选,无线链路常用)、差错检测与纠正。实现在网络适配器(网卡)的硬件里,主机软件只处理驱动与部分高层逻辑。

为什么链路层要“可选地”做可靠传输,而运输层已经做了?因为无线链路的误码率高,逐跳重传比端到端重传更快、更省(不用重传整条路径),而且能让 TCP 误以为“没丢包”,避免误降窗。

6.2 差错检测:CRC

技术原理能力
奇偶校验(一维/二维)附加校验位;二维可定位并纠正单比特弱;二维可纠 1 位
检验和(Internet checksum)16 位反码求和弱但便宜(运输层/网络层用)
CRC模 2 除法,用生成多项式 G 除强,链路层标准做法
T=D·2roplusR
(6-1)
TmodG=0
(6-2)
例 6-1(CRC 计算)

D = 101110,G = 1001(r = 3)→ 被除数 101110000
逐位模 2 除(异或),得余数 R = 011
发送 T = 101110011;接收端用 G 除,余数为 0 则无错

要点:模 2 除法不借位,就是异或;余数位数固定为 r 位(不足补 0)。

6.3 多路访问协议

类别代表要点
信道划分TDM / FDM / CDMA无冲突,但低负载时浪费;适合恒定速率业务
随机接入ALOHA、时隙 ALOHA、CSMA、CSMA/CD、CSMA/CA高负载冲突多;CSMA/CD 用于有线以太网,CSMA/CA 用于无线
轮流轮询(polling)、令牌传递无冲突、时延可预期;有轮询开销与单点故障
纯 ALOHA 最大效率 1/(2e) ≈ 18%;时隙 ALOHA 1/e ≈ 37%(6-3)
Lmin=2dpropR
(6-4)
例 6-2(最小帧长)

10 Mbps 以太网,最大距离 2500 m,传播速率 2×108 m/s:
往返传播时延 = 2×2500 ÷ 2×108 = 25 μs
最小帧长 = 25 μs × 10 Mbps = 250 bit → 标准取 512 bit(64 B)

直观解释:帧太短,发送方可能在“还不知道撞了”时就发完了,于是错误无法被检测到。

CSMA/CD(有线以太网):先听后发、边发边听、冲突即停、二进制指数退避(第 n 次冲突在 {0,…,2n−1} 个时隙中随机等待)。CSMA/CA(无线):无法“边发边听”(自己的信号太强盖住别人),改为避免——先听、随机退避、发完等 ACK;可选 RTS/CTS 解决隐藏终端。

6.4 交换局域网

MAC 地址(48 位,全球唯一,扁平)与 IP 地址(层次、可聚合)的区别是常考点:MAC 用于“同一链路上的下一跳”,IP 用于“端到端的全局定位”。

ARP:在同一子网内把 IP 解析为 MAC——广播“谁是 192.168.1.1?”,目标单播回应,结果缓存(软状态,几十秒到几分钟)。跨子网时,主机把帧发给默认网关的 MAC,而不是目的主机的 MAC——这是很多人第一次读错的地方。

例 6-3(ARP 与网关)

主机 192.168.1.5/24 访问 8.8.8.8:
① 判断目的不在本子网 → 查默认网关 192.168.1.1
② ARP 广播问 192.168.1.1 的 MAC → 网关单播回应
③ 以太网帧:源 MAC=主机,目的 MAC=网关;IP 头:源 192.168.1.5,目的 8.8.8.8
④ 网关收到后重新封装(新源 MAC=网关,目的 MAC=下一跳),IP 头不变(除 TTL)

以太网帧:前同步码 8 B + 目的 MAC 6 B + 源 MAC 6 B + 类型 2 B + 数据 46–1500 B + FCS 4 B(CRC-32)。最大帧 1518 B,对应 MTU 1500。

A(端口1) B(端口2) 交换机 C(端口3) 帧:src=A, dst=C 只从端口3 发出 帧:src=B, dst=未知 未知单播 → 向所有其他端口泛洪
← 左右滑动看全图 →
图 6-1 交换机靠“看源地址”自学习:收到帧就记下“这个 MAC 在我的哪个端口”,转发时查目的 MAC;查不到就泛洪,收到回应后补齐表项。

交换机:自学习 + 按目的 MAC 转发 + 未知单播泛洪;无路由功能,靠 生成树(STP) 防环;VLAN(802.1Q)用 4 字节标签在物理网络上切出多个逻辑局域网,广播域随之隔离。

交换机路由器
工作层链路层(MAC)网络层(IP)
转发表自学习生成路由协议 / SDN 生成
广播域同一 VLAN 内可泛洪默认隔离广播
典型时延微秒级较大(需查路由 + 改 TTL)

6.5 数据中心与 Web 请求全流程

数据中心网络:分层拓扑(TOR → 汇聚 → 核心)与叶脊(leaf-spine);用 ECMP 做多路径负载均衡,用 VXLAN 做 overlay(把二层帧封进 UDP),用 SDN 统一编排。

  • DHCP(UDP 67/68):DISCOVER → OFFER → REQUEST → ACK,拿到本机 IP、默认网关、DNS 服务器。
  • ARP:解析默认网关的 MAC(同子网内广播)。
  • DNS:解析域名(UDP 53,通常经本地 DNS 递归)。
  • TCP 三次握手:SYN → SYNACK → ACK(1 RTT)。
  • HTTP 请求与响应:中途可能经过 NAT、防火墙、负载均衡、CDN 边缘。
  • 页面引用对象:重复 3–5(持续连接可复用 TCP)。
  • 这六步是“把所有章节串起来”的最佳复习题:DHCP 用 UDP 与广播、ARP 是链路层、DNS 是应用层、TCP 是运输层、HTTP 是应用层——每一步都能追问“如果这一步失败了会怎样”。
    07

    无线网络和移动网络

    Wireless and Mobile Networks · 802.11 · CSMA/CA · 4G/5G · 移动性管理

    本章要区分两个容易混淆的概念:无线解决“最后一跳用无线电代替网线”,移动解决“换接入点后地址与连接怎么办”。二者可以独立存在——Wi-Fi 不移动,蜂窝电话边走边通话才是移动。

    7.1 无线链路特征

    • 衰减:信号随距离与遮挡衰减(平方反比 + 墙体吸收);干扰:同频段的其他设备(微波炉、邻居 Wi-Fi);多径:反射造成不同到达时间,产生符号间干扰。
    • SNR 与 BER:信噪比越高,误码率越低;速率越高对 SNR 要求越高——所以“自适应调制编码”是无线的基本操作:信号好就用高阶调制(快),信号差就降阶(稳)。
    • 隐藏终端:A、C 都能听到 AP,但互相听不到,同时发送会在 AP 处冲突,需要 RTS/CTS。
    SNR可用调制/速率BER
    低(< 10 dB)低阶(BPSK)仍可能偏高,需重传
    中(10–20 dB)QPSK / 16-QAM较低
    高(> 25 dB)64-QAM / 256-QAM很低,可高速率

    7.2 Wi-Fi:802.11

    体系结构:BSS(基本服务集)= AP + 若干站点;SSID 标识网络名,BSSID 是 AP 的 MAC;多个 BSS 经交换机组成 ESS,靠关联(association)接入,切换 AP 叫重关联。

    CSMA/CA(可选 RTS/CTS) 发送方接收方 RTS CTS(其他站点听到后静默) DATA ACK 帧间间隔:SIFS 用于 ACK/CTS 抢先,DIFS 用于普通数据;退避窗口随机
    ← 左右滑动看全图 →
    图 7-1 无线不能“边发边听”,所以用 ACK 确认 + 随机退避 代替冲突检测;RTS/CTS 用短帧预约信道,解决隐藏终端,代价是额外开销。

    802.11 帧有 4 个地址字段(源、目的、AP、以及自组网时的第四地址)、序号、持续时间;管理帧(信标、探测、关联)负责“发现与接入”,控制帧(RTS/CTS/ACK)负责“预约与确认”,数据帧承载上层数据。

    蓝牙(802.15.1):个人域网络,主从(piconet)+ 跳频,适合低功耗外设(耳机、手环)。

    7.3 蜂窝网络:4G 与 5G

    UE eNodeB基站 MME(信令) S-GW(锚点) P-GW(出口) HSS(签约) Internet 控制面(MME/HSS)与用户面(S-GW/P-GW)分离;5G 进一步服务化(SBA)与网络切片
    ← 左右滑动看全图 →
    图 7-2 4G 核心网(EPC)四件套:MME 管信令与移动性,S-GW 是用户面锚点,P-GW 连外网并分配 IP,HSS 存签约数据。
    4G LTE5G
    频段sub-6 为主sub-6 + 毫米波
    时延~10–50 ms目标 1 ms 级(URLLC)
    架构EPC,网元固定SBA(服务化)、网络切片
    典型场景移动宽带eMBB / URLLC / mMTC

    7.4 移动性管理

    • 归属网络 / 被访网络:归属网保存永久身份与签约,被访网提供接入。
    • 间接路由:通信对端始终发给归属网,归属网再隧道到被访网(三角路由,但切换对端透明)。
    • 直接路由:对端查询当前位置后直接发送(路径短,但需要位置查询与一致性维护)。
    • 移动 IP:归属代理 + 外地代理 + 转交地址(COA),用 IP-in-IP 隧道转发。
    例 7-1(三角路由的代价)

    对端在北京、归属网在上海、用户漫游到广州:
    间接路由:北京 → 上海 → 广州(绕行 1 倍以上)
    直接路由:北京 → 广州(最短,但要做位置查询)

    4G/5G 用的是“锚点 + 隧道”的折中:S-GW 作为锚点,切换时只改隧道终点,对端无感。

    7.5 对高层协议的影响

    无线链路的误码与切换会被 TCP 误判为拥塞(把随机丢包当成拥塞信号),导致不必要的降速;对策包括链路层本地重传、TCP 拆分连接(split TCP,把长 RTT 断成两段)、ECN 显式告知,以及 CUBIC/BBR 这类不把丢包当唯一信号的拥塞控制。

    一句话总结本章:无线解决“怎么在空中传”,移动解决“换了地方连接不断”;前者是链路层问题,后者是网络层与传输层协同问题。
    08

    计算机网络中的安全

    Security in Computer Networks · 密码学 · 鉴别 · TLS · IPsec · 防火墙

    网络安全要同时满足四件事:机密性(别人看不懂)、完整性(没被改)、鉴别(确实是他)、可用性(还能用)。本章按“先造工具、再组装协议”的顺序讲:对称加密 → 公钥 → 散列与签名 → 证书 → TLS/IPsec。

    8.1 安全目标与密码学基础

    对称加密同一把密钥加解密。DES(56 位,已不安全)、3DES、AES(128/192/256)。块密码工作模式:ECB(同样的块加密成同样的密文,不安全)、CBC(前一块密文参与下一块,需随机 IV)。
    公钥加密公钥加密、私钥解密。RSA 基于大数分解困难;密钥长、速度慢,通常只用来加密会话密钥。
    密钥交换Diffie-Hellman:双方在不安全信道上协商出共享密钥,但不提供鉴别,会被中间人攻击。
    混合体制实际协议(TLS)都是“公钥换会话密钥 + 对称加密数据”。
    例 8-1(RSA 小数字演示)

    取 p=5, q=11 → n=55,φ(n)=40;选 e=3(与 40 互素)
    求 d:3d ≡ 1 mod 40 → d=27(3×27=81=2×40+1)
    公钥 (n=55, e=3),私钥 d=27;加密 m=8:c = 8³ mod 55 = 512 mod 55 = 17
    解密:17²⁷ mod 55 = 8 ✓

    真实场景 n 是 2048 位以上的大数,计算量之大正是安全性来源。

    例 8-2(Diffie-Hellman 的中间人)

    A 与 B 各自选私钥、互换 g^a、g^b,得到同一个 K——但攻击者 M 可以分别与 A、B 建立两个不同的 K。
    DH 只保证“密钥协商不被窃听”,不保证“对面是谁”,所以必须配合证书/签名做鉴别。

    8.2 完整性与数字签名

    报文 m 散列 H(m) 用私钥加密 → 签名 → 与 m 一起发送 收到 m 与签名 用公钥解密签名 比对 H(m) 相等则完整且来自私钥持有者
    ← 左右滑动看全图 →
    图 8-1 签名 = “用私钥加密摘要”。它同时提供完整性(改一个字节摘要就变)与不可否认性(只有私钥持有者能生成)。
    • 散列函数:SHA-256 等,抗碰撞;输出定长摘要,用于“压缩后再签名”。
    • MAC / HMAC:用共享密钥 + 散列,保证完整性与“来自持有密钥者”,但不能向第三方证明(双方都有密钥)。
    • 数字签名:用私钥签、公钥验,可向第三方证明且不可否认。
    • 证书与 CA:解决“这把公钥到底是谁的”;CA 用自己的私钥签发证书,浏览器内置根证书形成信任链。
    例 8-3(为什么需要证书)

    你去银行网站,服务器给你公钥——但这把公钥可能是中间人伪造的。证书就是“CA 用私钥签名的声明:这把公钥属于 bank.com”。你用内置的 CA 公钥验证签名,就确认了归属。

    信任链:根 CA(内置)→ 中间 CA(由根签)→ 站点证书(由中间签)

    8.3 端点鉴别与邮件安全

    端点鉴别三要素:共享秘密、公钥、nonce(一次性随机数,防重放)。教材用 ap1–ap5 逐步演示:只报名字不行(可冒充)、加口令不行(可窃听重放)、加 nonce 才安全、必须双向鉴别(否则中间人可伪装服务器)。

    PGP:邮件端到端加密的事实标准——随机生成会话密钥,用对称算法加密正文,用接收方公钥加密会话密钥;同时用发送方私钥签名,实现机密 + 鉴别 + 完整。

    8.4 TLS 与 IPsec

    客户服务器 ClientHello(支持的套件 + 随机数) ServerHello + 证书 + 密钥交换参数 验证证书 → 生成预主密钥(公钥加密) Finished(握手完成校验) 之后:对称加密 + MAC 保护应用数据(记录层)
    ← 左右滑动看全图 →
    图 8-2 TLS 握手做三件事:鉴别服务器(证书)、协商算法(套件)、导出会话密钥(前向保密用 ECDHE)。握手完成后所有数据走对称加密。
    AHESP
    机密性无有(加密载荷)
    完整性/鉴别有(整个数据报,除可变字段)有(ESP 头之后)
    传输/隧道模式两种两种
    用途较少VPN 主流

    IPsec 靠 SA(安全关联,单向)定义算法与密钥,用 IKE 自动协商;隧道模式下整个原 IP 数据报被封装,形成 VPN。

    8.5 无线安全与系统安全

    • WEP(RC4 + 静态密钥 + 弱 IV)已被攻破;WPA2(AES-CCMP + 4 次握手)仍广泛使用;WPA3 用 SAE 抵抗离线字典攻击。
    • 4G/5G 鉴权:SIM 卡与 HSS 共享长期密钥,用挑战-响应(AKA)完成双向鉴别,空口加密在基站完成。

    8.6 防火墙与 IDS

    类型依据能力
    无状态分组过滤五元组(源/目的 IP、端口、协议)快,但不懂连接状态
    状态化过滤连接状态表可按会话放行返回流量
    应用网关 / 代理应用层内容可鉴权与内容过滤,性能开销大
    IDS / IPS特征匹配或异常检测告警(IDS)或阻断(IPS);加密流量下受限

    易错点

    • MAC ≠ 数字签名:MAC 不能向第三方证明,签名可以。
    • 公钥加密的是“会话密钥”,不是整段数据——性能原因。
    • 证书解决的是“公钥归属”,不是“加密强度”。
    • IPsec 的 SA 是单向的,双向需要两个 SA。
    • HTTPS 只能保护“端到端内容”,不能隐藏“你在访问哪个 IP”(除非用 ECH/加密 SNI)。
    A

    核心公式与速查表

    Formula Sheet · 时延 · 效率 · 窗口 · 子网 · CRC

    A.1 时延与吞吐量

    dtrans = L/R dprop = d/s dnodal = dproc+dqueue+dtrans+dprop(A-1)
    流量强度 = L·a/R;吞吐量 = min{Rs, Rc, 各跳 R}(A-2)
    存储转发端到端 = N·L/R;非持续 HTTP ≈ 2RTT × 对象数 + 传输(A-3)

    A.2 可靠传输与窗口

    停等利用率 = (L/R)/(RTT + L/R);窗口 N 时 = N(L/R)/(RTT + L/R)(A-4)
    打满链路 N ≥ (RTT·R + L)/L;GBN:W ≤ 2k−1;SR:W ≤ 2k−1(A-5)

    A.3 拥塞控制与 TCP

    TimeoutInterval = EstimatedRTT + 4·DevRTT;α=0.125,β=0.25(A-6)
    AIMD 平均吞吐量 ≈ 0.75·W/RTT;宏观模型 ≈ (MSS/RTT)·1.22/√L(A-7)

    A.4 编址与差错检测

    可用主机数 = 2(32−前缀) − 2(扣除网络号与广播)(A-8)
    子网块大小 = 2(32−前缀);最长前缀匹配取最具体项(A-9)
    CRC:T = D·2r XOR R(R 为余数);接收余数为 0 判无错(A-10)
    CSMA/CD 最小帧长 = 2·dprop·R;ALOHA 效率 18%,时隙 ALOHA 37%(A-11)
    B

    术语中英对照

    Glossary · 考试与读英文材料的高频词汇

    B.1 分层与通用

    中文English中文English
    端系统end system / host分组交换机packet switch
    存储转发store-and-forward流量强度traffic intensity
    封装encapsulation协议数据单元PDU
    接入网access network网络核心network core
    排队时延queuing delay吞吐量throughput

    B.2 应用层与运输层

    中文English中文English
    套接字socket多路复用multiplexing
    持续连接persistent connection条件 GETconditional GET
    资源记录resource record (RR)递归/迭代查询recursive / iterative query
    回退 N 步Go-Back-N选择重传selective repeat
    累计确认cumulative ACK快速重传fast retransmit
    流量控制flow control拥塞控制congestion control

    B.3 网络层与链路层

    中文English中文English
    转发表forwarding table最长前缀匹配longest prefix match
    链路状态link state距离向量distance vector
    自治系统autonomous system路径向量path vector
    载波侦听carrier sense冲突检测collision detection
    生成树spanning tree虚拟局域网VLAN
    目录