网络子系统
这页讲的是:网络并不只是 TCP/IP 几个协议名,而是一条从网卡收发数据、经过协议处理、再交给应用的完整系统路径。学这页的重点,是把“网络协议概念”和“内核网络数据路径”连接起来看。
这块是什么
网络子系统负责把网络设备接收到的数据包组织起来,交给对应协议处理,再把结果送到应用;反过来,它也负责把应用发出的数据变成可以真正上网传输的包。它是一条很长的数据通路,而不是一个单点功能。你以后看到的 socket、协议栈、网卡驱动,其实只是这条长路径上的不同位置。
可以把它理解成:数据包像快递件,网络子系统负责“收件、分拣、按规则转运、再派送给正确的人”。
它负责什么
收发网络数据
- 从网卡接收数据包
- 把发送请求交给设备
- 管理收发队列
- 把硬件世界的收发事件组织成内核可处理的数据流
处理协议栈
- IP、TCP、UDP 等协议处理
- 路由、分片、重组
- 连接和状态管理
- 让不同网络层次各自解决自己的问题
向应用提供接口
- socket 接口
- 端口与连接语义
- 和用户空间通信
- 让应用按统一模型使用网络,而不是直接操心包格式
一个网络包的大致旅程
| 阶段 | 你现在怎么理解 | 为什么它重要 |
|---|
| 网卡收包 / 发包 | 真实硬件把数据交给驱动,或从驱动拿走待发送数据。 | 网络能力不是凭空来的,最终还是要落到设备上。 |
| 内核包缓冲处理 | 数据包进入内核中的承载结构,被继续加工和转发。 | 这解释了为什么缓冲区、队列和内存管理在网络里如此关键。 |
| 协议栈逐层处理 | 不同层关注不同问题,比如寻址、可靠传输、端口分发等。 | 说明“网络协议”不是一个大黑盒,而是分层协作。 |
| 交给应用或继续转发 | 处理结果可能送到本机应用,也可能继续往外发。 | 这让网络子系统既像通信入口,也像交通枢纽。 |
关键概念
| 概念 | 现在怎么理解 |
|---|
| socket | 应用看到的网络入口,很多网络操作都从它开始。 |
| sk_buff | 内核里用来承载和传递网络包的重要数据结构。 |
| 协议栈 | 按层处理网络包的规则体系,不同层解决不同问题。 |
| 路由 | 决定一个包该往哪走、交给哪个下一跳。 |
| 网卡驱动 | 连接网络协议栈和实际硬件设备的桥梁。 |
为什么重要
- 现代系统大量工作都围绕网络展开,服务器尤其如此。
- 网络路径同时关心吞吐、延迟、丢包、拥塞和资源消耗,复杂度很高。
- 很多高性能、容器、云原生、安全能力都和网络子系统深度相关。
- 很多线上性能问题不是单纯“网卡慢”,而是协议处理、队列堆积、调度时机和内存使用共同作用的结果。
常见误解
- 误解一:网络子系统就是 TCP/IP。实际上它还包括包缓冲、驱动接口、队列、软中断处理等一整条通路。
- 误解二:socket 就等于网络实现。实际上 socket 只是应用视角的入口,不是整条数据路径本身。
- 误解三:网络性能问题只看带宽。很多时候真正的瓶颈在包处理路径和资源协调上。
它不负责什么
- 它不直接管理磁盘数据持久化,那是文件系统和存储栈的职责。
- 它不决定物理设备如何初始化,那更多是驱动和设备模型的事情。
- 它不单独解决所有并发问题,但网络路径本身高度并发。
和其他模块的关系
| 相关模块 | 关系 |
|---|
| 驱动 | 网卡驱动把真实硬件和网络协议栈接起来。 |
| 调度器 | 软中断、协议处理、应用线程运行体验都会受调度影响。 |
| 内存管理 | 网络包缓冲区、队列和零拷贝等都与内存管理相关。 |
| 并发控制 | 收发队列、连接状态和协议处理都需要同步机制。 |
最容易混的三层现在先怎么拆
| 层次 | 它更像什么 | 别和谁混 |
|---|
| socket 入口 | 应用和内核打交道的统一接口面。 | 别把它直接当成整个协议栈本体。 |
| 协议处理层 | 按 TCP/IP 等规则理解、改写、路由和分发包的中间大脑。 | 别把协议语义和网卡收发动作混成同一层。 |
| 网卡驱动与设备收发 | 真实硬件把包交进来、拿出去的最后落点。 | 别把“应用怎么用网络”和“设备怎么搬包”混到一起。 |
| 队列与缓冲组织 | 整条路径上的交通中转站,决定包如何被临时存放和推进。 | 别把性能问题只理解成协议问题,很多时候堵在这里。 |
读完这页后,你应该能回答
- 为什么网络子系统是一条完整的数据路径,而不是几个协议名?
- 为什么 socket 只是应用入口,而不是网络实现本身?
- 为什么网络性能问题经常会跨越驱动、调度、内存和并发几个模块?
后面适合继续问:一个包进入内核后大致走哪些层?sk_buff 为什么重要?网络性能调优为什么经常跨越多个模块?