计算机网络复习笔记(自顶向下方法·补充版)
基于《Computer Networking: A Top-Down Approach》前五章整理的计算机网络复习笔记,覆盖分层模型、应用层、运输层、网络层、路由和链路层。
说明:本笔记是先人工通看了教材和教学PPT,整理出自己认为比较重点的知识点骨架(每个二级三级标题),然后再用GPT5.5进行填充。
教材语境主要对应《Computer Networking: A Top-Down Approach》前五章:计算机网络与因特网、应用层、运输层、网络层、链路层。
总览:分层思想与常见单位
五层因特网协议栈
| 层次 | 核心任务 | 典型协议/技术 | 传输数据单位 |
|---|---|---|---|
| 应用层 Application | 为网络应用提供通信规则 | HTTP、FTP、SMTP、DNS、DHCP | message 报文 |
| 运输层 Transport | 进程到进程通信;复用/分解;可靠传输;拥塞控制 | TCP、UDP | segment 报文段 / datagram |
| 网络层 Network | 主机到主机通信;路由选择;转发 | IP、ICMP、OSPF、RIP、BGP | datagram 数据报 / packet 分组 |
| 链路层 Link | 相邻节点间传输;成帧;介质访问;差错检测 | Ethernet、Wi-Fi、ARP、PPP | frame 帧 |
| 物理层 Physical | 比特在物理介质上传输 | 光纤、双绞线、无线电 | bit 比特 |
封装与解封装:
应用层报文在运输层加 TCP/UDP 首部形成报文段,网络层加 IP 首部形成 IP 数据报,链路层加帧首部/尾部形成帧。接收端逐层去掉首部并交付上层。
考试常用表述:
- 网络层负责“主机到主机”的交付,不负责具体进程。
- 运输层负责“进程到进程”的交付,通过端口号区分应用进程。
- 链路层只负责“一跳”或“相邻节点”的传输。
- IP 是尽力而为服务,TCP 在 IP 之上实现可靠字节流。
网络基础概述
网络核心图解:分组交换、电路交换与四种时延

网络边缘
网络边缘是什么
**网络边缘(network edge)**由端系统和接入网络组成。
- 端系统 / 主机(end systems / hosts): PC、手机、服务器、IoT 设备等。
- 客户与服务器: 客户发起请求,服务器提供服务。
- 数据中心: 现代服务器通常集中部署在数据中心,由大量主机和交换机组成。
- 接入网络(access network): 将端系统连接到第一台路由器,即“边缘路由器”的网络。
常见接入方式
DSL(Digital Subscriber Line,数字用户线)
- 利用电话线接入互联网。
- 家庭端通过 DSL modem 接入运营商 DSLAM。
- DSL 将电话线频段划分为:电话语音、上行数据、下行数据。
- 下行速率通常大于上行速率,属于非对称接入。
Cable access(电缆接入)
- 利用有线电视系统的同轴电缆。
- 共享介质:同一区域用户共享到电缆头端的带宽。
- 常与 HFC(Hybrid Fiber Coax,混合光纤同轴)结构相关。
FTTH(Fiber To The Home,光纤到户)
- 光纤直接到家庭或楼宇。
- 典型形式:PON(Passive Optical Network,被动光网络)。
- 优点:高带宽、低损耗、抗干扰强。
LAN 接入
- 典型场景:校园网、公司网、家庭局域网。
- 有线 LAN 主要使用以太网。
- 无线 LAN 主要使用 Wi-Fi。
蜂窝网络接入
- 3G/4G/5G 移动网络。
- 支持移动性和广域覆盖。
- 端到端性能受无线信道、基站负载、核心网路径等影响。
主机发送数据的基本过程
主机发送一个长度为 bit 的分组,接入链路传输速率为 bit/s,则将该分组“推入链路”所需时间为:
注意:
- 这是传输时延,不是传播时延。
- 传输时延看分组长度和链路速率。
- 传播时延看物理距离和信号传播速度。
网络核心
网络核心由大量互联的路由器和链路组成,主要负责将分组从源主机转发到目的主机。
分组交换与电路交换
分组交换(packet switching)
思想: 把应用层数据切分为较小的分组,每个分组独立在网络中转发。
特点:
- 分组携带目的地址。
- 路由器根据转发表逐跳转发。
- 多个用户按需共享链路带宽。
- 适合突发型数据传输。
- 可能出现排队时延和丢包。
典型机制:存储转发(store-and-forward)。
路由器必须接收完整分组后,才能向下一条链路发送。如果分组长度为 bit,链路速率为 bit/s,则每一跳至少需要 的传输时间。
若有 条速率均为 的链路,忽略传播、排队、处理时延,单个分组端到端时延为:
如果有 个分组连续发送,经过 条链路,忽略其他时延,总时间为:
这里体现了流水线效果。
电路交换(circuit switching)
思想: 通信前先建立一条端到端专用电路,通信期间资源被独占或预留。
特点:
- 先建立连接,再传输数据。
- 资源预留,性能稳定。
- 没有排队竞争或竞争较小。
- 即使用户暂时不发送数据,预留资源也不能被其他用户使用,可能浪费。
- 适合持续、稳定速率的业务,如传统电话。
分组交换 vs 电路交换
| 比较项 | 分组交换 | 电路交换 |
|---|---|---|
| 资源分配 | 按需共享 | 预先预留 |
| 是否建立专用路径 | 通常不建立专用电路 | 需要建立电路 |
| 资源利用率 | 高,适合突发业务 | 低,空闲时也占资源 |
| 时延稳定性 | 不稳定,可能排队 | 较稳定 |
| 丢包 | 可能发生 | 一般不因拥塞丢包 |
| 典型应用 | Internet 数据通信 | 传统电话网络 |
考试答法:
分组交换利用统计多路复用提高资源利用率,但会引入排队时延和丢包;电路交换提供预留资源和较稳定性能,但资源利用率较低。
分组交换的四种时延及计算
一个分组从一个节点到下一个节点,通常包含四类时延:
处理时延
路由器检查首部、查找转发表、差错检测等所需时间。
特点:
- 通常较小。
- 取决于路由器处理能力。
排队时延
分组在输出队列中等待发送的时间。
特点:
- 最不稳定。
- 与网络拥塞程度强相关。
- 队列满时会发生丢包。
常用交通强度:
其中:
- :分组长度,单位 bit。
- :平均分组到达率,单位 packets/s。
- :链路传输速率,单位 bit/s。
解释:
- 接近 0:排队时延很小。
- 接近 1:排队时延急剧增大。
- :到达速率超过服务速率,队列趋向无界增长,系统不稳定。
传输时延
把分组所有比特推入链路所需时间:
由分组长度和链路速率决定。
传播时延
一个比特在物理链路上传播所需时间:
其中:
- :链路物理长度。
- :信号传播速度,通常约为 到 。
传输时延和传播时延的区别
| 比较项 | 传输时延 | 传播时延 |
|---|---|---|
| 公式 | ||
| 由什么决定 | 分组大小、链路速率 | 链路长度、传播速度 |
| 类比 | 把车队推上高速所需时间 | 第一辆车从起点开到终点所需时间 |
电路交换中的复用
电路交换要在链路上为多个用户划分资源,常见复用方式如下。
FDM(Frequency Division Multiplexing,频分复用)
- 把链路频谱划分为多个频带。
- 每个用户占用一个频带。
- 所有用户可同时通信。
- 典型例子:传统有线电视、无线频段划分。
TDM(Time Division Multiplexing,时分复用)
- 把时间划分为周期性帧。
- 每个帧中为用户分配固定时隙。
- 用户只在自己的时隙中发送。
WDM(Wavelength Division Multiplexing,波分复用)
- 光纤通信中使用不同波长承载不同信道。
- 本质上类似光纤中的频分复用。
与统计多路复用比较
分组交换通常使用统计多路复用:不预先固定分配资源,而是哪个用户有数据就使用链路。
| 复用方式 | 是否固定分配 | 资源利用率 | 是否可能排队 |
|---|---|---|---|
| FDM/TDM/WDM | 是 | 空闲时可能浪费 | 一般不会因共享竞争排队 |
| 统计多路复用 | 否 | 高 | 可能排队和丢包 |
应用层
应用层图解:体系结构、HTTP、FTP、Email、DNS

C/S 架构和 P2P 架构
Client-Server 架构
定义: 客户端向一直在线的服务器请求服务。
特点:
- 服务器通常有固定 IP 或固定域名。
- 服务器长期在线。
- 客户端之间通常不直接通信。
- 扩展能力依赖服务器集群和数据中心。
例子:Web、电子邮件、DNS 的大部分查询过程。
优点:
- 管理集中,易于维护。
- 安全策略和数据一致性较容易控制。
缺点:
- 服务器可能成为瓶颈。
- 部署成本较高。
P2P 架构
定义: 端系统之间直接通信,节点既可以请求资源,也可以提供资源。
特点:
- 不依赖或较少依赖中心服务器。
- 对等方可能间歇性在线。
- 节点 IP 地址可能变化。
- 具有自扩展性:新节点加入时既带来下载需求,也带来上传能力。
例子:BitTorrent、部分实时通信系统、部分区块链网络。
优点:
- 可扩展性强。
- 服务器压力小。
缺点:
- 管理复杂。
- 节点动态变化导致可靠性和安全性问题。
- NAT 穿越困难。
文件分发时间对比
设服务器上传速率为 ,第 个客户下载速率为 ,上传速率为 ,文件大小为 ,客户数为 。
C/S 模型中,分发时间至少满足:
P2P 模型中,分发时间至少满足:
结论:P2P 在大规模分发场景下更容易扩展,因为所有 peer 的上传能力也参与服务。
进程通信
进程与主机
网络应用之间真正通信的是进程(process),不是抽象的“主机”。
- 同一主机内进程通信:由操作系统提供进程间通信机制。
- 不同主机进程通信:通过网络交换报文。
客户进程与服务器进程
- 客户进程: 发起通信。
- 服务器进程: 等待被联系。
注意:P2P 中一个进程在某次通信中可以是客户,在另一次通信中可以是服务器。
套接字 Socket
**套接字(socket)**是应用进程和运输层之间的接口,也称为应用程序编程接口 API。
应用进程通过 socket:
- 把报文交给运输层;
- 从运输层接收报文;
- 指定目的 IP 地址和端口号;
- 选择 TCP 或 UDP 等运输层协议。
可以理解为:
应用进程 <—— socket ——> 运输层
进程寻址:IP 地址 + 端口号
要让一个进程收到数据,需要:
- 主机地址:IP address。
- 进程标识:port number。
例如:Web 服务器通常监听 TCP 80 或 TCP 443 端口。
应用层希望运输层提供的服务
应用层可能需要以下服务。
可靠数据传输
要求数据不丢失、不出错、按序到达。
- 文件传输、电子邮件、Web 页面通常要求可靠。
- 音视频可以容忍少量丢失。
TCP 提供可靠数据传输;UDP 不提供。
吞吐量保证
有些应用希望获得最低吞吐率。例如视频播放希望带宽不低于某个码率。
现实中的普通 TCP/UDP 并不直接提供最低吞吐量保证。应用通常通过自适应码率、缓存等方式处理带宽波动。
定时 / 时间敏感性
实时语音、视频会议、在线游戏对时延敏感。
普通 Internet 运输层协议不提供严格时延保证。
安全性
应用可能需要:
- 机密性:防窃听。
- 完整性:防篡改。
- 身份认证:确认通信对方身份。
TCP/UDP 本身不提供这些安全服务。现代 Web 通常使用 TLS 在应用与运输层之间提供安全通信。
SSL/TLS 安全套接层
教材中可能称 SSL(Secure Sockets Layer),现代标准通常称 TLS(Transport Layer Security)。
TLS 的位置
TLS 通常位于应用层和运输层之间:
HTTP / SMTP / IMAP 等应用协议
TLS
TCP
IP
链路层
HTTPS = HTTP + TLS + TCP。
TLS 提供的核心安全服务
- 加密:防止报文内容被窃听。
- 完整性校验:防止报文被篡改。
- 身份认证:通常通过服务器证书验证服务器身份。
- 密钥协商:通信双方协商会话密钥。
SSL 与 TLS 的关系
- SSL 是早期名称和早期协议版本。
- TLS 是 SSL 的后续标准化版本。
- 实际考试中若教材写 SSL,答题可写“SSL/TLS”,但应知道现代部署主要使用 TLS。
HTTP
HTTP(HyperText Transfer Protocol)是 Web 的核心协议。
HTTP 的基本特点
- 应用层协议。
- 使用客户-服务器模式。
- 默认 HTTP/1.1 使用 TCP 80 端口。
- HTTPS 使用 TCP 443 端口,并在 TCP 上使用 TLS。
- HTTP 是无状态协议:服务器默认不保存客户端过去请求的状态。
HTTP 无状态的含义
**无状态(stateless)**指每个请求在协议语义上相互独立,服务器不依赖先前请求来理解当前请求。
但实际 Web 应用可以借助:
- Cookie;
- Session;
- Token;
- 数据库;
来实现用户登录状态、购物车等应用层状态。
因此要区分:
- HTTP 协议本身无状态。
- Web 应用可以在 HTTP 之上实现状态管理。
本书常见协议:有状态/无状态、端口号、运输层
| 协议 | 层次 | 默认运输层 | 常见端口 | 有状态/无状态 | 说明 |
|---|---|---|---|---|---|
| HTTP | 应用层 | TCP | 80 | 协议本身无状态 | Web 请求/响应 |
| HTTPS | 应用层 | TCP + TLS | 443 | HTTP 语义无状态,TLS 连接有状态 | 安全 Web |
| FTP 控制连接 | 应用层 | TCP | 21 | 有状态 | 保存登录状态、当前目录等 |
| FTP 数据连接 | 应用层 | TCP | 20 或临时端口 | 与传输任务相关 | 控制连接与数据连接分离 |
| SMTP | 应用层 | TCP | 25;提交常用 587 | 会话有状态 | 邮件发送/中继 |
| POP3 | 应用层 | TCP | 110;加密 995 | 有状态 | authorization、transaction、update 状态 |
| IMAP | 应用层 | TCP | 143;加密 993 | 有状态 | 服务器保存邮箱状态,支持多设备同步 |
| DNS | 应用层 | UDP 为主,TCP 也可用 | 53 | 查询/响应近似无状态;递归解析器维护缓存 | 域名解析 |
| DHCP | 应用层 | UDP | server 67,client 68 | 有状态 | 地址租约分配 |
| SNMP | 应用层 | UDP | 161/162 | 管理状态在设备中 | 网络管理 |
| NTP | 应用层 | UDP | 123 | 通常无连接 | 时间同步 |
| BGP | 应用/控制平面协议 | TCP | 179 | 有状态 | AS 间路由协议 |
| RIP | 网络层控制协议 | UDP | 520 | 路由表有状态 | 基于距离向量 |
| OSPF | 网络层控制协议 | 直接封装在 IP | IP 协议号 89 | 邻接关系/LSDB 有状态 | 链路状态协议 |
| ICMP | 网络层辅助协议 | 直接封装在 IP | 无端口 | 无连接 | 差错报告和诊断 |
| ARP | 链路层/网络接口层辅助协议 | 不使用 TCP/UDP | 无端口 | ARP 缓存有状态 | IP 到 MAC 地址解析 |
易错点:
- 端口号属于运输层概念;ICMP、ARP、OSPF 不使用 TCP/UDP 端口。
- DNS 通常用 UDP 53,但在区域传送、大响应、某些扩展场景下可用 TCP 53。
- BGP 使用 TCP 179,虽然它服务于路由控制平面。
- DHCP 是应用层协议,但使用 UDP 67/68,并与 IP 地址配置密切相关。
非持久连接、持久连接与流水线
非持久 HTTP 连接
非持久连接(non-persistent connection): 每请求一个对象,就建立一个 TCP 连接,传输完成后关闭。
获取一个对象大致需要:
- 1 RTT 建立 TCP 连接;
- 1 RTT 发送 HTTP 请求并接收响应首字节;
- 对象传输时间。
所以单个对象大致需要:
若一个网页包含 1 个 HTML 文件和 10 张图片,非持久连接可能需要多次 TCP 连接,时延较大。
持久 HTTP 连接
持久连接(persistent connection): 多个 HTTP 请求/响应复用同一条 TCP 连接。
优点:
- 减少 TCP 连接建立开销。
- 避免每个对象都经历慢启动初期。
- 降低服务器和客户端资源消耗。
HTTP/1.1 默认使用持久连接。
流水线 pipelining
在 HTTP/1.1 中,客户端可以连续发送多个请求,不必等待前一个响应返回后再发下一个请求。
但流水线存在队头阻塞问题:前一个响应未完成时,后续响应可能被阻塞。现代 Web 更多依赖 HTTP/2 多路复用或 HTTP/3/QUIC 来优化。
HTTP 报文格式:请求与响应
HTTP 请求报文
一般格式:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
可选实体体
组成:
- 请求行:方法、URL 路径、HTTP 版本。
- 首部行:键值对。
- 空行:表示首部结束。
- 实体体:GET 通常没有;POST/PUT 常有。
常见方法:
| 方法 | 含义 |
|---|---|
| GET | 请求资源 |
| POST | 提交数据,常用于表单、创建资源 |
| HEAD | 类似 GET,但只要响应首部 |
| PUT | 上传/替换资源 |
| DELETE | 删除资源 |
HTTP 响应报文
一般格式:
HTTP/1.1 200 OK
Date: Tue, 01 Jul 2026 12:00:00 GMT
Server: Apache
Content-Type: text/html
Content-Length: 1024
<html>...</html>
组成:
- 状态行:HTTP 版本、状态码、原因短语。
- 首部行。
- 空行。
- 实体体。
常见状态码:
| 状态码 | 含义 |
|---|---|
| 200 OK | 请求成功 |
| 301 Moved Permanently | 永久重定向 |
| 302 Found | 临时重定向 |
| 304 Not Modified | 缓存对象仍有效 |
| 400 Bad Request | 请求格式错误 |
| 401 Unauthorized | 未认证 |
| 403 Forbidden | 服务器拒绝访问 |
| 404 Not Found | 资源不存在 |
| 500 Internal Server Error | 服务器内部错误 |
| 503 Service Unavailable | 服务不可用 |
Cookies
HTTP 无状态,但 Web 需要识别用户,因此引入 Cookie。
Cookie 的组成
Cookie 技术通常包含四部分:
- HTTP 响应报文中的
Set-Cookie首部。 - HTTP 请求报文中的
Cookie首部。 - 用户端系统中的 cookie 文件或浏览器存储。
- Web 站点后端数据库。
Cookie 工作过程
- 用户首次访问网站。
- 服务器生成用户标识,并通过
Set-Cookie返回。 - 浏览器保存 Cookie。
- 后续请求自动携带 Cookie。
- 服务器根据 Cookie 识别用户。
Cookie 的作用与问题
作用:
- 登录状态保持。
- 购物车。
- 个性化推荐。
- 用户行为追踪。
问题:
- 隐私风险。
- 被窃取后可能导致会话劫持。
- 需要配合
Secure、HttpOnly、SameSite等属性提高安全性。
Web caches / proxy
Web 缓存是什么
Web cache,也称代理服务器 proxy server,代表原始服务器保存对象副本。
用户请求对象时:
- 若缓存命中:代理直接返回对象。
- 若缓存未命中:代理向原始服务器请求,保存副本后返回给用户。
Web 缓存的作用
- 降低用户响应时间。
- 减少机构接入链路流量。
- 减少原始服务器负载。
- 使内容更靠近用户。
条件 GET
缓存需要确认对象是否过期。HTTP 使用条件 GET:
GET /index.html HTTP/1.1
If-Modified-Since: Tue, 01 Jul 2026 12:00:00 GMT
若对象未修改,服务器返回:
HTTP/1.1 304 Not Modified
此时不返回对象实体,节省带宽。
FTP:out-of-band
FTP(File Transfer Protocol)用于文件传输。
FTP 的两个连接
FTP 使用两个 TCP 连接:
- 控制连接 control connection:传输命令和响应,通常使用 TCP 21。
- 数据连接 data connection:传输文件数据,主动模式中服务器数据端口常与 TCP 20 相关;被动模式中常使用服务器临时端口。
out-of-band 的含义
FTP 的控制信息和文件数据不在同一连接上传输,称为 out-of-band control(带外控制)。
对比:HTTP 的请求控制信息和对象数据通常在同一个 TCP 连接中传输,因此是 in-band。
FTP 有状态
FTP 服务器在控制连接中维护用户状态,例如:
- 用户登录身份;
- 当前目录;
- 传输模式;
- 控制连接状态。
因此 FTP 是典型有状态协议。
Email 构成
电子邮件系统主要由三部分构成。
User Agent 用户代理
用户读写邮件的软件,例如 Outlook、Thunderbird、Webmail。
功能:
- 撰写邮件;
- 读取邮件;
- 管理邮件夹;
- 与邮件服务器交互。
Mail Server 邮件服务器
每个用户在邮件服务器上有邮箱 mailbox。
邮件服务器负责:
- 存储用户邮件;
- 与其他邮件服务器交换邮件;
- 为用户代理提供收取邮件服务。
邮件发送路径
SMTP 用于发送邮件。
典型路径:
发送方 user agent
-> 发送方 mail server
-> 接收方 mail server
-> 接收方 user agent
前两段和服务器之间的邮件转发主要使用 SMTP。
SMTP、POP3、IMAP、HTTP
SMTP
SMTP(Simple Mail Transfer Protocol)用于邮件发送和邮件服务器之间的转发。
特点:
- 使用 TCP。
- 默认服务器间传输端口 TCP 25。
- 是推协议 push protocol:发送方主动把邮件推给接收方服务器。
- 报文使用 ASCII 文本命令与响应。
常见命令:
HELO/EHLO
MAIL FROM:
RCPT TO:
DATA
QUIT
POP3
POP3 用于从邮件服务器取回邮件。
特点:
- 使用 TCP 110;加密常用 995。
- 模式简单。
- 通常下载并可删除服务器上的邮件。
- 状态阶段:Authorization、Transaction、Update。
IMAP
IMAP 用于访问和管理服务器上的邮件。
特点:
- 使用 TCP 143;加密常用 993。
- 邮件主要保存在服务器上。
- 支持文件夹、服务器端搜索、多设备同步。
- 比 POP3 更适合多终端邮箱管理。
HTTP Webmail
使用浏览器访问邮箱时,用户代理和 Web 邮件服务器之间使用 HTTP/HTTPS。
但邮件服务器之间转发仍通常依靠 SMTP。
对比表
| 协议 | 主要用途 | 方向 | 默认端口 | 特点 |
|---|---|---|---|---|
| SMTP | 发送/转发邮件 | push | 25;提交 587 | 服务器间邮件传输核心协议 |
| POP3 | 用户取信 | pull | 110/995 | 简单,常下载到本地 |
| IMAP | 用户取信和管理邮箱 | pull/同步 | 143/993 | 邮件保留服务器,支持同步 |
| HTTP/HTTPS | Webmail 访问 | 请求/响应 | 80/443 | 浏览器访问邮箱界面 |
DNS:提供的服务、层次、递归查询与迭代查询
DNS(Domain Name System)是互联网的命名系统。
DNS 提供的服务
DNS 不仅提供主机名到 IP 地址的转换,还提供:
- 主机名到 IP 地址映射:A 记录、AAAA 记录。
- 主机别名:CNAME。
- 邮件服务器别名:MX。
- 负载分配:一个域名对应多个 IP 地址。
DNS 层次结构
DNS 是分布式层次数据库。
根 DNS 服务器
-> 顶级域 TLD DNS 服务器(.com、.org、.cn 等)
-> 权威 DNS 服务器(example.com)
常见 DNS 服务器类型:
- 根 DNS 服务器 root server:指向 TLD 服务器。
- TLD DNS 服务器:管理顶级域。
- 权威 DNS 服务器 authoritative server:保存具体域名记录。
- 本地 DNS 服务器 local DNS server:通常由 ISP、学校、公司提供,负责代替主机递归查询。
递归查询与迭代查询
递归查询 recursive query
被查询服务器负责继续查询,并最终返回完整答案。
例子:主机把查询交给本地 DNS,本地 DNS 负责查完整个过程。
迭代查询 iterative query
被查询服务器不知道最终答案时,只返回“下一步应该问谁”。
典型过程:
本地 DNS -> 根 DNS:问 www.example.com?
根 DNS -> 本地 DNS:去问 .com TLD
本地 DNS -> .com TLD:问 www.example.com?
.com TLD -> 本地 DNS:去问 example.com 权威服务器
本地 DNS -> 权威 DNS:问 www.example.com?
权威 DNS -> 本地 DNS:返回 IP 地址
DNS 缓存
DNS 广泛使用缓存。
优点:
- 减少查询时延。
- 降低上层 DNS 服务器负载。
缓存记录有 TTL,到期后需要重新查询。
DNS 报文与端口
- DNS 通常使用 UDP 53。
- 大响应、区域传送等情况可使用 TCP 53。
- DNS 报文首部固定 12 字节。
套接字编程
UDP socket 编程基本过程
服务器端:
socket()
bind(server_port)
recvfrom()
sendto()
客户端:
socket()
sendto(server_ip, server_port)
recvfrom()
UDP 特点:
- 不需要建立连接。
- 每个报文需要指定目的地址。
- 可能丢失、乱序、重复。
TCP socket 编程基本过程
服务器端:
socket()
bind(server_port)
listen()
accept()
recv()/send()
close()
客户端:
socket()
connect(server_ip, server_port)
send()/recv()
close()
TCP 特点:
- 需要连接建立。
- 面向字节流。
- 可靠、按序交付。
- 服务器欢迎套接字 listening socket 用于接收连接;每个连接由 accept 产生一个新的连接套接字。
运输层
运输层图解:UDP、RDT、GBN/SR、TCP

运输层协议通常不提供严格时延保证和带宽保证。TCP 提供可靠数据传输、流量控制、拥塞控制;UDP 提供最小化服务。
多路复用和多路分解
你原文写的是“多路服用”,应为 多路复用。
多路复用 multiplexing
发送端运输层从多个 socket 收集数据,给每块数据加上首部,交给网络层。
关键:在运输层首部中加入端口号等信息。
多路分解 demultiplexing
接收端运输层根据报文段首部信息,把数据交付给正确 socket。
无连接的多路分解:UDP
UDP socket 的分解主要依据:
目的 IP 地址 + 目的端口号
教材常说:UDP socket 由二元组标识:
目的 IP 地址,目的端口号
含义:如果两个 UDP 数据报有相同的目的 IP 和目的端口,即使源 IP、源端口不同,也会被交付给同一个 UDP socket。
例子:
A: 1.1.1.1:50000 -> S: 2.2.2.2:53
B: 3.3.3.3:40000 -> S: 2.2.2.2:53
这两个报文都会交给服务器 2.2.2.2:53 的 DNS UDP socket。
有连接的多路分解:TCP
TCP socket 由四元组标识:
源 IP 地址,源端口号,目的 IP 地址,目的端口号
服务器可以在同一个端口上同时服务多个客户端,因为每条 TCP 连接的四元组不同。
例子:
Client A: 1.1.1.1:50000 -> Server: 2.2.2.2:80
Client B: 3.3.3.3:50000 -> Server: 2.2.2.2:80
虽然目的端口都是 80,但源 IP 不同,四元组不同,因此是不同连接。
本书常见协议使用 UDP 还是 TCP
| 协议/应用 | 通常使用 TCP | 通常使用 UDP | 说明 |
|---|---|---|---|
| HTTP/1.1、HTTP/2 | 是 | 否 | Web 传统版本基于 TCP |
| HTTP/3 | 否 | 是 | HTTP/3 基于 QUIC,QUIC 基于 UDP |
| HTTPS | 是 | 否 | HTTP + TLS + TCP;HTTP/3 例外 |
| FTP | 是 | 否 | 控制和数据连接都使用 TCP |
| SMTP | 是 | 否 | 邮件发送/服务器转发 |
| POP3 | 是 | 否 | 邮件读取 |
| IMAP | 是 | 否 | 邮件读取和同步 |
| DNS | 可用 | 主要使用 | 普通查询多用 UDP,区域传送/大响应可用 TCP |
| DHCP | 否 | 是 | UDP 67/68 |
| RIP | 否 | 是 | UDP 520 |
| BGP | 是 | 否 | TCP 179 |
| OSPF | 否 | 否 | 直接封装在 IP,协议号 89 |
| ICMP | 否 | 否 | 直接封装在 IP |
| ARP | 否 | 否 | 链路层协议,不走 IP/TCP/UDP |
| RTP/实时音视频 | 否 | 常用 | 容忍少量丢失,重视时延 |
| SNMP | 否 | 常用 | UDP 161/162 |
| NTP | 否 | 是 | UDP 123 |
UDP
UDP(User Datagram Protocol)提供一种非常简单的运输层服务。
UDP 的特点
- 无连接:发送前不握手。
- 不保证可靠:不保证到达、不保证按序、不保证不重复。
- 不进行拥塞控制。
- 首部开销小,只有 8 字节。
- 支持多播/广播场景。
- 应用可以自行实现需要的可靠性或时序控制。
适合:
- DNS 查询。
- DHCP。
- 实时音视频。
- 在线游戏。
- 简单请求响应。
UDP 报文段结构
UDP 首部固定 8 字节:
0 15 16 31
+---------------------+---------------------+
| Source Port | Destination Port |
+---------------------+---------------------+
| Length | Checksum |
+---------------------+---------------------+
| Application Data ... |
+-------------------------------------------+
字段:
| 字段 | 长度 | 作用 |
|---|---|---|
| Source Port | 16 bit | 源端口 |
| Destination Port | 16 bit | 目的端口 |
| Length | 16 bit | UDP 首部 + 数据总长度 |
| Checksum | 16 bit | 差错检测 |
UDP 校验和:端回进位 + 取反
UDP checksum 使用 16 位反码加法。
计算步骤:
- 把 UDP 首部、数据和伪首部按 16 bit 分组。
- 所有 16 bit 字相加。
- 如果最高位产生进位,将进位回卷加到低位,即端回进位。
- 对最终和逐位取反,得到校验和。
例子:
0110 0110 0110 0000
+ 0101 0101 0101 0101
= 1011 1011 1011 0101
+ 1000 1111 0000 1100
=1 0100 1010 1100 0001
端回进位:0100 1010 1100 0010
取反: 1011 0101 0011 1101
接收方验证:把所有 16 bit 字,包括 checksum 一起相加。若结果为全 1,则认为未检测到差错。
UDP 没有纠错功能
UDP checksum 只做差错检测:
- 能发现一部分比特错误。
- 不负责重传。
- 不负责纠错。
- 发现错误后通常直接丢弃,是否恢复由应用决定。
可靠数据传输 RDT
可靠数据传输讨论的是:在不可靠信道上,如何实现可靠交付。
rdt1.0:完全可靠信道
假设底层信道:
- 不出错。
- 不丢包。
因此发送方只需发送,接收方只需接收。
新增机制:无。
解决问题:无,因为信道理想。
rdt2.0:信道可能出现比特错误
假设:
- 分组可能出现比特错误。
- 分组不会丢失。
新增机制:
- checksum:检测差错。
- ACK:肯定确认。
- NAK:否定确认。
- 重传:收到 NAK 后重传。
问题:ACK/NAK 本身也可能损坏。如果 ACK/NAK 损坏,发送方不知道接收方到底是否正确收到。
rdt2.1:解决 ACK/NAK 损坏
新增机制:
- 序号 sequence number。
- 接收方通过序号识别重复分组。
由于停等协议中最多只需区分“当前分组”和“下一个分组”,所以 0/1 两个序号即可。
解决问题:
- ACK/NAK 损坏时,发送方可重传。
- 接收方通过序号判断是否重复,重复则丢弃但重新 ACK。
rdt2.2:无 NAK 协议
rdt2.2 去掉 NAK,只使用 ACK。
思想:
- 接收方收到正确分组,发送对应 ACK。
- 接收方收到错误分组或重复分组,重新发送上一个正确分组的 ACK。
- 发送方收到重复 ACK,可理解为当前分组没有被正确接收,从而重传。
新增机制:
- ACK 中携带被确认分组的序号。
rdt3.0:信道可能丢包
假设:
- 分组可能出错。
- 分组可能丢失。
- ACK 也可能丢失。
新增机制:
- 定时器 timer。
- 超时重传 timeout retransmission。
发送方发送分组后启动定时器:
- 超时前收到正确 ACK:发送下一个分组。
- 超时仍未收到 ACK:重传当前分组。
rdt3.0 是停等协议,性能较低。原因是发送方每次只能有一个未确认分组。
rdt 版本总结表
| 版本 | 信道假设 | 新增机制 | 解决的问题 | 遗留问题 |
|---|---|---|---|---|
| rdt1.0 | 不出错不丢包 | 无 | 理想信道传输 | 不现实 |
| rdt2.0 | 会出错不丢包 | checksum、ACK、NAK、重传 | 数据分组比特错误 | ACK/NAK 可能损坏 |
| rdt2.1 | 会出错不丢包 | 序号、重复检测 | ACK/NAK 损坏导致的不确定性 | 仍使用 NAK,较复杂 |
| rdt2.2 | 会出错不丢包 | 只用 ACK,ACK 带序号 | 去掉 NAK | 不能处理丢包 |
| rdt3.0 | 会出错会丢包 | 定时器、超时重传 | 分组或 ACK 丢失 | 停等,效率低 |
GBN 和 SR
停等协议信道利用率低,因此引入流水线协议:允许多个分组未确认。
Go-Back-N(GBN,回退 N 步)
GBN 的特点
- 发送方窗口大小为 。
- 允许连续发送多个未确认分组。
- 接收方只按序接收。
- 接收方丢弃失序分组。
- 使用累积 ACK。
- 发送方通常只为最早未确认分组设置一个定时器。
- 超时后,从最早未确认分组开始全部重传。
GBN 接收方行为
如果期望收到分组 :
- 收到 :交付上层,发送 ACK k。
- 收到 或更后面的失序分组:丢弃,重新发送 ACK k-1。
GBN 发送方窗口
设:
- :最早未确认分组序号。
- :下一个可发送分组序号。
- :窗口大小。
可发送条件:
Selective Repeat(SR,选择重传)
SR 的特点
- 发送方窗口大小为 。
- 接收方可以缓存失序分组。
- 每个分组单独确认。
- 每个分组通常有独立定时器。
- 只重传丢失或出错的分组。
SR 接收方行为
如果收到窗口内分组:
- 若未收到过,则缓存并发送 ACK。
- 若正好是窗口基序号,则向上层按序交付,并滑动窗口。
- 若重复分组,则重新 ACK。
SR 序号空间限制
为了避免新旧分组序号混淆,SR 通常要求:
如果序号空间为 ,则:
GBN vs SR
| 比较项 | GBN | SR |
|---|---|---|
| 接收方是否缓存失序分组 | 不缓存,直接丢弃 | 缓存 |
| ACK 类型 | 累积 ACK | 单独 ACK |
| 重传范围 | 从丢失处分组开始回退重传 | 只重传出错/丢失分组 |
| 定时器 | 通常一个 | 通常每个分组一个 |
| 实现复杂度 | 较低 | 较高 |
| 带宽利用率 | 丢包时较低 | 较高 |
TCP
TCP 是面向连接的可靠字节流协议。
TCP 提供的服务
- 面向连接。
- 可靠数据传输。
- 按序交付。
- 全双工通信。
- 流量控制。
- 拥塞控制。
TCP 不提供:
- 固定时延保证。
- 最小带宽保证。
- 报文边界保留。
- 原生加密。
TCP 报文结构与 MSS
TCP 首部
TCP 首部最小 20 字节。
0 15 16 31
+---------------------+---------------------+
| Source Port | Destination Port |
+---------------------+---------------------+
| Sequence Number |
+-------------------------------------------+
| Acknowledgment Number |
+----+------+---------+----------------------+
|Hdr |Flags | Window Size |
+----+------+---------+----------------------+
| Checksum | Urgent Pointer |
+---------------------+----------------------+
| Options (variable) |
+-------------------------------------------+
| Data ... |
+-------------------------------------------+
重要字段:
| 字段 | 作用 |
|---|---|
| Source/Destination Port | 标识应用进程 |
| Sequence Number | 本报文段数据第一个字节的序号 |
| Acknowledgment Number | 期望收到的下一个字节序号 |
| ACK | 确认号字段有效 |
| SYN | 建立连接 |
| FIN | 关闭连接 |
| RST | 重置连接 |
| Receive Window | 接收窗口,用于流量控制 |
| Checksum | 差错检测 |
| Options | MSS、窗口扩大、时间戳等选项 |
MSS
MSS(Maximum Segment Size)指 TCP 报文段中应用层数据部分的最大长度,不包括 TCP 首部和 IP 首部。
典型以太网 MTU 为 1500 字节时:
- IPv4 首部通常 20 字节。
- TCP 首部通常 20 字节。
- MSS 常为:
注意:MSS 不是 TCP 报文段总长度,也不是 IP 数据报总长度。
TCP 可靠数据传输
TCP 序号与确认号
TCP 把数据看作字节流。
- 序号:本报文段第一个数据字节的编号。
- 确认号:接收方期望收到的下一个字节编号。
例子:
若接收方已经正确收到字节 0~999,则 ACK = 1000。
TCP 使用累积确认。ACK 1000 表示 1000 之前的字节都已收到。
TCP 重传机制
TCP 主要通过以下方式触发重传:
- 超时重传。
- 快速重传:收到 3 个冗余 ACK 后,推断某报文段丢失。
RTT 估计与超时间隔
TCP 维护 EstimatedRTT:
教材常取:
RTT 偏差:
教材常取:
超时时间:
TCP 流量控制
流量控制解决什么问题
流量控制防止发送方发送太快,压垮接收方缓存。
接收方维护接收缓存,向发送方通告接收窗口 。
发送方需要满足:
rwnd 计算
设:
- :接收缓存大小。
- :最后收到的字节编号。
- :应用进程最后读取的字节编号。
则接收窗口:
与拥塞控制区别
| 比较项 | 流量控制 | 拥塞控制 |
|---|---|---|
| 目的 | 防止接收方缓存溢出 | 防止网络拥塞 |
| 依据 | 接收方通告窗口 rwnd | 拥塞窗口 cwnd、丢包、ACK |
| 控制对象 | 接收端处理能力 | 网络路径承载能力 |
TCP 实际发送窗口受两者共同限制:
TCP 连接管理
三次握手
TCP 建立连接使用三次握手。
Client -> Server: SYN, seq = x
Server -> Client: SYN + ACK, seq = y, ack = x + 1
Client -> Server: ACK, ack = y + 1
作用:
- 双方确认对方收发能力。
- 协商初始序号。
- 建立连接状态。
为什么不是两次握手
两次握手可能导致历史连接请求报文被服务器误认为新连接,从而建立半开连接。
三次握手可以让客户端最终确认服务器的 SYN,降低旧报文造成错误连接的风险。
四次挥手
TCP 是全双工,两个方向需要分别关闭。
A -> B: FIN
B -> A: ACK
B -> A: FIN
A -> B: ACK
主动关闭方通常进入 TIME_WAIT,等待一段时间,确保最后 ACK 可重传,并让旧连接报文在网络中消失。
TCP 拥塞控制
拥塞控制解决网络中路由器缓存溢出、排队时延过大、丢包等问题。
基本变量
- :拥塞窗口,发送方根据网络拥塞情况维护。
- :接收窗口,由接收方通告。
- :慢启动阈值。
- :最大报文段长度。
发送方最多可发送未确认数据量:
慢启动 Slow Start
当 时,处于慢启动阶段。
规则:
- 初始 cwnd 通常较小。
- 每收到一个 ACK,cwnd 增加 1 MSS。
- 每经过一个 RTT,cwnd 大约翻倍。
所以慢启动是指数增长。
拥塞避免 Congestion Avoidance
当 时,进入拥塞避免。
规则:
- 每 RTT,cwnd 约增加 1 MSS。
- 线性增长。
可以理解为 AIMD 中的 Additive Increase。
丢包事件:超时
超时通常表示拥塞严重。
典型 TCP Reno 处理:
然后:
重新进入慢启动。
丢包事件:3 个冗余 ACK
3 个冗余 ACK 表示某个报文段丢失,但后续报文段仍到达接收方,因此网络不一定严重拥塞。
触发:
- 快速重传 fast retransmit。
- 快速恢复 fast recovery。
TCP Reno 典型过程:
- 收到 3 个冗余 ACK:
- 进入快速恢复时:
这里的 是因为 3 个冗余 ACK 表明有 3 个报文段已经离开网络并被接收方收到,发送方可适当“膨胀”窗口。
- 每收到一个额外冗余 ACK,。
- 当收到对重传报文段的新 ACK,退出快速恢复:
然后进入拥塞避免。
Tahoe、Reno 与“ssthresh = cwnd/2 + 3”问题
严格说:
- 通常设置为丢包前 的一半。
- 加在 上,不是加在 上。
即:
ssthresh = cwnd / 2
cwnd = ssthresh + 3 MSS
若某些题目写成“快速重传变化时 ssthresh = cwnd/2 + 3”,通常是表述混淆。更标准的 Reno 快速恢复写法是 。
TCP Tahoe 没有快速恢复:检测到 3 个冗余 ACK 后也会把 cwnd 降到 1 MSS,重新慢启动。
AIMD
TCP 拥塞控制核心思想:
- Additive Increase:未检测到拥塞时线性增加窗口。
- Multiplicative Decrease:检测到拥塞时乘性减小窗口。
这能在多个 TCP 连接之间形成较公平的带宽共享。
网络层
网络层图解:IP、子网、分片、DHCP、NAT、IPv6

网络服务模型:模型及其保证的服务
网络层服务模型规定网络层为运输层提供什么服务。
Internet 的网络服务模型
Internet 的 IP 层提供尽力而为服务(best-effort service)。
它不保证:
- 分组一定到达。
- 分组按序到达。
- 分组不重复。
- 分组之间间隔固定。
- 最小时延。
- 最小带宽。
它尽力转发,但可靠性由上层协议或应用处理。
其他可能的服务模型
理论上网络层可以提供:
- 保证交付。
- 保证有界时延。
- 保证按序交付。
- 保证最小带宽。
- 安全服务。
但 Internet IP 层为了简单、可扩展,选择了尽力而为模型。
ATM 异步传输模式
ATM(Asynchronous Transfer Mode)是一种曾被广泛研究和部署的虚电路网络技术。
ATM 的特点
- 面向连接,使用虚电路。
- 固定长度信元 cell:53 字节,其中 5 字节首部,48 字节负载。
- 通过虚电路标识转发,而不是每个分组携带完整目的地址。
- 支持不同服务类别。
ATM 服务类别
| 服务类别 | 含义 | 适合业务 |
|---|---|---|
| CBR | Constant Bit Rate,恒定比特率 | 语音、传统视频 |
| VBR | Variable Bit Rate,可变比特率 | 压缩视频 |
| ABR | Available Bit Rate,可用比特率 | 弹性数据业务 |
| UBR | Unspecified Bit Rate,未指定比特率 | 尽力而为数据 |
ATM 的核心价值是提供可预测 QoS,但 Internet 最终以 IP 的简单尽力而为模型占主流。
虚电路网络和数据报网络
虚电路网络 VC network
虚电路网络在数据传输前建立路径。
过程:
- VC setup:建立虚电路。
- 数据传输:分组沿固定路径转发。
- VC teardown:拆除虚电路。
每条链路上的分组携带 VC number,路由器根据 VC 转发表替换 VC number 并转发。
虚电路转发表可表示为:
入接口,入 VC号 -> 出接口,出 VC号
特点:
- 路由器需要维护连接状态。
- 分组首部较短。
- 可预留资源。
- 链路或路由器故障会影响经过该虚电路的连接。
数据报网络 datagram network
Internet 是典型数据报网络。
特点:
- 不需要网络层连接建立。
- 每个分组携带目的地址。
- 路由器根据目的地址和转发表逐跳转发。
- 不同分组可走不同路径。
- 路由器不维护端到端连接状态。
与传输层连接/无连接比较
| 比较项 | 网络层虚电路 | TCP 连接 | 网络层数据报 | UDP |
|---|---|---|---|---|
| 层次 | 网络层 | 运输层 | 网络层 | 运输层 |
| 是否连接 | 是 | 是 | 否 | 否 |
| 路由器是否维护连接状态 | 是 | 否,TCP 状态在端系统 | 否 | 否 |
| 分组转发依据 | VC 号 | IP 层仍按目的地址转发 | 目的地址 | IP 层按目的地址转发 |
| 可靠性 | 取决于网络设计 | TCP 提供可靠传输 | IP 不可靠 | UDP 不可靠 |
易错点:
TCP 是端系统上的运输层连接,不代表网络中的路由器为 TCP 连接建立虚电路。Internet 中 TCP 报文段仍被封装进 IP 数据报,由 IP 层逐跳转发。
最长前缀匹配
路由器转发时,可能有多个转发表项匹配目的 IP 地址。此时选择匹配前缀最长的一项。
原因:前缀越长,地址块越具体。
例子:
| 前缀 | 输出接口 |
|---|---|
| 11001000 00010111 00010 | 0 |
| 11001000 00010111 00011000 | 1 |
| 11001000 00010111 00011 | 2 |
| otherwise | 3 |
如果目的地址同时匹配多个前缀,应选择最长的匹配项,而不是最先出现的表项。
IPv4 数据报结构
IPv4 首部最小 20 字节,最大 60 字节。
0 15 16 31
+----+----+----------+----------------------+
|Ver |IHL | DS/ECN | Total Length |
+--------------------+----------------------+
| Identification | Flags | Frag Offset |
+--------------------+----------------------+
| TTL | Protocol | Header Checksum |
+--------------------+----------------------+
| Source IP Address |
+-------------------------------------------+
| Destination IP Address |
+-------------------------------------------+
| Options (optional) |
+-------------------------------------------+
| Data |
+-------------------------------------------+
重要字段:
| 字段 | 作用 |
|---|---|
| Version | IP 版本,IPv4 为 4 |
| IHL | 首部长度,单位为 4 字节 |
| Total Length | IP 数据报总长度,首部 + 数据 |
| Identification | 分片重组标识 |
| Flags | DF、MF 等分片控制 |
| Fragment Offset | 分片偏移,单位 8 字节 |
| TTL | 生存时间,每经过一个路由器减 1 |
| Protocol | 上层协议,如 TCP=6、UDP=17、ICMP=1 |
| Header Checksum | IPv4 首部校验和 |
| Source/Destination IP | 源/目的 IP 地址 |
常见协议典型首部长度总结
| 协议/帧 | 典型首部长度 | 备注 |
|---|---|---|
| Ethernet II | 14 字节首部 + 4 字节 FCS | 前导码 8 字节通常不计入帧长度 |
| ARP | 28 字节 ARP 报文 | 封装在以太网帧中 |
| IPv4 | 20 字节最小,60 字节最大 | IHL 指定首部长度 |
| IPv6 | 固定 40 字节基本首部 | 扩展首部另算 |
| ICMP Echo | 8 字节 ICMP 首部 | Type、Code、Checksum 等 |
| UDP | 8 字节 | 固定长度 |
| TCP | 20 字节最小,60 字节常见上限 | Options 可变 |
| DNS | 12 字节固定首部 | 后接问题区/回答区等 |
| DHCP/BOOTP | 固定部分 236 字节 + options | UDP 67/68 |
| TLS record | 5 字节记录层首部 | TLS 在 TCP 之上 |
| HTTP | 无固定二进制首部长度 | 文本/语义首部,可变 |
IP 检验和:为什么需要反复重新计算
IPv4 首部有 Header Checksum,只覆盖 IPv4 首部,不覆盖数据部分。
每经过一个路由器:
- TTL 减 1。
- 首部字段发生变化。
- 因此 IPv4 首部校验和必须更新。
如果发生分片,首部中的 Total Length、Flags、Fragment Offset 等字段也会变化,也需要重新计算。
为什么运输层和网络层都有校验和?
| 层次 | 校验范围 | 作用 |
|---|---|---|
| IPv4 首部校验和 | 只保护 IPv4 首部 | 逐跳检测 IP 首部错误;TTL 等字段每跳变化 |
| TCP/UDP 校验和 | 覆盖运输层首部、数据和伪首部 | 端到端检测运输层数据和关键 IP 地址信息错误 |
关键区别:
- IPv4 checksum 是网络层、逐跳、只管 IP 首部。
- TCP/UDP checksum 是运输层、端到端、覆盖应用数据。
IPv6 去掉了首部校验和,减少路由器处理负担,差错检测主要依靠链路层和运输层。
IP 分片:MTU 与重组
MTU
MTU(Maximum Transmission Unit)是链路层帧能承载的最大网络层数据报长度。
例如以太网常见 MTU 为 1500 字节。
若 IP 数据报长度大于下一条链路 MTU,且 DF 位未设置,则路由器可以分片。
IPv4 分片字段
- Identification:同一个原始数据报的所有分片具有相同 ID。
- MF(More Fragments):后面是否还有分片。
- Fragment Offset:当前分片数据相对原始数据报数据部分的偏移,单位为 8 字节。
分片规则
假设:
- 原始 IP 数据报总长度为 。
- IP 首部长度为 。
- 数据部分长度为 。
- 下一链路 MTU 为 。
每个分片最多可携带数据:
除最后一个分片外,每个分片的数据长度必须是 8 字节的整数倍。
因此非最后分片最大数据长度为:
分片例题模板
例:IP 数据报 1020 字节,其中 IP 首部 20 字节,数据 1000 字节。链路 MTU = 500 字节。
每片最多总长度 500,首部 20,所以每片最多数据 480 字节。480 是 8 的倍数。
分片:
| 分片 | 数据字节范围 | 数据长度 | 总长度 | Offset | MF |
|---|---|---|---|---|---|
| 1 | 0–479 | 480 | 500 | 0 | 1 |
| 2 | 480–959 | 480 | 500 | 60 | 1 |
| 3 | 960–999 | 40 | 60 | 120 | 0 |
Offset 计算:
第 1 片 offset = 0 / 8 = 0
第 2 片 offset = 480 / 8 = 60
第 3 片 offset = 960 / 8 = 120
因此最后一个分片 offset 为 120。
重组
IPv4 分片只在目的主机重组,中间路由器不负责重组。
原因:
- 减少路由器状态。
- 避免中间路由器缓存大量分片。
- 保持网络核心简单。
IP 地址分配/寻址
IP 地址与接口
严格说,IP 地址分配给接口 interface,不是直接分配给主机或路由器整体。
- 一台主机通常有一个或多个接口。
- 一台路由器有多个接口。
- 每个路由器接口通常连接不同子网,并拥有该子网中的一个 IP 地址。
你原文中的句子是正确的:
一台路由器有多个接口,每个接口可以接入不同子网,所以一台路由器通常同时连接多个子网。
子网 subnet
子网是指不经过路由器即可直接互达的一组接口。
判断子网:
- 同一子网内接口具有相同网络前缀。
- 不同子网之间需要路由器转发。
CIDR 表示法
CIDR 使用斜线表示网络前缀长度:
192.168.1.0/24
含义:前 24 bit 是网络前缀,后 8 bit 是主机号。
子网计算方法
给定 IP 地址和子网掩码:
- 网络地址:IP 与 mask 按位与。
- 广播地址:网络地址的主机位全置 1。
- 可用主机范围:网络地址 + 1 到 广播地址 - 1。
- 主机数:一般为 。
例题:128.36.199.3,掩码 255.255.240.0
掩码:
255.255.240.0 = /20
二进制对应:
IP: 128. 36.199. 3
10000000.00100100.11000111.00000011
Mask: 255.255.240. 0
11111111.11111111.11110000.00000000
AND: 128. 36.192. 0
10000000.00100100.11000000.00000000
因此:
- 网络地址:
128.36.192.0/20 - 广播地址:第三个字节主机低 4 位全 1,第四个字节全 1:
128.36.207.255 - 地址范围:
128.36.192.0到128.36.207.255 - 可用主机范围:
128.36.192.1到128.36.207.254 - 主机位数:
- 可用主机数:
特殊 IP 地址与私有 IP 地址
私有 IPv4 地址
私有地址不能在公共互联网中全局路由,常配合 NAT 使用。
| 地址块 | 范围 | 说明 |
|---|---|---|
| 10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 私有地址 |
| 172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 私有地址 |
| 192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 私有地址 |
易错点:
- 不是所有 172 开头都是私有地址,只有
172.16.0.0到172.31.255.255。 - 不是所有 192 开头都是私有地址,只有
192.168.0.0/16。
常见特殊地址
| 地址/地址块 | 含义 |
|---|---|
| 0.0.0.0 | 本主机未知地址;也可表示默认路由 0.0.0.0/0 |
| 255.255.255.255 | 受限广播地址 |
| 127.0.0.0/8 | 回环地址,常用 127.0.0.1 |
| 169.254.0.0/16 | 链路本地地址,自动配置失败时常见 |
| 224.0.0.0/4 | IPv4 多播地址 |
| 100.64.0.0/10 | 运营商级 NAT 共享地址空间 |
| 192.0.2.0/24 | 文档示例地址 TEST-NET-1 |
| 198.51.100.0/24 | 文档示例地址 TEST-NET-2 |
| 203.0.113.0/24 | 文档示例地址 TEST-NET-3 |
路由聚合 route aggregation
路由聚合也称前缀聚合、CIDR 聚合。
基本思想
把多个连续的小地址块合并成一个较大的前缀通告,减少路由表项。
例:
200.23.16.0/24
200.23.17.0/24
...
200.23.31.0/24
可聚合为:
200.23.16.0/20
为什么能减少路由表
如果一个 ISP 拥有一段连续地址空间,它可以向外部只通告一个聚合前缀,而不是通告每个客户子网。
这样可降低全球 BGP 路由表规模。
最长前缀匹配与聚合例外
如果存在更具体的前缀,会优先匹配更具体路由。
例如:
200.23.16.0/20 -> ISP A
200.23.18.0/23 -> ISP B
目的地址属于 200.23.18.0/23 时,会选择 ISP B,因为 /23 比 /20 更长。
DHCP:即插即用协议
DHCP(Dynamic Host Configuration Protocol)用于自动为主机分配网络配置。
DHCP 提供的信息
DHCP 不仅分配 IP 地址,还可提供:
- 子网掩码。
- 默认网关。
- DNS 服务器地址。
- 租约时间。
DHCP 四阶段:DORA
Discover -> Offer -> Request -> ACK
| 阶段 | 发送方 | 目的 | 说明 |
|---|---|---|---|
| DHCP Discover | 客户端 | 广播 | 客户端寻找 DHCP 服务器 |
| DHCP Offer | 服务器 | 广播或单播 | 服务器提供 IP 地址等配置 |
| DHCP Request | 客户端 | 广播 | 客户端请求使用某个地址 |
| DHCP ACK | 服务器 | 广播或单播 | 服务器确认租约 |
源/目的 IP 与端口
首次获取地址时,客户端尚无 IP 地址,因此:
- 客户端源 IP 常为
0.0.0.0。 - 目的 IP 常为
255.255.255.255。 - 客户端 UDP 端口 68。
- 服务器 UDP 端口 67。
典型 DORA:
| 报文 | 源 IP | 目的 IP | 源端口 | 目的端口 | yiaddr |
|---|---|---|---|---|---|
| Discover | 0.0.0.0 | 255.255.255.255 | 68 | 67 | 空 |
| Offer | DHCP server IP | 255.255.255.255 或客户端可接收地址 | 67 | 68 | 服务器提供的 IP |
| Request | 0.0.0.0 | 255.255.255.255 | 68 | 67 | 请求使用的 IP |
| ACK | DHCP server IP | 255.255.255.255 或单播 | 67 | 68 | 确认分配的 IP |
注意:续租阶段客户端已经有 IP 地址,可能使用单播与服务器通信。所以“整个过程中客户端源 IP 都是 0.0.0.0”只适合教材中首次获取地址的简化 DORA 场景,不适合所有 DHCP 运行阶段。
DHCP 是应用层协议吗?
是。DHCP 运行在 UDP 之上,从协议栈角度属于应用层协议。
但它的功能是给网络层配置 IP 地址、子网掩码、默认网关等参数,因此常放在网络层章节讨论。
NAT 与 NAT traversal problem
NAT 是什么
NAT(Network Address Translation)把内部私有地址转换为公网地址。
常见家庭网络:
内网主机 192.168.1.10:50000
-> NAT 路由器公网地址 203.0.113.5:62000
-> Internet server 93.184.216.34:80
NAT 维护转换表:
内网 IP:端口 <-> 公网 IP:端口
NAT 的优点
- 缓解 IPv4 地址不足。
- 内网地址可复用。
- 更换 ISP 时内网地址不必改变。
- 对外隐藏内部主机结构。
NAT 的问题
- 破坏端到端原则。
- 外部主机难以主动连接内网主机。
- P2P、VoIP、在线游戏等需要 NAT 穿越。
- 某些协议把 IP/端口写入应用层数据,NAT 仅改 IP/TCP/UDP 首部会导致不一致。
NAT traversal problem
NAT 穿越问题:NAT 后的主机没有公网可达地址,外部 peer 难以直接建立连接。
常见解决方式:
| 方法 | 思想 | 说明 |
|---|---|---|
| 静态端口映射 | 手动配置公网端口转发到内网主机 | 简单但需人工配置 |
| UPnP / NAT-PMP / PCP | 内网主机请求 NAT 自动建立映射 | 依赖路由器支持 |
| STUN | 发现自己的公网映射地址 | 常用于实时通信 |
| TURN | 通过中继服务器转发数据 | 可靠但增加时延和带宽成本 |
| ICE | 综合 STUN/TURN,选择可用路径 | WebRTC 常用 |
| UDP hole punching | 双方同时向对方公网映射发包打洞 | P2P 常见 |
ICMP
ICMP(Internet Control Message Protocol)用于网络层差错报告和诊断。
ICMP 的作用
ICMP 不用于传输应用数据,主要用于:
- 差错报告。
- 网络诊断。
- 路径探测。
ICMP 报文封装在 IP 数据报中,但属于网络层辅助协议,不使用端口号。
常见 ICMP 报文类型
| 类型 | 名称 | 用途 |
|---|---|---|
| 0 | Echo Reply | ping 响应 |
| 3 | Destination Unreachable | 目的不可达 |
| 8 | Echo Request | ping 请求 |
| 11 | Time Exceeded | TTL 归零,traceroute 常用 |
| 12 | Parameter Problem | IP 首部参数问题 |
ping 与 traceroute
ping
使用 ICMP Echo Request 和 Echo Reply 测试可达性和 RTT。
traceroute
利用 TTL:
- 发送 TTL=1 的探测包。
- 第一跳路由器把 TTL 减为 0,丢弃并返回 ICMP Time Exceeded。
- 发送 TTL=2,第二跳返回 ICMP Time Exceeded。
- 逐渐增加 TTL,得到路径上的路由器。
所以 traceroute 测到的 delay 是从本机到该路由器再返回本机的往返时间 RTT,不是单程时延。
IPv6
IPv6 与 IPv4 差异
| 项目 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit | 128 bit |
| 首部长度 | 20~60 字节 | 固定 40 字节基本首部 |
| 首部校验和 | 有 | 无 |
| 分片 | 路由器和主机都可分片 | 路由器不分片,源主机负责分片 |
| 地址表示 | 点分十进制 | 冒号十六进制 |
| TTL 字段 | TTL | Hop Limit |
| 可选字段 | IPv4 options | IPv6 extension headers |
| NAT 依赖 | 常见 | 理论上显著减少 NAT 需求 |
IPv6 首部
IPv6 基本首部固定 40 字节,主要字段:
| 字段 | 作用 |
|---|---|
| Version | 版本号 6 |
| Traffic Class | 流量类别 |
| Flow Label | 流标签 |
| Payload Length | 负载长度 |
| Next Header | 下一个首部类型,类似 IPv4 Protocol |
| Hop Limit | 跳数限制,类似 TTL |
| Source Address | 128 bit 源地址 |
| Destination Address | 128 bit 目的地址 |
IPv6 改进点
- 地址空间巨大。
- 固定长度基本首部便于高速处理。
- 去掉首部校验和,减少路由器每跳处理开销。
- 路由器不再分片,简化网络核心。
- 更好支持自动配置和扩展首部。
IPv4 到 IPv6 的两种过渡方法
双栈 dual stack
设备同时支持 IPv4 和 IPv6。
- 与 IPv4 主机通信时使用 IPv4。
- 与 IPv6 主机通信时使用 IPv6。
优点:兼容性好。
缺点:需要同时维护两套协议栈。
隧道 tunneling
把 IPv6 数据报封装在 IPv4 数据报中,通过 IPv4 网络传输。
IPv6 packet -> 封装进 IPv4 packet -> IPv4 网络 -> 解封装为 IPv6 packet
优点:可穿越尚未支持 IPv6 的 IPv4 网络。
缺点:增加封装开销,路径和排错更复杂。
路由算法
路由图解:LS、DV、毒性逆转、层次路由与路由协议

路由算法决定从源到目的的路径。
三种分类
按信息来源
| 类型 | 说明 | 代表 |
|---|---|---|
| 全局式 global | 每个路由器掌握完整网络拓扑和链路代价 | LS、Dijkstra |
| 分散式 decentralized | 每个路由器只知道邻居和从邻居收到的信息 | DV、Bellman-Ford |
按路径是否随负载变化
| 类型 | 说明 |
|---|---|
| 静态路由 static | 路径变化慢,通常人工配置 |
| 动态路由 dynamic | 根据网络拓扑和链路代价自动更新 |
按是否考虑负载
| 类型 | 说明 |
|---|---|
| 负载敏感 load-sensitive | 链路代价会随拥塞变化 |
| 负载不敏感 load-insensitive | 链路代价不显式反映当前拥塞 |
全局式路由算法 LS:链路状态算法
LS(Link State)算法的核心:每个节点掌握完整拓扑,然后独立运行 Dijkstra 算法计算最短路径。
LS 的工作过程
- 每个节点发现自己的邻居和链路代价。
- 通过链路状态广播,把本节点链路状态发给所有节点。
- 所有节点获得相同的网络拓扑信息。
- 每个节点以自己为源点运行 Dijkstra 算法。
- 得到最短路径树和转发表。
link state broadcast
链路状态广播使所有节点最终拥有相同 LSDB(Link-State Database)。
每个链路状态分组通常包含:
- 发送节点 ID。
- 邻居列表。
- 到邻居的链路代价。
- 序号。
- 老化时间。
序号和老化时间用于避免旧信息长期存在。
Dijkstra 算法详细介绍
符号
- :已经确定最短路径的节点集合。
- :从源节点到 的当前最小代价估计。
- :当前最短路径上 的前驱节点。
- :节点 到 的链路代价。
初始化
源节点为 :
N' = {u}
对每个节点 v:
若 v 与 u 相邻,则 D(v)=c(u,v), p(v)=u
否则 D(v)=∞
迭代步骤
重复:
- 在不属于 的节点中,选择 最小的节点 。
- 将 加入 。
- 对每个不在 中且与 相邻的节点 ,更新:
如果更新成功,则:
输出
最终 是源节点到各节点的最短路径代价, 可回溯出最短路径树。
做题步骤模板
- 画表:列出 、。
- 初始化源点邻居代价。
- 每轮选择当前 最小且未确定的节点。
- 用新加入节点松弛其邻居。
- 重复直到所有节点确定。
- 根据前驱节点写出路径和下一跳。
分散式路由算法 DV:距离向量算法
DV(Distance Vector)基于 Bellman-Ford 方程。
Bellman-Ford 方程
节点 到目的 的最短路径代价:
含义:
从 到 ,第一跳必须先到某个邻居 ,总代价等于 到 的代价加上 到 的最短代价。选择最小者。
DV 算法过程
每个节点维护:
- 自己到所有目的地的距离向量。
- 从每个邻居收到的距离向量。
- 到每个邻居的链路代价。
过程:
- 初始只知道到邻居的代价。
- 周期性或发生变化时,把自己的距离向量发给邻居。
- 收到邻居距离向量后,用 Bellman-Ford 方程更新自己的距离向量。
- 如果发生变化,再通知邻居。
- 最终收敛。
DV 做题模板
对于节点 ,要计算到目的 的新距离:
经邻居 A: c(x,A) + d_A(y)
经邻居 B: c(x,B) + d_B(y)
经邻居 C: c(x,C) + d_C(y)
取最小值
下一跳就是使表达式最小的邻居。
好消息传得快,坏消息传得慢
好消息传得快
如果某条链路代价降低或出现更短路径,邻居很快能用 Bellman-Ford 更新出更小值,并继续传播。
坏消息传得慢
如果某条链路代价升高或断开,节点可能错误地相信“邻居还有通往目的地的好路径”。
这会导致路由环路和 count-to-infinity(计数到无穷)问题。
例子
假设:
X -- Y -- Z
原来 Y 到 X 代价为 1,Z 通过 Y 到 X 代价为 2。
若 X-Y 断开,Y 可能听到 Z 说“我到 X 代价为 2”,于是 Y 误以为可以经 Z 到 X,更新为 3;Z 又经 Y 更新为 4,如此逐步增大。
Poisoned reverse 毒性逆转
基本思想
如果节点 到目的 的路径下一跳是 ,那么 在告诉 自己到 的距离时,故意说:
这样 就不会以为可以通过 到达 。
作用
- 可消除两个节点之间的简单路由环路。
- 缓解 count-to-infinity。
局限
毒性逆转不能完全解决三个及以上节点形成的复杂环路。
层次路由
互联网规模巨大,不可能让所有路由器运行一个全局路由算法。因此引入层次路由。
AS 自治系统
AS(Autonomous System)是由同一管理机构控制的一组路由器和网络。
层次路由结构
- AS 内部:使用 IGP,如 OSPF、RIP。
- AS 之间:使用 BGP。
优点
- 降低路由表规模。
- 隐藏 AS 内部拓扑。
- 支持自治管理和策略控制。
IGP 与 BGP
OSPF
OSPF(Open Shortest Path First)是内部网关协议 IGP,基于链路状态算法。
特点:
- 在单个 AS 内运行。
- 使用链路状态广播。
- 每个路由器维护 LSDB。
- 使用 Dijkstra 算法计算最短路径树。
- 支持层次化区域 area。
- 直接封装在 IP 中,协议号 89。
OSPF 中的典型概念:
| 概念 | 含义 |
|---|---|
| LSA | Link-State Advertisement,链路状态通告 |
| LSDB | Link-State Database,链路状态数据库 |
| Area | 区域,用于层次化和扩展性 |
| Backbone Area | 骨干区域,Area 0 |
OSPF vs DV
OSPF 不是距离向量协议,而是链路状态协议。它依赖全网拓扑数据库和 Dijkstra 算法。
RIP
RIP(Routing Information Protocol)是内部网关协议,基于距离向量算法。
特点:
- 使用跳数 hop count 作为路径代价。
- 最大有效跳数为 15,16 表示不可达。
- 周期性向邻居发送路由表。
- 使用 UDP 520。
- 简单,但收敛较慢,适合小规模网络。
RIP 的问题:
- count-to-infinity。
- 收敛慢。
- 度量单一,只看跳数,不看带宽/时延。
BGP
BGP(Border Gateway Protocol)是 AS 之间的路由协议,属于外部网关协议 EGP。
特点:
- 用于 AS 间路由。
- 使用 TCP 179 建立 BGP 会话。
- 不是简单最短路径协议,而是路径向量 path-vector 协议。
- 路由选择受策略影响。
- 通过 AS-PATH 防止环路。
BGP 通告的是网络前缀及其属性,例如:
- AS-PATH:到达该前缀经过的 AS 序列。
- NEXT-HOP:下一跳地址。
- LOCAL-PREF:本地偏好。
- MED:多出口鉴别器。
BGP 与 OSPF/RIP 比较
| 协议 | 类型 | 运行范围 | 算法/思想 | 典型用途 |
|---|---|---|---|---|
| RIP | IGP | AS 内 | 距离向量 | 小型网络 |
| OSPF | IGP | AS 内 | 链路状态 | 中大型企业/ISP 内部 |
| BGP | EGP | AS 间 | 路径向量 + 策略 | 全球互联网路由 |
链路层
链路层图解:差错检测、MAC、ARP、以太网

链路层提供的服务
链路层负责相邻节点之间的数据传输。
主要服务
| 服务 | 说明 |
|---|---|
| 成帧 framing | 把网络层数据报封装成帧 |
| 链路接入 link access | 在共享介质上决定谁可以发送 |
| 可靠交付 | 某些链路层协议提供本跳可靠传输,如 Wi-Fi |
| 差错检测 | 检测帧中比特错误,如 CRC |
| 差错纠正 | 某些协议可纠正错误 |
| 流量控制 | 防止相邻节点发送过快 |
| 半双工/全双工控制 | 协调发送和接收方式 |
链路层可靠性和 TCP 可靠性的区别
| 比较项 | 链路层可靠交付 | TCP 可靠交付 |
|---|---|---|
| 范围 | 相邻节点之间一跳 | 端到端进程之间 |
| 目的 | 处理单条链路错误 | 处理端到端丢包、乱序、错误 |
| 是否一定存在 | 不一定 | TCP 必须提供 |
| 典型场景 | 无线链路常用 | Internet 端到端通信 |
错误检验 Error detection
差错检测用于发现帧在传输过程中是否发生比特错误。
发送方发送:
数据 D + 差错检测比特 EDC
接收方根据收到的数据和 EDC 判断是否出错。
注意:差错检测不是 100% 保证。强检测算法能降低漏检概率。
Parity checking 奇偶检验
一维奇偶检验
增加 1 bit,使整个比特串中 1 的个数满足某种奇偶性。
- 偶校验:1 的个数为偶数。
- 奇校验:1 的个数为奇数。
例:数据 1011001 中有 4 个 1。
- 偶校验位为 0。
- 奇校验位为 1。
能检测什么错误
一维奇偶检验:
- 能检测奇数个比特错误。
- 不能检测偶数个比特错误。
二维奇偶检验
把数据排成矩阵,对每行、每列都加奇偶校验位。
优点:
- 可检测更多错误。
- 对单比特错误可以定位并纠正。
CRC 循环冗余检测
CRC(Cyclic Redundancy Check)把比特串看作 GF(2) 上的多项式,使用模 2 除法计算冗余位。
基本符号
- :待传输数据,比特串。
- :生成多项式,对应比特串。
- :CRC 冗余位长度,等于 的阶数,即 比特长度减 1。
- :CRC 冗余位。
发送方构造:
要求:
也就是发送出去的比特串能被生成多项式整除。
已知 D 和 G,计算 R
步骤:
- 设 长度为 ,因此冗余位长度为 。
- 在 后补 个 0,得到 。
- 用模 2 除法除以 。
- 得到余数 。
- 若余数不足 位,左侧补 0。
- 发送 。
模 2 除法规则
模 2 运算中:
- 加法等于异或 XOR。
- 减法也等于异或 XOR。
- 不考虑借位和进位。
1 - 1 = 0
1 - 0 = 1
0 - 1 = 1 这里不是普通减法,而是 XOR
0 - 0 = 0
CRC 例题模板
题目:,。
- 长度 4,所以 。
- 在 D 后补 3 个 0:
101110000
- 用
1001做模 2 除法,得到 3 位余数 。 - 发送比特串:
101110 + R
答题时要把除法过程写出来。若只问方法,写清“补 0、模 2 除、取余数、拼接发送”。
CRC 的检测能力
取决于生成多项式 G。合适的 G 可以检测:
- 所有单比特错误。
- 许多双比特错误。
- 所有长度小于等于 r 的突发错误。
- 绝大多数更长突发错误。
多路访问链路和协议 MAC
多路访问问题:多个节点共享同一个广播信道时,如何协调发送,避免或处理碰撞。
MAC 协议三大类
| 类型 | 思想 | 代表协议 |
|---|---|---|
| 信道划分协议 | 把信道资源切分给节点 | TDMA、FDMA、CDMA |
| 随机接入协议 | 节点随机发送,发生冲突后恢复 | ALOHA、CSMA、CSMA/CD、CSMA/CA |
| 轮流协议 | 节点按某种顺序轮流发送 | polling、token passing |
信道划分协议
TDMA
时间划分为帧,每帧划分为多个时隙。每个节点使用固定时隙。
优点:无碰撞。
缺点:节点无数据时,其时隙浪费。
FDMA
频带划分为多个频段,每个节点分配一个频段。
优点:无碰撞。
缺点:节点空闲时频段浪费。
CDMA
不同节点使用不同编码同时发送,接收方通过编码分离信号。
常见于无线通信场景。
ALOHA
纯 ALOHA
节点有数据就立即发送。
若发生碰撞,等待随机时间后重传。
最大效率约为:
时隙 ALOHA
时间划分为等长时隙,节点只能在时隙开始发送。
要求:
- 所有帧长度相同。
- 节点时钟同步。
最大效率约为:
时隙 ALOHA 比纯 ALOHA 效率高,因为碰撞危险区间减半。
CSMA
CSMA(Carrier Sense Multiple Access,载波侦听多路访问)思想:发送前先监听信道。
基本原则
- 信道空闲:发送。
- 信道忙:推迟发送。
为什么仍会碰撞
由于传播时延,一个节点可能还没听到另一个节点已经开始发送,于是误以为信道空闲并发送,导致碰撞。
传播时延对 CSMA 的影响
传播时延越大,节点越难及时感知其他节点发送,碰撞概率越高。
CSMA/CD
CSMA/CD(Carrier Sense Multiple Access with Collision Detection)在发送时继续监听信道,检测碰撞。
工作过程
- 监听信道。
- 若空闲,开始发送。
- 发送过程中继续检测碰撞。
- 若检测到碰撞,立即停止发送,并发送 jam signal。
- 执行指数退避,等待随机时间后重传。
二进制指数退避
第 次碰撞后,从以下集合随机选择 :
等待时间:
实际以太网中 通常有上限。
以太网最小帧长为什么是 64 字节
为了保证发送方在发送完帧之前能检测到最远端可能发生的碰撞。
若帧太短,发送方已经发送完成并认为成功,但碰撞信号还没传播回来。
因此传统共享式以太网规定最小帧长 64 字节。
现代交换式以太网
现代以太网大多使用交换机和全双工链路,不再共享总线,因此基本不需要 CSMA/CD。
但考试中仍常考 CSMA/CD 原理。
轮询协议
Polling
主节点依次询问每个从节点是否有数据要发送。
优点:
- 无碰撞。
- 可控制发送顺序。
缺点:
- 主节点故障会影响全网。
- 轮询开销和等待时延。
Token passing
令牌在节点之间传递,只有持有令牌的节点可以发送。
优点:
- 无碰撞。
- 公平性较好。
缺点:
- 令牌丢失或节点故障需要恢复机制。
- 低负载时令牌传递有额外开销。
局域网 LANs
ARP
ARP(Address Resolution Protocol)用于在同一局域网内将 IP 地址解析为 MAC 地址。
ARP 的作用
发送 IP 数据报时,主机需要知道下一跳接口的 MAC 地址。
- 若目的 IP 与自己在同一子网:解析目的主机 IP 的 MAC。
- 若目的 IP 不在同一子网:解析默认网关 IP 的 MAC。
ARP 工作过程
假设主机 A 想知道主机 B 的 MAC 地址。
- A 发送 ARP Request,目的 MAC 为广播地址:
ff:ff:ff:ff:ff:ff
- 同一局域网所有主机都收到请求。
- 只有 IP 地址匹配的 B 回复 ARP Reply。
- ARP Reply 通常单播给 A。
- A 将映射写入 ARP cache。
ARP 报文特点
- ARP 不使用 IP 数据报封装。
- ARP 直接封装在链路层帧中。
- ARP 不使用端口号。
- ARP 请求广播,ARP 响应单播。
ARP 易错点
如果目的主机不在同一子网,源主机不会 ARP 查询远程目的主机的 MAC,而是查询默认网关的 MAC。
以太网
以太网帧格式
Ethernet II 帧:
+-------------------+----------------+------------+-----------+-----+
| Destination MAC | Source MAC | Type | Data | FCS |
| 6 bytes | 6 bytes | 2 bytes | 46-1500 | 4 |
+-------------------+----------------+------------+-----------+-----+
说明:
- 目的 MAC:接收方网卡地址。
- 源 MAC:发送方网卡地址。
- Type:上层协议类型,如 IPv4、ARP、IPv6。
- Data:承载的网络层数据。
- FCS:帧检验序列,通常使用 CRC。
MAC 地址
MAC 地址通常为 48 bit,写作 6 个十六进制字节:
00:1A:2B:3C:4D:5E
特殊地址:
ff:ff:ff:ff:ff:ff
表示以太网广播地址。
以太网服务特点
- 无连接。
- 不可靠交付:接收方不发送链路层 ACK。
- 使用 CRC 检测错误,错误帧通常丢弃。
交换机 self-learning
以太网交换机通过学习源 MAC 地址建立交换表。
交换表项:
MAC 地址 -> 交换机端口 -> 时间戳
转发规则:
| 情况 | 行为 |
|---|---|
| 目的 MAC 在表中 | 转发到对应端口 |
| 目的 MAC 不在表中 | 泛洪到除入端口外所有端口 |
| 目的 MAC 就在入端口 | 丢弃,不转发 |
| 广播帧 | 泛洪 |
交换机 vs 路由器
| 比较项 | 交换机 | 路由器 |
|---|---|---|
| 层次 | 链路层 | 网络层 |
| 使用地址 | MAC 地址 | IP 地址 |
| 转发表依据 | MAC 转发表 | 路由表/转发表 |
| 分隔广播域 | 默认不分隔 | 分隔 |
| 典型功能 | 局域网内部转发 | 子网之间转发 |
高频综合表
常见协议默认端口号
| 协议 | TCP | UDP | 端口 |
|---|---|---|---|
| FTP data | 是 | 否 | 20 |
| FTP control | 是 | 否 | 21 |
| SSH | 是 | 否 | 22 |
| Telnet | 是 | 否 | 23 |
| SMTP | 是 | 否 | 25 |
| DNS | 是 | 是 | 53 |
| DHCP server | 否 | 是 | 67 |
| DHCP client | 否 | 是 | 68 |
| HTTP | 是 | 否 | 80 |
| POP3 | 是 | 否 | 110 |
| NTP | 否 | 是 | 123 |
| IMAP | 是 | 否 | 143 |
| SNMP | 否 | 是 | 161/162 |
| BGP | 是 | 否 | 179 |
| HTTPS | 是 | 否 | 443 |
| RIP | 否 | 是 | 520 |
| SMTP Submission | 是 | 否 | 587 |
| IMAPS | 是 | 否 | 993 |
| POP3S | 是 | 否 | 995 |
常见协议号、类型与地址
| 项目 | 值 | 说明 |
|---|---|---|
| ICMP over IPv4 | IP protocol 1 | ping/traceroute 相关 |
| TCP | IP protocol 6 | 可靠字节流 |
| UDP | IP protocol 17 | 无连接数据报 |
| OSPF | IP protocol 89 | 链路状态路由协议 |
| IPv4 EtherType | 0x0800 | 以太网帧 Type 字段 |
| ARP EtherType | 0x0806 | 以太网帧 Type 字段 |
| IPv6 EtherType | 0x86DD | 以太网帧 Type 字段 |
| Ethernet broadcast | ff:ff:ff:ff:ff:ff | MAC 广播地址 |
| IPv4 limited broadcast | 255.255.255.255 | 受限广播 |
| Loopback | 127.0.0.0/8 | 本机回环 |
常用公式
| 主题 | 公式 | 含义 |
|---|---|---|
| 传输时延 | L bit 分组推入 R bit/s 链路 | |
| 传播时延 | 距离 d,传播速度 s | |
| 节点总时延 | 四类时延之和 | |
| 交通强度 | 接近 1 时排队时延剧增 | |
| C/S 分发下界 | 文件分发 | |
| P2P 分发下界 | 文件分发 | |
| UDP/TCP checksum | 16 bit 反码和再取反 | 端回进位 |
| TCP 估计 RTT | α 常取 0.125 | |
| TCP 超时 | 自适应超时 | |
| 接收窗口 | TCP 流量控制 | |
| 实际发送窗口 | 拥塞+流量控制 | |
| 子网主机数 | 一般 IPv4 子网 | |
| 分片 offset | IP 片偏移单位 8 字节 | |
| CRC | 模 2 除法 | |
| Slotted ALOHA 最大效率 | 随机接入 | |
| Pure ALOHA 最大效率 | 随机接入 |
易错点集中整理
- DLS 应为 DSL。 DSL 是数字用户线。
- segment datagram 翻译: TCP 常说 segment(报文段),UDP 也常称 UDP segment 或 UDP datagram;IP 层称 datagram(数据报)。
- 传输时延不是传播时延。 对应传输时延, 对应传播时延。
- HTTP 无状态不等于网站不能登录。 登录状态由 Cookie/Session/Token 等在 HTTP 之上实现。
- FTP 是 out-of-band。 控制连接和数据连接分离。
- UDP socket 分解看目的 IP+目的端口。 不同源 IP/端口发来的 UDP 数据报可进入同一个 UDP socket。
- TCP socket 用四元组区分连接。 同一服务器端口可服务多个客户端连接。
- UDP checksum 只检测,不纠错。 UDP 不负责重传。
- SR 窗口不能超过序号空间一半。 否则新旧分组会混淆。
- MSS 不包括 TCP/IP 首部。 以太网 MTU 1500 下常见 MSS 1460。
- TCP 的 加在 cwnd,不是 ssthresh。 Reno 快速恢复:,。
- TCP 连接不等于网络层虚电路。 Internet 路由器不为 TCP 维护端到端连接状态。
- 最长前缀匹配选择最具体路由。 不是选择第一个匹配项。
- IPv4 分片 offset 单位是 8 字节。 最后一片数据长度可以不是 8 的倍数。
- IP 地址属于接口。 路由器多个接口通常在多个不同子网。
- 不是所有 172 地址都是私有地址。 私有范围是
172.16.0.0/12。 - DHCP 使用 UDP 67/68。 服务器 67,客户端 68。
- ICMP 没有端口号。 ICMP 直接封装在 IP 中。
- IPv6 基本首部固定 40 字节。 IPv6 路由器不分片。
- OSPF 是链路状态协议。 RIP 是距离向量协议;BGP 是路径向量协议。
- ARP 解析的是下一跳 MAC。 跨子网时 ARP 默认网关 MAC,不是远程主机 MAC。
- 现代交换式以太网通常不再使用 CSMA/CD。 但共享式以太网原理仍会考。
参考资料(用于核对标准细节)
- Kurose & Ross textbook official site: https://gaia.cs.umass.edu/kurose_ross/index.php
- IANA Service Name and Transport Protocol Port Number Registry: https://www.iana.org/assignments/service-names-port-numbers
- IANA IPv4 Special-Purpose Address Registry: https://www.iana.org/assignments/iana-ipv4-special-registry
- RFC 9110 HTTP Semantics: https://datatracker.ietf.org/doc/html/rfc9110
- RFC 9112 HTTP/1.1: https://datatracker.ietf.org/doc/html/rfc9112
- RFC 8446 TLS 1.3: https://datatracker.ietf.org/doc/html/rfc8446
- RFC 959 FTP: https://datatracker.ietf.org/doc/rfc959/
- RFC 5321 SMTP: https://datatracker.ietf.org/doc/html/rfc5321
- RFC 1939 POP3: https://datatracker.ietf.org/doc/html/rfc1939
- RFC 9051 IMAP4rev2: https://datatracker.ietf.org/doc/html/rfc9051
- RFC 1034 DNS Concepts and Facilities: https://www.rfc-editor.org/info/rfc1034/
- RFC 1035 DNS Implementation and Specification: https://datatracker.ietf.org/doc/html/rfc1035
- RFC 768 UDP: https://datatracker.ietf.org/doc/html/rfc768
- RFC 9293 TCP: https://datatracker.ietf.org/doc/html/rfc9293
- RFC 5681 TCP Congestion Control: https://datatracker.ietf.org/doc/html/rfc5681
- RFC 791 IPv4: https://datatracker.ietf.org/doc/html/rfc791
- RFC 1918 Private Address Space: https://www.rfc-editor.org/info/rfc1918/
- RFC 4632 CIDR: https://datatracker.ietf.org/doc/html/rfc4632
- RFC 2131 DHCP: https://datatracker.ietf.org/doc/html/rfc2131
- RFC 792 ICMP: https://datatracker.ietf.org/doc/html/rfc792
- RFC 8200 IPv6: https://datatracker.ietf.org/doc/html/rfc8200
- RFC 4787 NAT Behavioral Requirements for UDP: https://datatracker.ietf.org/doc/html/rfc4787
- RFC 2328 OSPFv2: https://datatracker.ietf.org/doc/html/rfc2328
- RFC 2453 RIPv2: https://datatracker.ietf.org/doc/html/rfc2453
- RFC 4271 BGP-4: https://www.rfc-editor.org/info/rfc4271/
- RFC 826 ARP: https://datatracker.ietf.org/doc/html/rfc826
评论