知其然,知其所以然
网络协议原理 2026-10-16

VPN 隧道的封装:IP-in-UDP 与 MTU 的连锁反应

在 Docker 的 Linux 里搭真的 GRE、VXLAN、WireGuard、IPsec ESP 隧道:每个包额外 +24 / +50 / +60~72 / +55~56 字节;VXLAN 不指定 dev 时 MTU 是 1500 不是 1450;超过隧道 MTU 时带 DF 本地报错、不带 DF 先在内层分片;1% 丢包下分成两个外层包的内层包丢失率 0.99% → 1.73%;TCP 开销 4.6% → 6.3% / 8.3% / 9.2%。

网络协议 VPN 隧道 封装 MTU 分片 WireGuard GRE VXLAN IPsec 真实验证 动画演示
网络协议原理 2026-10-15

分层与封装:一个 HTTP 请求在线上到底多了哪几层头

用 tcpdump 和 dpkt 把一个 HTTP 请求逐层拆开:82 字节的请求在 lo0 上多出 lo0 头 4 字节、IPv4 头 20 字节、TCP 头 32 字节;在真实以太网上再多 14 字节的以太网头,MSS 从 16344 降到 1460;1 MiB 下载头部占 0.35%(lo0)或 4.36%(以太网,公式);自己拼出的 IPv4 头与抓到的字节逐字节吻合。

网络协议 分层 封装 以太网 IPv4 TCP tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

以太网帧:MAC 地址、EtherType、最小帧长与 FCS

在真实网卡上抓 4007 个以太网帧:EtherType 0x0800/0x0806/0x86dd 决定载荷,目的地址分单播 / 广播 / 组播;MAC 第一个字节的两个标志位(本机的随机私有地址 0x7e vs 网关的全局地址 0x70);ARP 请求抓到 42 字节、对方的应答 60 字节,线上最小帧 64;ping -D -s 1472 帧长 1514,1473 被本机拒绝;FCS 抓包里看不到。

网络协议 以太网帧 MAC地址 EtherType 最小帧长 FCS tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

MTU 与 MSS:一个数据包最大能多大

实测 MTU 与 MSS:lo0 的 MTU 16384、en0 的 1500;SYN 里的 MSS = MTU − 40(16344 / 1460),example.com 一侧通告 1400;实际段长还要减 12 字节时间戳选项(16332 / 1388);macOS 上 TCP_MAXSEG 在 connect 前设置不生效;500 字节小块写比 1 MiB 大块写多 31 倍的包、慢 50 多倍。

网络协议 MTU MSS TCP选项 分段 tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

ARP:IP 怎么变成 MAC,缓存、老化与免费 ARP

在真实以太网上看 ARP:邻居表 81 条、网关路由标志 UHLWIir、max_age 1200 s;一次完整解析是 42 字节广播请求 + 60 字节单播应答(93.53 ms);无人应答时每秒重发一个请求、共 5 个,条目停在 (incomplete);30 秒的网段流量里请求 166 个(广播)、应答只抓到 2 个,免费 ARP 12 个、探测 7 个;发往本机自己地址不需要 ARP。

网络协议 ARP 邻居表 免费ARP tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

VLAN 与 802.1Q:帧里多出来的 4 字节

按 IEEE 802.1Q 用 struct 拼出带标签的以太网帧并让 tcpdump 解析(TPID 0x8100,TCI 拆成 PCP / DEI / VID,帧长 +4;Q-in-Q 的 0x88a8 外层标签 +8);这台机器的真实网口 20 秒内没有抓到任何带标签的帧;VLAN 号 12 位、可用 4094 个、PCP 8 级,32768 种组合打包后全部一致。

网络协议 VLAN 802.1Q QinQ 以太网标签 tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

回环接口:发给 127.0.0.1 的包到底走不走网卡

实测回环接口:本机任何本地地址(包括 en0 的地址)的路由出口都是 lo0,连自己的 en0 地址时 lo0 抓到 12 个包、en0 上 0 个;macOS 上只有 127.0.0.1 在 lo0 上,连 127.0.0.2 超时;ping 回环 0.178 ms 对网关 4.211 ms;1 字节乒乓 TCP 20.9 µs、UDP 24.5 µs、Unix 域 6.4 µs,而 1 GiB 灌入 TCP 6654 MiB/s 反超 Unix 域的 1524。

网络协议 回环 lo0 127.0.0.1 Unix域套接字 路由 真实验证 动画演示
网络协议原理 2026-10-15

接口、地址与子网掩码:ifconfig / netstat 里每个字段的含义

读懂 ifconfig / netstat:flags=0x8863 逐位拆开是 UP+BROADCAST+SMART+RUNNING+SIMPLEX+MULTICAST;netmask 0xfffffc00 = 255.255.252.0 = /22(1024 个地址、1022 个可用);这台机器 23 个接口里只有 lo0 和 en0 同时 UP 且有 IPv4;netstat 的多行共用一组计数;一个接口可以同时有 IPv4 和多个 IPv6 地址。

网络协议 接口 IP地址 子网掩码 ifconfig netstat 真实验证 动画演示
网络协议原理 2026-10-15

单播、广播、组播:同一个包到底发给了谁

同一个 UDP 载荷发给单播 / 子网广播 / 255.255.255.255 / 组播,目的 MAC 分别是网关的、ff:ff:ff:ff:ff:ff、ff:ff:ff:ff:ff:ff、01:00:5e:…(IP 低 23 位);两个套接字绑同一端口时单播只交给 1 个、广播和组播交给全部;ping 广播地址 2 个请求换来 52 个应答;网段里 30 秒有 789 个广播帧、926 个组播帧。

网络协议 单播 广播 组播 MAC地址 UDP 真实验证 动画演示
网络协议原理 2026-10-15

IPv4 头部逐字段:版本、IHL、TOS、TTL、协议号与校验和

逐字节解读真实收到的 IPv4 头:45 00 03 d4 ce aa 40 00 30 06 2e bf …(版本 4、IHL 5、总长 980、DF、TTL 48、协议 6、校验和验算通过);发出的包 TTL 64、id 0;IP_TOS 设 0x28 / 0xb8 原样出现在头里;20 秒网段流量里 2559 个 20 字节头、6 个 24 字节头(IGMP 的 Router Alert 选项)。

网络协议 IPv4 IP头 TTL DSCP IP选项 tcpdump 真实验证 动画演示
网络协议原理 2026-10-15

子网划分与 CIDR:用代码算网络号、广播地址与可用主机数

用代码算 CIDR:同一个地址不同前缀的网络号 / 广播 / 可用主机数;/31 与 /32 的特殊情况;VLSM 把 /24 切给 60/28/12/2 台四个部门且互不重叠;8 个连续 /24 聚合成 /21,没对齐只能部分合并;(ip & mask) == network 比 ipaddress 对象快 7 倍;本机路由表里 198 条目的地的前缀分布。

网络协议 子网 CIDR VLSM 路由聚合 最长前缀匹配 真实验证 动画演示
网络协议原理 2026-10-15

路由表与最长前缀匹配:看懂 netstat -rn 与默认路由

读懂本机路由表:default 的 UGScg、直连的 link#N、127 与 169.254 的省略写法;route get 对回环、本机地址、同网段、公网、组播、链路本地各选哪条路由;自己实现最长前缀匹配,12 个目的地 11 个与内核一致(本机地址是内核特判);2 万条路由下逐条扫描 1281 µs 对分桶哈希 0.9 µs。

网络协议 路由表 最长前缀匹配 netstat route 默认路由 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号