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

TCP Fast Open:把数据塞进 SYN

实测 TCP Fast Open:macOS 上服务端 listen 后才能设选项、客户端用 connectx;cookie 与 SYN 带数据、50 ms 延迟下 202 ms 降到 101 ms、example.com 接受 SYN 里的请求;服务端密钥轮换后旧 cookie 被拒、数据不丢;客户端在 SYN 重传 3 次后对该目的地停用 TFO,停用只针对该目的地、至少 40 分钟没有恢复;Linux 容器对照:省一个往返、对不支持的服务端回退、SYN 数据可被重放、带数据的 SYN 被丢弃时每个连接多等约 1 秒。

网络协议 TCP TCP Fast Open TFO connectx SYN cookie 真实验证 动画演示
网络协议原理 2026-10-15

带宽时延积与套接字缓冲区:怎样把长肥管道填满

在 100 Mbit/s、RTT 100 ms 的 netlab 链路上扫描缓冲区:BDP 是 1,250,000 字节;接收窗口 256/512/1024 KiB 吞吐 2.53/4.98/9.91 MB/s,2048 KiB 起封顶 12.46 MB/s;过大的缓冲让 srtt 从 105 ms 涨到 197 ms;发送缓冲 64 KiB 只有 0.63 MB/s。

网络协议 TCP 带宽时延积 BDP SO_RCVBUF SO_SNDBUF bufferbloat 真实验证 动画演示
网络协议原理 2026-10-15

TCP 队头阻塞:一个包丢了,后面的数据都在等

实测 TCP 队头阻塞:单程 50 ms、丢包 3% 的链路上,UDP 的 p99 延迟 51.4 ms 但丢 3%;TCP 单连接 0 丢失但 28.8% 的消息延迟超过 80 ms,p99 229.8 ms;一次丢包通常拖住 9 条消息,并在同一时刻被一起释放;拆成 4 条连接降到 8.7%。

网络协议 TCP 队头阻塞 丢包 延迟 UDP 真实验证 动画演示
网络协议原理 2026-10-15

TCP 时间戳选项:RTT 测量与 PAWS

实测 TCP 时间戳选项:占 12 字节(lo0 载荷 16344−12=16332);时钟 1000 Hz;keepalive 探测不带时间戳;TSecr 配对 20/20 成功但抓包差值只是一半 RTT(50 对 100 ms);重传的 36 个段里 34 个 ACK 回显重传的 TSval,分得清是哪次发送;PAWS 只有计算。

网络协议 TCP 时间戳 TSval TSecr PAWS RTT Karn 真实验证 动画演示
网络协议原理 2026-10-15

丢包率对 TCP 吞吐的影响:用延迟与丢包注入实测

在 lo0 上用 netlab 注入延迟与丢包实测 TCP 吞吐:无丢包时往返 20 ms 为 193.57 MB/s、往返 100 ms 为 41.46 MB/s(窗口上限);5% 丢包让吞吐掉到基线的 2.2%;大多数格子实测与 Mathis 公式之比在 0.89~1.21;丢包率 ×4 吞吐约 ÷2.2~2.4。

网络协议 TCP 丢包 吞吐 Mathis公式 netlab 真实验证 动画演示
网络协议原理 2026-10-15

MSS 协商与钳制:隧道和 PPPoE 里的 MSS

实测 MSS 协商:SYN 里的 MSS = 接口 MTU − 40(lo0 16344、en0 1460);example.com 把 MSS 压到 1400,本机实际发出的最大段载荷 1388 = 1400 − 12;TCP_MAXSEG 在 connect/listen 前设置返回 EINVAL,连上后设置能把段限制在 1000 但不改握手;附各隧道应有 MSS 的计算表。

网络协议 TCP MSS MSS钳制 TCP_MAXSEG MTU 真实验证 动画演示
网络协议原理 2026-10-15

DNS 报文格式:头部、问题与资源记录,逐字节解析

逐字节解析 DNS 报文:29 字节查询(12 字节头 + 问题区);1.1.1.1 的 61 字节响应,记录名是指向偏移 12 的压缩指针 c0 0c;递归解析器标志 QR RD RA,权威服务器 QR AA 且无 RA,不托管的名字 REFUSED;名字压缩省 20%~41%;大小写原样回显,非法标签长度被丢弃。

网络协议 DNS 报文格式 名字压缩 RCODE AA RD RA 真实验证 动画演示
网络协议原理 2026-10-15

递归与迭代:一次域名解析要问几个服务器

自己从根开始迭代解析:example.com 3 问 757 ms(根 → com. → 权威),交给 1.1.1.1 递归只要 1 个查询;转介报文含 13 条 NS 和 11 条胶水并因 512 字节上限被截断;13 个根服务器往返从 7 到 280 ms(任播);www.bbc.co.uk 被抢先伪造应答(7.6 ms、两个矛盾答案、带 RA)。

网络协议 DNS 递归解析 迭代解析 根服务器 转介 胶水记录 DNS 伪造 真实验证 动画演示
网络协议原理 2026-10-15

DNS 缓存与 TTL:负缓存与过期时的行为

实测 DNS 缓存:1.1.1.1 / 8.8.8.8 返回的 TTL 在 101~300 间乱跳(背后多个缓存节点,没有干净的倒数);.invalid 的 NXDOMAIN 负缓存 86400 秒,NODATA 的 SOA TTL 1800 秒;对公网解析器命中与否在 290 ms 往返里看不出(差 1 ms),但本机操作系统缓存把 getaddrinfo 从 80.9 ms 降到 0.3 ms。

网络协议 DNS 缓存 TTL 负缓存 NXDOMAIN SOA mDNSResponder 真实验证 动画演示
网络协议原理 2026-10-15

A、AAAA、CNAME、MX、TXT、NS、SRV:记录类型实测

逐类型取 DNS 记录的原始 RDATA 字节并手工解读:A 4 字节、AAAA 16 字节、CNAME 与 MX 后半截用压缩指针、TXT 带长度前缀、SRV 端口 993、CAA 只允许 pki.goog、PTR 反向名字、HTTPS 记录里的 alpn=h3,h2;ANY 在 1.1.1.1 上直接 NOTIMP。每个答案都和 8.8.8.8 交叉核对。

网络协议 DNS 资源记录 A AAAA CNAME MX TXT SRV SOA CAA PTR HTTPS 真实验证 动画演示
网络协议原理 2026-10-15

DNS over TCP 与 EDNS0:什么时候不再用 UDP 512 字节

实测 DNS 的 512 字节限制与 EDNS0:不带 EDNS0 的根 DNSKEY 响应被截成 17 字节并置 TC,TCP 重问得 842 字节;OPT 记录 11 字节里藏着 1232 的载荷大小和 DO 位;TCP 新连接 612 ms 约为 UDP 285 ms 的两倍,线上 10 包对 2 包;1.1.1.1 对 2649 / 4689 字节的响应一律 TC,不产生 IP 分片。

网络协议 DNS EDNS0 DNS over TCP TC OPT IP 分片 真实验证 动画演示
网络协议原理 2026-10-15

DNSSEC:签名链与验证

自己从根信任锚验证 example.com 的 DNSSEC 签名链(8 环全部通过);RRSIG 的字段、签名有效期 50 小时、带签名的响应多约 107 字节;改一个地址 / 翻一个比特 / 过期后都会验证失败;dnssec-failed.org 在 1.1.1.1 与 8.8.8.8 上 SERVFAIL + EDE 9,加 CD 位则能取回;12 个常见名字里 4 个已签名。

网络协议 DNS DNSSEC RRSIG DNSKEY DS 信任锚 AD 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号