看了linux IP層的代碼,這裏作一個簡單總結,具體對照上圖說明:linux
下層報文由路徑PRE_ROUTING進入IP層,在RT節點通過路由決策將目地爲本機的報文經過LOCAL_IN路徑送至上層協議.非本機的報文由FOWARDING到達EM節點,而由本地產生的報文在RT節點通過路由決策後將經過LOCAL_OUT進入EM節點。流至EM節點的全部報文將經過POST_ROUTING流出IP層。網絡
報文重組和分片是至關重要的,報文重組發生在LOCAL_IN路徑上,即對到達本機的報文使用IP重組。框架
報文分片實際能夠發生在3個地方,首先POST_ROUTING路徑上會進行分片,此處應該是主要應對轉發的報文。對象
在LOCAL_OUT路徑上會進行分片,主要針對的是本地產生的UDP,ICMP,RAW 報文。還有一個可能對載荷發生分片的地方是在IP層上面的傳輸層, 對於TCP,SCTP等協議是能知道MTU相關的,所以其能夠完成相關工做,再加上IP層工做偏多,所以就將部分工做轉移到針對以上協議的傳輸層。接口
在整個IP層的主要路徑上穿插有netfilter框架入口,如上圖。在PRE_ROUTING,LOCAL_IN,LOCAL_OUT,IP_FORWARDING,POST_ROUTING都有netfilter入口,netfilter的主要做用是使後續的開發者能經過在netfilter中註冊模塊來在各個主要路徑上獲取報文信息以及改變報文在協議棧中的流向。路由
linux網絡設備對象自己是不帶IP等屬性的,由於這並非網絡設備必須的屬性,所以linux對於這些附帶屬性使用一個通用結構存儲管理,並將其附加在網絡設備實例上。開發
用戶空間經常須要進行與路由,設備IP等內核相關的操做,linux在這方面使用netlink和proc等機制完成用戶空間與內核空間的交互。二者的不一樣在於netlink主要是爲用戶空間的程序提供交互接口,而proc文件系統主要是直接與用戶交互。
程序
linux-3.6im
面碼
總結