计算机网络
协议全书
从物理层的比特流到应用层的报文,再到内核中的实现——十四章完整覆盖计算机网络核心知识,并融入《TCP/IP 详解》卷一(协议)与卷二(实现)的经典细节。
网络基础概念
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 测出的值。
- 时延带宽积 = 传播时延 × 带宽,表示"链路上最多能容纳多少个比特"。
传播时延 = 信道长度(m) ÷ 电磁波速率(m/s) (光纤/铜线中约 2×10⁸ m/s)
处理时延 = 节点检查首部、查路由表、差错检验的时间
排队时延 = 在路由器队列中等待转发的时间(拥塞时剧增)
分层体系结构
LEVEL 1 · 入门分层是计算机网络最重要的设计思想:每层只通过接口使用下层服务、为上层提供服务,层与层之间解耦——某一层技术换代不影响其他层。
2.1协议三要素与相关概念
协议:对等层之间通信规则的集合,由三要素组成:
- 语法:数据与控制信息的格式(报文长什么样,字段怎么排)。
- 语义:各字段的含义、需要做什么动作(SYN 表示请求建连)。
- 同步(时序):事件顺序的约定(先握手、再传数据、后挥手)。
辨析:协议是"水平"的(两台机器同一层之间的约定);服务是"垂直"的(下层通过接口为上层提供能力);接口(SAP 服务访问点)是相邻两层交换信息的地方,如传输层的 SAP 就是端口。
2.2OSI 七层模型详解
2.3封装 / 解封装 与各层网络设备
发送方自顶向下逐层加首部(链路层还加尾部),接收方自底向上逐层剥离。每层的数据单位(PDU)名称不同:
各层设备辨析(高频考点)
| 设备 | 工作层 | 冲突域 / 广播域 | 说明 |
|---|---|---|---|
| 中继器 / 集线器 Hub | 物理层 | 不隔离冲突域,不隔离广播域 | 只放大再生信号;Hub 所有端口共享带宽,半双工 |
| 网桥 / 交换机 Switch | 链路层 | 隔离冲突域,不隔离广播域 | 按 MAC 地址表转发,每端口独占带宽,全双工 |
| 路由器 Router | 网络层 | 隔离冲突域 + 隔离广播域 | 按 IP 查路由表转发,连接不同网段 |
| 网关 Gateway | 传输层及以上 | — | 协议转换(如 HTTP ↔ 内部协议);日常说的"默认网关"其实是路由器 |
物理层
LEVEL 2 · 入门物理层只关心一件事:怎样在传输媒体上传送比特流。它定义接口的机械、电气、功能、规程特性——电压多高算 1、用什么接头、速率多少。
3.1传输媒体(导引型与非导引型)
| 媒体 | 特点 | 典型应用 |
|---|---|---|
| 双绞线 | 两根绝缘铜线绞合抗干扰,便宜易布线;屏蔽(STP)/非屏蔽(UTP);常见 Cat5e/Cat6 | 以太网布线(RJ45),百米级 |
| 同轴电缆 | 屏蔽好、带宽较高,已逐渐被双绞线/光纤取代 | 有线电视 HFC |
| 光纤 | 带宽极高、损耗低、抗电磁干扰 | 骨干网、FTTH 入户 |
| ├ 多模光纤 | 多条光线以不同角度反射前进,会展宽失真 | 短距离(楼内、机房) |
| └ 单模光纤 | 光线直线传播不失真,更贵 | 长距离骨干 |
| 无线(非导引型) | 无线电波/微波/红外;微波需视距,卫星时延大 | Wi-Fi、4G/5G、卫星 |
3.2编码与调制
- 编码(基带信号,数字→数字):不归零制(高电平 1 低电平 0,但无法自同步);曼彻斯特编码——每位中间都有一次跳变,跳变沿自带时钟(以太网曾用),缺点:占两倍带宽;差分曼彻斯特——看位开始处有无跳变,抗干扰更强。
- 调制(带通信号,数字→模拟):调幅 AM(幅度承载信息)、调频 FM、调相 PM;正交振幅调制 QAM 同时调幅+调相,一个码元可携带多比特(如 16-QAM = 每码元 4 bit),Wi-Fi 与 5G 的核心。
3.3奈氏准则与香农公式(计算必考)
极限数据率 = 2W · log₂V (V = 每个码元的离散电平数)
→ 无噪声时想提速,只能增加电平数 V
S/N = 信噪比;若以分贝给出:dB = 10·log₁₀(S/N),须先换算回比值
→ 噪声存在时,V 再大也白搭,信噪比与带宽决定上限;实际速率取两公式较小者
3.4信道复用:一条干线多人共用
| 复用方式 | 原理 | 应用 |
|---|---|---|
| FDM 频分 | 不同用户占不同频段,同时发送 | 广播电台、有线电视 |
| TDM 时分 | 轮流占用整个信道,每人一个固定时隙 | 传统电话骨干;缺点:时隙空闲也浪费 |
| STDM 统计时分 | 按需动态分配时隙(分组交换本质) | 提高利用率 |
| WDM 波分 | 光的频分复用:一根光纤跑多种波长 | 光纤骨干(DWDM 可达几十上百路) |
| CDM/CDMA 码分 | 每人一个正交码片序列,同时同频发送,靠码型区分 | 3G 移动通信、GPS |
数据链路层
LEVEL 3 · 进阶链路层负责「相邻节点」之间的一跳:把 IP 数据报封装成帧、检测差错、协调共享信道的访问。以太网与 Wi-Fi 都活在这一层。
4.1三个基本问题:封装成帧 · 透明传输 · 差错检测
- 封装成帧:在 IP 数据报前后加首部与尾部(帧定界 + 地址 + 校验),接收方据此从比特流中切出完整的帧。帧长上限即 MTU(以太网 1500 字节)。
- 透明传输:数据里若恰好出现与定界符相同的字节怎么办?字节填充:在其前面插入转义字符 ESC;比特填充(HDLC):连续 5 个 1 后强制插 0。对上层"透明"= 数据随便传,不会误判帧边界。
- 差错检测:比特在传输中会出错(误码率)。链路层用 CRC 循环冗余检验:收发双方约定生成多项式 G(x),发送方在数据后补 n 个 0 做模 2 除法,余数(FCS)附在帧尾;接收方整帧再除一次,余数为 0 则收下,否则丢弃。
4.2PPP 点对点协议
拨号与广域网点对点链路上最常用的链路层协议。三部分组成:封装方法(帧定界 0x7E)、LCP 链路控制协议(建立/配置/测试链路)、NCP 网络控制协议族(为不同网络层协议协商参数,如 IPCP 分配 IP)。特点:简单、只检错不纠错、无序号无流量控制、支持身份认证(PAP/CHAP)。异步链路用字节填充,同步链路用零比特填充。
4.3CSMA/CD 与以太网
早期以太网所有主机共享一条总线,同时发会冲突。CSMA/CD 载波监听多点接入/碰撞检测:
先听后发(载波监听)
信道忙就持续等待,空闲才发送。
边发边听(碰撞检测)
发送中持续监测电压,发现叠加异常即知冲突。
冲突停止 + 退避重发
立即停止并发送干扰信号强化冲突,然后按二进制指数退避:第 k 次冲突从 {0..2ᵏ−1}(k 上限 10)随机取 r,等待 r × 争用期后重发,16 次失败则放弃上报。
以太网帧结构(点击字段查看详解)
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;双方都写入缓存。
IP 编址与子网划分
LEVEL 3 · 进阶IPv4 地址 = 32 bit =「网络号 + 主机号」二级结构;子网划分后变成「网络号 + 子网号 + 主机号」三级;CIDR 则彻底取消类别,用任意长度前缀——这是网络层的地基,也是计算题的重灾区。
5.1IPv4 地址与分类编址
点分十进制 192.168.1.10 的机器形态是 11000000 10101000 00000001 00001010。分类编址按首字节区分(自环 127 不占 A 类):
| 类别 | 首字节 | 网络号/主机号 | 网络数 × 主机数 | 用途 |
|---|---|---|---|---|
| A | 1–126 | 8 / 24 位 | 126 × 约 1677 万 | 超大型网络 |
| B | 128–191 | 16 / 16 位 | 16384 × 65534 | 中型网络 |
| C | 192–223 | 24 / 8 位 | 约 200 万 × 254 | 小型网络 |
| D | 224–239 | — | — | 组播 |
| E | 240–255 | — | — | 保留实验 |
5.2子网划分:向主机位"借位"
一个 C 类网 254 台主机对一个 50 人的部门太浪费。办法:从主机位借若干位作子网号,用子网掩码(连续 1 = 网络+子网位,连续 0 = 主机位)标识边界。对外仍表现为一个网络,对内细分为多个子网。
子网数 = 2借位数 | 每子网可用主机 = 2剩余主机位 − 2
块大小 = 256 − 掩码变化段(子网地址按块大小递增)
例题:192.168.1.0/24 均分 4 个子网 → 借 2 位 → /26,掩码 255.255.255.192,块大小 64:
| 子网 | 网络地址 | 可用主机范围 | 广播地址 | 可用主机 |
|---|---|---|---|---|
| #1 | 192.168.1.0/26 | .1 – .62 | .63 | 62 |
| #2 | 192.168.1.64/26 | .65 – .126 | .127 | 62 |
| #3 | 192.168.1.128/26 | .129 – .190 | .191 | 62 |
| #4 | 192.168.1.192/26 | .193 – .254 | .255 | 62 |
VLSM 变长子网:不同部门主机数不同时按需分配——先满足最大需求。例如 100 台(/25)、50 台(/26)、10 台(/28)、2 台点对点(/30),从大到小依次切,避免浪费。
5.3CIDR 与路由聚合
CIDR 无类别域间路由:取消 A/B/C 类,地址写成 IP/前缀长度,前缀任意长。两大意义:
- 分配更细:想要 500 个地址就给 /23,不再被迫领一整个 B 类。
- 路由聚合(构成超网):多个连续小网合成一条大前缀路由,大幅压缩路由表。判断能否聚合:取各网络地址的最长公共前缀。
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 | 链路本地 / APIPA | DHCP 失败时自动配置,出现它 = 没拿到地址 |
| 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:8329 → 2001:db8::ff00:42:8329。
| 对比项 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit | 128 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动手算:子网计算器
网络层协议
LEVEL 4 · 进阶网络层的任务是把数据报从源主机跨网络送到目的主机。IP 提供尽力而为的转发,ICMP 负责通报差错,NAT 缓解地址枯竭,DHCP 让设备即插即用。
6.1IP 首部与分片重组
IP 提供的是无连接、不可靠、尽力而为的服务:不建连、不确认、不重传、不保证顺序——可靠性全部交给 TCP。先看清首部每个字段(点击展开):
分片与重组(高频计算题)
不同链路 MTU 不同(以太网 1500、PPPoE 1492、有些广域网仅 576)。数据报超过下一跳 MTU 时,若 DF=0 则由路由器分片,到目的主机才重组:
每片数据须 ≤ 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 | 时间戳请求 / 应答 | 测量往返时延、粗估时钟差 |
tracert 用 ICMP 回显请求做探测,Linux traceroute 默认用 UDP。
ping 的隐藏能力:IP 选项(卷一名场面)
- 记录路由选项 RR(
ping -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 的不同端口。
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)。
路由协议
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(计数到无穷),收敛慢且期间可能成环。
RIPv1 vs RIPv2(卷一对照)
| RIPv1 | RIPv2 | |
|---|---|---|
| 类别 | 有类(更新不带掩码,靠接口掩码猜) | 无类(更新携带子网掩码) |
| 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 不可抢占(后加入的更强路由器不会夺权,保证稳定)。
LSA 链路状态通告的类型(卷一/考证高频)
| 类型 | 名称 | 谁产生 | 内容与泛洪范围 |
|---|---|---|---|
| Type 1 | Router LSA | 每台路由器 | 描述自己的直连链路与 cost;只在本区域内泛洪 |
| Type 2 | Network LSA | DR | 描述广播网络上挂了哪些路由器;本区域内 |
| Type 3 | Network Summary LSA | ABR 区域边界路由器 | 把一个区域的网段汇总通告给其他区域——区域间路由靠它 |
| Type 4 | ASBR Summary LSA | ABR | 告诉大家「怎么去 ASBR」 |
| Type 5 | AS External LSA | ASBR 自治系统边界路由器 | 引入的外部路由(如重分发的 BGP/RIP 路由);全 AS 泛洪 |
| Type 7 | NSSA External LSA | NSSA 区域内的 ASBR | 特殊末节区域内的外部路由,由 ABR 转成 Type 5 再送出 |
邻居状态机:从陌生到全同步
Down → Init(收到对方 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.9 | RIPv2 路由器 |
| 224.0.0.13 | PIM 组播路由器 | 224.0.1.1 | NTP 时钟协议 |
- 组播 MAC:
01:00:5E:+ 组播 IP 低 23 位。IP 组播地址的高 5 位不参与映射 → 32 个组播 IP 共享一个 MAC,网卡收到后还需 IP 层再过滤一次。 - IGMP 组管理协议:跑在主机与相邻组播路由器之间(封装在 IP,协议号 2),让路由器知道"本网段还有没有人要这个组"。v1:查询 + 报告,离组靠超时;v2 增加离组报文与指定组查询(加快收敛);v3 支持指定源组播 SSM(只要来自某源的节目)。
- 组播路由(路由器之间):PIM-DM 密集模式(先泛洪再剪枝,适合成员密集)、PIM-SM 稀疏模式(围绕汇聚点 RP 建共享树,适合成员稀疏的大网)。
7.6三大路由协议对比(高频考点)
| RIP | OSPF | BGP | |
|---|---|---|---|
| 类型 / 算法 | IGP · 距离向量 | IGP · 链路状态 (Dijkstra) | EGP · 路径向量 |
| 度量 | 跳数(≤15) | cost(带宽反比) | AS 路径 + 策略属性 |
| 交换对象 | 仅邻居 | 区域内所有路由器(泛洪) | TCP 对等体 |
| 交换内容 | 整张路由表 | 链路状态 LSA | 可达前缀 + AS 路径 |
| 更新方式 | 周期 30s 全量 | 触发式增量(+30min 刷新) | 触发式增量 |
| 封装 | UDP 520 | 直接封装在 IP(协议号 89) | TCP 179 |
| 收敛 | 慢(计数到无穷) | 快 | 慢但稳定(互联网级) |
| 适用 | 小型网络 | 中大型企业/校园网 | ISP / AS 之间 |
UDP 用户数据报协议
LEVEL 3 · 进阶UDP 只在 IP 之上加了两个能力:端口号(复用/分用)和可选的校验和。它的"简陋"恰恰是优势——无握手、无状态、延迟极低。
UDP 的特点
- 无连接:想发就发,没有握手挥手。
- 不可靠:不确认、不重传、不排序、不去重;丢了应用自己扛。
- 面向报文:应用给多长的报文就原样发多长(不合并不拆分)——应用要自己控制报文大小。
- 无流量/拥塞控制:网络再拥塞也照发(实时应用宁愿丢帧也不要延迟)。
- 支持一对一、一对多(组播/广播)、多对多。
- 首部仅 8 字节(TCP 至少 20),开销极小。
典型应用:DNS 查询(一问一答,丢了重问即可)、DHCP、SNMP、RIP、实时音视频/视频会议/直播(卡一帧比等重传强)、在线游戏状态同步、QUIC(HTTP/3 在 UDP 之上自己实现可靠性)。
TCP 传输控制协议
LEVEL 5 · 核心难点TCP 是全书最重的一章:在不可靠的 IP 之上凭空造出可靠、有序、双向的字节流。握手、确认重传、滑动窗口、拥塞控制——每一块都是面试与考试的高频区。
TCP 的特点(与 UDP 对照记)
- 面向连接:先三次握手,用后四次挥手;点对点(不支持组播广播)。
- 可靠交付:无差错、不丢失、不重复、按序到达。
- 全双工:双方都有发送缓存和接收缓存,可同时收发。
- 面向字节流:把应用数据看作无结构的字节序列,按序号组织;因此存在「粘包」问题,应用层需自行界定消息边界(长度前缀 / 分隔符 / 定长)。
9.1连接建立:三次握手(交互演示)
SYN 洪泛攻击:攻击者狂发 SYN 却不回第三次 ACK,服务端半连接队列被耗尽 → 防御手段 SYN Cookie(见第 12 章)。
9.2连接释放:四次挥手与 TIME_WAIT
点击上方演示区的「四次挥手模式」逐步观看。要点回顾:TCP 全双工,两个方向要分别关闭;被动关闭方收到 FIN 后可能还有数据没发完,ACK 必须立即回、FIN 要等数据发完,无法像握手那样合并,所以是四次。
① 若最后的 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),直接进拥塞避免线性增长——个别丢包不代表网络瘫痪,温和处理。
9.6TCP 有限状态机(11 个状态)
把握手、数据传输、挥手合在一起看,每条 TCP 连接都在这张状态机里流转(卷一核心图):
| 状态 | 含义 | 状态 | 含义 |
|---|---|---|---|
| CLOSED | 初始 / 终点 | FIN_WAIT_2 | 对方已 ACK,等对方的 FIN |
| LISTEN | 服务端等待连接 | CLOSE_WAIT | 被动方:收到 FIN 已 ACK,等应用关闭 |
| SYN_SENT | 主动方已发 SYN | CLOSING | 双方几乎同时发 FIN(同时关闭) |
| SYN_RCVD | 被动方收到 SYN 回了 SYN+ACK | LAST_ACK | 被动方发完 FIN,等最后 ACK |
| ESTABLISHED | 连接建立,正常收发 | TIME_WAIT | 主动方等 2MSL(见 9.2) |
| FIN_WAIT_1 | 主动方已发 FIN |
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 定时器 | 主动关闭方发完最后 ACK | TIME_WAIT 等待时长(见 9.2) |
9.9TCP 选项与连接管理细节
首部选项(握手时协商,卷一逐个抓包验证过)
| 选项 | 作用 | 细节 |
|---|---|---|
| MSS 最大报文段 | 声明"我单个报文段最多收多少数据" | 只在 SYN 报文中出现 | ;以太网典型 1460 = 1500(MTU) − 20(IP) − 20(TCP);目的:尽量不让 IP 层分片
| 窗口扩大因子 | 窗口字段只有 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 的端口——服务器重启立刻可拉起,网络编程必知。
应用层协议
LEVEL 4 · 进阶应用层协议直接服务于应用程序:域名翻译、网页传输、邮件收发、远程登录。每个协议都要记住四件事——干什么、走 TCP 还是 UDP、端口号、报文格式要点。
10.1DNS 域名系统
把 www.example.com 翻译成 IP 的分布式层级数据库(UDP/TCP 53)。层级:根域名服务器 → 顶级域服务器(.com/.cn/.org)→ 权威服务器(example.com 自己管)→ 本地 DNS 服务器(运营商/公司,负责代查并缓存)。
| 查询方式 | 行为 | 用在哪 |
|---|---|---|
| 递归查询 | "你必须给我最终答案"——代查到底 | 主机 → 本地 DNS |
| 迭代查询 | "我不知道,但你可以去问它"——返回 referrals | 本地 DNS → 根/顶级/权威 |
常用记录类型
| 记录 | 含义 | 记录 | 含义 |
|---|---|---|---|
| A | 域名 → IPv4 | MX | 邮件服务器 |
| AAAA | 域名 → IPv6 | NS | 该域的权威服务器 |
| CNAME | 别名 → 真名 | PTR | IP → 域名(反向解析) |
| 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),请求-响应、无状态。报文是纯文本:起始行 + 首部字段 + 空行 + 可选正文。
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Cookie: session=abc123
(空行)
(GET 无正文;POST 的正文放这里)
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-Match、Last-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 数据用对称加密传输。
10.5电子邮件 · FTP · SSH
SMTP:25
发送与服务器间转发邮件(推)。三个阶段:建连 → 邮件传送(MAIL FROM / RCPT TO / DATA)→ 释放。明文命令-应答式。
POP3 / IMAP:110 / :143
收取邮件(拉)。POP3:下载到本地后服务器默认删除,简单但多端不同步。IMAP:邮件留在服务器,本地只是"窗口",多端同步、可按文件夹管理——现代主流。
MIME
SMTP 只能传 7 位 ASCII 文本。MIME 扩展支持附件、图片、中文:Base64 编码 + Content-Type 声明。
FTP:21 控制 / :20 数据
双连接是其标志:21 端口传命令,数据走另一条连接。主动模式:服务器从 20 端口反向连客户端;被动模式:客户端再发起数据连接(穿 NAT 更友好)。明文,现多被 SFTP 取代。
SSH / Telnet:22 / :23
Telnet 明文传输已被淘汰;SSH 全程加密,支持口令/公钥认证,还常用来做端口转发与隧道(ssh -L/-R)。
WebSocket:80/443
借 HTTP 握手(101 升级)后转为全双工长连接,服务器可主动推送——聊天室、实时行情、协同编辑。
常用端口号速查
| 端口 | 协议 | 用途 | 端口 | 协议 | 用途 |
|---|---|---|---|---|---|
| 20/21 | FTP | 数据 / 控制 | 110 | POP3 | 收邮件 |
| 22 | SSH | 安全远程登录 | 143 | IMAP | 邮件同步 |
| 23 | Telnet | 明文远程登录 | 443 | HTTPS | 加密网页 |
| 25 | SMTP | 发邮件 | 179 | BGP | AS 间路由 |
| 53 | DNS | 域名解析 | 520 | RIP | 路由信息(UDP) |
| 67/68 | DHCP | 自动分配地址 | 3389 | RDP | Windows 远程桌面 |
| 80 | HTTP | 网页 | 3306 | MySQL | 数据库 |
10.6卷一经典小协议:TFTP · BOOTP · SNMP · NFS · Telnet
TFTP:69
极简版 FTP:只读写文件、无认证无目录列表。可靠传输自己实现——停止等待:每个 512B 数据块带块号,收到 ACK 才发下一块,超时重发。典型用途:无盘工作站启动、给路由器/交换机刷固件。
BOOTP:67/68
DHCP 的前身:无盘机开机广播请求 IP 与启动文件位置(再用 TFTP 下载内核)。DHCP 在其报文格式上扩展出"动态租约 + 选项",二者端口相同、报文兼容。
SNMP:161 / :162
简单网络管理协议:管理站用 get / set / get-next 读写设备上的 MIB 变量(按 OID 树形编号,如 1.3.6.1…);设备异常时主动发 trap 告警(162 端口)。路由器流量监控全靠它。
NFS / RPC:111 / :2049
Sun 的网络文件系统:挂载远端目录如本地。底层是 ONC RPC 远程过程调用(XDR 做数据序列化),端口由 portmapper(111) 动态注册查询——微服务 RPC 的思想源头。
Telnet / NVT:23
网络虚拟终端 NVT:把千差万别的终端统一抽象成一种虚拟格式,双方各自转换——"定义一个中间层屏蔽差异"是协议设计的经典手法。明文传输,已淘汰,仅作教学与端口测试(telnet host port)。
SLIP / CSLIP
串口拨号时代的链路层协议:帧尾 0xC0 定界,极其简单但无类型字段、无校验、需双方预知 IP。CSLIP 把 40 字节的 IP/TCP 首部压缩到 3–5 字节——拨号时代的"性能优化",被 PPP 取代。
场景串联
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 | 每经过一台路由器重写一次 |
| 网络层 | 源/目的 IP | 192.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 测端口,查防火墙与代理。
实现视角:从协议到代码
LEVEL 5 · 卷二精要《TCP/IP 详解·卷二》读的是 4.4BSD 内核源码:协议规范落到内存里是什么结构、一个包在内核里走过哪些函数。这一章提炼其中最有迁移价值的概念——懂了它们,socket 编程和性能调优都会豁然开朗。
12.1Socket:一条连接到底是什么
- 五元组唯一标识一条 TCP 连接:源 IP、源端口、目的 IP、目的端口、协议。同一客户端 IP 用不同源端口可以对同一服务器开数万条连接;服务器的 80 端口也能同时服务无数连接——靠四元组区分。
- Socket API 的标准舞步:服务端
socket → bind → listen → accept(循环);客户端socket → connect;然后双方send/recv,最后close。listen的 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 的关系(把概念对齐到内存)
发送缓冲 = [已发未确认] + [可发未发] + [不可发] ← 滑动窗口在其中滑动
接收缓冲上限 ≈ 对方看到的 rwnd 上限;内核默认缓冲太小会压垮高速长延迟链路的吞吐
吞吐上限 ≈ 窗口 ÷ RTT (窗口 64KB、RTT 100ms → 至多 5 Mbps:窗口扩大因子存在的理由)
卷二还实现了每条连接的四个定时器(9.8)、TIME_WAIT 的快速回收、拥塞窗口的维护——你在 9.x 学到的每个机制,在内核里都只是 PCB 上的几个字段加一个定时器。协议是规则,实现是状态机加计时器。
网络安全基础
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(现代轻量)。
自测题库
检验掌握程度20 道题覆盖全书重点。先在心里作答再点开核对;答错的题回到对应章节重读——目录里每道题都标了归属章节。