TCP IP協議棧初始化

2021-12-30 03:52:15 字數 1671 閱讀 2983

這已經是第六篇了。但協議棧的初始化還沒有說完。不得不承認協議棧還是很複雜的。越是牛b的東西,就越複雜。就像一門手藝一樣,當你可以做到別人都不能達到的複雜度的時候,你就是大師了。還有人說,想要精通一樣技術,你必須重複它10萬次以上。子曰:「溫故而知新」,**看多了,就能明白其中的奧秘了。當然一些實踐還是必不可少的。這個系列一開始,我就說,協議棧很牛,所以它複雜也在情理之中。學習到現在,對協議棧,感覺自己剛入門。繼續看**。

上回說完了arp協議。回到inet_init函式的第1414行。看到了期待已久的ip協議的初始化函式。

1414 ip_init();

函式定義在net/ipv4/ip_output.c中。

1404 void __init ip_init(void)

1405 很簡單的三個函式呼叫。第三個函式只是為igmp協議在虛擬檔案系統proc中建立目錄,不再討論。前兩個函式依次展開討論下。第乙個是ip_rt_init()。在tcp/ip協議族裡,rt就代表route,路由的意思。ip_rt_init就是ip系統裡路由子系統的初始化。因為路由是ip協議的乙個主要功能,沒有這個功能,網際網路就不存在了。可見其重要性。這個函式位於net/ipv4/route.c中。是目前看到的比較複雜的乙個函式。為了方便檢視,我把其中預編譯的部分去掉了。

梳理初始化的過程,重點在於協議棧資料結構網路是如何構建的。這對於後續協議棧的工作流學習是個基礎。

2922 int __init ip_rt_init(void)

2923 2924-2962 分配了資源,初始化了路由的雜湊表,初始化路由表的一些限制(最大數量等)。可以看到同tcp_proto一樣,ipv4_dst_ops是路由表(struct rt_table)記憶體資源的持有者,它還負責dst路由表的維護。真正把路由表組織起來的是rt_hash_table。因為核心要經常訪問路由表,修改它,所以要用到雜湊的實現高效的查詢訪問。這兩個資料結構都位於route.c檔案中。讓我們暫時記下這些資料結構,以後會再次遇到它們。

158 static struct dst_ops ipv4_dst_ops = ;

247 static struct rt_hash_bucket *rt_hash_table;

207 struct rt_hash_bucket ;繼續看,2964,完成與協議棧有關的裝置初始化。這個函式不複雜,原始碼不再列出,對於協議棧的資料結構沒有什麼補充,需要注意到以下事情:

1 它定義了ip層的裝置事件處理函式。ip_netdev_notifier中的inetdev_event(net/ipv4/devinet.c中)。這個函式不展開說,只需要知道,當網絡卡啟用,mtu變化等事件發生時,是由inetdev_event函式處理的。與之前在arp中遇到的類似。

2 為ip層註冊了鏈路層傳來訊息時的處理函式。如有新位址、刪除位址、請求位址等。

2964 devinet_init();

繼續2965行。fib是forward information base的縮寫。也是ip層完成路由**的重要資料資訊。

2965 ip_fib_init();

因為此函式會新增乙個重要資料結構,所以把它的原始碼列出。位於net/ipv4/fib_frontend.c中。fib_table_hash是串聯起fib資訊的資料結構。fib_table_hashsz被固定編碼為1。所以只會有乙個元素。只是這個列表會怎麼用到,現在還不知道。

912 void __init ip_fib_init(void)

kernel網路協議棧初始化

kernel的網路初始化順序 core initcall sock init fs initcall inet init subsys initcall net dev init device initcall 裝置驅動初始化 網路基礎系統初始化 第一步,使用core initcall初始化巨集修飾...

ZigBee協議棧初始化網路啟動流程

zigbee的基本流程 由協調器的組網 建立pan id 終端裝置和路由裝置發現網路以及加入網路。1.1 進入程式入口main zmain.c中 c code int main void main 1.2 給任務新增id sapi.c中 c code 1.3 初始化zigbee協議棧網路 c cod...

鏈棧的初始化

include include using namespace std template class linkedstack 類宣告 template 全域性的operator 函式都要在類定義前宣告 istream operator istream is,linkedstack s templat...