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

NAT / NAPT:端口映射表怎样改写地址

用 STUN 实测本机出口的 NAT:外部看到的是公网地址、端口保留,与目的无关的映射;40 个套接字里 39 个保留端口(4500 被改成 3319);traceroute 看不到被改写的源地址;NAPT 表的纸面模型演示端口冲突、入站过滤和校验和更新。

网络协议 NAT NAPT STUN 端口映射 端口保留 真实验证 动画演示
网络协议原理 2026-10-15

私有地址、链路本地(169.254)、回环与保留地址段

14 段特殊用途地址合计 592,708,608 个(13.80%);Python 的 is_private 漏掉 100.64/10;往私有、文档、保留地址发包都走默认网关,169.254 和本网段未用地址先 ARP;127.0.0.2 绑不了也连不上,0.0.0.0 连的是本机;公网路径上有私有地址的路由器。

网络协议 特殊地址 私有地址 链路本地 回环 保留地址 真实验证 动画演示
网络协议原理 2026-10-15

ICMP 限速与重定向:系统为什么不回你每一个包

实测 ICMP 差错限速:本机对端口不可达最多每 100 ms 回一个(374,840 个包只回 31 个),echo 应答与 TCP RST 不受限;默认网关 100 个只回 3~4 个;时间戳 / 地址掩码请求不回应;net.inet.icmp 下没有限速 sysctl。

网络协议 ICMP 限速 重定向 echo RST 真实验证 动画演示
网络协议原理 2026-10-15

IPv6 头部:固定 40 字节与扩展头

逐字节解码 lo0 上的 IPv6 头(40 字节固定,无校验和,ICMPv6 校验和覆盖伪头部);IPv6 头比 IPv4 头多 20 字节、MSS 差 20;流标签由内核按套接字生成;en0 上 25 秒 275 个 IPv6 包的跳数限制只有 255 与 1;手工构造的扩展头链用 tcpdump 与 scapy 解码。

网络协议 IPv6 IPv6头 扩展头 流标签 跳数限制 真实验证 动画演示
网络协议原理 2026-10-15

IPv6 地址:前缀、作用域、链路本地与缩写规则

本机 8 个接口共 9 个 IPv6 地址、全部是回环或链路本地(没有公网 IPv6);2001:db8::1 有 20936 种合法写法;链路本地地址必须带接口编号才能发送;ff02::1 ping 得到 146 个地址的应答;邻居里 80 / 172 个地址由 MAC 推出。

网络协议 IPv6 IPv6地址 链路本地 EUI-64 作用域 组播 真实验证 动画演示
网络协议原理 2026-10-15

邻居发现 NDP:取代 ARP 的 NS / NA / RS / RA

实测 IPv6 邻居发现:STALE 邻居在发数据后经过 DELAY(约 5 秒)进入 PROBE,单播 NS 得到 NA 后回到 REACHABLE;解析不存在的邻居时 NS 发往被请求节点组播地址、重传 4 次;ND 报文跳数限制全是 255;en0 上没有收到过路由器通告。

网络协议 NDP 邻居发现 NS NA NUD IPv6 真实验证 动画演示
网络协议原理 2026-10-15

SLAAC 与隐私地址:IPv6 地址怎么自己生成

本机 SLAAC 相关参数(临时地址首选 24 小时、有效 7 天、DAD 发 1 次);EUI-64 / 稳定不透明 / 临时三种接口标识符的计算与换网络后的差别;120 秒没有听到任何 RA;没有 IPv6 路由时 getaddrinfo 只返回 IPv4,connect IPv6 在 0.1 ms 失败。

网络协议 SLAAC IPv6 EUI-64 临时地址 隐私扩展 DAD 真实验证 动画演示
网络协议原理 2026-10-15

双栈与 Happy Eyeballs:先连 IPv6 还是 IPv4

IPV6_V6ONLY=0 的双栈监听同时服务 ::1 与 127.0.0.1;IPv6 一端慢(往返 800 ms)时顺序回退 801 ms,Happy Eyeballs 255 ms;真实的 IPv6 黑洞上 asyncio 关闭 Happy Eyeballs 卡死、打开 0.25 则 254 ms 连上 IPv4;延迟值就是额外等待上限。

网络协议 双栈 Happy Eyeballs IPv6 IPv4映射地址 getaddrinfo asyncio 真实验证 动画演示
网络协议原理 2026-10-15

UDP:8 字节头、校验和与“无连接”的真正含义

解码 lo0 上的 UDP 头(8 字节,长度 = 8 + 载荷);UDP 保留报文边界、缓冲区太小会截断,TCP 把三次发送合并成 60 字节;一问一答 UDP 2 个包约 1 个往返、TCP 12 个包约 2 个往返;临时端口随机分配;数据报上限 65507,默认只能发 9216。

网络协议 UDP UDP头 报文边界 端口 无连接 真实验证 动画演示
网络协议原理 2026-10-15

UDP 的丢包、乱序与重复:本机能不能复现

netlab 造的随机丢包(5% 实测 4.7%,独立随机、不乱序);限速管道让突发 1000 个只收到 100 个、延迟 881 ms;用户态中继造乱序重复并用序号算法检测与真实记录一致;真实互联网上公共 DNS A 丢 13.3%;停等协议在 40% 丢包下重发 332 次。

网络协议 UDP 丢包 乱序 重复 netlab 停等协议 真实验证 动画演示
网络协议原理 2026-10-15

DHCP 四步:DORA、租约与续约

解码本机当前的 DHCP 租约(租约 1800 秒,T1 = 817 秒);实发一次 DHCPDISCOVER(伪造 MAC,不发 REQUEST)收到 114.2 ms 后的 OFFER;自己解码与 scapy 一致;30 分钟被动抓包抓到本机两次续租 REQUEST / ACK,间隔 801.0 秒;DHCP 配置与系统实际一致。

网络协议 DHCP DORA 租约 T1 T2 BOOTP 真实验证 动画演示
网络协议原理 2026-10-15

UDP 接收缓冲区溢出:丢包发生在哪一层

UDP 默认接收缓冲区 786,896 字节、上限 8 MiB;不读的接收方对 100 / 1000 / 8000 字节的数据报分别只能攒 4099 / 762 / 97 个;读得慢时默认缓冲区丢 80.7%、8 MiB 缓冲区不丢;发送方 sendto 全程不报错,netstat 的计数是整机共用的。

网络协议 UDP 接收缓冲区 SO_RCVBUF 丢包 netstat 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号