Linux 系统是如何收发网络包的

内容分享2个月前发布
1 0 0

一句话总结

Linux 收发网络包就是在“网卡↔驱动↔协议栈↔Socket 接口”这条生产线中,网卡收到的比特流被不断“拆箱、分拣、贴标签”,最终交给应用;应用要发包时,则逆向“打包、贴邮编、装车”,通过网卡送向网络。


详细解析

下面我们把 Linux 内核看作一个“网络快递中心”,分两大流程说明——“收件流程”(Receive)和“发件流程”(Transmit)。

1. 收件流程:网卡收包 → 应用收包

物理介质 ──▶ 网卡硬件 ──▶ 驱动层 ──▶ NAPI/SoftIRQ ──▶ 协议栈(L2/L3/L4) 
                            │                                    ↓
                            └────── sk_buff ──────▶ Socket 缓冲区 ──▶ 用户进程
  • 网卡硬件接收
  1. 网卡上电路收到电/光/无线信号,经过物理层解调,写入环形 RX DMA 缓冲区。
  2. 类比:快递员骑车把包裹放到快递中心的收货传送带上。
  • 网卡驱动
  1. 驱动打开 NAPI(New API)模式,定时或由中断触发,轮询 RX DMA,针对每个到达的数据块alloc_skb()并拷入sk_buff。
  2. 类比:收货员把传送带上的包裹装进统一的快递箱(sk_buff),准备内部分拣。
  • 软中断(SoftIRQ)/NAPI 调度
  1. 驱动调用netif_receive_skb()或napi_gro_receive(),将 skb 推给网络层。
  2. 软中断上下文处理,不占用应用进程时间。
  3. 类比:分拣员下发“快递箱”到不同区的分拣线(软中断工位),不用打扰收货员继续卸货。
  • 协议栈分层处理
  1. L2 层(Ethernet):解 Ethernet 头,做 VLAN、MAC 过滤、bridge/ebtables、netfilterPREROUTING钩子。
  2. L3 层(IP):解 IP 头,IPv4 执行路由查表、IP 校验、NetfilterINPUT钩子;IPv6 类似。
  3. L4 层(TCP/UDP):根据协议字段分发到tcp_v4_rcv()/udp_rcv(),做端口对接、校验和、TCP 重组、流控、NetfilterLOCAL_IN。
  4. 类比:分拣员按照包裹标签(MAC、IP、端口),一路传送带分拣到“HTTP 区”“DNS 区”“SSH 区”……
  • 交付 Socket
  1. 最终 skb 被放入对应套接字的接收队列 (sk_receive_queue),等待应用调用recv()时拷贝到用户空间。
  2. 类比:快递小哥把分拣好的包裹送到你家门口的储物柜,等你来取。

2. 发件流程:应用发包 → 网卡发包

用户进程 send() 
  └▶ Socket 层 ─▶ 协议栈(L4/L3/L2) ─▶ sk_buff 分配 ─▶ 驱动层 ─▶ 网卡硬件 ─▶ 物理介质
  • 用户态调用 send()/sendto()
  1. 应用把数据写入 Socket 缓冲区,调用系统调用进入内核。
  2. 类比:你到快递柜前填写寄件单,把包裹放入柜子。
  • 传输层封装
  1. 内核 TCP/UDP 实现:UDP:直接加 UDP 头、计算校验和,调用ip_queue_xmit()TCP:走tcp_sendmsg()→ 拆包、滑窗、拥塞控制 →ip_send_skb()
  2. 类比:小哥给包裹贴上“目的套房号(端口)+序列号”,决定挂号或平邮。
  • 网络层封装
  1. ip_queue_xmit()给 skb 加 IP 头(源/目的 IP、TTL、协议号),查路由表(fib_lookup()),找到下一跳;
  2. 如果需要 ARP/NDP,发送 ARP 请求或查询邻居缓存;
  3. 类比:邮局给包裹贴“省/市/邮编(源/目的 IP)”,并打电话问前台“收件人门锁码(MAC)”。
  • 链路层封装
  1. neigh_output()拿到 MAC,调用dev_queue_xmit()拉入设备队列;视情况使用 Qdisc 排队、流量整形、tc 等;
  2. 驱动的ndo_start_xmit()从 skb 中读头部,写入 TX DMA 环;
  3. 类比:快递中心分装进入“局部派送网袋”(帧队列),排队等车辆装货。
  • 网卡硬件发送
  1. DMA 从 skb 拷贝帧到网卡 TX ring,触发网卡发送中断,将比特流推到物理介质;
  2. skb 最终由dev_consume_skb()释放。
  3. 类比:货车司机装好后出发,将包裹送上高速公路。

难点生动比喻

  • sk_buff:就是“快递箱”,不仅装数据,还挂着各种“标签”(指针、状态、校验和、协议类型等元信息)。
  • NAPI:类似“分批卸货”机制,把中断式抢资源改成定时叫号,防止一窝蜂卸货时挤爆产线。
  • SoftIRQ:把原本硬中断的分拣工作,转移到专门的“软中断工位”,让收货和分拣并行不相互打断。
  • Netfilter/IPtables:就是“快递检查站”,每个层次(PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING)都能加安检规则。
  • Qdisc/TC:相当于“发货排队闸机”,按优先级、队列长度、速率限制等策略放行包裹
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...