按原书 8 章的“应用层 → 运输层 → 网络层 → 链路层 → 无线与移动 → 安全”顺序整编:每个概念先讲为什么需要它,再讲它怎么工作,配关键计算例与结构图。
本书的编排逻辑是“先看应用怎么用网络,再逐层向下追问它是怎么被实现的”。整本书可以压缩成一句话:应用进程通过套接字把报文交给运输层,运输层把它切成报文段,网络层加上地址做成数据报,链路层封装成帧送上线,最后一跳由链路层交给主机,向上逐层拆封。
第 1 章不追求“讲透某个协议”,而是建立词汇表和坐标系:因特网由哪些部件组成、端系统怎么接入、分组在核心怎么被交换、一路会损失多少时间,以及为什么要把网络分成五层。这一章的每个概念后面都会被反复引用,所以值得读慢一点。
教材给了两种互补的描述方式:一种描述它由什么构成,另一种描述它能为应用做什么。考试常问“这两种描述的区别”,答案是:前者是工程视角(部件与连接),后者是服务视角(应用能获得什么)。
协议是本章最重要的定义,必须能一字不差地复述:
用人类的对话类比:见面说“你好”(语法:一句问候语)、对方回“你好”(时序:一问一答、不能抢话)、如果对方没回应你会重说一遍(动作:超时重传)。计算机协议完全同构:HTTP 的请求行是语法,200/404 的含义是语义,先三次握手再发请求是时序。
两台主机用 TCP 传文件,至少涉及四层协议协作:HTTP 决定“要哪个文件”(应用层),TCP 保证“字节不丢不乱”(运输层),IP 负责“找到对方主机”(网络层),以太网负责“在这一段线缆上送达下一跳”(链路层)。任何一层出错,用户看到的结果都是“打不开网页”,但排查要逐层看。
边缘 = 端系统 + 接入网。端系统按角色分客户 / 服务器;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、蜂窝、卫星)无需布线但受干扰、遮挡与多径影响。
核心 = 分组交换机组成的网状网。两种交换方式的对立,是本章计算与简答的高频点。
分组交换把长报文切成小分组,每个分组独立走链路,采用存储转发:交换机必须收完整个分组才能开始向下一段链路发送。
分组交换的两大代价是排队时延与丢包:输出链路被占用时分组排队,缓冲区满则被丢弃。
电路交换在通信前先建立连接,预留一条路径上的资源,用 FDM(频分:每条连接分到一个频段)或 TDM(时分:每条连接分到一个时隙)切分链路。
| 分组交换 | 电路交换 | |
|---|---|---|
| 资源分配 | 按需使用、统计复用 | 建立连接时预留 |
| 时延 | 有排队时延,随负载波动 | 传输时延固定,无排队 |
| 适合 | 突发型数据(Web、文件) | 连续恒定速率(传统语音) |
| 缺点 | 拥塞时丢包、首部开销 | 静默期浪费带宽、建链慢 |
一条 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,从而同时降低时延与带宽成本。
四种时延必须能分开写、分开算,这是全书最基础的计算:
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 倍。这就是“为什么跨洋访问慢,换个更快的网卡也没用”。
流量强度是排队的关键参数:(L 分组长度、a 到达速率、R 链路速率)。
| La/R | 现象 | 直观解释 |
|---|---|---|
| ≈ 0 | 几乎不排队 | 路上没车 |
| → 1 | 平均排队时延急剧上升 | 车流接近饱和,一点波动就堵 |
| > 1 | 队列无限增长 → 缓冲区满 → 丢包 | 到达比通过快,必然积压 |
丢包不是“网络坏了”,而是有限缓冲的必然结果:路由器缓冲满时尾部丢弃,TCP 会重传,实时业务则表现为卡顿。丢包与排队是在 La/R → 1 时同时恶化的,这也是“网络利用率 80% 以上事故频发”的原因。
吞吐量由瓶颈链路决定:端到端吞吐量 = 各跳 R}。若服务器出口 2 Mbps、客户端接入 1 Mbps,则吞吐量就是 1 Mbps——加多少带宽在服务器侧都没用。
分层的本质是把“我能提供什么服务”与“我怎么实现”分开。这样某一层的实现可以独立替换:IPv4 换成 IPv6 时,浏览器不需要改;Wi-Fi 换成 5G 时,TCP 也不需要改。
| 层 | 数据单元 | 核心职责 | 典型协议 |
|---|---|---|---|
| 应用层 | 报文 message | 面向具体应用的数据交换 | HTTP、SMTP、DNS、P2P |
| 运输层 | 报文段 segment | 进程到进程交付、复用/分解、可靠性、拥塞控制 | TCP、UDP、QUIC |
| 网络层 | 数据报 datagram | 主机到主机、逻辑寻址、路由与转发 | IP、ICMP、路由协议 |
| 链路层 | 帧 frame | 相邻结点传输、成帧、差错检测、介质访问 | 以太网、802.11、PPP |
| 物理层 | 比特 | 把比特变成信号送上介质 | — |
分层的代价:每层都有首部开销(以太网 14 字节 + 4 字节 FCS、IP 20 字节、TCP 20 字节,传 100 字节应用数据时开销近 60%),且层与层之间的信息被隐藏,某些跨层优化(如无线链路知道丢包是误码而非拥塞)需要“层间违例”。
教材把安全放在第一章,是为了让你在读每个协议时都带着“它假设了什么”的问题。因特网最初的设计假设是“所有用户互相信任”,这是今天大部分漏洞的根源。
应用层是唯一“用户看得见”的一层。这一章的抓手是“应用需要运输层提供什么”——可靠性、吞吐量、时延、安全性四个维度,决定了为什么有的应用用 TCP、有的用 UDP、有的在 UDP 上另建一套(QUIC)。
进程通信:进程通过套接字(socket)收发报文。套接字由 IP + 端口号标识;应用层协议规定报文语义,运输层只负责把字节送到对端套接字。注意:同一台主机上可以同时有多个进程使用同一端口(如多个浏览器标签),运输层靠四元组区分(源 IP、源端口、目的 IP、目的端口)。
| 应用 | 丢失容忍 | 带宽 | 时延 | 选用与原因 |
|---|---|---|---|---|
| 文件传输 / 邮件 / Web | 不容忍 | 弹性 | 弹性 | TCP:不能丢字节 |
| 流式音视频 | 可容忍少量 | 弹性(有下限) | 有上限 | TCP + DASH,或 UDP |
| 实时语音 / 游戏 | 可容忍少量 | 低带宽即可 | 严格 | UDP:重传来不及,宁可丢 |
| DNS / SNMP | 可重试 | 很小 | 较快 | UDP:一问一答,自带重试 |
TCP 提供面向连接、可靠、流量控制、拥塞控制,但不提供时延保证与最小带宽保证;UDP 只做复用/分解与轻量检错。二者都不加密——加密由 TLS 在 TCP 之上补上(机密性、完整性、服务器鉴别)。
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 在部分网络被限速 |
一个基础 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(无实体),省下带宽。
某机构接入链路 15 Mbps,平均请求率 15 次/秒、平均对象 1 MB,则流量强度 ≈ 1(拥塞,时延数秒)。
加缓存后命中率 0.4:链路负载降为 0.6,时延从“秒级”降到几十毫秒;
若不装缓存而把链路升到 100 Mbps,成本远高于一台缓存服务器。
邮件是“推 + 拉”的组合:发件人用 SMTP(TCP 25)把邮件推给自己的邮件服务器,再由它推到收件人的邮件服务器;收件人用 POP3 / IMAP 或 Webmail 把邮件拉下来。
SMTP 是 ASCII 命令-响应的“对话式”协议:HELO 打招呼 → MAIL FROM → RCPT TO → DATA → . 结束。二进制附件要用 MIME 编码(base64)后再塞进 DATA。
| POP3 | IMAP | |
|---|---|---|
| 状态保存 | 基本在客户端,下载后可删除 | 全部在服务器(文件夹、已读、草稿) |
| 多设备 | 不同步,易重复下载 | 天然同步 |
| 适用 | 单设备、离线阅读 | 手机+电脑多端 |
DNS 是分布式数据库 + 应用层协议,提供四类服务:主机名→IP、主机别名(CNAME)、邮件服务器别名(MX)、负载分配(一个域名对应多个 IP,轮转)。
| 层次 | 作用 | 规模 |
|---|---|---|
| 根 DNS | 返回 TLD 服务器地址 | 全球 13 组(任播,实际数百个实例) |
| 顶级域 TLD | com / cn / org…,返回权威服务器地址 | 每个 TLD 一组服务器 |
| 权威 DNS | 保存该域的真实记录 | 由域名持有者/托管商维护 |
| 本地 DNS(默认) | ISP 提供,代替主机做查询并缓存 | 每个 ISP 若干台 |
资源记录是四元组(Name, Value, Type, TTL):
访问 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 能承受全球查询量的关键。
BitTorrent:文件切成固定大小的 chunk;tracker 给出一组对等方;对等方之间交换“我有哪些块”的位图。两条关键策略:最稀有优先(先请求副本最少的块,防止某些块绝迹)与 tit-for-tat(只给上传速率最高的 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 任播。
| UDP | TCP | |
|---|---|---|
| 服务端 | socket → bind → recvfrom / sendto | socket → 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)
recvfrom 一次收一个报文,超长部分被截断,应用要自己定最大长度。bind 的端口是“监听端口”,客户端连接后的源端口由系统随机分配。运输层是全书计算最密集的一章。核心问题只有两个:怎么把数据可靠地送过去(rdt → GBN → SR → TCP),以及送得太快把网络压垮了怎么办(拥塞控制)。
运输层提供进程到进程的交付,网络层只到主机。教材的经典类比:IP 是邮政系统(把信送到某栋楼),运输层是楼里的收发室(把信分给具体的人)。
多路复用与分解靠端口号实现:发送时把多个进程的数据加上端口号交给网络层(复用),接收时按四元组把报文段交给正确的套接字(分解)。TCP 用四元组(源 IP、源端口、目的 IP、目的端口)区分连接;UDP 只用二元组(目的 IP、目的端口)定位套接字。
| 协议 | 连接 | 可靠性 | 拥塞控制 | 首部 |
|---|---|---|---|---|
| UDP | 无连接 | 不可靠(尽力而为) | 无 | 8 字节 |
| TCP | 面向连接 | 可靠、有序 | 有(AIMD 等) | 20 字节起 |
UDP 报文段只有四个字段:源端口、目的端口、长度、校验和(各 2 字节),其余全是应用数据。
两个 16 位字:0x3A5C + 0x8F21 = 0xC97D;回卷无进位;取反码 = 0x3682,写入校验和字段。
接收端把三个字相加:0x3A5C + 0x8F21 + 0x3682 = 0xFFFF → 全 1,判定无错。
注意:校验和只能发现“多数”错误,不能纠错,也可能漏检(两个比特同时出错可能抵消)。
教材用一串递进的协议把“可靠性”拆开讲,这条线索必须能默写:
每一步都在修前一步的漏洞:
| 回退 N 步(GBN) | 选择重传(SR) | |
|---|---|---|
| 接收端缓存 | 不缓存乱序分组,直接丢弃 | 缓存乱序分组,逐个确认 |
| 确认方式 | 累积确认(ack=n 表示 n 之前全收到) | 逐个确认 |
| 发送窗口 | ≤ 2k−1(k 位序号) | ≤ 2k−1 |
| 重传代价 | 一个丢包可能重传整窗 | 只重传丢失的那一个 |
| 复杂度 | 低 | 高(需定时器与缓存管理) |
序号 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?否则新旧分组序号会重叠,接收方分不清“是新包还是重传的老包”。
R = 1 Gbps,RTT = 30 ms,L = 1500 B = 12000 bit:
单个分组占用链路时间 L/R = 12 μs;RTT 期间链路可传 30 ms/12 μs = 2500 个分组
→ 要打满链路,窗口需 N ≥ 2501(实际由 TCP 窗口缩放选项支持)
三次握手的目的不是“建立连接”这么笼统,而是三件具体的事:① 双方确认对方收发都正常;② 同步初始序号(ISN);③ 协商 MSS、窗口缩放、SACK 等选项。
| 字段 | 作用 |
|---|---|
| 源/目的端口 | 复用与分解 |
| 序号 seq | 本报文段第一个数据字节在字节流中的编号 |
| 确认号 ack | 期望收到的下一个字节(累积确认) |
| 接收窗口 rwnd | 流量控制:本端还能接收多少字节 |
| 标志位 | SYN、FIN、ACK、RST、PSH、URG、CWR、ECE |
| 首部长度 / 选项 | 20 字节起;MSS、窗口缩放、时间戳、SACK |
客户 ISN = 1000,发送 500 字节 → seq=1000,len=500
服务器回 ack=1500(期望下一个字节 1500),同时自己的 seq=3000
客户再发 200 字节 → seq=1500,len=200;服务器 ack=1700
看清一点:ack 是“我期待的下一个”,不是“我收到的最后一个”,两者差 1。
RTT 估计用指数加权移动平均,超时时间再加 4 倍偏差,避免“估计得刚好、稍微抖动就误重传”:
Karn 算法:重传的报文段不采样(无法判断 ACK 对应哪次发送),且每次超时把超时间隔加倍(指数退避),避免在拥塞时反复猛发。
旧 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
接收方缓冲 4000 B,已缓存 1000 B 未读 → 通告 rwnd=3000
发送方已发未确认 2000 B;若 cwnd=3500,则还能发 min(3500,3000)−2000 = 1000 B
若接收方应用一直不读,rwnd 会降到 0,发送方停止发送并定期发零窗口探测,否则双方永久僵死。
拥塞的代价有三层:① 排队时延增大;② 丢包引起重传,浪费带宽;③ 多跳场景下,上游链路已经把分组送出去,却在 downstream 被丢弃,前面的努力全白费。所以“拥塞控制”不是“别丢包”,而是“别把网络推到崩溃点”。
| 阶段 | 触发 | cwnd 变化 |
|---|---|---|
| 慢启动 | 连接开始 / 超时后 | 每收到一个 ACK 加 1 MSS → 每 RTT 翻倍;到 ssthresh 转拥塞避免 |
| 拥塞避免 | cwnd ≥ ssthresh | 每 RTT 加 1 MSS(线性) |
| 快速重传 / 快速恢复 | 3 个冗余 ACK | ssthresh = cwnd/2,cwnd = ssthresh + 3,之后线性增长(Reno) |
| 超时 | 计时器到期 | ssthresh = cwnd/2,cwnd = 1 MSS,重回慢启动 |
初始 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 重来”,后者“减半继续”。
公平性:多条 TCP 共享同一瓶颈时,AIMD 会收敛到“均分带宽”(因为增得慢、减得狠,快的被惩罚得多)。但 UDP 不受约束,会挤占 TCP;RTT 小的连接增长更快,也不公平。对策:AQM(如 CoDel)、ECN(路由器用标记而不是丢包提前通知)、以及更现代的 CUBIC(按立方函数增长,长肥管道更快)与 BBR(基于带宽与 RTT 建模,不把丢包当唯一信号)。
第 4 章讲“一个分组到达路由器后,在本地怎么被送出去”(数据平面);第 5 章讲“转发表是谁算出来的”(控制平面)。这条分工是理解全书网络层的关键。
因特网的网络服务模型是尽力而为(best-effort):不保证交付、不保证时延与带宽、不保证顺序。这与 ATM 的 CBR(恒定比特率)、VBR(可变比特率)、ABR(可用比特率)承诺形成对照——ATM 用复杂信令换取 QoS 保证,最终输给了“简单 + 过量带宽”的 IP 模型。
三个流 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(按权重分配,且保证最小速率)
IPv4 首部(20 字节固定 + 选项):版本、首部长度、服务类型、总长度、标识/标志/片偏移(分片用)、TTL、协议、首部校验和、源/目的 IP。
| 概念 | 要点 |
|---|---|
| 分片 | 受 MTU 限制;片偏移以 8 字节为单位;由目的端重组;IPv6 取消路由器分片 |
| CIDR | a.b.c.d/x,前 x 位为网络前缀;路由聚合减少表项 |
| 子网 | 与主机直连、不经过路由器的一组接口;用子网掩码 / 前缀长度描述 |
| DHCP | UDP 67/68,DISCOVER → OFFER → REQUEST → ACK 四步,即插即用 |
① 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 应选后者(更长、更具体),即使前者也能匹配。
NAT 让一个公网 IP 服务多台内网主机:出方向把(源 IP, 源端口)替换成(公网 IP, 新端口)并记表,回方向按表还原。
IPv6:128 位地址、固定 40 字节首部、取消首部校验和与路由器分片、加入流标签;过渡技术有双栈(同时跑 v4/v6)、隧道(6to4,把 v6 包塞进 v4)、转换(NAT64/DNS64)。
| IPv4 | IPv6 | |
|---|---|---|
| 地址长度 | 32 位(约 43 亿) | 128 位 |
| 首部 | 20 字节起,含校验和 | 固定 40 字节,无校验和 |
| 分片 | 路由器可分片 | 仅源端分片(扩展首部) |
| 配置 | DHCP / 手工 | SLAAC 无状态自动配置 |
传统转发只看目的 IP;泛化转发用“匹配 + 动作”表:匹配任意首部字段组合(OpenFlow 的 12 元组),动作可为转发、丢弃、修改首部、送控制器、复制到多端口。
| 匹配(Match) | 动作(Action) | 典型用途 |
|---|---|---|
| 入端口 + 目的 MAC | 转发到端口 3 | 二层交换 |
| 目的 IP 前缀 | 改目的 MAC、转发 | 三层路由 |
| TCP 目的端口 80 | 丢弃 | 防火墙 / 策略 |
| 源 IP + 目的 IP | 改源 IP 后转发 | NAT / 负载均衡 |
中间盒:NAT、防火墙、负载均衡、DPI——它们“既不是纯路由器也不是纯主机”,破坏了分层假设,是现代网络管理复杂性的主要来源。
控制平面回答一个问题:转发表里的每一条是从哪来的。答案有三条路线——每路由器独立的分布式算法(OSPF、BGP)、逻辑集中的 SDN 控制器,以及两者的混合。
| 每路由器控制 | SDN 集中式控制 | |
|---|---|---|
| 算法位置 | 每个路由器自己跑路由协议 | 远程控制器算好,下发给交换机 |
| 典型 | OSPF、BGP | OpenFlow、Google B4 |
| 优点 | 鲁棒、无单点故障、随网络自愈 | 全局视图、策略易编排、可编程 |
| 缺点 | 收敛慢、难做全局优化与流量工程 | 控制器可靠性与扩展性挑战 |
两种路线的根本差别是“信息在哪”:分布式算法里,每个路由器只知道局部信息,靠邻居交换逐步收敛;SDN 里,控制器持有全网拓扑与流量矩阵,可以一次算出全局最优解。
链路状态(LS):每个节点把“我连了谁、代价多少”洪泛到全网,所有节点得到同一张拓扑图,各自跑 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 迭代:
它不需要全局拓扑,但会犯一个著名错误:计数到无穷(count-to-infinity)——好消息传得快,坏消息传得慢。
三个节点 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-IS | RIP、BGP(路径向量改造) |
OSPF 是链路状态协议,直接承载在 IP 上(协议号 89),洪泛链路状态通告(LSA),每个路由器维护相同的链路状态数据库,再各自跑 Dijkstra。支持层次化区域:骨干区 0 + 若干非骨干区,区域间只交换汇总信息,减少洪泛范围;度量是链路代价(可配置,默认与带宽相关,不一定是跳数)。
BGP 是路径向量协议,运行在 TCP/179 上。它传播的不是“距离”,而是完整的 AS 路径——这既防环(看到自己就在路径里,直接丢弃),又让每个 AS 能执行策略(谁能过、走谁)。
SDN 的四条特征:基于流的转发、控制与数据平面分离、控制平面外部化(远程控制器)、可编程。
OpenFlow 流表项 = 匹配字段 + 优先级 + 计数器 + 动作集合(转发、丢弃、改字段、送控制器)。控制器与交换机之间用 OpenFlow 协议;常见控制器 ONOS、OpenDaylight,云厂商则多用自研(如 Google 的 Orion)。
两条路径 A(1 Gbps)、B(1 Gbps),流量需求 1.6 Gbps。传统 OSPF 会把所有流量压到“最短”的那条,造成拥塞;SDN 控制器看到全局需求后,按 0.8/0.8 分流到两条路径。
这是 SDN 最典型的收益:把“最短路径路由”换成“全局最优分配”。
TTL=1 → 第一跳路由器减到 0,回 ICMP 超时,暴露其 IP
TTL=2 → 第二跳回超时 …… 直到到达目的主机(回“端口不可达”)
每跳通常探测 3 次,取 RTT 显示
链路层把“一个分组”变成“一段链路上能传输的帧”,并解决多个结点共享同一介质的冲突问题。它是五层里唯一“逐跳”而非“端到端”工作的层。
链路层提供的服务有四类:成帧(把比特流切成有边界的帧)、链路接入(MAC,决定谁在什么时候发)、可靠交付(可选,无线链路常用)、差错检测与纠正。实现在网络适配器(网卡)的硬件里,主机软件只处理驱动与部分高层逻辑。
| 技术 | 原理 | 能力 |
|---|---|---|
| 奇偶校验(一维/二维) | 附加校验位;二维可定位并纠正单比特 | 弱;二维可纠 1 位 |
| 检验和(Internet checksum) | 16 位反码求和 | 弱但便宜(运输层/网络层用) |
| CRC | 模 2 除法,用生成多项式 G 除 | 强,链路层标准做法 |
D = 101110,G = 1001(r = 3)→ 被除数 101110000
逐位模 2 除(异或),得余数 R = 011
发送 T = 101110011;接收端用 G 除,余数为 0 则无错
要点:模 2 除法不借位,就是异或;余数位数固定为 r 位(不足补 0)。
| 类别 | 代表 | 要点 |
|---|---|---|
| 信道划分 | TDM / FDM / CDMA | 无冲突,但低负载时浪费;适合恒定速率业务 |
| 随机接入 | ALOHA、时隙 ALOHA、CSMA、CSMA/CD、CSMA/CA | 高负载冲突多;CSMA/CD 用于有线以太网,CSMA/CA 用于无线 |
| 轮流 | 轮询(polling)、令牌传递 | 无冲突、时延可预期;有轮询开销与单点故障 |
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 解决隐藏终端。
MAC 地址(48 位,全球唯一,扁平)与 IP 地址(层次、可聚合)的区别是常考点:MAC 用于“同一链路上的下一跳”,IP 用于“端到端的全局定位”。
ARP:在同一子网内把 IP 解析为 MAC——广播“谁是 192.168.1.1?”,目标单播回应,结果缓存(软状态,几十秒到几分钟)。跨子网时,主机把帧发给默认网关的 MAC,而不是目的主机的 MAC——这是很多人第一次读错的地方。
主机 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。
交换机:自学习 + 按目的 MAC 转发 + 未知单播泛洪;无路由功能,靠 生成树(STP) 防环;VLAN(802.1Q)用 4 字节标签在物理网络上切出多个逻辑局域网,广播域随之隔离。
| 交换机 | 路由器 | |
|---|---|---|
| 工作层 | 链路层(MAC) | 网络层(IP) |
| 转发表 | 自学习生成 | 路由协议 / SDN 生成 |
| 广播域 | 同一 VLAN 内可泛洪 | 默认隔离广播 |
| 典型时延 | 微秒级 | 较大(需查路由 + 改 TTL) |
数据中心网络:分层拓扑(TOR → 汇聚 → 核心)与叶脊(leaf-spine);用 ECMP 做多路径负载均衡,用 VXLAN 做 overlay(把二层帧封进 UDP),用 SDN 统一编排。
本章要区分两个容易混淆的概念:无线解决“最后一跳用无线电代替网线”,移动解决“换接入点后地址与连接怎么办”。二者可以独立存在——Wi-Fi 不移动,蜂窝电话边走边通话才是移动。
| SNR | 可用调制/速率 | BER |
|---|---|---|
| 低(< 10 dB) | 低阶(BPSK) | 仍可能偏高,需重传 |
| 中(10–20 dB) | QPSK / 16-QAM | 较低 |
| 高(> 25 dB) | 64-QAM / 256-QAM | 很低,可高速率 |
体系结构:BSS(基本服务集)= AP + 若干站点;SSID 标识网络名,BSSID 是 AP 的 MAC;多个 BSS 经交换机组成 ESS,靠关联(association)接入,切换 AP 叫重关联。
802.11 帧有 4 个地址字段(源、目的、AP、以及自组网时的第四地址)、序号、持续时间;管理帧(信标、探测、关联)负责“发现与接入”,控制帧(RTS/CTS/ACK)负责“预约与确认”,数据帧承载上层数据。
蓝牙(802.15.1):个人域网络,主从(piconet)+ 跳频,适合低功耗外设(耳机、手环)。
| 4G LTE | 5G | |
|---|---|---|
| 频段 | sub-6 为主 | sub-6 + 毫米波 |
| 时延 | ~10–50 ms | 目标 1 ms 级(URLLC) |
| 架构 | EPC,网元固定 | SBA(服务化)、网络切片 |
| 典型场景 | 移动宽带 | eMBB / URLLC / mMTC |
对端在北京、归属网在上海、用户漫游到广州:
间接路由:北京 → 上海 → 广州(绕行 1 倍以上)
直接路由:北京 → 广州(最短,但要做位置查询)
4G/5G 用的是“锚点 + 隧道”的折中:S-GW 作为锚点,切换时只改隧道终点,对端无感。
无线链路的误码与切换会被 TCP 误判为拥塞(把随机丢包当成拥塞信号),导致不必要的降速;对策包括链路层本地重传、TCP 拆分连接(split TCP,把长 RTT 断成两段)、ECN 显式告知,以及 CUBIC/BBR 这类不把丢包当唯一信号的拥塞控制。
网络安全要同时满足四件事:机密性(别人看不懂)、完整性(没被改)、鉴别(确实是他)、可用性(还能用)。本章按“先造工具、再组装协议”的顺序讲:对称加密 → 公钥 → 散列与签名 → 证书 → TLS/IPsec。
取 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 位以上的大数,计算量之大正是安全性来源。
A 与 B 各自选私钥、互换 g^a、g^b,得到同一个 K——但攻击者 M 可以分别与 A、B 建立两个不同的 K。
DH 只保证“密钥协商不被窃听”,不保证“对面是谁”,所以必须配合证书/签名做鉴别。
你去银行网站,服务器给你公钥——但这把公钥可能是中间人伪造的。证书就是“CA 用私钥签名的声明:这把公钥属于 bank.com”。你用内置的 CA 公钥验证签名,就确认了归属。
信任链:根 CA(内置)→ 中间 CA(由根签)→ 站点证书(由中间签)
端点鉴别三要素:共享秘密、公钥、nonce(一次性随机数,防重放)。教材用 ap1–ap5 逐步演示:只报名字不行(可冒充)、加口令不行(可窃听重放)、加 nonce 才安全、必须双向鉴别(否则中间人可伪装服务器)。
PGP:邮件端到端加密的事实标准——随机生成会话密钥,用对称算法加密正文,用接收方公钥加密会话密钥;同时用发送方私钥签名,实现机密 + 鉴别 + 完整。
| AH | ESP | |
|---|---|---|
| 机密性 | 无 | 有(加密载荷) |
| 完整性/鉴别 | 有(整个数据报,除可变字段) | 有(ESP 头之后) |
| 传输/隧道模式 | 两种 | 两种 |
| 用途 | 较少 | VPN 主流 |
IPsec 靠 SA(安全关联,单向)定义算法与密钥,用 IKE 自动协商;隧道模式下整个原 IP 数据报被封装,形成 VPN。
| 类型 | 依据 | 能力 |
|---|---|---|
| 无状态分组过滤 | 五元组(源/目的 IP、端口、协议) | 快,但不懂连接状态 |
| 状态化过滤 | 连接状态表 | 可按会话放行返回流量 |
| 应用网关 / 代理 | 应用层内容 | 可鉴权与内容过滤,性能开销大 |
| IDS / IPS | 特征匹配或异常检测 | 告警(IDS)或阻断(IPS);加密流量下受限 |
| 中文 | English | 中文 | English |
|---|---|---|---|
| 端系统 | end system / host | 分组交换机 | packet switch |
| 存储转发 | store-and-forward | 流量强度 | traffic intensity |
| 封装 | encapsulation | 协议数据单元 | PDU |
| 接入网 | access network | 网络核心 | network core |
| 排队时延 | queuing delay | 吞吐量 | throughput |
| 中文 | English | 中文 | English |
|---|---|---|---|
| 套接字 | socket | 多路复用 | multiplexing |
| 持续连接 | persistent connection | 条件 GET | conditional GET |
| 资源记录 | resource record (RR) | 递归/迭代查询 | recursive / iterative query |
| 回退 N 步 | Go-Back-N | 选择重传 | selective repeat |
| 累计确认 | cumulative ACK | 快速重传 | fast retransmit |
| 流量控制 | flow control | 拥塞控制 | congestion control |
| 中文 | English | 中文 | English |
|---|---|---|---|
| 转发表 | forwarding table | 最长前缀匹配 | longest prefix match |
| 链路状态 | link state | 距离向量 | distance vector |
| 自治系统 | autonomous system | 路径向量 | path vector |
| 载波侦听 | carrier sense | 冲突检测 | collision detection |
| 生成树 | spanning tree | 虚拟局域网 | VLAN |