Linux系統篇-網絡協議棧之IP協議

上篇文章簡單分析了鏈路層之後,上升到網絡層來分析,看看鏈路層是如何為其上層--網絡層服務的。其實在驅動程序層和網絡層直接還有一層是接口層,叫做驅動程序接口層,用來整合不同的網絡設備。接口層的內容會在上下層中提及。這裡我們分析網絡IP協議的實現原理。

其實現的文件主要是net/inet/ip.c文件中

我們首先分析下ip_init()初始化函數

這個函數是如何被調用的呢?

下面是調用的過程:

首先是在系統啟動過程main.c中調用了sock_init()函數

Linux系統篇-網絡協議棧之IP協議

然後調用了proto_init()函數

Linux系統篇-網絡協議棧之IP協議

  1. 而protocols全局變量協議向量表的定義中對INET域中協議的初始化函數設置為inet_proto_init()
Linux系統篇-網絡協議棧之IP協議

看到在inet_proto_init()函數中調用了ip_init()對IP層進行了初始化。

Linux系統篇-網絡協議棧之IP協議

代碼中inet_protocol_base指向的鏈表為&igmp_protocol-->&icmp_protocol-->&udp_protocol-->&tcp_protocol-->NULL(定義在protocol.c中)

分析ip_init()函數需要先要知道packet_type結構,這個結構體是網絡層協議的結構體,網絡層協議與該結構體一一對應

Linux系統篇-網絡協議棧之IP協議

第一個字段的網絡層協議編號定義在include/linux/if_ether.h中

Linux系統篇-網絡協議棧之IP協議

第二個字段表示處理包的網絡接口設備,一般初始化為NULL。第三個字段為相應網絡協議的處理函數。

第四個字段是一個void指針。

第五個字段是next指針域,用於將該結構連接成鏈表。

下面是ip_init()函數

Linux系統篇-網絡協議棧之IP協議

這裡需要說明的是系統採用主動通知的方式,其實現是有賴於notifier_block結構,其定義在notifier.h中

Linux系統篇-網絡協議棧之IP協議

對於網卡設備而言,網卡設備的啟動和關閉是事件,內核需要得到通知從而採取相應的措施。其原理是:當事件發生時,事件通知者便利某個隊列,對隊列中感興趣(符合條件)的被通知者調用被通知者註冊是定義的通知處理函數,從而達到讓內核做出相應的操作。當硬件緩衝區數據填滿後,會執行中斷處理程序,以NE 8390網卡為例,由於在ne.c文件中註冊中斷時的中斷處理函數設置如下:

Linux系統篇-網絡協議棧之IP協議

中斷處理函數為ei_interrupt()。執行ei_interrupt()函數時會調用函數ei_recieve(),而ei_recieve()函數會調用netif_rx()函數將以skb_buf的形式發送給上層。當然netif_rx()函數的特點前面分析過,即Bottom Half技術,使得中斷處理過程有效的縮短,提高系統的效率。在下半段該函數會調用dev_transmit()函數,而它會調用函數dev_tint()函數,dev_tinit()會調用函數dev_queue_xmit(),這個函數會調用dev->hard_start_xmit函數,該函數指針在ethdev_init()函數中賦值了:

Linux系統篇-網絡協議棧之IP協議

最後調用ei_start_xmit()函數將數據包從硬件設備中讀出放在skb中,即存放到內核空間中。

中斷返回後系統會執行下半段,即執行net_bh()函數,該函數會掃描網絡協議隊列,調用相應的協議的接收函數,IP協議就會調用ip_rcv()

Linux系統篇-網絡協議棧之IP協議

IP數據包類型的初始化設置在ip.c中

Linux系統篇-網絡協議棧之IP協議

接下來分析ip_rcv()函數,這是IP層的接收函數,接收來自鏈路層的數據。

內核中用於封裝網絡數據的最重要的數據結構sk_buff定義在include/linux/skbuff.h中:

Linux系統篇-網絡協議棧之IP協議

ip_rcv()函數流程圖:

Linux系統篇-網絡協議棧之IP協議

Linux系統篇-網絡協議棧之IP協議

這裡會進一步調用raw_rcv()或者相應協議的ipprot->handler來調用傳輸層服務函數。下篇會進行簡單分析。

這篇文章花了我半天完成。差點一口老血噴出來了。感謝支持!

喜歡我的文章的話,就關注我吧!在本頭條號的置頂文章中有【文章分類】包含:

[C++進階篇系列]

[高級網絡編程篇系列]

[Linux系統篇系列]

[Linux操作篇系列]

[C++基礎知識篇]

[協議篇系列]

[數據結構和算法系列]

[設計模式系列]

不要只收藏和轉發哦,軟件架構師成長必經之路。


分享到:


相關文章: