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 內核網絡協議棧中連接網絡層(L3)與鏈路層(L2)的關鍵模塊,負責將 IP 地址解析為 MAC 地址(ARP/NDP),維護鄰居可達性狀態機,提供硬件頭緩存加速數據包發送。本文從架構定位、核心流程、發送路徑三個維度構建整體認知框架。

一、 什麼是鄰居?

  • 物理定義:同一廣播域(二層網絡)內的節點,通過一跳可達。
  • 拓撲定義:IP 路由表中 gateway 指向的下一跳設備,或本地網段內的目的主機。
  • 協議棧角色:L3 到 L2 地址映射的緩存管理器、狀態機引擎、發送路徑決策器。

二、 在協議棧中的地位


用戶態應用
    ↓ sendmsg()
內核 Socket 層
    ↓ ip_route_output() / ip_route_output_slow()
路由查找 → 分配 dst_entry
    ↓ arp_bind_neighbour(dst)  【關鍵綁定點】
綁定 neighbour (創建/查找)
    ↓ dst->output() → ip_output()
    ↓ ip_finish_output2()
dst->neighbour->output(skb)  【進入鄰居子系統】
    ↓
neigh_resolve_output() / neigh_connected_output()
    ↓
構建 L2 頭部 → dev_queue_xmit() → 驅動發送

三、 發送數據包完整流程

1. UDP 發送示例


sendmsg()
  → inet_sendmsg()
    → ip_route_output_flow()      // 路由查找,獲取 dst_entry
      → arp_bind_neighbour(dst)   // 綁定鄰居
        → __neigh_lookup_errno()  // 查找/創建 neighbour
    → ip_build_xmit()             // 構建 IP 頭
    → output_maybe_reroute()
      → dst->output()             // ip_output()
        → __ip_finish_output()
          → ip_finish_output2()
            → dst->neighbour->output(skb)  // 關鍵:調用鄰居輸出函數

2. 鄰居輸出函數選擇

根據 neigh->nud_state 動態綁定:

四、 核心子模塊

  1. 地址解析協議:ARP (IPv4)、NDP (IPv6)、ATMARP、CLIP (ATM)。各實現 constructor、solicit、error_report。
  2. 狀態機引擎:8 狀態(INCOMPLETE, REACHABLE, STALE, DELAY, PROBE, FAILED, PERMANENT, NOARQ),由定時器、接收報文、發送事件驅動轉換。
  3. 垃圾回收器:neigh_periodic_timer 分桶掃描,根據 gc_thresh1/2/3、gc_staletime 清理失效條目。
  4. 硬件頭緩存:hh_cache 緩存完整 L2 頭部(以太網頭+VLAN+PPPoE 等),neigh_hh_output 直接 memcpy 填充,避免重複調用 dev->hard_header()。
  5. 代理 ARP/NDP:pneigh_entry 支持代理回應、PVLAN 隔離場景。

五、 初始化鏈


start_kernel()
  → net_dev_init()        // 設備模型
  → arp_init()            // IPv4 ARP
      → neigh_table_init(&arp_tbl)
      → dev_add_pack(&arp_packet_type)
      → register_netdevice_notifier()
  → ndisc_init()          // IPv6 NDP
      → neigh_table_init(&nd_tbl)
  → neigh_sysctl_init()   // sysctl 參數樹

六、 用戶態交互接口

狀態output 函數行為
NUD_CONNECTEDneigh_resolve_output / neigh_hh_output直接構建 L2 頭發送,或使用硬件頭緩存快速路徑
NUD_STALEneigh_suspect_output發送前先轉入 DELAY 狀態啟動定時器,仍嘗試發送
NUD_DELAYneigh_suspect_output等待 delay_probe_time,超時轉 PROBE
NUD_PROBEneigh_suspect_output主動發送單播/多播探測,排隊數據包
NUD_INCOMPLETEneigh_suspect_output剛創建,發送首個探測,排隊數據包
NUD_FAILEDneigh_blackhole直接丟棄,返回 -ENETUNREACH
接口功能示例
/proc/net/arp查看 IPv4 鄰居緩存IP address, HW type, Flags, HW address, Mask, Device
/proc/net/neigh/*每個設備的參數調優base_reachable_time, retrans_time, gc_staletime
netlink NETLINK_ROUTERTM_NEWNEIGH/DELNEIGH/GETNEIGHip neigh 命令
ioctl SIOCGARP/SIOCSARP/SIOCDARP舊式管理接口arp -s 192.168.1.5 00:11:22:33:44:55

七、 總結:鄰居子系統三大核心價值

  1. 解耦:網絡層無需關心 L2 地址細節,統一通過 neighbour 抽象訪問。
  2. 性能:狀態機減少 ARP 廣播風暴、硬件頭緩存消除重複封裝開銷、RCU 無鎖查找支撐高並發。
  3. 可靠性:可達性探測機制自動檢測鏈路故障、GC 防止內存洩漏、代理 ARP 支持複雜拓撲。
Copyright © Windows教程網 All Rights Reserved