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

UDP 广播:SO_BROADCAST 与子网广播地址

往广播地址发 UDP 必须先开 SO_BROADCAST(否则 EACCES);受限广播与定向广播在以太网上都是 ff:ff:ff:ff:ff:ff;只有绑 0.0.0.0 的套接字能收到受限广播;局域网上 30 秒有 828 个广播帧、约 99.6 Kbit/s。

网络协议 UDP 广播 SO_BROADCAST 受限广播 定向广播 真实验证 动画演示
网络协议原理 2026-10-15

UDP 组播:加入组、TTL 范围与回环

加入组播组后 netstat 里多出 01:00:5e 加 IP 低 23 位的链路层地址,线上发出 IGMPv2 报告;32 个组播地址共用一个 MAC;只有加入了组的套接字收得到,默认 TTL 是 1,LOOP=0 本机接收方也收不到;成员关系按接口、按引用计数。

网络协议 UDP 组播 IP_ADD_MEMBERSHIP IGMP IP_MULTICAST_TTL 真实验证 动画演示
网络协议原理 2026-10-15

IGMP:成员关系查询与报告

解码 IGMPv2:加入组发 1 个成员报告(IP 目的是组地址)、离开发 Leave 到 224.0.0.2,8 字节、校验和正确;180 秒没有听到成员查询,别的设备 27 个源地址发了 79 个 224.0.0.251 的报告;netstat 累计收到 8 万多个报告。

网络协议 IGMP 组播 成员报告 成员查询 Router Alert 真实验证 动画演示
网络协议原理 2026-10-15

IGMPv2 与 IGMPv3:报文格式与源过滤

手工构造 IGMPv2 / v3 查询与报告并用 tcpdump 与 scapy 交叉解码(v2 报文 8 字节,v3 报告 8 字节头 + 每条记录 8 字节起);本机套接字能按源过滤(只要别的源就收不到),但 IP_BLOCK_SOURCE 对本机回送的包没生效;线上全是 v2,过滤只在内核里。

网络协议 IGMP IGMPv3 源过滤 组播 真实验证 动画演示
网络协议原理 2026-10-15

mDNS 与 Bonjour:.local 名字是怎么被组播解析的

60 秒抓到 3450 个 mDNS 包(185 个源地址,约 57.5 包/秒);问 _services._dns-sd._udp.local 得到 38 个应答、20 种服务类型;PTR → SRV + TXT → A / AAAA 三步各 70~90 ms 完成;.local 没人回答要等约 5 秒才放弃;TTL 4500 占应答记录的 73%。

网络协议 mDNS Bonjour DNS-SD 组播 .local 真实验证 动画演示
网络协议原理 2026-10-15

STUN 与 NAT 穿透:UDP 打洞的原理

解码真实 STUN 报文(请求 20 字节,XOR-MAPPED-ADDRESS 端口异或 0x2112 还原出本地端口);用 RFC 5780 测出本机 NAT 是与目的无关的映射,但过滤行为公共服务器测不出;STUN 重传按 RFC 共 39.5 秒;UDP 打洞模拟矩阵 16 种组合 13 种能通。

网络协议 STUN NAT穿透 UDP打洞 RFC5780 真实验证 动画演示
网络协议原理 2026-10-15

TCP 头部逐字段:序号、确认号、标志位与选项

逐字节解码真实 TCP 连接:SYN 头 44 字节(MSS 1460、窗口缩放 6、时间戳、SACK-permitted),相对序号与确认号逐包对应,数据包头 32 字节;lo0 下载 1 MiB 的 98 个包里 92 个纯 ACK;MSG_OOB 发出的 URG 包紧急指针为 1。

网络协议 TCP TCP头部 序号 确认号 标志位 选项 窗口缩放 URG 真实验证 动画演示
网络协议原理 2026-10-15

三次握手:SYN、SYN-ACK、ACK 与初始序号

三次握手的序号 / 确认号都是对方 ISN + 1;2000 个连接的 ISN 随机分布;SYN 无回应时 0~5 秒每秒一个、之后 2/4/8 秒退避(25 秒内共 9 个,只有第一个带 ECN);客户端 connect 比服务端 accept 早半个往返。

网络协议 TCP 三次握手 初始序号 ISN SYN重传 真实验证 动画演示
网络协议原理 2026-10-15

四次挥手:FIN、半关闭与 shutdown / close 的区别

抓包四次挥手(FIN → ACK → FIN → ACK,10 次都是 8 个包);半关闭后仍能收到 26 字节;close 时有未读数据发 RST 而不是 FIN;SHUT_RD 后对方再发数据被 RST;50 ms 延迟下 10 / 10 次同时关闭 FIN 交叉。

网络协议 TCP 四次挥手 FIN 半关闭 shutdown RST SO_LINGER 真实验证 动画演示
网络协议原理 2026-10-15

TCP 状态机:用 netstat 逐个观察 11 个状态

用 netlab 把回环的握手和挥手拖慢到 netstat 能抓到,逐个观察 TCP 的 11 个状态;客户端先关的路径(FIN_WAIT_1/2 → TIME_WAIT)、服务端(CLOSE_WAIT → LAST_ACK → 消失)、同时关闭(CLOSING)、握手期的 SYN_RCVD。

网络协议 TCP 状态机 netstat FIN_WAIT CLOSE_WAIT TIME_WAIT 真实验证 动画演示
网络协议原理 2026-10-15

TIME_WAIT:为什么要等 2MSL,大量堆积怎么办

macOS 的 MSL 是 15 秒,TIME_WAIT 实测持续 31.3 秒;同一四元组在 TIME_WAIT 期间连不上(即使设了 SO_REUSEADDR);谁先 close 谁留下 TIME_WAIT;短连接 15696 次后临时端口耗尽(Can't assign requested address);SO_LINGER 0 能省掉 TIME_WAIT 但发 RST。

网络协议 TCP TIME_WAIT 2MSL 临时端口 SO_LINGER 真实验证 动画演示
网络协议原理 2026-10-15

RST:哪些情况会收到连接重置

RST 的序号规则:对 SYN 回 ACK+RST(序号 0,确认号 = SYN 序号 + 1);对带 ACK 的数据段,RST 序号 = 该段的确认号;对端 FIN 后再发数据先成功一次、之后 EPIPE、recv 得 ECONNRESET;本机上 RST 之前到达的数据仍可读。

网络协议 TCP RST 连接重置 ECONNRESET EPIPE 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号