Appearance
concepts/network/ —— 网络高并发
一台机器怎么扛住成千上万并发连接:应用层(IO 模型、并发/线程模型)+ 内核层(网络栈调优、零拷贝、网卡中断/RSS)+ 传输层(TCP 流量控制/拥塞控制/可控项)三条线。
知识体系全景
图一:服务端一条连接的生命线(按时间轴)

图析:这是一条不可跳步的流水线。
socket()阶段只是分配数据结构——双层结构struct socket(管接口)+struct sock(管状态),此时处于TCP_CLOSE;bind()把 IP:Port 注册进全局 hash 表,让外界能"找到"这个 socket,但 TCP 状态仍然不变;listen()是转折点——标记TCP_LISTEN,创建半连接/全连接两队列,内核开始响应 SYN,没有这步 accept 什么都拿不到;accept()是消费端,从全连接队列 FIFO 取走已握手的连接,返回新 fd;epoll_wait()是事件驱动的心脏,一个线程盯成千上万连接靠的就是它;read/write是数据面,TCP 流控和拥塞控制在背后默默工作。六个阶段之间有严格的依赖关系:没 socket 就没法 bind,没 bind 没法 listen,没 listen 没法 accept,没 accept 没 fd 可 epoll,没就绪 fd 不能 read/write。 对应的文档按这条轴逐一覆盖,读的时候建议顺着走。
图二:并行基础设施——贯穿整条生命线的底层支撑

图析:图一是"谁先谁后"的时间轴,图二是"数据怎么在机器里流动"的空间轴——两者正交,共同构成性能分析的坐标系。(1) 网卡收包——DMA 直接把包写到内存,CPU 不参与搬运;RSS 通过 Toeplitz 哈希把不同四元组的包分发到不同收包队列,这是中断分散的前提;(2) 中断分发——硬中断把"有包到了"这个信号发给指定的 CPU,
irq-affinity控制中断绑在哪颗核上,配合 RSS 让同一连接的处理始终在同一核上、最大化 cache 命中;(3) 软中断处理——硬中断只记一笔就走,真正的协议处理交给NET_RX_SOFTIRQ,NAPI 用轮询替代中断风暴,高负载下更高效;(4) 协议栈——TCP/IP 逐层解包、检验和、查路由、状态机推进(SYN→SYN-ACK→ACK),三次握手在此完成,拥塞控制在此限速;(5) socket 缓冲区——包最终进入sk_receive_queue,read()从内核拷到用户态,零拷贝技术(sendfile/splice)省的就是这最后一次拷贝。如果图一告诉你"什么时候发生了什么",图二告诉你"每件事的物理路径和开销来源"——排查网络性能问题时,这两张图分别是时间维度和空间维度的导航仪。
三条阅读路线
| 路线 | 解决什么问题 | 入口文档 | 后续深入 |
|---|---|---|---|
| ① 内核调用链 | socket/bind/listen/accept 到底在内核里做了什么?两队列怎么来的?阻塞/唤醒机制怎么工作? | socket-kernel-internals → listen-kernel-internals → accept-kernel-internals | accept-bottleneck(单点瓶颈优化)、kernel-tuning-net(队列参数调优) |
| ② IO 模型与并发 | 怎么高效盯住成千上万连接?阻塞/非阻塞/多路复用怎么选?线程模型怎么搭? | io-models → epoll → thread-models | io-model-latency(延迟量化对比)、accept-bottleneck(SO_REUSEPORT 根治) |
| ③ 传输与硬件 | 数据发出去被谁限了速?网卡怎么分流?怎么省拷贝? | tcp-flow-congestion-control → rss → zero-copy | tcp-nodelay(Nagle 细节)、zero-copy-deep(mmap/splice/io_uring)、kernel-stack-optimization(协议栈调优) |
总纲
从这开始——给你全局视角和瓶颈→对策的路由表:
- overview.md —— 总纲:高并发要解决什么(C10K→C10M)、两大瓶颈(每连接资源开销 / 每次 IO 的 CPU 开销)、应用层+内核层框架、瓶颈→对策→去哪篇的路由表
内核调用链:socket → bind → listen → accept 四件套
这是服务端启动的核心路径。四篇按调用顺序排列,每一篇都是下一篇的前提。
- socket-kernel-internals.md —— socket / bind 内核实现:
socket()造 shell(struct socket挂 vtable +struct sock管状态),bind()贴标签(IP:Port 注册到全局 hash),双层结构、协议族选择、端口冲突规则、VFS 与 socket 的分层协作 - listen-kernel-internals.md —— listen 内核实现:把 socket 从
TCP_CLOSE推入TCP_LISTEN,创建两张队列(半连接 / 全连接),backlog 的三种语义与 somaxconn 截断 - accept-kernel-internals.md —— accept 内核实现:生产者-消费者模型(软中断生产连接 → accept 消费),阻塞睡在
sk->sk_wq、排他唤醒、多线程锁竞争根因与SO_REUSEPORT根治方案 - accept-bottleneck.md —— 单点 Accept 瓶颈详解:根本原因、观测方法与五种优化方案
IO 模型与并发:从"怎么盯"到"谁来做"
解决了"连接怎么进来"之后,要解决"怎么高效处理它们"。
- io-models.md —— 五种 IO 模型:阻塞/非阻塞/IO 多路复用(select/poll/epoll)/信号驱动/异步(AIO/io_uring),两阶段视角、同步异步 vs 阻塞非阻塞
- io-multiplexing-comparison.md —— select/poll/epoll 深度对比:序列图展示三者内部执行流差异、数据结构与开销对比表、选型速查
- io-model-latency.md —— 不同网络IO模型的延迟量化分析:阻塞/非阻塞/select/poll/epoll/io_uring性能对比
- epoll.md —— epoll 原理:红黑树 + 就绪链表 + 回调、O(1) 破解 select/poll 三宗罪、LT vs ET、惊群
- thread-models.md —— 并发/线程模型:每连接一线程 → 线程池 → Reactor(主从)→ Proactor、SO_REUSEPORT、Redis/Nginx/Netty 对比、事件循环不能阻塞
传输控制:数据怎么发、发多快
连接建立后,TCP 协议栈的行为直接决定吞吐和延迟。
- tcp-flow-congestion-control.md —— TCP 流量控制(rwnd/窗口缩放/Nagle/Delayed ACK)、拥塞控制(CUBIC/BBR/Reno 对比选型)、应用层可控项(TCP_NODELAY/CORK/QUICKACK/SO_RCVBUF/SO_SNDBUF/TCP_CONGESTION/keepalive/TCP_USER_TIMEOUT)、四大场景决策指南(短连接/长连接代理/大文件传输/低延迟)
- tcp-nodelay.md —— TCP_NODELAY/TCP_CORK 的原理与性能影响、适用场景与最佳实践
- tcp-timewait.md —— TIME_WAIT 原理与处理:为什么协议要设计 2×MSL(最后 ACK + 迷途包隔离)、端口耗尽的数学上限、
tcp_tw_reuse的时间戳安全原理、tcp_tw_recycle废弃根因、SO_LINGER 的危险性、连接池根治方案
内核调优与硬件:从 sysctl 到网卡
以上所有机制的行为都可以通过内核参数和硬件配置来调节。
- kernel-tuning-net.md —— 内核网络调优:连接队列(backlog)、fd 上限、TCP 缓冲区、TIME_WAIT、端口范围、网卡多队列 RSS/RPS/RFS + 中断亲和性、conntrack
- kernel-stack-optimization.md —— 内核网络协议栈优化:队列长度、中断绑定、RPS/RFS、拥塞控制算法调优
- rss.md —— RSS 详解:网卡硬件多队列收包分流的完整机制——Toeplitz 哈希算法(逐 bit 门级实现 + 简化示例)、间接表配置(权重/条目映射)、哈希字段选择(sdfn vs sd)、RSS+IRQ affinity 三环链式绑定 + 完整配置脚本、RPS/RFS/XPS/Flow Director 全线对比、DPDK/io_uring/epoll 三种高性能栈对 RSS 的依赖、ethtool 全套配置与诊断、各队列收包不均匀的排查方法
- zero-copy.md —— 零拷贝:传统 read+write 的 4 拷贝、mmap/sendfile/splice/SG-DMA 逐级省拷贝、为什么对高并发重要、TLS 的局限
- zero-copy-deep.md —— 零拷贝技术深入:mmap/sendfile/splice/io_uring 全解析、性能对比与最佳实践
配套:观测连接用 ../../tools/network/ss.md,调优入口用 ../../tools/proc/kernel-tuning.md,中断/绑核底层见 ../process/interrupts.md 和 ../process/irq-affinity.md。