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

半连接队列与全连接队列:backlog 溢出时发生什么

macOS 的 listen(N) 让全连接队列正好容纳 N 个(上限 somaxconn = 128);队列满时服务端仍回 SYN-ACK,客户端 connect 成功但随后被 RST(与 Linux 丢 SYN 不同);netstat -L 的 qlen/incqlen/maxqlen。

网络协议 TCP 半连接队列 全连接队列 backlog somaxconn netstat 真实验证 动画演示
网络协议原理 2026-10-15

SYN Flood 与 SYN Cookie:防御原理

本机 syncookie = 1;用 netlab 拖慢握手并发起 20000 个并发连接,SYN-ACK 里出现 4243 个只有 MSS + SACK 的精简选项(与 cookie 的特征一致,但本机 netstat 的 TCP 计数全是 0,无法确认);SYN cookie 原理的计算演示。

网络协议 TCP SYN Flood SYN Cookie syncache netlab 真实验证 动画演示
网络协议原理 2026-10-15

序号与确认:字节流如何被编号、累积确认如何工作

逐包验证 TCP 序号 / 确认号:数据段的序号 + 载荷 = 下一个确认号,SYN / FIN 各占 1 个序号;4 MiB 下载 196 个数据段只回 45 个 ACK(累积确认);lo0 上发 4.5 GiB 真的看到序号从 4294960721 回绕到 9757。

网络协议 TCP 序号 确认号 累积确认 序号回绕 真实验证 动画演示
网络协议原理 2026-10-15

超时重传:RTO 的计算与指数退避

用 tcp_info 读 srtt / rttvar / rto:RTT 100 ms 时 rto 从 500 ms 收敛到 307 ms ≈ srtt + 4×rttvar + 200 ms 的 rexmt_slop;lo0 上 RTO 下限 230 ms;30% 丢包下首次重传间隔中位 316 ms,之后 353、437 ms,没有看到逐次翻倍。

网络协议 TCP 重传 RTO srtt rttvar 指数退避 真实验证 动画演示
网络协议原理 2026-10-15

快速重传:三个重复 ACK 的触发

2 MiB 传输 1.5% 丢包里 3 次重传的间隔都是 42 ms(≈ 一个 RTT),是快速重传;单个小包丢了没有后续数据触发重复 ACK,首次重传要等 181~275 ms,是前者的 4~7 倍。

网络协议 TCP 快速重传 重复ACK 尾部丢失 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号