网络协议全书 net.wujun.org
分层封装图协议图谱← 主目录
Computer Networking · Complete Field Guide

计算机网络
协议全书

从物理层的比特流到应用层的报文,再到内核中的实现——十四章完整覆盖计算机网络核心知识,并融入《TCP/IP 详解》卷一(协议)与卷二(实现)的经典细节。

14 章 · 六大部分 3 个 交互工具(子网计算器 / 报文结构图 / 握手动画) 20 题 自测题库
01

网络基础概念

LEVEL 1 · 入门

计算机网络 = 多台自治计算机通过链路与节点设备互连、按协议交换信息的系统。本章建立全局视角:网络由什么组成、数据以什么方式交换、用什么指标衡量快慢。

1.1组成、分类与拓扑

从功能上看:边缘部分 + 核心部分

  • 边缘部分:所有连接在网络上的主机(端系统),用户直接使用。通信方式两类:C/S 客户-服务器(浏览器 ↔ 网站,服务器需一直在线、有固定地址)与 P2P 对等(每台主机既是客户又是服务器,如 BT 下载,节点越多越快)。
  • 核心部分:大量路由器与链路,负责为边缘主机提供连通性与转发——核心技术是分组交换

按覆盖范围分类

类型范围典型例子
PAN 个域网约 10 m蓝牙、智能手表连手机
LAN 局域网约 1 km家庭 Wi-Fi、校园网、办公室网络
MAN 城域网5–50 km城市宽带骨干
WAN 广域网几十–几千 km互联网骨干、跨运营商链路

拓扑结构

拓扑特点优缺点
星型所有节点连到中心设备(交换机)主流。单点故障影响大(中心坏则全瘫),但布线简单、易排障
总线型所有节点共享一条总线早期以太网。省线,但冲突多、一处断全断
环型节点首尾相连成环(令牌环)延迟可预期,单点故障影响全网
网状节点间多路径互连可靠性最高(互联网骨干采用),成本高

1.2电路交换 / 报文交换 / 分组交换

「交换」解决的核心问题:不可能让所有主机两两直连,数据必须经过中间节点转发。三种方式:

电路交换报文交换分组交换
方式先建立专用物理通路 → 通信 → 释放整个报文存储转发报文切为带首部的分组,逐跳存储转发
资源占用独占线路(通话期间他人不能用)共享,统计复用共享,统计复用
时延建立慢、通信时极小且恒定大(整报文缓存)小(分组流水线转发)
可靠性/灵活线路故障则断可绕路单个分组故障只重传该分组,可动态选路
典型应用传统电话网早期电报(已淘汰)互联网
为什么互联网选分组交换 计算机数据是突发式的(刷一下网页、停很久)。电路交换独占线路太浪费;分组交换把线路按「需」分配给各个分组,线路利用率高,且无需先建连、健壮性好。代价:每个分组要带首部开销,节点存储转发引入排队时延与丢包。

1.3性能指标与时延公式(考试计算重点)

  • 速率:数据的传送速率,单位 bit/s(bps)。注意换算:1 kb/s = 10³ b/s,而存储单位 1 KB = 2¹⁰ 字节——速率用 10 进制,存储用 2 进制
  • 带宽:两种含义——模拟信道指频带宽度(Hz);数字信道指最高速率(bit/s),即"标称速率"。
  • 吞吐量:实际测得的每秒通过的数据量,受瓶颈链路限制。
  • RTT 往返时延:从发送到收到确认的时间,是 ping 测出的值。
  • 时延带宽积 = 传播时延 × 带宽,表示"链路上最多能容纳多少个比特"。
总时延 = 四种时延之和 发送时延 = 帧长(bit) ÷ 发送速率(bit/s) (把帧推上线路所需的时间)
传播时延 = 信道长度(m) ÷ 电磁波速率(m/s) (光纤/铜线中约 2×10⁸ m/s)
处理时延 = 节点检查首部、查路由表、差错检验的时间
排队时延 = 在路由器队列中等待转发的时间(拥塞时剧增)
经典例题 发送 1000 字节的数据到 100 Mb/s 的链路:发送时延 = 8000 bit ÷ 10⁸ bit/s = 80 μs。若距离 1000 km,传播时延 = 10⁶ m ÷ 2×10⁸ m/s = 5 ms谁占主导取决于数据量与距离——"高速链路"提高的是发送速率,对传播时延无能为力(光速不变)。
02

分层体系结构

LEVEL 1 · 入门

分层是计算机网络最重要的设计思想:每层只通过接口使用下层服务、为上层提供服务,层与层之间解耦——某一层技术换代不影响其他层。

2.1协议三要素与相关概念

协议:对等层之间通信规则的集合,由三要素组成:

  • 语法:数据与控制信息的格式(报文长什么样,字段怎么排)。
  • 语义:各字段的含义、需要做什么动作(SYN 表示请求建连)。
  • 同步(时序):事件顺序的约定(先握手、再传数据、后挥手)。

辨析:协议是"水平"的(两台机器同一层之间的约定);服务是"垂直"的(下层通过接口为上层提供能力);接口(SAP 服务访问点)是相邻两层交换信息的地方,如传输层的 SAP 就是端口。

2.2OSI 七层模型详解

7
应用层Application · 报文
为应用进程提供网络服务:HTTP、DNS、FTP、SMTP、SSH
6
表示层Presentation
数据格式转换、加解密、压缩(JPEG、TLS 常被归于此)
5
会话层Session
建立、管理、终止会话;断点续传(校验点)
4
传输层Transport · 报文段
端到端通信、复用分用、可靠传输、流量/拥塞控制:TCP、UDP
3
网络层Network · 数据报
路由选择(跨网络找路)、拥塞控制、异构网互连:IP、ICMP、OSPF
2
数据链路层Data Link · 帧
封装成帧、差错检测、相邻节点间可靠传输:以太网、PPP、ARP、VLAN
1
物理层Physical · 比特
在媒体上传输比特流:电压电平、接口引脚、速率——"怎样表示 0 和 1"
记忆口诀 自下而上:物 链 网 传 会 表 应("物联网传会表应")。实际互联网用的是 TCP/IP 四层:网络接口层(1+2)→ 网络层(3)→ 传输层(4)→ 应用层(5+6+7);教材常用折中的五层模型(把 5/6/7 合并为应用层)。

2.3封装 / 解封装 与各层网络设备

发送方自顶向下逐层加首部(链路层还加尾部),接收方自底向上逐层剥离。每层的数据单位(PDU)名称不同:

应用层
应用数据 —— 报文 Message(如一段 HTTP 请求)
传输层
TCP/UDP 首部+数据 = 报文段 Segment(端口号、序号)
网络层
IP 首部+报文段 = 数据报 Datagram(源/目的 IP)
链路层
帧首部+数据报 = 帧 Frame(源/目的 MAC)
FCS 校验
▼ 物理层:比特流 bit ▼

各层设备辨析(高频考点)

设备工作层冲突域 / 广播域说明
中继器 / 集线器 Hub物理层不隔离冲突域,不隔离广播域只放大再生信号;Hub 所有端口共享带宽,半双工
网桥 / 交换机 Switch链路层隔离冲突域,不隔离广播域按 MAC 地址表转发,每端口独占带宽,全双工
路由器 Router网络层隔离冲突域 + 隔离广播域按 IP 查路由表转发,连接不同网段
网关 Gateway传输层及以上协议转换(如 HTTP ↔ 内部协议);日常说的"默认网关"其实是路由器
一句话记忆 交换机分隔冲突域,路由器分隔广播域。VLAN 也可在二层分隔广播域。
03

物理层

LEVEL 2 · 入门

物理层只关心一件事:怎样在传输媒体上传送比特流。它定义接口的机械、电气、功能、规程特性——电压多高算 1、用什么接头、速率多少。

3.1传输媒体(导引型与非导引型)

媒体特点典型应用
双绞线两根绝缘铜线绞合抗干扰,便宜易布线;屏蔽(STP)/非屏蔽(UTP);常见 Cat5e/Cat6以太网布线(RJ45),百米级
同轴电缆屏蔽好、带宽较高,已逐渐被双绞线/光纤取代有线电视 HFC
光纤带宽极高、损耗低、抗电磁干扰骨干网、FTTH 入户
├ 多模光纤多条光线以不同角度反射前进,会展宽失真短距离(楼内、机房)
└ 单模光纤光线直线传播不失真,更贵长距离骨干
无线(非导引型)无线电波/微波/红外;微波需视距,卫星时延大Wi-Fi、4G/5G、卫星
常识考点 千兆网线 8 芯全用;百兆只用 4 芯。直通线连不同类型设备(电脑↔交换机),交叉线连同类型设备(电脑↔电脑)——现代网卡支持 Auto-MDIX 自动翻转,已无需区分。

3.2编码与调制

  • 编码(基带信号,数字→数字):不归零制(高电平 1 低电平 0,但无法自同步);曼彻斯特编码——每位中间都有一次跳变,跳变沿自带时钟(以太网曾用),缺点:占两倍带宽;差分曼彻斯特——看位开始处有无跳变,抗干扰更强。
  • 调制(带通信号,数字→模拟):调幅 AM(幅度承载信息)、调频 FM、调相 PM;正交振幅调制 QAM 同时调幅+调相,一个码元可携带多比特(如 16-QAM = 每码元 4 bit),Wi-Fi 与 5G 的核心。

3.3奈氏准则与香农公式(计算必考)

奈氏准则 —— 理想无噪声信道 极限码元速率 = 2W 波特(W = 带宽,单位 Hz)
极限数据率 = 2W · log₂V (V = 每个码元的离散电平数)
→ 无噪声时想提速,只能增加电平数 V
香农公式 —— 有噪声信道 极限数据率 = W · log₂(1 + S/N)
S/N = 信噪比;若以分贝给出:dB = 10·log₁₀(S/N),须先换算回比值
→ 噪声存在时,V 再大也白搭,信噪比与带宽决定上限;实际速率取两公式较小者
经典例题 带宽 3 kHz、信噪比 30 dB 的电话信道:30 dB → S/N = 10³ = 1000;香农极限 = 3000 × log₂(1001) ≈ 3000 × 10 ≈ 30 kb/s

3.4信道复用:一条干线多人共用

复用方式原理应用
FDM 频分不同用户占不同频段,同时发送广播电台、有线电视
TDM 时分轮流占用整个信道,每人一个固定时隙传统电话骨干;缺点:时隙空闲也浪费
STDM 统计时分按需动态分配时隙(分组交换本质)提高利用率
WDM 波分光的频分复用:一根光纤跑多种波长光纤骨干(DWDM 可达几十上百路)
CDM/CDMA 码分每人一个正交码片序列,同时同频发送,靠码型区分3G 移动通信、GPS
CDMA 计算题套路 收到叠加序列 S,要判断站 A 发了什么:计算 S·A ÷ m(m=码片长度)的内积规格化结果:+1 发了 1,−1 发了 0,0 没发。前提:各站码片两两正交(内积为 0)。
04

数据链路层

LEVEL 3 · 进阶

链路层负责「相邻节点」之间的一跳:把 IP 数据报封装成帧、检测差错、协调共享信道的访问。以太网与 Wi-Fi 都活在这一层。

4.1三个基本问题:封装成帧 · 透明传输 · 差错检测

  • 封装成帧:在 IP 数据报前后加首部与尾部(帧定界 + 地址 + 校验),接收方据此从比特流中切出完整的帧。帧长上限即 MTU(以太网 1500 字节)
  • 透明传输:数据里若恰好出现与定界符相同的字节怎么办?字节填充:在其前面插入转义字符 ESC;比特填充(HDLC):连续 5 个 1 后强制插 0。对上层"透明"= 数据随便传,不会误判帧边界。
  • 差错检测:比特在传输中会出错(误码率)。链路层用 CRC 循环冗余检验:收发双方约定生成多项式 G(x),发送方在数据后补 n 个 0 做模 2 除法,余数(FCS)附在帧尾;接收方整帧再除一次,余数为 0 则收下,否则丢弃。
CRC 计算套路 数据 101001、生成多项式 x³+x²+1 → 除数 1101(4 位,n=3)。数据后补 3 个 0 → 101001000,对 1101 做模 2 除法(异或、不借位),余数 001 即 FCS,发送 101001001。接收方整帧除以 1101,余 0 则无错。注意:CRC 只检错不纠错,出错的帧直接丢弃,可靠传输由上层负责。

4.2PPP 点对点协议

拨号与广域网点对点链路上最常用的链路层协议。三部分组成:封装方法(帧定界 0x7E)、LCP 链路控制协议(建立/配置/测试链路)、NCP 网络控制协议族(为不同网络层协议协商参数,如 IPCP 分配 IP)。特点:简单、只检错不纠错、无序号无流量控制、支持身份认证(PAP/CHAP)。异步链路用字节填充,同步链路用零比特填充。

4.3CSMA/CD 与以太网

早期以太网所有主机共享一条总线,同时发会冲突。CSMA/CD 载波监听多点接入/碰撞检测

先听后发(载波监听)

信道忙就持续等待,空闲才发送。

边发边听(碰撞检测)

发送中持续监测电压,发现叠加异常即知冲突。

冲突停止 + 退避重发

立即停止并发送干扰信号强化冲突,然后按二进制指数退避:第 k 次冲突从 {0..2ᵏ−1}(k 上限 10)随机取 r,等待 r × 争用期后重发,16 次失败则放弃上报。

必考数字 争用期(碰撞窗口)= 端到端往返时延 ,10 Mb/s 以太网规定为 51.2 μs → 最小帧长 64 字节(512 bit)。发送时间不足争用期的帧,发生冲突时发送方已发完、无法察觉,故必须保证帧长下限;无效冲突残片也因 < 64B 被识别丢弃。交换式全双工以太网不再需要 CSMA/CD。

以太网帧结构(点击字段查看详解)

MAC 地址:48 bit,固化在网卡 ROM,前 24 位是 IEEE 分配的厂商标识 OUI。单播(最低位 0)/ 组播(最低位 1)/ 广播(全 F)。MAC 只标识"下一跳":帧每经过一台路由器,源/目的 MAC 都会被重写。

4.4交换机与 VLAN

交换机如何工作:自学习 + 转发

  • 自学习:收到帧时,把「源 MAC → 入端口」记入交换表(带老化时间)。
  • 转发:查目的 MAC——表中查到就只从对应端口转发;查不到或广播帧则泛洪(除入端口外全部发送);目的就在入端口则丢弃。
  • 对比集线器 Hub:Hub 是纯物理层设备,收到什么都往所有端口复制,共享带宽、同一冲突域;交换机每端口独立冲突域、全双工、独占带宽。

VLAN 虚拟局域网

一台物理交换机上按端口/MAC/协议划分多个逻辑广播域:不同 VLAN 之间二层隔离(广播不互通),互访必须经路由器/三层交换机。干道链路用 802.1Q 标签(在帧中插入 4 字节 Tag,含 12 bit VLAN ID,最多 4094 个)。用途:按部门隔离广播、提升安全、灵活调整而无需重新布线。

4.5ARP:把 IP 翻译成 MAC

IP 数据报最终要装进以太网帧,需要下一跳的 MAC 地址——ARP 负责解析:

查 ARP 缓存

主机先查本机 ARP 表(arp -a 可见,条目有生存期)。

广播询问

未命中则广播 ARP 请求:「谁是 192.168.1.1?请告诉 192.168.1.10」(帧目的 MAC 为全 F)。

单播应答

目标主机收到后单播回复自己的 MAC;双方都写入缓存。

关键点 ① ARP 只能用于同一网段:目的 IP 不在本网时,主机 ARP 解析的是默认网关的 MAC,帧交给网关转发。② ARP 请求是广播、应答是单播。③ 免费 ARP:主机开机主动广播询问自己的 IP,用于检测 IP 冲突和刷新他人缓存。④ ARP 无认证 → 可被伪造应答实施 ARP 欺骗(见第 12 章)。
05

IP 编址与子网划分

LEVEL 3 · 进阶

IPv4 地址 = 32 bit =「网络号 + 主机号」二级结构;子网划分后变成「网络号 + 子网号 + 主机号」三级;CIDR 则彻底取消类别,用任意长度前缀——这是网络层的地基,也是计算题的重灾区。

5.1IPv4 地址与分类编址

点分十进制 192.168.1.10 的机器形态是 11000000 10101000 00000001 00001010。分类编址按首字节区分(自环 127 不占 A 类):

类别首字节网络号/主机号网络数 × 主机数用途
A1–1268 / 24 位126 × 约 1677 万超大型网络
B128–19116 / 16 位16384 × 65534中型网络
C192–22324 / 8 位约 200 万 × 254小型网络
D224–239组播
E240–255保留实验
记忆技巧 看二进制最高位判类:A 类 0 开头、B 类 10、C 类 110、D 类 1110、E 类 1111。主机数减 2:全 0 = 网络地址(代表本网络),全 1 = 直接广播地址。

5.2子网划分:向主机位"借位"

一个 C 类网 254 台主机对一个 50 人的部门太浪费。办法:从主机位借若干位作子网号,用子网掩码(连续 1 = 网络+子网位,连续 0 = 主机位)标识边界。对外仍表现为一个网络,对内细分为多个子网。

核心公式 网络地址 = IP AND 掩码 | 广播地址 = 网络地址 + 主机位全 1
子网数 = 2借位数 | 每子网可用主机 = 2剩余主机位 − 2
块大小 = 256 − 掩码变化段(子网地址按块大小递增)

例题:192.168.1.0/24 均分 4 个子网 → 借 2 位 → /26,掩码 255.255.255.192,块大小 64:

子网网络地址可用主机范围广播地址可用主机
#1192.168.1.0/26.1 – .62.6362
#2192.168.1.64/26.65 – .126.12762
#3192.168.1.128/26.129 – .190.19162
#4192.168.1.192/26.193 – .254.25562

VLSM 变长子网:不同部门主机数不同时按需分配——先满足最大需求。例如 100 台(/25)、50 台(/26)、10 台(/28)、2 台点对点(/30),从大到小依次切,避免浪费。

5.3CIDR 与路由聚合

CIDR 无类别域间路由:取消 A/B/C 类,地址写成 IP/前缀长度,前缀任意长。两大意义:

  • 分配更细:想要 500 个地址就给 /23,不再被迫领一整个 B 类。
  • 路由聚合(构成超网):多个连续小网合成一条大前缀路由,大幅压缩路由表。判断能否聚合:取各网络地址的最长公共前缀
聚合例题 聚合 192.24.8.0/24、192.24.9.0/24 … 192.24.15.0/24:第三段 8–15 的二进制都是 00001xxx,公共前缀到第三段前 5 位 → 8+8+5 = /21,聚合为 192.24.8.0/21(8 个 /24 合一条)。
转发规则 · 最长前缀匹配 路由表中多条路由都匹配目的 IP 时,选前缀最长(最具体)的那条。例如同时命中 0.0.0.0/0(默认路由)与 192.168.0.0/16,走后者。

5.4特殊地址速查

地址段名称说明
10.0.0.0/8 · 172.16.0.0/12 · 192.168.0.0/16私有地址RFC 1918,仅内网使用,公网路由器不转发;上网靠 NAT(见 6.3)
127.0.0.0/8环回地址localhost,数据不离开本机,测试协议栈用
169.254.0.0/16链路本地 / APIPADHCP 失败时自动配置,出现它 = 没拿到地址
0.0.0.0未指定地址可作源地址(DHCP Discover 时);路由表中 0.0.0.0/0 = 默认路由
255.255.255.255受限广播本网段广播,路由器一律不转发
主机位全 1直接广播如 192.168.1.255/24,向该网段所有主机广播
224.0.0.0/4组播一对多:224.0.0.1 全网段主机、224.0.0.2 全路由器、224.0.0.5/6 OSPF

5.5IPv6:128 位的下一代编址

IPv4 地址约 43 亿个,2011 年 IANA 已分完。IPv6 地址 128 bit,写作 8 组 4 位十六进制,规则:每组可省前导零;连续的全零组可用一次 :: 压缩。例:2001:0db8:0000:0000:0000:ff00:0042:83292001:db8::ff00:42:8329

对比项IPv4IPv6
地址长度32 bit128 bit(≈3.4×10³⁸ 个)
首部20–60 B 变长,含校验和、分片字段固定 40 B,取消校验和,分片移入扩展首部
广播有(受限/直接广播)取消,用组播替代
地址类型单播 / 广播 / 组播单播 / 组播 / 任播(送到最近的一个)
地址配置手工 / DHCP支持无状态自动配置 SLAAC(无需 DHCP)
链路本地地址169.254/16(兜底)fe80::/10(每接口必备)

过渡技术

  • 双协议栈:设备同时跑 v4 和 v6,按目的地址选择。
  • 隧道:把 IPv6 数据报整个塞进 IPv4 数据部分,穿过 v4 网络(如 6to4)。
  • NAT64 / 协议转换:首部翻译,让 v6 主机访问 v4 服务。

5.6动手算:子网计算器

SUBNET CALCULATOR · IPv4
⚠ 请输入合法的 IPv4 地址(每段 0–255)
06

网络层协议

LEVEL 4 · 进阶

网络层的任务是把数据报从源主机跨网络送到目的主机。IP 提供尽力而为的转发,ICMP 负责通报差错,NAT 缓解地址枯竭,DHCP 让设备即插即用。

6.1IP 首部与分片重组

IP 提供的是无连接、不可靠、尽力而为的服务:不建连、不确认、不重传、不保证顺序——可靠性全部交给 TCP。先看清首部每个字段(点击展开):

分片与重组(高频计算题)

不同链路 MTU 不同(以太网 1500、PPPoE 1492、有些广域网仅 576)。数据报超过下一跳 MTU 时,若 DF=0 则由路由器分片,到目的主机才重组

分片例题 一个 4000 字节的数据报(首部 20B + 数据 3980B)经过 MTU=1500 的链路:
每片数据须 ≤ 1500−20 = 1480 B,且除最后一片外数据长度须是 8 的倍数 → 1480 满足。
→ 分 3 片:1480 + 1480 + 1020。
片偏移 = 该片数据起点 ÷ 8:第 1 片偏移 0、MF=1;第 2 片偏移 1480/8 = 185、MF=1;第 3 片偏移 2960/8 = 370、MF=0。三片的标识字段相同。

6.2ICMP:网络层的信使

IP 本身不会报告"包丢了、走不通",ICMP 网际控制报文协议承担差错报告与网络探询。ICMP 报文装在 IP 数据部分(协议号 1),但它属于网络层。

类型名称说明 / 应用
8 / 0回显请求 / 应答ping 的原理:测可达性与往返时延 RTT
11时间超过TTL 归 0 时由路由器发回——traceroute 的原理
3目的不可达细分代码:网络/主机/协议/端口不可达、需分片但 DF=1(用于 PMTUD 路径 MTU 发现)
5重定向路由器通知主机"有更优的下一跳"
12参数问题IP 首部字段错误
17 / 18地址掩码请求 / 应答无盘主机启动时获取本网的子网掩码(卷一细节,现已少用)
13 / 14时间戳请求 / 应答测量往返时延、粗估时钟差
traceroute 细节 依次发 TTL=1,2,3… 的探测包:第 n 跳路由器把 TTL 减到 0,回 ICMP 超时报文,于是暴露自己的地址;到达目的主机后,因探测端口无人监听,回「端口不可达」宣告结束。Windows 的 tracert 用 ICMP 回显请求做探测,Linux traceroute 默认用 UDP。

ping 的隐藏能力:IP 选项(卷一名场面)

  • 记录路由选项 RRping -R):每个经过的路由器把自己的出口 IP 写入 IP 首部的选项字段。因选项空间只有 40 字节,最多记录 9 个地址(IPv6 已取消此选项)。
  • 时间戳选项 TS:与 RR 类似,但记录的是时间戳,用于分析逐跳时延。
  • 这也解释了为什么 IP 首部要设计成"定长 20B + 变长选项"——功能都在,但平时零开销。

6.3NAT / NAPT:一个公网 IP 养活整个内网

私有地址不能上公网。装有 NAT 的路由器在转发时改写地址:

  • NAT:私有 IP ↔ 公网 IP 一对一映射,节省效果有限。
  • NAPT(端口复用,家用路由器实际用的):映射到「公网 IP + 端口」粒度。内网 192.168.1.2:50001 访问外网 → 路由器改写为 203.0.113.5:60001 并记录映射;回包查表还原。多台设备共用同一公网 IP 的不同端口。
影响 优点:缓解 IPv4 枯竭、隐藏内网拓扑(外网无法主动连入)。代价:破坏端到端透明——P2P、主机游戏联机需要 NAT 打洞 / UPnP 端口映射;这也是 IPv6 的动机之一。

6.4DHCP:即插即用的地址分配

新设备入网没有 IP,全靠 DHCP 动态主机配置协议(基于 UDP,服务器 67 / 客户端 68)自动获取 IP、掩码、网关、DNS。四步 DORA

Discover 发现(广播)

源 0.0.0.0 → 目的 255.255.255.255:「网里有 DHCP 服务器吗?」

Offer 提供

服务器响应:「我可以给你 192.168.1.100,租期 24 小时,附网关和 DNS。」

Request 请求(仍广播)

「我接受这台服务器的地址」——广播是为了让其他也报价的服务器收回地址。

ACK 确认

服务器最终确认,租约生效。租期过半(T1=50%)自动续租,87.5%(T2)时广播重新申请。

跨网段时由 DHCP 中继代理(路由器功能)把广播转成单播转给 DHCP 服务器。若一直拿不到地址,Windows 会自动配置 169.254.x.x(见 5.4)。

07

路由协议

LEVEL 4 · 进阶

路由器凭什么知道包该往哪发?静态路由靠管理员手写,动态路由靠协议自动学习——RIP、OSPF、BGP 是三代经典,分别代表距离向量、链路状态、路径向量三种思想。

7.1路由表与转发过程

路由表每条表项:目的网络 / 前缀 | 下一跳 | 出接口。转发时对目的 IP 逐条做「AND 掩码」匹配,多条命中取前缀最长者(最长前缀匹配);都不命中走默认路由 0.0.0.0/0;再没有则丢弃并回 ICMP 网络不可达。

  • 静态路由:管理员手工配置。简单、无开销、可控,但拓扑变化要人工改——适合小网或末节网络。
  • 动态路由:路由器之间交换信息自动计算。互联网太大,先按 自治系统 AS(同一管理机构下的网络,有全局唯一 AS 号)划分:AS 内部用 IGP(RIP、OSPF),AS 之间用 EGP(BGP)。

7.2RIP:距离向量算法

要素RIP 的做法
度量跳数(经过的路由器数),直连=1,16 = 不可达 → 只适用于小型网络
和谁交换仅相邻路由器
交换什么自己的整张路由表(目的网络 + 距离 + 下一跳)
何时交换每 30 秒周期性广播/组播(封装在 UDP 520 端口)

更新规则(Bellman-Ford):收到邻居 X 的表项后,距离全部 +1——若该项是新的、或经过 X 的距离更短、或原下一跳就是 X(距离变了必须更新),则采纳。优点:实现简单。缺点:跳数限制规模;「好消息传得快,坏消息传得慢」——链路故障时距离会逐次 +1 慢慢数到 16(计数到无穷),收敛慢且期间可能成环。

防环手段 水平分割:从某接口学到的路由不再从该接口发回;毒性逆转:发回时把距离标为 16;触发更新:拓扑一变立即通告,不等 30 秒周期。

RIPv1 vs RIPv2(卷一对照)

RIPv1RIPv2
类别有类(更新不带掩码,靠接口掩码猜)无类(更新携带子网掩码)
VLSM / CIDR不支持支持
更新发送广播 255.255.255.255(打扰所有主机)组播 224.0.0.9(只打扰 RIP 路由器)
认证支持明文 / MD5 认证
下一跳字段支持显式下一跳(防次优路径)

7.3OSPF:链路状态算法(本章核心)

OSPF 开放最短路径优先是大中型网络的主流 IGP。思想完全不同:每台路由器都掌握全网的完整拓扑地图,各自独立跑 Dijkstra 算出以自己为根的最短路径树。

要素OSPF 的做法
度量cost 代价(默认 = 参考带宽 ÷ 接口带宽,与带宽成反比),无跳数上限
和谁交换向本 AS 内所有路由器泛洪(flood)
交换什么仅自己与邻居的链路状态 LSA(我连着谁、cost 多少),不是整张路由表
何时交换链路状态变化时触发(另有 30 分钟周期性刷新);Hello 报文每 10 秒保活邻居
封装直接封装在 IP 中(协议号 89),组播地址 224.0.0.5 / 224.0.0.6

五种报文类型(建立邻接的全过程)

报文作用
1 Hello发现与维持邻居关系;协商参数;选举 DR/BDR
2 DBD 数据库描述交换链路状态数据库的「目录摘要」,互相对账
3 LSR 链路状态请求对账后,请求自己缺少或过期的 LSA
4 LSU 链路状态更新携带完整 LSA 应答(泛洪也用它)
5 LSAck 确认确认收到 LSU,保证泛洪可靠

为什么要划分区域(Area)

全网泛洪在大型网络中代价巨大。OSPF 把 AS 划分为多个区域:Area 0 是骨干区域,所有其他区域必须直连骨干;LSA 泛洪只在本区域内进行,区域边界路由器(ABR)做区域间路由汇总。效果:链路状态数据库变小、SPF 计算量下降、拓扑变化的影响被限制在区域内——协议因此可扩展到上千台路由器。

DR / BDR 指定路由器

在以太网这类广播多路访问网络中,n 台路由器两两同步要 O(n²) 次。OSPF 选举一台 DR(指定路由器),所有人只与 DR 同步(组播 224.0.0.6 发给 DR/BDR,DR 再用 224.0.0.5 泛洪给大家);BDR 做热备份,DR 宕机立即接管。选举规则:接口优先级最高者胜,相同则 Router-ID 大者胜;DR 不可抢占(后加入的更强路由器不会夺权,保证稳定)。

OSPF 的优点 收敛快(变化触发 + 增量更新)、无自环(SPF 树保证)、支持等价负载分担、支持区域划分与路由汇总、支持认证、用 cost 度量比跳数合理(千兆与百兆路径能区分开)。

LSA 链路状态通告的类型(卷一/考证高频)

类型名称谁产生内容与泛洪范围
Type 1Router LSA每台路由器描述自己的直连链路与 cost;只在本区域内泛洪
Type 2Network LSADR描述广播网络上挂了哪些路由器;本区域内
Type 3Network Summary LSAABR 区域边界路由器把一个区域的网段汇总通告给其他区域——区域间路由靠它
Type 4ASBR Summary LSAABR告诉大家「怎么去 ASBR」
Type 5AS External LSAASBR 自治系统边界路由器引入的外部路由(如重分发的 BGP/RIP 路由);全 AS 泛洪
Type 7NSSA External LSANSSA 区域内的 ASBR特殊末节区域内的外部路由,由 ABR 转成 Type 5 再送出

邻居状态机:从陌生到全同步

DownInit(收到对方 Hello,但对方还没看到我)→ 2-Way(互见 Router-ID,邻接确立;在此阶段选举 DR/BDR)→ ExStart(协商主从,准备交换)→ Exchange(互发 DBD 对账)→ Loading(LSR/LSU 补全缺失 LSA)→ Full(数据库完全一致,正常转发)。排障时邻居卡在 ExStart/Loading 多半是 MTU 不匹配或 Router-ID 冲突。

7.4BGP:AS 之间的外交官

互联网 = 数万个 AS 互连。BGP 边界网关协议(目前 BGP-4)是唯一在用的 EGP:

  • 路径向量:通告的不是"距离"而是完整 AS 路径(到某前缀要经过哪些 AS),天然防环(看到自己 AS 号在路径里就拒收)。
  • 策略优先:AS 间选路首先服从商业/管理策略("不走竞争对手的网络""客户流量优先"),不是简单求最短。
  • 建立在 TCP 179 端口上:邻居(对等体)之间先建 TCP 连接,可靠交换。AS 内部的 BGP 邻居叫 iBGP,跨 AS 叫 eBGP。
  • 四种报文:OPEN(建邻)、UPDATE(通告/撤销路由,核心)、KEEPALIVE(保活)、NOTIFICATION(报错关连接)。
  • 只通告变化部分(增量更新),KEEPALIVE 周期 60 秒。

7.5广播与组播(IGMP)

广播是一对所有:受限广播 255.255.255.255 不出本网;直接广播(如 192.168.1.255/24)可被路由器转发到目标网段(多数设备默认关闭,防 Smurf 攻击)。二层对应全 F 的 MAC。

组播是一对一组:D 类地址 224.0.0.0/4,只有"加入该组"的主机才接收——IPTV、视频会议、行情推送的基础。

组播地址含义组播地址含义
224.0.0.1本网段所有主机224.0.0.5 / .6所有 OSPF 路由器 / OSPF DR
224.0.0.2本网段所有路由器224.0.0.9RIPv2 路由器
224.0.0.13PIM 组播路由器224.0.1.1NTP 时钟协议
  • 组播 MAC01:00:5E: + 组播 IP 低 23 位。IP 组播地址的高 5 位不参与映射 → 32 个组播 IP 共享一个 MAC,网卡收到后还需 IP 层再过滤一次。
  • IGMP 组管理协议:跑在主机与相邻组播路由器之间(封装在 IP,协议号 2),让路由器知道"本网段还有没有人要这个组"。v1:查询 + 报告,离组靠超时;v2 增加离组报文与指定组查询(加快收敛);v3 支持指定源组播 SSM(只要来自某源的节目)。
  • 组播路由(路由器之间):PIM-DM 密集模式(先泛洪再剪枝,适合成员密集)、PIM-SM 稀疏模式(围绕汇聚点 RP 建共享树,适合成员稀疏的大网)。

7.6三大路由协议对比(高频考点)

RIPOSPFBGP
类型 / 算法IGP · 距离向量IGP · 链路状态 (Dijkstra)EGP · 路径向量
度量跳数(≤15)cost(带宽反比)AS 路径 + 策略属性
交换对象仅邻居区域内所有路由器(泛洪)TCP 对等体
交换内容整张路由表链路状态 LSA可达前缀 + AS 路径
更新方式周期 30s 全量触发式增量(+30min 刷新)触发式增量
封装UDP 520直接封装在 IP(协议号 89)TCP 179
收敛慢(计数到无穷)慢但稳定(互联网级)
适用小型网络中大型企业/校园网ISP / AS 之间
一句话总结 RIP 问邻居「你觉得怎么走」(道听途说);OSPF 自己画地图算路(全局视角);BGP 关心「经过谁家」与政策(外交谈判)。
08

UDP 用户数据报协议

LEVEL 3 · 进阶

UDP 只在 IP 之上加了两个能力:端口号(复用/分用)和可选的校验和。它的"简陋"恰恰是优势——无握手、无状态、延迟极低。

UDP 的特点

  • 无连接:想发就发,没有握手挥手。
  • 不可靠:不确认、不重传、不排序、不去重;丢了应用自己扛。
  • 面向报文:应用给多长的报文就原样发多长(不合并不拆分)——应用要自己控制报文大小。
  • 无流量/拥塞控制:网络再拥塞也照发(实时应用宁愿丢帧也不要延迟)。
  • 支持一对一、一对多(组播/广播)、多对多
  • 首部仅 8 字节(TCP 至少 20),开销极小。

典型应用:DNS 查询(一问一答,丢了重问即可)、DHCP、SNMP、RIP、实时音视频/视频会议/直播(卡一帧比等重传强)、在线游戏状态同步、QUIC(HTTP/3 在 UDP 之上自己实现可靠性)。

思考题 既然 UDP 不可靠,为什么实时音视频不用 TCP?——TCP 丢包会触发重传并阻塞后续所有数据(队头阻塞),会议画面会"卡住等旧帧";实时场景里迟到的新帧已无意义,宁丢勿等。
09

TCP 传输控制协议

LEVEL 5 · 核心难点

TCP 是全书最重的一章:在不可靠的 IP 之上凭空造出可靠、有序、双向的字节流。握手、确认重传、滑动窗口、拥塞控制——每一块都是面试与考试的高频区。

TCP 的特点(与 UDP 对照记)

  • 面向连接:先三次握手,用后四次挥手;点对点(不支持组播广播)。
  • 可靠交付:无差错、不丢失、不重复、按序到达。
  • 全双工:双方都有发送缓存和接收缓存,可同时收发。
  • 面向字节流:把应用数据看作无结构的字节序列,按序号组织;因此存在「粘包」问题,应用层需自行界定消息边界(长度前缀 / 分隔符 / 定长)。

9.1连接建立:三次握手(交互演示)

TCP 三次握手 · THREE-WAY HANDSHAKE
客户端 CLIENT
主动发起方
CLOSED
服务端 SERVER
被动监听方
LISTEN

经典面试题 为什么是三次不是两次?① 两次无法让服务端确认客户端的接收能力;② 防止历史重复连接:若客户端的旧 SYN 延迟到达,两次握手下服务端会直接建连空等;三次握手中客户端发现这不是自己要建的连接,回 RST 终止。
SYN 洪泛攻击:攻击者狂发 SYN 却不回第三次 ACK,服务端半连接队列被耗尽 → 防御手段 SYN Cookie(见第 12 章)。

9.2连接释放:四次挥手与 TIME_WAIT

点击上方演示区的「四次挥手模式」逐步观看。要点回顾:TCP 全双工,两个方向要分别关闭;被动关闭方收到 FIN 后可能还有数据没发完,ACK 必须立即回、FIN 要等数据发完,无法像握手那样合并,所以是四次。

TIME_WAIT 必考 主动关闭方发完最后一个 ACK 后进入 TIME_WAIT,等待 2MSL(MSL=报文最大生存时间,常 30s/1min/2min):
① 若最后的 ACK 丢失,对方会重传 FIN,等待期内还能再回 ACK(否则对方无法正常关闭);
② 让本连接的所有残留报文在网络中消亡,避免窜入下一个相同四元组的新连接造成数据错乱。
服务器出现大量 TIME_WAIT 通常说明是服务器主动关闭了短连接(如未开 Keep-Alive),属正常但可复用端口优化。

9.3可靠传输:序号 · 确认 · 重传

  • 序号 Seq:TCP 给每个字节编号,报文段首部写"本段第一个字节的编号"。
  • 累积确认 Ack:Ack = n 表示 n 之前的字节全部正确收到,期望下一个来 n。优点是丢失个别 ACK 不要紧(后面的 ACK 能覆盖);缺点是无法精确反映空洞(由 SACK 选项补充)。
  • 超时重传:每发一段启动定时器,超时未收到 ACK 则重发。超时时间 RTO 动态计算:基于加权平均 RTT(RTTs)与偏差(RTTd)——略大于平均往返时延,太短会误判重传加剧拥塞。
  • 快速重传:收到 3 个冗余 ACK(对同一字节的重复确认)说明中间有个段丢了,立即重传而不等超时——把恢复时间从 RTO 级缩到 RTT 级。

9.4滑动窗口与流量控制

逐段"停等确认"效率太低。TCP 用滑动窗口流水线发送:窗口内的字节可连续发出不必等待,收到确认后窗口右滑。接收方在 ACK 中通告 rwnd 接收窗口(自己缓冲区的剩余容量),发送方的发送窗口不得超过 rwnd——这就是流量控制:防止发送方把接收方淹没。

  • 接收方缓冲满时通告 rwnd = 0(零窗口),发送方停发;之后用零窗口探测报文周期性询问(防对方"窗口更新"的 ACK 丢失导致双方死等)。
  • 发送窗口实际大小 = min(rwnd, cwnd)——rwnd 管接收方,cwnd 管网络(见下节)。

9.5拥塞控制:四个经典算法

流量控制管"对方收不收得下",拥塞控制管"网络扛不扛得住"——这是一个全局问题。发送方维护拥塞窗口 cwnd,网络越堵 cwnd 越小。核心变量还有慢启动门限 ssthresh

慢启动 Slow Start

cwnd 从 1 个 MSS 开始,每收到一个 ACK 翻倍(指数增长):1→2→4→8… 快速探明网络容量,直到达到 ssthresh。

拥塞避免 Congestion Avoidance

超过 ssthresh 后改为线性增长:每个 RTT 只 +1 MSS,谨慎逼近极限。

发生超时 = 严重拥塞

ssthresh ← cwnd/2,cwnd ← 1,重新慢启动("断崖式"惩罚)。

3 个冗余 ACK = 轻度丢包 → 快重传 + 快恢复

立即重传丢失段;ssthresh ← cwnd/2,cwnd ← ssthresh(不归 1),直接进拥塞避免线性增长——个别丢包不代表网络瘫痪,温和处理。

图像记忆 cwnd 曲线 = 锯齿状:指数爬升 → 线性爬升 → 遇丢包砍半(快恢复)或归零(超时)→ 再爬……经典考题会给一张 cwnd 折线图让你标注各段的算法与 ssthresh 取值。
延伸 经典 Reno 之外还有 BBR(谷歌,按带宽×RTT 建模主动控速而非被动响应丢包,YouTube 在用)。另外 TCP 还有 Nagle 算法(攒小报文合并发)与延迟 ACK(等 200ms 或凑满两个段再确认)等小优化。

9.6TCP 有限状态机(11 个状态)

把握手、数据传输、挥手合在一起看,每条 TCP 连接都在这张状态机里流转(卷一核心图):

状态含义状态含义
CLOSED初始 / 终点FIN_WAIT_2对方已 ACK,等对方的 FIN
LISTEN服务端等待连接CLOSE_WAIT被动方:收到 FIN 已 ACK,等应用关闭
SYN_SENT主动方已发 SYNCLOSING双方几乎同时发 FIN(同时关闭)
SYN_RCVD被动方收到 SYN 回了 SYN+ACKLAST_ACK被动方发完 FIN,等最后 ACK
ESTABLISHED连接建立,正常收发TIME_WAIT主动方等 2MSL(见 9.2)
FIN_WAIT_1主动方已发 FIN
状态机的三个"冷门出口" ① FIN_WAIT_1 收到 ACK+FIN 同包 → 跳过 FIN_WAIT_2 直达 TIME_WAIT;② FIN_WAIT_1 收到对方 FIN(先于 ACK)→ 进入 CLOSING(同时关闭);③ 同时打开:两端互发 SYN,双方 SYN_SENT → SYN_RCVD → ESTABLISHED,共 4 个报文——NAT 打洞(P2P)利用的正是它。

9.7交互式 vs 批量数据流(卷一实测章节)

交互式流量(SSH、Telnet、游戏指令):小报文问题

敲一个键产生 1 字节数据,却要套上 20B IP + 20B TCP = 41 字节的报文,广域网上会放大拥塞。两个机制的博弈:

  • Nagle 算法(发送方):连接上最多允许一个未确认的小报文;未确认期间后续数据积攒起来合并发送。ACK 回来得越快,发得越快——自适应:低速网络自动攒大包,高速网络几乎无感。
  • 延迟 ACK(接收方):收到数据不立即确认,等至多 200ms——若期间本端正好要回数据就捎带 ACK。两者叠加偶尔造成"小延迟感"(Nagle 在等 ACK,延迟 ACK 在等数据),实时应用可置 TCP_NODELAY 关掉 Nagle。

批量流量(下载、备份):窗口流水线与 ACK 自时钟

  • 发送方在窗口内连续发出多个报文段,每收到一个 ACK 窗口右滑,再补发新段——ACK 的返回节奏(ACK clock)天然等于最慢链路的通过节奏,发送速度被自动"调速"。
  • 糊涂窗口综合征 SWS:接收方应用读得慢,缓冲只剩几百字节就通告几百字节的窗口 → 发送方就发小报文 → 恶性循环。对策:接收方不通告小窗口(攒到 1 个 MSS 或缓冲一半再更新)+ 发送方 Nagle 攒数据。

9.8TCP 的四个定时器与 RTT 测量

定时器触发作用
重传定时器发出数据即启动RTO 超时未确认 → 重传。RTO 由 RTT 动态估算;连续超时按指数退避(RTO 翻倍),多次失败放弃连接
坚持定时器 Persist收到零窗口通告周期性发送窗口探测报文,防止「窗口更新 ACK 丢失 → 双方互相死等」的僵局
保活定时器 Keepalive连接空闲(默认 2 小时)探测对端是否还活着(每 75s 一次、多次无响应则 RST 断开)。半开连接清理;实践中更多用应用层心跳
2MSL 定时器主动关闭方发完最后 ACKTIME_WAIT 等待时长(见 9.2)
RTT 怎么测才准(Jacobson / Karn 算法) 难点:报文重传后收到 ACK,算的是哪一次的 RTT?Karn 算法:重传过的报文段不参与 RTT 测量,且每次重传 RTO 加倍(退避),直到拿到干净样本再恢复公式计算。RTT 估算用指数加权平均:RTTs ← (1−α)·RTTs + α·新样本,再叠加 4 倍偏差得到 RTO——平滑掉抖动,又不会迟钝。

9.9TCP 选项与连接管理细节

首部选项(握手时协商,卷一逐个抓包验证过)

;以太网典型 1460 = 1500(MTU) − 20(IP) − 20(TCP);目的:尽量不让 IP 层分片
选项作用细节
MSS 最大报文段声明"我单个报文段最多收多少数据"只在 SYN 报文中出现
窗口扩大因子窗口字段只有 16 位(最大 65535),左移扩展因子 n 表示窗口值左移 n 位(最大 14 → 约 1GB),应对高带宽长延迟链路(时延带宽积大)
SACK 选择性确认告诉对方"我缺的是哪几段"克服累积确认"只知道第一个空洞"的缺陷,只重传真正丢失的段
时间戳每个报文带回显时间戳更精确测 RTT;同时用于 PAWS(防序号回绕:高速网络 32 位序号 4 秒就能绕一圈)

连接管理的边角但常考

  • 半关闭 Half-Close:一方 FIN("我不发了")后,另一方仍可继续单向发送,直到它也 FIN。例:rsh 类命令发完输入后关写端,继续读结果。
  • RST 复位的三种典型场景:① 向没人监听的端口发起连接(TCP 回 RST;对照:UDP 回 ICMP 端口不可达);② 异常终止连接(置 SO_LINGER 超时为 0);③ 半开连接——对端重启后收到旧连接的数据,回 RST。
  • 连接队列:服务端内核维护两条队列——半连接队列(SYN_RCVD,收到 SYN 未完成握手)与 全连接队列 / accept 队列(ESTABLISHED、等待应用 accept())。SYN 洪泛打满前者;应用 accept 太慢打满后者(新连接被丢或回 RST)。listen(fd, backlog) 的 backlog 即约束队列长度。
  • SO_REUSEADDR:允许绑定处于 TIME_WAIT 的端口——服务器重启立刻可拉起,网络编程必知。
10

应用层协议

LEVEL 4 · 进阶

应用层协议直接服务于应用程序:域名翻译、网页传输、邮件收发、远程登录。每个协议都要记住四件事——干什么、走 TCP 还是 UDP、端口号、报文格式要点。

10.1DNS 域名系统

www.example.com 翻译成 IP 的分布式层级数据库(UDP/TCP 53)。层级:根域名服务器 → 顶级域服务器(.com/.cn/.org)→ 权威服务器(example.com 自己管)→ 本地 DNS 服务器(运营商/公司,负责代查并缓存)。

查询方式行为用在哪
递归查询"你必须给我最终答案"——代查到底主机 → 本地 DNS
迭代查询"我不知道,但你可以去问它"——返回 referrals本地 DNS → 根/顶级/权威

常用记录类型

记录含义记录含义
A域名 → IPv4MX邮件服务器
AAAA域名 → IPv6NS该域的权威服务器
CNAME别名 → 真名PTRIP → 域名(反向解析)
TXT文本(SPF 反垃圾、域名验证)SOA区域授权起始信息

细节:默认走 UDP(查询报文 < 512B 时);区域传送(主从同步)与报文过大时用 TCP。各级缓存由 TTL 控制有效期——改 DNS 记录"生效慢"就是缓存在作怪。

DNS 报文结构(卷一细节)

  • 12 字节固定首部:标识 ID(配对请求/应答)、标志位(QR 查询/应答、RD 期望递归、AA 权威应答、TC 截断)+ 四个计数字段。
  • 后接四区:查询问题 / 回答 / 授权 / 附加信息。应答报文的问题区原样回显。
  • 域名压缩指针:重复出现的域名后缀用 2 字节指针(高 2 位为 11)指向先前位置,代替整串——一条应答里多个记录共享 example.com 只需写一次。
  • 默认 UDP(报文 < 512B);TC=1 截断或区域传送(AXFR 主从同步)时改用 TCP。缓存 TTL 由权威服务器下发——改记录"生效慢"就是各级缓存未过期。

10.2HTTP:报文格式与状态码

超文本传输协议(TCP 80),请求-响应、无状态。报文是纯文本:起始行 + 首部字段 + 空行 + 可选正文。

请求报文示例 GET /index.html HTTP/1.1 ← 请求行:方法 + URL + 版本
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: session=abc123
(空行)
(GET 无正文;POST 的正文放这里)
响应报文示例 HTTP/1.1 200 OK ← 状态行:版本 + 状态码 + 短语
Content-Type: text/html; charset=utf-8
Content-Length: 5123
Cache-Control: max-age=3600
(空行)
<html>…(正文)

请求方法

方法语义幂等
GET获取资源,参数在 URL 里,无正文
POST提交数据创建资源/触发处理,参数在正文
PUT整体替换资源
DELETE删除资源
HEAD只要响应首部(探活/查大小)
PATCH局部修改资源

状态码分类(必背)

类别含义常见状态码
1xx信息性101 Switching Protocols(升级 WebSocket)
2xx成功200 OK · 201 Created · 204 No Content · 206 Partial Content(断点续传)
3xx重定向301 永久 · 302 临时 · 304 Not Modified(缓存有效,直接用本地)
4xx客户端错误400 请求有误 · 401 未认证 · 403 禁止 · 404 不存在 · 405 方法不允许 · 429 请求太频繁
5xx服务端错误500 内部错误 · 502 网关错误 · 503 服务不可用 · 504 网关超时
  • 无状态与 Cookie:HTTP 本身不记得你是谁;服务器通过 Set-Cookie 下发票据,浏览器此后每次自动携带 → 实现登录态。Session 是把状态存在服务端、Cookie 里只放 session id 的做法。
  • 缓存:强缓存(Cache-Control: max-age,不过期不发请求)与协商缓存(ETag/If-None-MatchLast-Modified,没变则回 304)。

10.3HTTP/1.1 → HTTP/2 → HTTP/3 的演进

版本关键改进遗留问题
HTTP/1.0每个请求一条 TCP 连接(短连接)建连开销巨大
HTTP/1.1长连接 keep-alive(复用连接)、管道化(效果差基本弃用)、Host 头支持虚拟主机队头阻塞:同连接上请求只能串行,前一个慢全卡住 → 浏览器只能开 6 条连接绕开
HTTP/2二进制分帧 + 多路复用(一条连接并行交错传多个流)、HPACK 首部压缩、服务器推送、流优先级TCP 层的队头阻塞仍在:一个 TCP 段丢失,所有流一起等重传
HTTP/3弃用 TCP,改用基于 UDP 的 QUIC:流独立丢包互不影响、TLS 1.3 内建(1-RTT 甚至 0-RTT 建连)、连接迁移(Wi-Fi 切 4G 不断线)—(部署普及中)

10.4HTTPS 与 TLS 握手

HTTPS = HTTP + TLS(TCP 443),解决三个问题:加密(防窃听)、认证(防假冒)、完整性(防篡改)。设计精髓:非对称加密交换密钥,对称加密传输数据——前者慢但安全,后者快,各取所长。

ClientHello

客户端:支持的 TLS 版本、加密套件列表、随机数 1

ServerHello + 证书

服务器:选定套件、随机数 2、并发送数字证书(内含服务器公钥,由 CA 签名)。

验证证书 + 交换密钥

客户端用内置的 CA 根证书验证证书链(域名对不对、有没有过期、签名是否可信)。然后生成预主密钥,用服务器公钥加密发送(RSA 模式);ECDHE 模式则双方交换临时公钥各自算出。

各自算出会话密钥

双方用「随机数1 + 随机数2 + 预主密钥」算出相同的对称会话密钥,互发加密 Finished 验证,之后全部 HTTP 数据用对称加密传输。

为什么能防中间人 中间人能转发数据,但伪造不了证书——没有 CA 私钥,签不出客户端信任的证书;替换证书会触发浏览器警告。私钥只有服务器持有,预主密钥只有它能解开。

10.5电子邮件 · FTP · SSH

邮件 · TCP

SMTP:25

发送与服务器间转发邮件(推)。三个阶段:建连 → 邮件传送(MAIL FROM / RCPT TO / DATA)→ 释放。明文命令-应答式。

邮件 · TCP

POP3 / IMAP:110 / :143

收取邮件(拉)。POP3:下载到本地后服务器默认删除,简单但多端不同步。IMAP:邮件留在服务器,本地只是"窗口",多端同步、可按文件夹管理——现代主流。

邮件扩展

MIME

SMTP 只能传 7 位 ASCII 文本。MIME 扩展支持附件、图片、中文:Base64 编码 + Content-Type 声明。

文件传输 · TCP

FTP:21 控制 / :20 数据

双连接是其标志:21 端口传命令,数据走另一条连接。主动模式:服务器从 20 端口反向连客户端;被动模式:客户端再发起数据连接(穿 NAT 更友好)。明文,现多被 SFTP 取代。

远程管理 · TCP

SSH / Telnet:22 / :23

Telnet 明文传输已被淘汰;SSH 全程加密,支持口令/公钥认证,还常用来做端口转发与隧道(ssh -L/-R)。

实时双向 · TCP

WebSocket:80/443

借 HTTP 握手(101 升级)后转为全双工长连接,服务器可主动推送——聊天室、实时行情、协同编辑。

常用端口号速查

端口协议用途端口协议用途
20/21FTP数据 / 控制110POP3收邮件
22SSH安全远程登录143IMAP邮件同步
23Telnet明文远程登录443HTTPS加密网页
25SMTP发邮件179BGPAS 间路由
53DNS域名解析520RIP路由信息(UDP)
67/68DHCP自动分配地址3389RDPWindows 远程桌面
80HTTP网页3306MySQL数据库
记忆口诀 端口范围:0–1023 熟知端口(系统服务);1024–49151 登记端口;49152–65535 临时端口(客户端发起连接时随机取用,这就是服务器日志里那些大数字端口的来源)。

10.6卷一经典小协议:TFTP · BOOTP · SNMP · NFS · Telnet

文件传输 · UDP

TFTP:69

极简版 FTP:只读写文件、无认证无目录列表。可靠传输自己实现——停止等待:每个 512B 数据块带块号,收到 ACK 才发下一块,超时重发。典型用途:无盘工作站启动、给路由器/交换机刷固件。

引导 · UDP

BOOTP:67/68

DHCP 的前身:无盘机开机广播请求 IP 与启动文件位置(再用 TFTP 下载内核)。DHCP 在其报文格式上扩展出"动态租约 + 选项",二者端口相同、报文兼容。

网络管理 · UDP

SNMP:161 / :162

简单网络管理协议:管理站用 get / set / get-next 读写设备上的 MIB 变量(按 OID 树形编号,如 1.3.6.1…);设备异常时主动发 trap 告警(162 端口)。路由器流量监控全靠它。

文件共享 · UDP/TCP

NFS / RPC:111 / :2049

Sun 的网络文件系统:挂载远端目录如本地。底层是 ONC RPC 远程过程调用(XDR 做数据序列化),端口由 portmapper(111) 动态注册查询——微服务 RPC 的思想源头。

远程终端 · TCP

Telnet / NVT:23

网络虚拟终端 NVT:把千差万别的终端统一抽象成一种虚拟格式,双方各自转换——"定义一个中间层屏蔽差异"是协议设计的经典手法。明文传输,已淘汰,仅作教学与端口测试(telnet host port)。

历史课代表

SLIP / CSLIP

串口拨号时代的链路层协议:帧尾 0xC0 定界,极其简单但无类型字段、无校验、需双方预知 IP。CSLIP 把 40 字节的 IP/TCP 首部压缩到 3–5 字节——拨号时代的"性能优化",被 PPP 取代。

11

场景串联

LEVEL 5 · 实战

把前十三章的知识串成完整的故事——这是面试"输入 URL 后发生了什么"的标准答案框架,也是自查知识漏洞的最好方式。

11.1浏览器输入网址后的完整旅程

解析 URL 与本地查找

浏览器解析出协议/域名/端口/路径,先查浏览器 DNS 缓存 → 操作系统缓存 → hosts 文件。

DNS 解析(应用层 + UDP)

未命中则向本地 DNS 服务器递归查询;本地 DNS 迭代问 根 → 顶级域 → 权威服务器,拿到 93.184.216.34 并缓存。

判断网段 + ARP 解析(链路层)

目的 IP 与本机掩码相与——不在本网段,下一跳是默认网关。查 ARP 缓存,没有则广播解析网关的 MAC 地址。

TCP 三次握手(传输层)

与服务器 443 端口建连:SYN → SYN+ACK → ACK,交换初始序号。沿途每台路由器:TTL−1、重算首部校验和、重写 MAC 首部(源/目的 IP 全程不变)。

TLS 握手(安全层)

验证服务器证书,协商出对称会话密钥(见 10.4 四步)。

发送 HTTP 请求(应用层)

加密后的 GET / HTTP/2 发出;报文沿途被层层封装:HTTP → TLS → TCP 段 → IP 数据报 → 以太网帧 → 比特流。

服务器处理与响应

NAT/负载均衡 → Web 服务器 → 应用/数据库 → 返回 HTML(200 OK)。浏览器对响应逐层解封装。

渲染与后续请求

解析 HTML 构建 DOM,遇到 CSS/JS/图片再发请求(HTTP/2 下在同一连接并行复用);强缓存命中的资源直接读本地。

连接关闭

keep-alive 复用一段时间后,一方发起 FIN,四次挥手,主动方等待 2MSL 后彻底关闭。

11.2抓包视角:一个包里的四套地址

家庭网络里手机(192.168.1.2)访问公网服务器时,出口路由器上抓到的一帧长这样:

字段值(示例)谁写的 / 会不会变
链路层源/目的 MAC手机MAC → 光猫MAC每经过一台路由器重写一次
网络层源/目的 IP192.168.1.2 → 93.184.216.34端到端不变(NAT 出口处改写一次)
传输层源/目的端口51234 → 443不变;NAPT 会改写源端口
应用层Host 头www.example.com不变(TLS 内加密)

11.3排障思路:ping 不通怎么办(自底向上)

物理/链路层

网线/Wi-Fi 连上了吗?ipconfig 看有没有拿到地址——169.254.x.x 说明 DHCP 失败。

本机协议栈

ping 127.0.0.1 通不通——不通则 TCP/IP 协议栈本身坏了。

网关可达性

ping 网关——不通查本机到路由器(网线、Wi-Fi、ARP 表 arp -a)。

外网 IP 可达性

ping 223.5.5.5(阿里 DNS)——通则网络层 OK;不通用 traceroute 看断在哪一跳。

DNS 解析

IP 能通但域名不行 → nslookup 查 DNS,换 DNS 服务器或清缓存。

端口与服务

域名通但打不开网页 → curl -v / telnet 主机 443 测端口,查防火墙与代理。

方法论 网络排障的黄金法则就是分层:自底向上逐层验证,每层通了再往上走——这正是学分层模型最实用的地方。
12

实现视角:从协议到代码

LEVEL 5 · 卷二精要

《TCP/IP 详解·卷二》读的是 4.4BSD 内核源码:协议规范落到内存里是什么结构、一个包在内核里走过哪些函数。这一章提炼其中最有迁移价值的概念——懂了它们,socket 编程和性能调优都会豁然开朗。

12.1Socket:一条连接到底是什么

  • 五元组唯一标识一条 TCP 连接:源 IP、源端口、目的 IP、目的端口、协议。同一客户端 IP 用不同源端口可以对同一服务器开数万条连接;服务器的 80 端口也能同时服务无数连接——靠四元组区分。
  • Socket API 的标准舞步:服务端 socket → bind → listen → accept(循环);客户端 socket → connect;然后双方 send/recv,最后 closelisten 的 backlog 对应 9.9 的连接队列;accept 返回的是的描述符(每条连接一个),监听套接字本身只负责接客。
  • UDP 无连接但也有 socket:connect 对 UDP 只是"记下默认对端",不发任何报文。

12.2内核数据结构:mbuf 链 与 PCB

  • mbuf:BSD 内核存包的基本单位——固定小内存块,包大就用串起来,首部预留空间让各层"前插"自己的首部。目的只有一个:全程零拷贝,层层封装不需要移动数据,只改指针。Linux 的 sk_buff 是同一思想。
  • PCB 协议控制块:每条连接在内核中的"档案"——四元组、当前状态机状态、发送/接收缓冲指针、窗口值、定时器都挂在上面。收到报文后内核按四元组 hash 查找 PCB,决定交给哪个 socket。
  • 路由表用基数树(radix tree)组织:最长前缀匹配本质是按 bit 逐位下树,这正是查表能 O(前缀长度) 完成的原因。

12.3一个包的内核之旅(接收方向)

网卡收包 → DMA → 中断

帧经 DMA 直接写入内存环形缓冲区,网卡发中断通知 CPU,驱动把帧挂上 IP 输入队列(现代 Linux 用 NAPI 轮询削峰)。

链路层 → IP 层

剥帧首部、FCS 已校验;查"类型"字段(0x0800)交给 IP。IP 校验首部、查路由表决定转发还是上交本机、必要时重组分片。

IP → TCP(协议分用)

按 IP 首部"协议号"(6)交给 TCP。TCP 按四元组找到 PCB:校验序号、去重、乱序段挂到重组队列、回 ACK,把按序数据追加到 socket 接收缓冲。

唤醒应用

应用阻塞在 read() 上被唤醒,数据从内核缓冲拷到用户态。发送方向完全相反:write → TCP 分段 → IP 选路 → 帧封装 → 网卡队列。

性能视角 这条路径上的每次拷贝、上下文切换、中断都是钱。零拷贝(sendfile)、大页内存、CPU 亲和、中断合并、DPDK/内核旁路——所有网络性能优化都是在这条旅程上做减法。

12.4缓冲区、窗口与 MSS 的关系(把概念对齐到内存)

三组概念一次对齐 MTU 1500(链路层限制)→ MSS 1460(TCP 一次最多装的数据)→ IP 数据报 ≤ 1500 不分片
发送缓冲 = [已发未确认] + [可发未发] + [不可发] ← 滑动窗口在其中滑动
接收缓冲上限 ≈ 对方看到的 rwnd 上限;内核默认缓冲太小会压垮高速长延迟链路的吞吐
吞吐上限 ≈ 窗口 ÷ RTT (窗口 64KB、RTT 100ms → 至多 5 Mbps:窗口扩大因子存在的理由)

卷二还实现了每条连接的四个定时器(9.8)、TIME_WAIT 的快速回收、拥塞窗口的维护——你在 9.x 学到的每个机制,在内核里都只是 PCB 上的几个字段加一个定时器。协议是规则,实现是状态机加计时器。

13

网络安全基础

LEVEL 5 · 实战

经典协议设计于互相信任的年代,几乎每层都有对应的攻击手法。了解攻击原理,才能理解防御机制为什么长这样。

12.1常见攻击与防御

攻击针对层原理防御
ARP 欺骗链路层ARP 无认证:伪造应答把自己 MAC 冒充成网关,劫持/监听局域网流量静态 ARP 绑定、交换机 DAI 动态检测
SYN 洪泛传输层狂发 SYN 不回 ACK,耗尽服务器半连接队列SYN Cookie:不存状态,把序号编码进 cookie,合法客户端回 ACK 时再验证
DDoS各层僵尸网络海量请求/流量淹没目标(含 UDP/反射放大:伪造源地址让小查询变大回复)流量清洗、CDN/Anycast 分散、限速
DNS 劫持/污染应用层篡改解析结果或抢答伪造应答,导到钓鱼站DNSSEC 签名验证、DoH/DoT 加密查询
中间人 MITM传输/应用插在通信双方之间转发窃听篡改TLS 证书体系:伪造不了 CA 签名证书(见 10.4)
IP 欺骗网络层伪造源 IP 发包(常用于反射攻击)运营商入口过滤(uRPF)

12.2防火墙与 VPN

  • 包过滤防火墙(网络层):按五元组(源/目的 IP、端口、协议)查表放行或丢弃,快但不懂应用语义。
  • 状态检测防火墙:跟踪连接状态——"内网先发出的连接的回程包"自动放行,外网主动进来的默认拒绝(家用路由器默认行为,配合 NAT 构成天然屏障)。
  • 应用层网关/代理:能理解 HTTP 等协议内容,可做内容过滤,但性能开销大。
  • VPN:在公网上建立加密隧道,把远程流量"搬进"内网。IPSec(网络层,站点到站点)、SSL/TLS VPN(远程接入主流)、WireGuard(现代轻量)。
纵深防御 没有单一银弹:边界防火墙 + TLS 加密 + 强认证(密码+二次验证)+ 及时打补丁 + 最小权限——攻击者只需找到一个洞,防御者要堵住所有洞,所以必须多层设防。
14

自测题库

检验掌握程度

20 道题覆盖全书重点。先在心里作答再点开核对;答错的题回到对应章节重读——目录里每道题都标了归属章节。