Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 網絡協議棧全景解析:從四層模型到內核源碼架構

編輯:關於 Linux

Linux 網絡協議棧基於 TCP/IP 四層模型,在內核中實現高性能、模塊化、可擴展的網絠處理管道。本文自底向上剖析物理層、鏈路層、網絡層 (IP/ICMP/ARP)、傳輸層 (TCP/UDP)、應用層,並深入內核架構:Socket 層、協議無關層、協議實現層、設備無關接口層、驅動層,揭示 sk_buff、net_device、sock 核心數據結構與收發流程。

一、TCP/IP 四層模型在 Linux 中的映射

TCP/IP 層Linux 內核實現核心協議/組件
應用層用戶態進程HTTP, DNS, SSH, MySQL, gRPC... (調用 Socket API)
傳輸層內核協議棧TCP (可靠、流式、擁塞控制), UDP (不可靠、數據報), SCTP, DCCP
網絡層內核協議棧IPv4/IPv6 (路由、分片、重組), ICMP (錯誤/查詢), ARP/RARP (地址解析), IGMP/MLD (組播)
鏈路層內核 + 驅動Ethernet (MAC, VLAN), WiFi, PPP, Bonding, Bridge, VXLAN, 虛擬設備 (veth, tun/tap)
物理層硬件網卡 (NIC), 光模塊, 雙絞線, 光纖, 總線 (PCIe, USB)

二、內核協議棧五層架構 (源碼目錄 net/)

+---------------------------------------------------------------+
| 1. 系統調用接口層 (Socket API)                                 |
|    socket(), bind(), listen(), accept(), connect(),           |
|    send/recv(), sendto/recvfrom(), setsockopt(), ioctl()      |
|    → 入口: net/socket.c, sys_socket() 等                      |
+---------------------------------------------------------------+
| 2. 協議無關接口層 (Core Socket Layer)                          |
|    struct socket, struct sock, struct proto_ops               |
|    統一面向用戶態的操作向量: inet_stream_ops, inet_dgram_ops  |
|    管理 sock 狀態、接收/發送隊列、等待隊列、鎖、內存限制      |
|    → 核心: net/core/sock.c, net/ipv4/af_inet.c                |
+---------------------------------------------------------------+
| 3. 協議實現層 (Protocol Implementation)                        |
|    IPv4: net/ipv4/  (ip_input.c, ip_output.c, tcp_*.c, udp.c) |
|    IPv6: net/ipv6/                                            |
|    核心邏輯: 三次握手、滑動窗口、擁塞控制 (CUBIC/BBR)、      |
|    IP 路由查找 (FIB/TRIE)、分片重組、Netfilter 掛鉤點        |
|    → 關鍵數據結構: sk_buff (封包描述符), dst_entry (路由緩存) |
+---------------------------------------------------------------+
| 4. 設備無關接口層 (Network Device Interface)                   |
|    struct net_device_ops (ndo_open, ndo_start_xmit, ndo_stop) |
|    統一不同驅動 (e1000e, igb, mlx5, virtio_net) 的操作接口   |
|    流控: NAPI (中斷+輪詢), XDP (eBPF 早期掉包/轉發)           |
|    → 核心: net/core/dev.c                                     |
+---------------------------------------------------------------+
| 5. 驅動程序層 (Device Drivers)                                 |
|    具體硬件驅動: drivers/net/ethernet/intel/e1000e/,          |
|    drivers/net/ethernet/mellanox/mlx5/,                       |
|    drivers/net/virtio_net.c                                   |
|    負責: 硬件初始化、DMA 映射、中斷處理、收發環管理、         |
|    硬件校驗和卸載 (TSO, LRO, RSS, Checksum Offload)           |
+---------------------------------------------------------------+

三、核心數據結構:sk_buff —— 封包在內核中的「護照」


struct sk_buff {
    struct sk_buff *next, *prev;      // 雙向鏈表 (接收/發送隊列)
    struct net_device *dev;           // 輸入/輸出設備
    unsigned char *head, *data;       // 線性數據區頭/當前數據頭
    unsigned char *tail, *end;        // 尾部/結束位置
    unsigned int len, data_len;       // 總長度/片段數據長度
    __u16 mac_header, network_header; // 各層頭部偏移
    __u16 transport_header;
    struct sock *sk;                  // 關聯 socket
    struct dst_entry *dst;            // 路由緩存條目
    unsigned int mark;                // 防火牆標記/策略路由
    __be16 protocol;                  // 協議類型 (ETH_P_IP, ETH_P_IPV6)
    // ... 引用計數、時間戳、擴展標簽 (secmark, nfct) ...
}
  • 頭部預留:skb_reserve(skb, headroom) 為各層封裝預留空間,避免頻繁 skb_cow 複制。
  • 非線性數據:skb_shinfo(skb)->frags[] 指向頁片段 (零拷貝、大頁支持)。
  • 克隆/共享:skb_clone 複製元數據共享數據區 (引用計數),skb_copy 完全深拷貝。

四、收包流程 (RX Path) 簡析

  1. 硬件中斷:NIC 收到幀 → DMA 寫入 Ring Buffer → 發起中斷 (MSI-X)。
  2. 驅動 ISR:ndo_poll_controller / napi_schedule → 關閉中斷,啟動 NAPI 輪詢。
  3. NAPI Poll:poll() 循環從 Ring 取數據 → napi_build_skb() / napi_alloc_skb() 構建 sk_buff → skb->protocol = eth_type_trans(skb, dev) 解析以太網類型 → netif_receive_skb(skb) 進入協議棧。
  4. 協議棧處理:
    • IP 層:ip_rcv() → 校驗和、分片重組、路由查找 (fib_lookup) → Netfilter PREROUTING → ip_local_deliver() → 協議分發 (inet_protos[protocol])。
    • TCP 層:tcp_v4_rcv() → 查找 sock (__inet_lookup_skb) → 狀態機處理 (SYN/ACK/DATA/FIN) → 放入接收隊列 (sk_receive_queue) → 喚醒等待進程 (sk_data_ready)。
  5. 用戶態讀取:recv() → tcp_recvmsg() → 從隊列拷貝數據到用戶緩衝區 (copy_to_user) → 更新窗口、發送 ACK。

五、發包流程 (TX Path) 簡析

  1. 用戶態寫入:send() → tcp_sendmsg() → 分配 sk_buff、拷貝用戶數據 (copy_from_user) → 加入發送隊列 (sk_write_queue) → 嘗試發送 (tcp_push)。
  2. TCP 輸出:tcp_transmit_skb() → 構建 TCP 頭、計算校驗和 (硬件卸載) → ip_queue_xmit()。
  3. IP 輸出:ip_output() → 路由查找、分片 (超過 MTU) → Netfilter POSTROUTING → dst_output() → dev_queue_xmit()。
  4. 設備傳輸:dev_queue_xmit() → QDisc (qdisc_pfifo_fast/fq_codel/htb) 排隊/整形 → __dev_xmit_skb() → 驅動 ndo_start_xmit() → 填充 Ring Buffer → 觸發硬件發送 → 完成中斷回收 skb。

六、關鍵優化技術

  • NAPI:中斷+輪詢混合,高負載下減少中斷風暴,批量處理提升吞吐。
  • TSO/LRO/GRO:TCP 分段卸載 (硬件合併大包發送/接收合併小包),減少 CPU 干預。
  • RSS/RPS/RFS:接收側縮放/流導向,多隊列分發至多 CPU 核心,縮放鎖爭用。
  • XDP (eXpress Data Path):eBPF 在驅動層早期處理 (DDoS 防護、負載均衡、防火牆),繞過協議棧。
  • 零拷貝:sendfile, splice, vmsplice, copy_file_range 避免用戶/內核態拷貝。

七、總結

Linux 網絡協議棚是內核中最複雜、最高性能的子系統之一。理解 四層模型映射、五層內核架構、sk_buff 生命週期、NAPI 收發流程、核心優化技術,是高性能網絡編程 (DPDK/XDP/eBPF)、內核網絡調試 (dropwatch, perf, bpftrace)、容器網絡 (CNI, CNI 插件, Service Mesh Sidecar) 故障診斷的核心基礎。

Linux 網絡協議棧架構圖

Copyright © Windows教程網 All Rights Reserved