一个塞满的缓冲区,看起来和一条慢链路一模一样——这就是全部问题
所有人都默认网络缓冲区越大越安全。跑一下这个仿真:把缓冲区调大,它会把一条快链路变成一条「感觉上很慢」的链路,而吞吐数字一点都没变。
Overlay 与 mesh 组网、VPN、NAT 穿透、路由,以及搬运数据包的协议——包含协议细节与可复现的实验。
80 篇文章
所有人都默认网络缓冲区越大越安全。跑一下这个仿真:把缓冲区调大,它会把一条快链路变成一条「感觉上很慢」的链路,而吞吐数字一点都没变。
我把一个真实 mesh VPN 的线协议用 C 在 ESP32 上重写了一遍,然后把编码器编译到笔记本上,看它真正吐出的字节。第一个把我绊住的,是一个会「撒谎」的头字段——而这个谎是承重的。
我跟踪了对本站的一次真实请求,把每个阶段都计时了。意外的不是总耗时,而是服务器只占其中一小部分——以及如果要优化,最该动的是哪个阶段。
动手实操 Modbus —— 那个驱动工厂的极简协议。通过 TCP 和 pty 模拟的 RS485 链路,展示真实请求/响应字节、CRC16 校验和异常处理。
在 Linux 上用 SocketCAN 和虚拟 vcan0 接口搭起一条 CAN 总线:真实帧、真实的仲裁规则、candump、cansend、cansniffer、CAN-FD,以及通往真实硬件的路径。
iproute2 的 `ip rule` 策略路由让内核按源地址、fwmark 或接口来选择路由表,而不只看目的地址。用真实的 `ip route get` 输出,演示双出口、按源路由、VPN 分流隧道和 IPv6。
一次真机 IPv6 防火墙实验:用一张 nftables inet 表同时给 IPv4 和 IPv6 设防,讲清 IPv6 离不开的 ICMPv6/NDP 规则、链路本地与多播放行、默认拒绝的 input 链,附真实放行与拦截的测试输出、计数器,以及和 ip6tables 的对比。
证书吊销是怎么回事:CRL、OCSP 各自的问题与隐私代价,用 ssl_stapling 在真实 Docker 实验里配置 nginx 并以 s_client -status 验证,Must-Staple 的兴亡,以及 Let's Encrypt 2025 年关停 OCSP 如何改变了一切。
一篇带真实输出的 systemd-networkd 与 NetworkManager 对比:.network 声明式文件对比 nmcli 连接配置文件、同一份静态 IP 的两种写法、各自如何供 DNS 给 systemd-resolved,以及为什么两个一起跑是坏主意。
为什么 500 Mbit/s 的链路只跑出 14 Mbit/s:接收窗口、TCP 窗口缩放、带宽延迟积,以及套接字缓冲区与自动调优如何决定真实上限——全部用真实的 iperf3、tcpdump、netem 与 ss -ti 输出说话。
在真实文件上实测 brotli 与 gzip:完整的 gzip 1-9 与 brotli 1-11 字节数对照表、压缩级别的 CPU 开销、nginx gzip 与 brotli 模块配置、构建期预压缩静态资源、BREACH 风险,以及哪些内容不该压缩。
MQTT 5 带来了共享订阅、请求响应、用户属性、消息过期和真正的 reason code。这篇用 mosquitto 2.1.2 逐个实测,看看哪些特性真正改变了设备端的设计。
我跑了一个一次性的单节点 NATS JetStream,输出全部原样贴出:建流、发布消息、持久化消费者、显式 consumer acks,以及一次 least-once 反例演示——故意不 ack 的消息带着 tries: 2 和 num_redelivered: 1 回来了。另附 retention 策略、limit 上限和 KV 层的真实结果,以及与 Kafka 的诚实对比。
条件请求让客户端在下载正文之前先问一句「变了吗」。用一次性 nginx 跑真实 curl 输出:ETag + If-None-Match 返回 304 Not Modified、正文 0 字节,If-Modified-Since 与 ETag 的对比,If-Match 返回 412 做乐观并发,以及 Range 返回 206 支持断点续传。
从实践角度解释证书透明机制:用 openssl 从真实证书里解出 SCT、认出签发它的 CT 日志、梳理 Chrome 的强制策略,再查询公开 CT 日志数据,第一时间发现误签发到你域名下的证书。
无需 DHCP,主机如何自动获得 IPv6 地址——RS/RA 交换、前缀信息、A/M/O 标志、EUI-64 与稳定隐私地址、真实 radvd 输出。
systemd-resolved 是大多数系统早已在跑、却被悄悄绕开的本地缓存存根解析器,监听 127.0.0.53。一篇结合 resolvectl、缓存、分流 DNS、DNS over TLS 与 mDNS 的实战走读,全部输出来自一台 Arch 主机。
完整 TLS 握手到底要花多少往返和字节;TLS 1.2 的会话 ID 与会话票据、TLS 1.3 的 PSK 票据如何让重连客户端跳过大部分工作;用 openssl s_client -sess_out/-sess_in 亲眼验证;nginx ssl_session_cache 调优;以及 TLS 1.3 0-RTT 的重放代价。
一次完整的 DNSSEC 实践:用 BIND 内联签名对真实区域签名,检查 DNSKEY/RRSIG/DS/NSEC 记录,通过验证解析器观察 ad 标志,故意破坏信任链后看 SERVFAIL,并了解密钥轮换为何让 DNSSEC 运维如此痛苦。
一份实用的 WireGuard 排障阶梯,全部基于真实的 wg show、tcpdump 与 conntrack 输出:公钥配错、AllowedIPs 打错、NAT 后面的 PersistentKeepalive、MTU 让大包卡死——每个故障都在一次性容器里真实复现。
一次真实的 Consul 实验:在 127.0.0.1 上跑一个一次性 dev agent,注册一个带 HTTP 健康检查的服务,看着它变成 critical,用 DNS 接口和 HTTP API 查询,再用 Consul KV 存配置——全部是真输出,跑完即拆。
半开连接可能滞留数小时。通过真实实验和计时数据,了解 TCP keepalive(SO_KEEPALIVE、TCP_KEEPIDLE)和应用层心跳如何检测死对端。
一次 DNS 区域传送(AXFR)会把整个区域的主机名一次送给陌生人。本文用 127.0.0.1 上真实的 BIND 实验,展示 dig AXFR 成功拖走整个 zone、allow-transfer { none; } 后被真实 REFUSED、TSIG 只放行备用服务器,以及 NSEC3 签名后的传送内容,并给出自查清单。
一次动手对比 HTTP/2 与 HTTP/1.1:用一次性 nginx 容器跑出真实 curl 与 nghttp2 输出,讲清 HTTP/2 多路复用、HPACK 头压缩、nginx http2 配置、TCP 队头阻塞为何要靠 QUIC,以及在本地与高延迟链路上分别量到的诚实数字。
如何使用 nginx stream 模块作为 TCP/UDP 代理。通过真实配置讲解 L4 与 L7 的区别、ssl_preread SNI 路由、UDP 代理、负载均衡和 proxy_protocol。
一份动手的 Python 抓包与组包教程:用 Scapy 手工构造 ICMP echo、一个 Ethernet/IP/TCP 帧和一个真实的 DNS 查询,只发到 127.0.0.1,再把回包嗅探回来。附真实的 show()、hexdump() 与解析器输出,以及 NET_RAW 与授权使用的边界。
用 tc netem 和 tbf 在 Linux 上模拟广域网延迟、丢包和限速。所有数据来自一次性 Docker 容器的真实测量:ping RTT、限速前后吞吐量、tc -s 计数器。
用 Go 构建一个真正的双向 TCP 代理——io.Copy、优雅关闭、超时、连接计数——80 行代码学会代理编程的完整模型。
Accept-Ranges、Range、Content-Range、206 Partial Content 与 416 到底是干什么的,下载工具和视频播放器为什么离不开它们,If-Range 如何让断点续传在文件变化时依然安全,为什么动态生成的响应往往做不了范围请求,以及在 nginx 里怎么开启它(以及什么会把它弄坏)。
我把一个一次性的 gRPC 服务和一个等价的 REST 接口并排跑起来,然后量了线上真实的数据:grpcurl 调用与反射、HTTP/2 分帧、protobuf 与 JSON 的字节数、四种流式调用、以及 deadline 超时——最后写下 gRPC 与 REST 各自到底在哪里赢、代价又在哪里。
一旦在应用前面放上 CDN、负载均衡或反向代理,$remote_addr 就变成了代理自己,而不是你的用户。本文讲清 X-Forwarded-For、X-Real-IP、Forwarded 的语义,nginx real_ip 如何用 set_real_ip_from 与 real_ip_recursive 重写客户端地址,为什么 proxy_protocol 更难被伪造,以及盲目信任一个不是你写的头部会带来什么后果。
WebSocket 还是 Server-Sent Events?我把一个回声服务器和一个事件端点放到 nginx 后面,抓下了真实的 101 握手、text/event-stream 帧、带 Last-Event-ID 的重连,以及缓冲那个坑——最后整理成一份决策清单。
Kafka 不是队列——它是一个只追加、可分区的日志,配上消费者 offset,而这一个差别解锁了重放与多组彼此独立的消费者。我用一个一次性、单 broker、KRaft 模式的集群跑了真实的 topic 创建、消费者组 offset、rebalance 与日志压实,输出原样贴出,并诚实交代它什么时候是过度设计。
用跑一遍的方式学共识:一个一次性的三节点 etcd 集群,真实的 etcdctl 输出,watch 与 lease,一个事务,杀掉 leader 后证明 quorum,还有 Raft 为什么偏爱奇数。
用 openssl 搭一套极小的 PKI,让 nginx 通过 ssl_verify_client 强制要求客户端证书(client certificate),再用 curl 与 openssl s_client 验证握手,并绕开 EKU、SAN、证书链与吊销这几个最容易踩的坑。
一份动手验证的 Caddy vs nginx 反向代理对比:同一个任务分别用两边写,真实的 curl -I 输出,HTTP/3 与压缩,TLS 证书处理(automatic HTTPS 对比 certbot),配置体量与易用性,以及一份决策清单。
消息队列是几乎所有扩容问题的默认答案,而大多数时候它是错的。我用一次性的 NATS、RabbitMQ 和 Postgres 容器,演示队列到底给你带来什么:真实的 pub/sub 扇出、带竞争消费者的工作队列、进入死信队列的 at-least-once 重投,以及一个用 FOR UPDATE SKIP LOCKED 的普通 SQL 表。
几分钟搭起一个容器 DNS 服务器:一份最小的 CoreDNS Corefile,从 zone 文件提供自定义权威区域,未知域名转发上游,再用 dig @127.0.0.1 -p 15353 逐条戳它——包含真实的 NXDOMAIN、SERVFAIL、CNAME 链和 TTL 输出。
一份从容器内部出发的 Docker networking 实操:docker0 怎么发 IP、怎么 NAT 到外网,veth 如何把 eth0 接到网桥,user-defined bridge 为什么自带 DNS,-p 到底做了什么,host/none/macvlan/overlay 的取舍,以及用真实输出调试 container networking 的固定套路。
一份实用的 curl 教程,讲清我日常真正在用的 curl flags:用 -v/-i/-D 读请求与响应,用 curl -w timing 里的 %{time_total} 拆分耗时,-L 与 --max-redirs,--fail 与 exit codes,-d/--json/-F 发请求体,-H/-A/-e 设置请求头,-u/--netrc 做认证,HTTP/2 与 HTTP/3,用 --resolve 做本地测试,以及调 HTTP 请求时为什么 -v 远比瞎猜管用。
一篇务实的 BGP homelab 指南:BGP 这个协议到底在做什么,什么时候 multi-homing、ISP 故障切换,或者你自己的 IPv6 PI space 才值得上它,BIRD 与 FRR 的现实选项,你必须先搞懂的概念(AS、prefix、local-pref、路由过滤),一份最小的可用配置,以及一个坦诚的建议。
为什么默认云端化的智能家居是一种负债,一个由 Home Assistant、Zigbee、Z-Wave 和本地 MQTT 组成的 local smart home 如何运转,如何挑选厂商倒闭后仍能用的设备,以及那些没人愿意提的老实难点。
一次讲清 QUIC 与 HTTP/3:它们要解决的 TCP 队头阻塞、握手过慢与中间盒僵化,基于 UDP、内建 TLS 1.3、流与连接迁移,0-RTT 与 1-RTT 握手、QPACK,以及 nginx 与 Caddy 里的 UDP 443 运维和测试方法。
TCP 拥塞控制,就是内核在几乎不了解路径的情况下自己决定发送速率。slow start、congestion avoidance、fast recovery 三个阶段,为什么 CUBIC 是 Linux 默认,BBR 如何建立带宽延迟积模型,怎么读 `ss -ti`,用 sysctl 切到 BBR,以及 bufferbloat。
WireGuard 装进容器看起来很简单,直到内核模块、/dev/net/tun 和 NET_ADMIN 开始作祟。一份实用的 WireGuard Docker 指南:主机命名空间 vs 容器命名空间、NET_ADMIN、wireguard-go 兜底、kill switch 与路由陷阱、把密钥留在镜像之外,以及什么时候干脆别用容器。
一篇讲透 HTTP 缓存的实用指南:浏览器、CDN 与反向代理三层缓存谁听谁的,真正重要的 Cache-Control 指令,ETag 与 Last-Modified 校验器,304 Not Modified 往返过程,no-cache 的经典误读,指纹缓存与重验证之别,Vary 与 Cookie,以及一份可用的静态站点 nginx 配置。
一份 nftables 实战指南:从 tables/chains/rules 心智模型讲起,给出服务器可直接复制的默认拒绝规则集,用集合与命名区间管理 IP 列表,讲清 masquerade 与端口转发 NAT、持久化,以及如何读懂 nft list ruleset,并附上不把自己锁在 SSH 门外的回滚办法。
一篇务实的加密 DNS 指南:明文 DNS 会泄露什么、泄露给谁;DNS over TLS 与 DNS over HTTPS 有何区别;DoQ 能带来什么;加密究竟保护了查询内容,又永远藏不住 SNI、目标 IP 和你所使用的解析器;运营者要面对的那些取舍;以及 Unbound 与 systemd-resolved 的具体配置。
一篇把 IPv6 家庭网络跑通的实操指南:先确认运营商真的做了前缀委派,再让路由器用 SLAAC 通告一个 /64,把 IPv6 防火墙收紧成默认拒绝入站,配好 AAAA 记录,并排查一条残缺 IPv6 路径造成的卡顿。
一旦有人入职或要更换密钥,authorized_keys 的散乱就崩了。SSH 证书能治好它:一个 SSH CA 用 principals 和有效期来签用户证书,主机证书干掉 TOFU 提示,短时效凭证则让吊销列表变得多余。附可复制的 ssh-keygen -s 与 sshd 配置。
把本地、远程与动态 SSH 端口转发讲具体,加上用 ProxyJump 穿跳板、autossh 与一份 systemd 单元保活,并诚实说清 ssh 隧道在哪一刻不够用、该改用 WireGuard 或 mesh 覆盖网络。
简明拆解 WireGuard 的工作原理:拒绝协商的设计哲学,Curve25519、ChaCha20-Poly1305、BLAKE2s 与 HKDF 四大原语,Noise_IK 握手与前向保密,基于定时器的重新握手,端点漫游,以及为什么 AllowedIPs 就是加密路由。
一个 IP 一个计数器根本不算限流。本文讲清楚你到底在防什么、为什么固定窗口和滑动窗口会失手、令牌桶如何处理突发、该在哪一层拦截、小服务不用 Redis 怎么做限流,以及如何返回带 Retry-After 的、诚实的 429。
面向静态站点的实用安全响应头指南:HSTS 及其 includeSubDomains 陷阱、严格的 Content-Security-Policy、X-Content-Type-Options、Referrer-Policy、frame-ancestors、Permissions-Policy 与 CORS 基础,外加 nginx add_header 的继承陷阱、修复办法和测试方法。
为什么 Go 网络工具总能胜出:单文件静态二进制、一条命令交叉编译、自带 TCP 代理与 DNS 客户端的 net 包、用 goroutine 处理并发连接,以及最先咬到你的并发陷阱——无上限的 goroutine、连接泄漏、缺失的超时。
写一份 ssh config 是我在命令行上做过的性价比最高的一次效率升级。接着是 ssh 隧道:本地、远程与动态端口转发,用 ProxyJump 穿过跳板机,以及 ed25519 密钥和 ssh-agent。附可直接复制的配置与命令,还有那些同时改善日常体验的加固项。
简洁地走一遍在地址栏敲下 URL 后的完整链路:浏览器缓存、经存根与递归解析器到权威服务器的 DNS 解析、TCP 握手与慢启动、TLS 1.3 握手、反向代理这一跳、缓存头、浏览器渲染,以及 HTTP/2 与 HTTP/3 的连接复用。
一个只用标准库、一次就能读懂的 Python pcap 解析器:全局头与数据包记录、字节序与 snaplen、何时该用 scapy 或 dpkt、何时手写反而更划算、从以太网到 IPv4 再到 TCP 的 5 元组提取、pcapng 块结构速览,以及流式处理的性能笔记。
一篇讲清怎么读第一次 packet capture:什么时候抓包比翻日志更管用,如何用 tcpdump(-i、BPF 过滤器、-w 存文件、snaplen)正确地抓,三次握手、重传、RST 与读不了的 TLS 字节在 Wireshark 里长什么样,以及一个“这条连接为什么慢”的实战排查例子。
逐条消息走一遍 TLS 1.3 握手:它必须达成什么、ClientHello 里的 key_share、CertificateVerify 与 Finished、它与 TLS 1.2 的区别、0-RTT 的重放代价,以及如何在 openssl s_client 和 Wireshark 里读懂整个握手。
一份实战版 TLS 证书错误指南:证书链不完整、SNI 缺失、证书过期、主机名不匹配、自签名证书、时钟偏移、协议/加密套件不匹配、Let's Encrypt 速率限制,以及 HSTS——每种都给出原因、能验证它的 openssl s_client 命令,以及具体的修法。
一篇务实的家庭网络分段指南:IoT 设备与横向移动带来的真实风险,从免费的家庭访客网络到带网管交换机的 VLAN home network 的各种方案,一份具体的拓扑、防火墙规则,以及关于该做到哪一步的坦诚建议。
一份 ESP32 TCP 调试实战指南:lwIP socket 缓冲区、Wi-Fi 重传与 Nagle/延迟 ACK 的相互作用如何造成卡顿、复位与半开连接;哪些统计与 Wireshark 视图能真正揭示 TCP 重传;附 ESP-IDF 代码片段与排查清单。
一篇讲透 ESP32-C3 电源管理的实战笔记:为什么 Wi-Fi 射频才是耗电大头,active、modem sleep、light sleep 与深度睡眠各自在连通性上要付出什么代价,DTIM 与监听间隔如何用延迟换续航,怎样低成本测出真实电流,以及把设备设计成周期上报、常驻监听还是市电供电。
MQTT 比大多数 IoT 消息协议都更契合单片机的预算——最小两字节的固定头、发布/订阅解耦、以及可按下调的 QoS。本文说清楚,一旦把 TLS、证书和重连都算进来,一套 MQTT ESP32 方案到底要付出什么。
经典 traceroute 更像一幅美化的漫画:ICMP 限速、按流负载均衡、被藏起来的 MPLS 标签、非对称路由与 NAT 都会把它掰弯。本文讲清如何用 tcptraceroute、mtr 和固定流 ID 得到可信信号,如何区分排队与距离,并给出一例「看着坏了、其实只是被限速」的 traceroute。
转发器与真正的递归 DNS 解析器有何区别,为什么值得自建 DNS(隐私、无上游日志、过滤、掌控权),可选方案(Unbound、Knot Resolver、dnsdist),一份加固过的 Unbound 配置——qname minimisation、DNSSEC、缓存调优、访问控制,以及必须避开的 open resolver 故障模式。
一篇从数据包层面拆解 DNS 解析的文章:存根解析器、递归解析器、根服务器与顶级域服务器、权威应答,缓存与 TTL,日常真正用得上的记录类型(A/AAAA/CNAME/TXT/MX/NS/SOA/CAA),CNAME 的规则,glue 记录以及为什么裸域不能用 CNAME(ALIAS/ANAME),权威角色与递归角色的区别,以及如何用 dig +trace、kdig、DoH 和 DoT 来排障。
一篇讲清 MTU 为什么会在大包上出故障:1500 字节的世界如何被 VPN、overlay、隧道吃掉,分片与 DF 位,MSS clamping 一条能用的 nftables 规则,路径 MTU 发现为何被过滤的 ICMP 毁掉,TLS 握完却卡死的经典症状,以及用 ping -M do、tracepath、tcpdump 的实战排查流程。
一份公允的 2026 年 WireGuard vs OpenVPN 对比:设计与代码量、加密方式(Noise 对 TLS)、内核与用户态性能、漫游、NAT 穿越、配置复杂度、UDP 443 回退、企业级认证与客户端支持——附带决策表、明确建议,以及各自的适用场景。
一篇写给一直躲着 IPv6 的人的实战教程:地址计算其实比看上去简单(前缀、/64、SLAAC、没有 NAT),运维上真正变了什么(nftables、ip -6、AAAA 记录、监听 [::]),为什么双栈才是务实的路线,那些会咬人的坑(链路本地地址、MTU、ICMPv6 依赖),以及如何在一台机器上把它测通。
用 ip netns、veth 对、网桥和 NAT,在一台 Linux 机器里搭出一个小型多主机网络,让命名空间之间能互相 ping、能走网桥交换、还能经 NAT 上公网。这是一篇动手实战指南:不用额外硬件就能测试路由、overlay 配置和防火墙规则,并用 ping、ip route 和 tcpdump 逐项验证。
一套可复用的 HTTP API 逆向方法论:先观察再动手,梳理认证流程,用浏览器开发者工具与 mitmproxy 抓包,用 curl 重放,识别请求签名,最后把它写成状态机与一个小客户端。
一份实操向的 WireGuard 教程:生成密钥、写 wg-quick 配置、添加对端、把 AllowedIPs 理解为“加密路由”,搭好两台主机之间的隧道与站点到站点的子网路由,用 wg 命令排查问题,并说清 WireGuard 究竟把哪些事留给了你自己。
一篇讲清机制的 NAT 穿透科普:NAT 为什么会破坏点对点连接、四种 NAT 分类以及为什么对称型 NAT 是硬骨头、STUN 如何发现你的反射地址、UDP 打洞的分步过程、TURN 作为中继兜底、ICE 作为统一框架,以及 CGNAT、端口随机化、QUIC 和基于 WireGuard 的 overlay 在今天改变了什么。
一篇面向 2026 年的 mesh VPN 对比——Tailscale vs ZeroTier,加上 NetBird、Nebula 与 EasyTier——从控制面、数据面、L2 与 L3、NAT 穿透、自托管和锁定成本几个维度来评判。没有会过时的价格表,只讲决定一套自托管 VPN 的取舍。
从数据包层面讲清认证门户(captive portal)的真实机制:DHCP 与 DNS 拦截、RFC 8910 认证门户 API、Wi-Fi 登录跳转、Android/iOS 的 CNA 检测、walled garden、MAB 与 RADIUS,以及如何实现无浏览器的自动登录。
我把一套 hub-and-spoke 的 WireGuard 换成了 EasyTier 的 mesh VPN:一个 overlay 网络名加一个密钥,节点之间尽力打洞走直连 P2P,走不通才回落到中继。这是一篇可照抄的 homelab 实操——安装、组网、验证路由、暴露服务。
ESPTier 用纯 C 在 ESP32-C3 上复刻了 EasyTier v2.6.4 的线协议——TCP 分帧、SipHash-1-3 身份、AES-128-GCM、路由同步与转发——让一颗受限 MCU 成为 overlay 网络中真正可被 ping 通的一员。
本文记录我如何靠观察逆向锐捷 ePortal 认证门户与 CAS 单点登录流程,绕过老接口 404 的坑,用纯 Python 标准库写出无浏览器的校园网自动登录守护进程,并作为 systemd 服务部署,在强制断线后约 16 秒内自动重连。