為了更好的了解netfilter的工作機理,非常有必要先來分析一下linux2.4系列核心對於網路資料是如何處理的。以下的分析全部基於乙太網和ipv4協議。
1 收到資料,中斷發生
通常的,當一塊網絡卡接收到屬於其自己mac位址或者廣播的以太網路資料幀時,就會引發乙個中斷,網絡卡驅動的中斷處理程式獲得機會,通過i/o,dma複製網路幀資料到記憶體中。然後網路驅動程式將建立乙個skb結構,將網路幀資料填充,設定時間戳,區分型別後,將skb送入對應的包接收佇列(其實就是新增到系統中的乙個雙向鍊錶中)。在新的2.4核心中,通過軟中斷(softirq)方式實現將資料報從佇列中提取,傳遞到協議處理堆疊。和以前2.2/2.0 核心採用方式相比,軟中斷方式的最大的優點是支援針對多處理器的優化。在這裡,網絡卡驅動的中斷處理程式將呼叫 include/linux/interrupt.h:__cpu_raise_softirq()發起乙個軟中斷,然後完成使命,退出。
2 資料接收軟中斷
核心呼叫kernel/softirq.c:do_softirq()執行資料報接收軟中斷(net_rx_softirq),將skb從cpu的接收佇列中取出來,交給對應ipv4協議處理程式。協議處理程式將對傳入的資料報進行一些完整性監測,如果監測失敗,則將資料報丟棄。通過完整性監測以後,將進行一些必要的清理操作,去掉可能多餘的填充資料,並且重新計算資料報的長度。接下來,資料報將進入netfilter的第乙個hook函式 nf_ip_input的控制範圍。從hook函式出來以後,程式流程將轉移到net/ipv4/ipv_input.c:ip_rcv_finish (),進行資料報的目的位址的判斷,送給路由選擇程式,決定資料報是(1)送往本地的應用程序(ip_local_deliver);(2)**到其他主機(ip_forward);(3)多播**(ip_mr_input);(4)錯誤,丟棄(ip_error)。
3 資料**
我們來看那些需要**的資料報。
對於資料報的**工作,將由net/ipv4/ip_forward.c:ip_forward()來完成。首先檢查ip包的ttl,如果小於0,則丟棄之,並且向源主機傳送ttl超時錯的icmp包,否則,將ttl減1。然後比較包大小和目標網路介面的mtu,如果ip包標記不允許分包,則丟棄該資料報,並向源主機傳送icmp包,告知資料需要分包。接下來是netfilter要處理的另乙個hook地點:nf_ip_forward hook。如果我們在iptables規則中跳轉到accept,則這裡的hook將返回nf_accept,於是資料報將會順利的通過 ip_forward_finish(),準備傳送到另外的網路。而資料報在最終傳送之前,將會落入netfilter的第三個hook陷阱,那就是 nf_ip_post_routing,滿足規則的資料報最終被送入網絡卡驅動程式傳送到另外的網路。
linux2 4核心 path walk流程簡析
這裡以path walk解析 usr lib glibc為例 int path walk const char name,struct nameidata nd while c c 計算每個分量的長度 this.len name const char this.name this.hash end ...
Linux 2 4 核心學習筆記 訊號
版權申明 0 31 這 32 個訊號稱為標準訊號。從 32 到 63 之間的 32 個訊號稱為實時訊號。可以通過 man 7 signal 檢視對 標準訊號 和 實時訊號 詳細的描述。每個程序擁有乙個訊號等待佇列。在 task struct 中有乙個 struct sigpending pendin...
linux2 4到linux2 6核心排程(1)
本文從 linux 2.4 排程系統的缺陷入手,詳細分析了 linux 2.6 排程系統的原理和實現細節,並對與排程系統相關的負載平衡 numa 結構以及實時效能進行了分析和評價。文末,作者從排程系統的發展和實現出發,對 linux 的發展特點和方向提出了自己的看法。1 前言 linux 的市場非常...