知其然,知其所以然
网络协议原理 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 默认路由 真实验证 动画演示
网络协议原理 2026-10-15

IP 分片与重组:超过 MTU 的包是怎么拆开的

在 en0(MTU 1500)上抓到 4000 字节 UDP 数据报被拆成 3 个同 id 分片(偏移 0/1480/2960,MF 1/1/0,只有第一片带 UDP 头);lo0 上 40000 字节不分片;按公式 5% 丢包下 41 片的数据报只有约 12% 能送达;TCP 下载 303 个包里 302 个带 DF。

网络协议 IP分片 MF 片偏移 重组 DF MTU 真实验证 动画演示
网络协议原理 2026-10-15

TTL 与 traceroute:逐跳探测的原理

默认 TTL 64;抓包看 traceroute:UDP 探测 TTL 递增、端口 33435 起逐个加 1,路由器回 ICMP 11/0 并引用原包,目的地回 3/3;15 跳里 2 个全无应答、6 个多路径;自己用 IP_TTL 实现 traceroute;收到包的 TTL 估跳数与实测差 0~2。

网络协议 TTL traceroute ICMP Time Exceeded 跳数 真实验证 动画演示
网络协议原理 2026-10-15

ICMP echo:ping 的往返时间从哪里来

抓包看 ping:类型 8/0、84 字节的 IP 包、载荷前 8 字节是发送时间戳;ICMP 校验和手算与抓包一致;ping 报的 RTT 比抓包多 0.08~0.5 ms;4000 字节载荷被分成 3 片;用非特权 ICMP 套接字自己发 echo。

网络协议 ICMP echo ping RTT 校验和 真实验证 动画演示
网络协议原理 2026-10-15

ICMP 差错报文:目的不可达、超时、需要分片

抓包看 ICMP 差错报文:UDP 端口不可达(类型 3/3)引用 28 字节原包,connect 过的 UDP 才能收到错误;TCP 用 RST 拒绝、网关拒绝要 1005 ms(SYN 重发一次)、防火墙丢弃要等 3001 ms 超时;12 个目的地只有 4 个回差错;引用长度 28 与 40 字节两种;广播不回差错。

网络协议 ICMP 差错报文 目的不可达 端口不可达 RST 真实验证 动画演示
网络协议原理 2026-10-15

路径 MTU 发现:DF 位、ICMP 与“黑洞”

实测路径 MTU 发现:DF 置位的 1500 字节 UDP 在公网路径第 3 跳处得到 ICMP 3/4(下一跳 MTU 1492),≤1492 的全部到达;本机设了 DF 的超大包直接 EMSGSIZE;UDP 收到 3/4 后内核路由缓存没变;黑洞的后果用模拟说明。

网络协议 PMTUD 路径MTU DF ICMP 分片 MSS 黑洞 真实验证 动画演示
网络协议原理 2026-10-15

校验和:IP / TCP / UDP 的反码求和,手算并核对

手算 IPv4 头与 UDP 校验和并在 53 个真实包上核对全部通过;lo0 上校验和被卸载所以抓到的是 0;16 位字调换查不出来(CRC-32 查得出);增量更新公式在 53 个 TTL 和 18 个 NAT 改写上与整体重算一致;算出 0 的 UDP 校验和线上发 0xffff。

网络协议 校验和 反码求和 伪头部 RFC1071 RFC1624 CRC 真实验证 动画演示
网络协议原理 2026-10-15

DSCP 与 ECN:服务类型字段里的两种标记

TOS 字节 = DSCP + ECN,IP_TOS 设的值在 lo0 和 en0 上原样出现;公网路径上 DSCP 被清成 0 而 ECN 位保留;SO_TRAFFIC_CLASS 不会自动打 DSCP;TCP 主动连接的 SYN 带 SEW,4 个主机全部接受 ECN;TOS 按套接字设置,不随连接继承。

网络协议 DSCP ECN TOS QoS IP_TOS 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号