linux核心網路報文簡單流程
2014-08-12 10:05:09
分類: linux
linux下的網絡卡驅動中通常會提供類似***_rx的接收函式
該函式處理與具體硬體相關的暫存器操作
包括中斷檢查,資料狀態檢查,錯誤檢查等
在確認有資料抵達後讀取資料或從dma的接收環中獲取資料位址
***_rx函式以skb為元資料結構組織報文資料
隨後呼叫核心介面函式netif_rx或netif_receive_skb
這裡會涉及到軟中斷的處理,napi的接收方式
但是最後都會走netif_receive_skb函式
現在核心中使用了rps機制
將報文分散到各個cpu的接收佇列中進行負載均衡處理
在netif_receive_skb函式中進行了封裝
真正的資料處理從__netif_receive_skb_core函式開始
現在可以將該函式視為協議棧的入口函式
首先進行skb中報文頭元資料的調整
如果是vlan報文則先從資料中提取至vlan_tci欄位
將vlan標籤的4個位元組從資料移除
即在呼叫deliver_skb向上層傳遞報文資料時不含vlan標籤
ptype_all鍊錶的處理主要用於抓包
在應用程式中註冊pf_packet族eth_p_all的socket便可以得到所有的輸入報文
也可以用於實現自定義的協議型別報文收發
隨後核心會丟棄無法識別的報文
也可以在核心模組中使用dev_add_pack向ptype_all註冊自定義的處理函式
如果介面上配置了輸入流控
則根據具體的佇列和分類規則決定繼續處理或丟棄報文
對於vlan資料報文
將skb記錄的輸入介面修改為vlan虛介面
比如使用vconfig配置的eth0.100虛介面
再重複上述處理
核心提供了netdev_rx_handler_register介面函式向介面註冊rx_handler
比如為網橋下的介面註冊br_handle_frame函式
為bonding介面註冊bond_handle_frame函式
這相對於老式的網橋處理更靈活
有了這個機制也可以在模組中自行註冊處理函式
網橋的處理包括向上層提交和**
發往本地的報文會修改入介面為網橋虛介面如br0
呼叫netif_receive_skb重新進入協議棧處理
對於上層協議棧見到的只有橋虛介面
需要**的報文根據**表進行單播或廣播傳送
netfilter在網橋的處理路徑中從br_handle_frame到br_dev_queue_push_xmit設定了5個hook點
根據nf_call_iptables的配置還會經過nfproto_ipv4的hook點等
核心註冊的由br_nf_ops陣列中定義
可在模組中自行向nfproto_bridge族的幾個hook點註冊函式
ebtables在netfilter框架nfproto_bridge中實現了橋二層過濾機制
配合應用程式ebtables可在橋下自定義相關規則
處理完介面上的rx_handler後便根據具體的3層協議型別在ptype_base中尋找處理函式
比如eth_p_ip則呼叫ip_rcv,eth_p_ipv6則呼叫ipv6_rcv
這些函式都由dev_add_pack註冊
可在模組中自定義協議型別處理函式
如果重複定義相同協議的處理函式則要注意報文的修改對後續流程的影響
ip報文進入ip_rcv後進行簡單的檢查便進入路由選擇
根據路由查詢結果呼叫ip_local_deliver向上層提交或呼叫ip_forward進行**
向上層提交前會進行ip分片的重組
在ip_local_deliver_finish中會根據報文中4層協議型別呼叫對應的處理函式
處理函式由介面函式inet_add_protocol註冊
針對tcp或udp進行不同處理,最後喚醒應用程式接收資料
向外傳送和**資料經由ip_output函式
包括ip的分片,arp學習,mac位址的修改或填充等
netfilter在從ip_rcv到ip_output間設定了5個hook點
向各個點的鍊錶中註冊處理函式或使用iptables工具自定義規則
實現報文處理的行為控制
報文的傳送最後匯聚到佇列傳送函式dev_queue_xmit
在介面up的時候dev_activate會建立預設的佇列規則
這裡也涉及到介面驅動初始化的時候軟體多佇列與硬體多佇列
配合tc工具可以在報文傳送前進行流量控制等
最終報文傳送到dev_hard_start_xmit呼叫介面註冊的動作函式ndo_start_xmit
傳送前會檢查ptype_all鍊錶,支援抓包處理等
如果是虛擬介面則通常呼叫其對應物理介面的傳送函式
到這裡核心對報文的控制便結束了
根據不同網絡卡驅動的實現,操作暫存器等由物理層將資料傳送出去
整個呼叫鏈相對較長
每個點都包含大量的細節
主線都是圍繞元資料結構skb的處理
走進Linux核心網路 報文是什麼 sk buff
今天來聊下sk buff。如果把核心網路協議棧比作乙個人,那麼sk buff就是流淌在他體內血管裡紅血球,它運輸養分 資料 走遍全身 協議棧每一層 乙個sk buff就是乙個報文。在協議棧層次模型中,我們提到過,報文在協議棧各層之間穿梭,傳送方向不斷加上header,接收方向不斷去掉header。自...
linux核心網路協議棧 網絡卡報文收發(十六)
linux版本 3.10.103 網絡卡驅動 ixgbev 網絡卡驅動預設採用的是napi的報文處理方式。即中斷 輪詢的方式,網絡卡收到乙個報文之後會產生接收中斷,並且遮蔽中斷,直到收夠了netdev max backlog個報文 預設300 或者收完網絡卡上的所有報文之後,重新開啟中斷。網絡卡啟用...
linux 核心網路雜燴
linux核心網路驅動屬於iso的第二層,資料鏈路層 其中sk buff在資料報的收發中起關鍵性作用,作為資料的載體,經由每一層其資料區域都在變化,關於sk buff相關資料,以下幾篇很不錯,主要講解sk buff的結構以及在每一層的變化過程,學習網路驅動,sk buff是重要的乙個結構體,必須足夠...