← 返回首页

408 · COMPUTER NETWORK · 谢希仁 完整版

计算机网络

五层之上,每一行字、每一张图,都在跑长跑。

28 节课,从五层模型起步:物理层编码、链路层 CRC 计算、IP 与子网划分、TCP 三次握手 + 滑动窗口 + 拥塞控制、DNS / HTTP 完整解析,每一项都给出算例和代码。

~25 分 5 层 28 节 大题:CRC / 子网 / TCP

// agenda

28 张卡片:一条 HTTP 请求的全旅程

体系 + 物理 + 链路

  1. OSI 与 TCP/IP 模型
  2. 物理层编码
  3. 物理层复用 + 介质
  4. 链路层成帧 + CRC
  5. 流量控制 + ARQ
  6. 介质访问控制
  7. 以太网帧 + MAC
  8. 交换机 + VLAN
  9. 无线 802.11

网络层 + 路由

  1. IP 数据报详细
  2. IP 地址分类
  3. 子网划分完整算例
  4. CIDR + 路由表查找
  5. NAT + IPv6
  6. 路由协议 RIP/OSPF/BGP
  7. ARP / ICMP / DHCP

传输 + 应用

  1. UDP 详细
  2. TCP 首部
  3. 三次/四次握手
  4. TCP 状态机
  5. 流量控制 / 滑动窗口
  6. 拥塞控制 4 算法
  7. DNS 解析
  8. HTTP / HTTPS
  9. 邮件 / FTP
  10. 整体回顾

01 · 体系结构

OSI 七层 vs TCP/IP 四层 vs 五层教学版

应用层 · 数据 Data
HTTP / DNS / SMTP / FTP
传输层 · 报文段 Segment
TCP / UDP
网络层 · 数据报 Packet
IP / ICMP / ARP
物理层 · 比特 Bit
电缆 / 光纤 / 无线

封装与解封

每下一层 → 加自己的 header;每上一层 → 剥掉。同层对等通信,实际数据沿栈"折跃"

同层对应设备

设备转发依据
物理中继器 / 集线器仅放大信号
链路网桥 / 交换机MAC 地址表
网络路由器IP 路由表
传输+网关 / 防火墙协议转换 / 端口

三个域

  • 冲突域:可能争用同一介质的范围;集线器扩大、交换机分隔
  • 广播域:广播帧能到的范围;交换机扩大、路由器分隔
  • VLAN:在交换机层逻辑划分广播域

02 · 物理层

把比特送上线路 + 4 种编码 + 2 个定理。

关键公式

  • 奈奎斯特:C = 2W log₂V(无噪声)
  • 香农:C = W log₂(1 + S/N)(有噪声)
  • S/N(dB) = 10 log₁₀(S/N)
  • 码元速率 (Baud) = 信号变化次数 / 秒
  • 比特率 (bps) = 码元 × log₂V

实例

带宽 3kHz、S/N = 30 dB(千倍):
香农容量 = 3000 × log₂(1001) ≈ 30 kbps

编码方式

NRZ 不归零: 高电平=1, 低电平=0 (需另发时钟同步) RZ 归零: 每位前半信号, 后半 0 (自带同步, 但占带宽多) 曼彻斯特: 高→低=0, 低→高=1 (自同步, 以太网用; 带宽×2) 差分曼彻斯特:每位起点跳变=0, 不跳=1 (抗干扰强) NRZI: 翻转=1, 不翻=0

基带 vs 频带

  • 基带:直接发送数字信号(短距、局域网)
  • 频带:用调制变成模拟(ASK/FSK/PSK/QAM)远距、电话线

02 · 多路复用

让一条物理通道承载多路逻辑信号。

4 种复用

类型原理
FDM 频分不同频段同时传调频广播、ADSL
TDM 时分不同时隙轮流电话、E1
WDM 波分光纤不同波长骨干光纤
CDM 码分正交码区分CDMA 移动通信

同步 vs 统计 TDM

同步 TDM:每个用户固定时隙,空闲也不分配 → 浪费。
统计 TDM:按需分配(信元 / 数据包)→ 高效,但需排队。

传输介质

介质带宽距离 / 用途
双绞线 UTP100 Mbps - 10 Gbps百 m / 局域网
同轴电缆类似CATV、早期以太
单模光纤40 Gbps+数十 km / 长距
多模光纤10 Gbps2 km / 短距
无线 Wi-Fi54 Mbps - 9 Gbps百 m / 室内
微波 / 卫星多种跨海 / 偏远

5e/6 类双绞线是局域网默认;单模光纤适合干线。

03 · 数据链路

成帧方式 + CRC 完整计算。

4 种成帧

  • 字符计数:首字段计长(一处错全乱)
  • 字符填充:FLAG 边界 + ESC 转义(PPP 用)
  • 零比特填充:连 5 个 1 后插 0(HDLC)
  • 违规编码:用物理层"非法"模式做边界

差错检测 CRC

M(x) · 2^r = Q(x) · G(x) + R(x)
发送 = (M · 2^r) XOR R
收方用 G(x) 除整帧,余数 = 0 → 无错

完整 CRC 计算示例

数据 M = 101001(6 位),G = 1101(r=3 位余数)

M · 2³ = 101001 000

   101001000 ÷ 1101 =
   1101
   ────
    11110
    1101
    ────
     0111
     0
     ────
      1110
      1101
      ────
       0110
       0
       ────
        1100
        1101
        ────
        0001  ← R = 001

发送 = 101001 001  (帧)
接收 = 101001 001 ÷ 1101 → 余数 0 → OK

CRC 只能检错,不能纠错。多项式越长检错能力越强。

03 · 可靠传输

停-等 · GBN · SR · 三种 ARQ 策略。

停-等 Stop-and-Wait

发一帧 → 等 ACK → 再发下一帧。超时则重传。简单但信道利用率低。

U = T_d / (T_d + RTT)

GBN 后退 N

  • 发送窗口 W ≤ 2^n − 1(n 位序号)
  • 接收窗口 = 1,按序到达才接受
  • 接收方丢失某帧 → 之后所有帧丢弃
  • 发送方超时 → 重传从该帧开始的所有未确认帧
  • 使用累积 ACK

SR 选择重传

  • 发送 / 接收窗口都 ≤ 2^(n-1)(序号空间一半)
  • 接收方对每帧单独确认 / 缓存
  • 发送方仅重传超时 / 被 NACK 的那一帧
  • 带宽利用最高

利用率公式

U = W·T_d / (T_d + RTT)
U ≤ 1 → W ≥ (T_d + RTT)/T_d
// 窗口够大才能填满"飞行中"

序号空间 vs 窗口

  • 停等:序号 1 位
  • GBN:W_T ≤ 2^n − 1
  • SR:W_T, W_R ≤ 2^(n-1)

03 · MAC

静态 vs 动态:怎么共享一根线。

分类

  • 静态划分:FDM、TDM、WDM、CDM
  • 动态-随机:ALOHA、CSMA、CSMA/CD、CSMA/CA
  • 动态-轮询:令牌环、令牌总线

ALOHA

纯 ALOHA:想发就发,冲突后随机退避。利用率最高 18.4%。
分槽 ALOHA:只在固定时隙发,利用率 36.8%。

CSMA

  • 1-坚持:监听到忙就一直等到空闲
  • 非坚持:忙则等随机时长再听
  • p-坚持:空闲时以概率 p 发

CSMA/CD 五步

  1. 先听后发:信道空闲才发
  2. 边发边听:检测冲突
  3. 检测到冲突 → 立刻发干扰信号 32-48 bit
  4. 等待二进制指数退避 r·51.2μs,r ∈ [0, 2^k − 1],k = min(尝试次数, 10)
  5. 16 次都冲突 → 放弃,报错

CSMA/CA(无线)

  • 无线半双工,无法边发边听 → 避免冲突
  • 发帧前等 DIFS + 随机退避
  • 接收方收到后等 SIFS 发 ACK
  • RTS / CTS 解决隐藏终端问题

04 · 局域网

以太网帧 + MAC 地址 + 最小帧规则。

以太网帧格式(DIX V2)

Preamble7B
SFD1B
DST6B
SRC6B
Type2B
Data46-1500B
FCS4B
  • 最小帧 = 64 B(不含前导码),用于检测冲突窗口
  • 最大帧 = 1518 B(数据 1500)
  • 少于 46 B 数据 → 填充
  • FCS 用 CRC-32

为什么 64 B?

10 Mbps 以太网:双向传播延迟 51.2μs → 512 bit = 64 B。
发送时间 ≥ 2×τ 才能"听到"冲突。

MAC 地址(48 bit)

0A:1B:2C:3D:4E:5F
└── 前 3 字节 OUI ── 厂商分配
    后 3 字节 ── 厂商内部唯一

最低字节最低 2 位:
  bit 0: 单播 0 / 多播 1
  bit 1: 全球 0 / 本地 1

特殊:
  FF:FF:FF:FF:FF:FF  广播
  01:00:5E:xx:xx:xx  多播
  IPv6 多播: 33:33:xx:xx:xx:xx

以太网速率

  • 10BASE-T:10 Mbps 双绞线
  • 100BASE-TX:100 Mbps
  • 1000BASE-T:千兆
  • 10GBASE-T:万兆

04 · 局域网设备

交换机的自学习 + VLAN 隔离。

交换机 vs 集线器

集线器交换机
层次物理链路
转发广播按 MAC 表精确
冲突域所有端口共一个每端口独立
广播域所有端口共一个所有端口共一个
带宽共享独享

交换机自学习

  1. 收到帧 → 记录"源 MAC → 该端口"到 MAC 表(含 TTL)
  2. 查目的 MAC → 表中有 → 仅向该端口转发
  3. 表中无 → 向除来源外所有端口泛洪
  4. 表项过期自动删除

VLAN 虚拟局域网

把一台物理交换机划分成多个逻辑广播域。同 VLAN 才能直接通信,跨 VLAN 必须经过三层设备(路由器或三层交换机)。

802.1Q VLAN Tag (4B)

DST | SRC | 802.1Q Tag | Type | Data | FCS

Tag (4B):
  TPID 16b = 0x8100   // 标识为 VLAN 帧
  PRI  3b              // 优先级 0-7
  CFI  1b
  VID  12b             // VLAN ID 0-4095

STP 生成树

交换机之间若有冗余链路会形成环,广播帧无限循环。STP 通过选根 / 阻塞冗余端口构造无环生成树。

04 · WLAN

隐藏终端 + RTS/CTS。

802.11 体系

  • 基础设施模式:站点通过 AP 通信
  • Ad-hoc 模式:站点直接通信
  • SSID = 网络名称
  • BSS = 基本服务集(一个 AP 覆盖)
  • ESS = 扩展服务集(多个 BSS)

隐藏终端问题

A、C 在 B 的覆盖内,但 A、C 之间被障碍隔开。A、C 同时发,都在 B 处冲突,自己却"听不见"对方 → CSMA 失效。

暴露终端:A 听到 B 在发,于是不发,但其实自己的目标方向是 D,本可同时进行。

RTS / CTS 解决

A 想发给 B: A → RTS → B B → CTS → 所有听见的(含 C) C 收到 CTS → 在 NAV 期间禁声 A 安心发数据 B 收完 → 发 ACK NAV 网络分配向量 = 虚拟载波监听

802.11 帧结构

含 4 个地址字段(源 / 目 / 发送 AP / 接收 AP)。
序号字段用于排重。

主要版本

a/b/g/n/ac/ax;速率从 11 Mbps → 9.6 Gbps(Wi-Fi 6)。

05 · 网络层

IPv4 首部 + 分片重组算例。

首部 20 ~ 60 字节

Ver4b
IHL4b
TOS8b
Total Length16b
Identifier16b
Flag3b
Frag Offset13b
TTL8b
Protocol8b
Header Checksum16b
Source IP 32b
Destination IP 32b
Options + Padding
  • IHL:首部长度,单位 4 字节
  • TTL:每经过一跳 -1;为 0 丢弃 + 发 ICMP
  • Proto:TCP=6 / UDP=17 / ICMP=1 / OSPF=89
  • Flag:DF 不分片 / MF 还有更多分片

分片完整例

原 IP 数据报:3800 B 数据 + 20 B 首部;途经 MTU = 1500 的链路。

最大数据 / 片 = (1500 − 20) = 1480 B
分片偏移单位 = 8 B → 1480/8 = 185

3800 → 三片:
  片1: 1480 B  offset=0   MF=1
  片2: 1480 B  offset=185 MF=1
  片3:  840 B  offset=370 MF=0

每片都有完整 20 B 首部
Identifier 相同; Total Length 各异

重组由目的主机完成,路由器不重组。
设置定时器:超时 → 丢弃整个数据报。

05 · IP 地址

A B C D 五类 + 特殊地址。

分类地址(旧)

首位网络号范围主机数
A08 位1-1262²⁴-2
B1016 位128-1912¹⁶-2
C11024 位192-2232⁸-2
D1110224-239多播
E1111240-247保留

主机数 −2:去掉网络号本身(全 0)和广播地址(全 1)。

特殊地址

地址含义
0.0.0.0本网络上的本主机(初始 DHCP)
0.0.0.0/0默认路由
255.255.255.255本网广播(路由器不转发)
net.255.255.255定向广播(指定网络的所有主机)
127.0.0.0/8本机环回
169.254/16APIPA 链路本地

私有地址(不路由到公网)

  • A 类:10.0.0.0/8
  • B 类:172.16.0.0/12
  • C 类:192.168.0.0/16

05 · 子网

借主机位做子网号。

步骤

  1. 确定子网数 N,借 ⌈log₂N⌉ 位
  2. 新掩码 = 旧掩码长度 + 借位
  3. 每子网主机数 = 2^(剩余主机位) − 2
  4. 第 i 个子网起点:网络号 | (i ≪ 主机位)

完整算例

原: 192.168.10.0/24 (C 类)
要划分 6 个子网

需借 ⌈log₂6⌉ = 3 位
新掩码: /27 = 255.255.255.224

每子网容主机 = 2⁵ − 2 = 30

子网 0: 192.168.10.0   范围 .0 – .31
        广播 .31, 可用 .1–.30
子网 1: 192.168.10.32  .32–.63
子网 2: 192.168.10.64
子网 3: 192.168.10.96
子网 4: 192.168.10.128
子网 5: 192.168.10.160
(可用 6 个, 实际划出 8 个)

VLSM 变长掩码

不同子网用不同长度掩码,按需分配。例:A 部门要 60 主机 → /26;B 部门要 30 → /27;C 部门要 14 → /28。

某 IP 的子网判定

IP 与掩码按位与 → 子网号。

IP    = 192.168.10.130
Mask  = 255.255.255.192  (/26)
AND   = 192.168.10.128   子网号

子网范围: .128 – .191
广播: .191
可用主机: .129 – .190
共 62 台

超网 / CIDR

把多个连续 C 类合并:192.168.0.0/22 = 4 个 C → 一条路由项。
路由聚合 → 减少路由表大小。

05 · 转发

最长前缀匹配。

路由表项

目的网络掩码下一跳
0.0.0.00.0.0.0R1 (默认)
192.168.0.0255.255.0.0R2
192.168.1.0255.255.255.0R3
192.168.1.128255.255.255.192R4

查找过程

收到 IP = 192.168.1.150:

  • 与 /16 与 → 192.168.0.0 ✓
  • 与 /24 与 → 192.168.1.0 ✓
  • 与 /26 与 → 192.168.1.128 ✓
  • 三项都匹配 → 取最长 /26 → R4

路由器转发流程

  1. 接收到数据报,验证 IP 首部校验和
  2. TTL -= 1;若为 0 → 丢弃 + 发 ICMP 超时
  3. 查路由表(最长前缀匹配)
  4. 用 ARP 获取下一跳 MAC
  5. 重新封装链路层帧
  6. 从出口转发

直连 / 远端

同子网的目的 → 直接 ARP 拿对方 MAC;不同子网 → ARP 拿网关 MAC,由网关转发。

默认路由

0.0.0.0/0 表示"匹配所有"。当无具体路由时使用。

05 · 地址扩展

从地址不够用到新的 128 位时代。

NAT 网络地址转换

出口路由器把"私网 IP + 端口"映射到"公网 IP + 不同端口",记录在 NAT 表中。

内: 192.168.1.5:5000 → 8.8.8.8:80 出: 公网IP:38001 → 8.8.8.8:80 NAT 表: 192.168.1.5:5000 ↔ 38001 192.168.1.6:4000 ↔ 38002 回包: 8.8.8.8:80 → 公网IP:38001 NAT 查表 → 改为 192.168.1.5:5000

优点:解决 IPv4 不够用;缺点:破坏端到端,P2P 难穿透。

IPv6 关键改进

  • 地址 32 → 128 位 → 2¹²⁸ 个地址
  • 固定 40 B 首部(去掉校验和、IHL)
  • 无需 NAT、无需分片(由源做"路径 MTU 发现")
  • 支持地址自动配置 SLAAC
  • 更好支持流标记 / QoS

IPv6 地址表示

2001:0DB8:0000:0000:0000:FF00:0042:8329
简化:
  连续 0 段用 :: 一次
  → 2001:DB8::FF00:42:8329

特殊:
  ::1 / 128       本机环回
  ::/0            默认路由
  FE80::/10       链路本地
  FF00::/8        多播
  2000::/3        全球单播

06 · 路由协议

RIP / OSPF / BGP — 内 / 外网关。

RIPOSPFBGP
算法距离向量链路状态路径向量
度量跳数 ≤ 15带宽 cost策略
范围小型内网大型 AS 内AS 之间
更新方式30s 全表有变化才发有变化才发
消息UDP 520IP 89TCP 179

RIP 局限

最大跳数 15 → 16 不可达。"计数到无穷"问题(环路时跳数无限增大)。
解决:水平分割、毒性反转、抑制定时器。

OSPF 工作流程

  1. HELLO 报文发现邻居
  2. 建立邻居关系,同步 LSDB(链路状态数据库)
  3. 每个路由器对 LSDB 用 Dijkstra 算最短路径树
  4. 用变更 LSA 增量更新

支持多区域划分(area 0 是骨干),减少 LSA 范围。

BGP 特点

  • 承载 AS_PATH(经过的 AS 序列)
  • 路由选择基于策略而非最短
  • 邻居关系建立在 TCP 之上
  • 分 iBGP(同 AS 内)和 eBGP(跨 AS)

06 · 网络层辅助

解析 · 报告 · 动态分配。

ARP 地址解析

解决"IP → MAC"映射。

  1. 广播 ARP Request(含目标 IP)
  2. 目标主机单播 ARP Reply(含 MAC)
  3. 双方更新 ARP 缓存

免费 ARP:广播自己的 IP/MAC,检测 IP 冲突。

RARP:反向 ARP,由 MAC 求 IP(早期无盘工作站)。

ICMP

报告错误 / 查询。

  • 差错:终点不可达、超时、参数错
  • 查询:回送请求 / 应答(ping)
  • traceroute = 故意发 TTL=1/2/3 → 收 ICMP 超时

不会发对:广播包、ICMP 差错本身、片偏移非 0 的片。

DHCP

动态分配 IP + 网关 + DNS。

  1. Discover(广播)
  2. Offer(服务器单播 / 广播)
  3. Request(客户确认)
  4. Ack(服务器确认)

基于 UDP;客户 68,服务器 67。
租约到期前 1/2 / 7/8 续约。

三者层次

ARP / ICMP 在网络层(ARP 帧的 Type=0x0806,ICMP 协议号 1);DHCP 在应用层(基于 UDP)。
易错:ARP 不是链路层。

07 · 传输层

明信片协议:尽力交付,简单高效。

UDP 首部(8 字节)

Source Port16b
Dest Port16b
Length16b
Checksum16b
  • Length:UDP 首部 + 数据总长
  • Checksum 覆盖伪首部 + 首部 + 数据
  • 无连接,无序,无重传,无流量 / 拥塞控制
  • 面向报文:应用一次写多大就发多大

UDP 伪首部

源 IP (4B) | 目的 IP (4B)
0 (1B) | 协议=17 (1B) | UDP 长度 (2B)
+ UDP 首部 + 数据

计算校验和时拼上, 发送时不实际传
作用: 检测 IP 是否传错收件人

用途

  • DNS(53 端口)
  • DHCP(67/68)
  • TFTP(69)
  • SNMP(161)
  • 视频会议 / 实时游戏
  • RIP(520)

复用 / 分用

复用:多进程共享一个 UDP/IP 出去;分用:靠 (协议, 端口) 派发到对应进程。

07 · TCP

挂号信协议:可靠、有序、字节流。

TCP 首部(最少 20B)

Source Port16b
Dest Port16b
Seq Number32b
Ack Number32b
HL4b
Rsv6b
Flags6b
U A P R S F
Window16b
Checksum16b
Urg Ptr16b
Options + Padding

关键字段

  • Seq:本段第一字节在数据流中的序号
  • Ack:期望收到对方下一字节的序号(累计 ACK)
  • Window:本端剩余可接收字节数 → 流量控制
  • Urg Ptr:紧急数据末尾的偏移(与 URG 标志一起用)

6 个标志位

意义
URG紧急数据上交
ACKAck Number 字段有效
PSH立即上交应用
RST异常 → 复位连接
SYN建立连接请求
FIN终止连接

08 · 连接

为什么三次?为什么四次?

三次握手

Client
SYN seq=x
Server
SYN_SENT
← SYN+ACK seq=y, ack=x+1
SYN_RCVD
ESTABLISHED
ACK seq=x+1, ack=y+1
ESTABLISHED

为什么三次?

  • 双方确认彼此发送 / 接收能力
  • 防止历史延迟的 SYN 报文导致服务端建立"假连接"浪费资源

SYN 攻击:发大量 SYN 不完成握手,耗光服务器资源。
解决:SYN Cookie。

四次挥手

主动方
FIN seq=u
被动方
FIN_WAIT_1
← ACK ack=u+1
CLOSE_WAIT
FIN_WAIT_2
← FIN seq=v
LAST_ACK
TIME_WAIT
ACK ack=v+1
CLOSED

为什么四次?TCP 全双工,每方关一个方向(自己发完 FIN)。中间被动方可能还有数据要传,所以 FIN/ACK 分两组。

TIME_WAIT 2MSL

  • 等待网络中残留报文消失,避免影响下一连接
  • 保证对端收到最后的 ACK(若丢失可重发)
  • MSL 通常 30s-2min

08 · 11 个状态

从 CLOSED 到 ESTABLISHED 到 CLOSED。

11 个状态

  • CLOSED:初始状态
  • LISTEN:服务器等待连接
  • SYN_SENT:客户已发 SYN,等待回应
  • SYN_RCVD:服务器已发 SYN+ACK
  • ESTABLISHED:连接已建立
  • FIN_WAIT_1:发出 FIN,等 ACK
  • FIN_WAIT_2:收到 ACK,等对方 FIN
  • CLOSE_WAIT:被动方收到 FIN
  • LAST_ACK:被动方发出 FIN,等最后 ACK
  • TIME_WAIT:主动方等 2MSL
  • CLOSING:双方同时关闭(少见)

典型转换路径

客户: CLOSED → SYN_SENT → ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED 服务器: CLOSED → LISTEN → SYN_RCVD → ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED

异常处理

  • RST:收到不属于任何连接的报文 / 异常 → 强行复位
  • 保活定时器:长时间无活动,发探测包;若多次无响应 → 断开
  • 持续定时器:rwnd=0 时探测对方是否更新窗口

netstat 看状态

`netstat -ant` 显示当前所有 TCP 连接状态;大量 TIME_WAIT 通常没问题,CLOSE_WAIT 多 → 应用层没正确 close()。

09 · 流量控制

滑动窗口 + 0 窗口探测。

原理

接收方在 ACK 中通告 rwnd(剩余空间),发送方维护"发送窗口 ≤ rwnd",发完就等 ACK。

发送窗口 (假设 W=4) [ack已确认] [发了未ack] [可发未发] [不允发] 随 ACK 到达, 窗口右移 若 rwnd 缩小, 窗口收缩

0 窗口死锁

接收方通告 rwnd=0 后,再恢复时若那个 ACK 丢失 → 双方僵持。
解决:持续计时器,发送方每隔一段时间发 1 字节探测包,强制接收方重新通告 rwnd。

糊涂窗口综合症

问题:接收方刚腾出一点空间就通告小 rwnd → 发送方发小包 → 效率低。

解决:

  • 接收方:等 rwnd ≥ MSS 或缓冲半空再通告
  • 发送方:Nagle 算法 —— 攒够 MSS 或收到对方 ACK 再发

实际窗口

发送窗口 swnd = min(cwnd, rwnd)
// 流量 vs 拥塞,取小者

流量控制保护接收方不被淹没;拥塞控制保护网络不被淹没。

09 · 拥塞

慢开始 · 拥塞避免 · 快重传 · 快恢复。

4 个算法配合

  1. 慢开始:cwnd = 1,每 RTT 翻倍(指数增)
  2. cwnd ≥ ssthresh → 进入拥塞避免:每 RTT +1(线性增)
  3. 超时丢包 → ssthresh = cwnd / 2,cwnd = 1,回到慢开始
  4. 收到 3 个重复 ACK → 快重传立即重发丢失段
  5. 同时 快恢复:ssthresh = cwnd / 2,cwnd = ssthresh,进入拥塞避免(不退到 1)

关键设定

  • 初始 ssthresh:通常 16 或 64 KB
  • cwnd 单位 = MSS
  • 超时 RTO = RTT + 4 × DevRTT(Karn 算法估计)

cwnd 曲线

cwnd │ ●超时 │ /│ │ ●●●● / ↓ │ ●● ●●●●/ cwnd=1 │ ●● 快重传 + 快恢复 │ ssth ─── ┐ │ ●● │ ssth=cwnd/2 │ ●● │ │ ●● │ │ ●● │ │ ●● 初始 ssthresh │● 慢开始 (×2) 0 ────────────────→ RTT

TCP Reno vs Tahoe

  • Tahoe:任何丢失(超时或快重传)都回到 cwnd=1
  • Reno:快重传 → 快恢复(cwnd=ssth),仅超时回 1
  • Cubic(Linux 默认):用三次函数缓慢增窗
  • BBR(Google):基于带宽时延,不再以丢包为信号

10 · 应用层

从域名到 IP,递归 + 迭代两次。

层次结构

. (根)
├── com
│   ├── google
│   │   ├── www
│   │   └── mail
│   └── microsoft
├── cn
│   └── edu
│       └── tsinghua
└── org

完整域名 www.google.com.
从右到左由大到小

常用记录类型

  • A:域名 → IPv4
  • AAAA:域名 → IPv6
  • CNAME:别名
  • MX:邮件交换器
  • NS:权威 DNS 服务器
  • PTR:反向解析(IP → 域名)

解析过程

用户 → 本地 DNS (递归)
       本地 DNS → 根 DNS (迭代)
       根 → 返回 .com 服务器
       本地 DNS → .com 服务器
       → 返回 google.com 权威 NS
       本地 DNS → google.com 权威
       → 返回 IP

返回过程沿原路返回, 缓存逐级

递归 vs 迭代

  • 递归:服务器替客户问到底再返回
  • 迭代:服务器只告诉你下一步该问谁
  • 常见:用户 → 本地 DNS 用递归;本地 DNS → 上层用迭代

DNS 协议

UDP 53 端口;查询包小于 512 B 时用 UDP,否则用 TCP(区域传送也走 TCP)。
DNS 缓存有 TTL,过期才重新查询。

10 · HTTP

请求 / 响应 + 状态码 + 版本演进。

HTTP 报文

// 请求
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: SESSID=abc123
<空行>

// 响应
HTTP/1.1 200 OK
Date: Mon, 23 May 2026 ...
Server: nginx
Content-Type: text/html
Content-Length: 1234
<空行>
<!DOCTYPE html>...

8 种方法

  • GET / POST / PUT / DELETE
  • HEAD(只要响应头)
  • OPTIONS(询问支持的方法)
  • PATCH(局部更新)
  • TRACE / CONNECT

状态码 5 大类

含义
1xx信息100 Continue
2xx成功200 OK, 201 Created, 204 No Content
3xx重定向301 永久, 302 临时, 304 Not Modified
4xx客户错400 Bad, 401 未授权, 403 禁止, 404 NotFound
5xx服务器错500 内部错, 502 网关, 503 不可用

HTTP 版本

  • 1.0:非持久连接(每请求一连接)
  • 1.1:持久连接 + 流水线(pipelining)
  • 2.0:二进制分帧 + 多路复用 + 头压缩
  • 3.0:基于 QUIC(UDP),0-RTT

HTTPS

HTTP + TLS(443 端口)。TLS 握手协商对称密钥,后续数据加密 + 完整性 + 服务器身份认证。

10 · 其他应用

邮件 4 协议 + FTP 双通道。

邮件协议

协议端口方向 / 用途
SMTP25 / 587发送(推送到邮件服务器)
POP3110下载到本地后默认从服务器删除
IMAP143服务器留存 + 多设备同步
MIME对邮件内容的扩展(附件 / 多语言)

邮件流向

发件方
  → SMTP → 发件方 ISP 邮件服务器
  → SMTP → 收件方 ISP 邮件服务器
  ← POP3/IMAP ← 收件方读取

FTP 双通道

  • 控制连接 21:命令 / 响应,整个会话期间保持
  • 数据连接 20(PORT 主动)或客户随机口(PASV 被动)
  • 主动 PORT:服务器主动连客户 → 易被防火墙挡
  • 被动 PASV:客户主动连服务器,更友好

FTP 命令

USER username
PASS password
LIST  (目录列表)
RETR file (下载)
STOR file (上传)
QUIT

一次完整网页访问

  1. DNS:域名 → IP
  2. TCP 三次握手
  3. HTTP GET → 收 HTML
  4. 解析 HTML → 加载 CSS / JS / 图片
  5. TCP 四次挥手

// summary

五层一图收尾。

每层在干什么

应用进程交互;HTTP/DNS/SMTP/FTP;端口
传输端到端可靠;TCP/UDP;流量+拥塞
网络主机到主机路由;IP/ICMP/ARP
链路相邻节点;以太网/MAC;CRC
物理比特;编码/复用

三大易丢分点

  1. OSI 与设备对应(路由器 ≠ 网桥)
  2. 子网掩码 / 最长前缀匹配
  3. TCP Seq、Ack 具体数值

三大必备公式

奈奎斯特: C = 2W log₂V
香农: C = W log₂(1+S/N)
停-等: U = T_d / (T_d + RTT)

10 道高频大题

  • CRC 余数 / 帧封装
  • 子网划分 + 路由表
  • TCP 三次/四次握手 Seq
  • cwnd 模拟变化
  • DNS 解析过程