關於skb uffer中各網路層協議頭的表示問題

2021-06-26 22:11:27 字數 1290 閱讀 1432

1 問題:

skbuff中表示各網路層的報頭資訊**去了呢? 

2 分析:

struct sk_buff 

;

上面分別是運輸層/網路層/鏈路層頭變數,看看sk_buff_data_t定義:   

#ifdef net_skbuff_data_uses_offset 

typedef unsigned int sk_buff_data_t; //使用偏移來表示資料頭位置

#else

typedef unsigned char *sk_buff_data_t; // 使用指標來表示資料頭位置
#endif

這裡不再使用union結構來轉換各頭部結構,而把轉換任務交給了函式處理。

舉例說明如何得到ip報頭:   

struct iphdr *iph = ip_hdr(skb);   ip_hdr是做什麼的呢?他就是強制轉換資料結構的介面(類似介面卡模式)。

static inline struct iphdr *ip_hdr(const struct sk_buff *skb)

上面已經說過,表示報頭的方式有兩種:一種是偏移;一種是位址。  

那麼skb_network_header表示也應該有兩種。對了,的確如此.

static inline unsigned char *skb_network_header(const struct sk_buff *skb)

#else /* net_skbuff_data_uses_offset */

static inline unsigned char *skb_network_header(const struct sk_buff *skb)

#endif /* net_skbuff_data_uses_offset */

3 總結 :

3.1 linux中不斷引入模式設計思想(這裡模式思想是很廣泛的,如主動物件/管道/監視物件/領導者-跟隨著等等一些列的模式),提供更加靈活多變的核心設計   

3.2linux中使用c語言實現物件導向的設計。   

3.3 物件導向+模式設計+c語言, 很精彩,好漂亮啊。   

3.4 具體說到本例,中心點就是乙個:推遲型別轉換。

計算機網路 關於網路層中的計算

例題 某網路的ip位址空間為192.168.5.0 24,採用定長子網劃分,子網掩碼為255.255.255.248,則該網路的最大子網個數,每個子網內的最大可分配位址個數為各為多少?解析 在解釋這個題目之前我們需要理解幾個概念ip位址組成部分 什麼是子網掩碼 網路位址 廣播位址?乙個ip的組成部分...

TCP IP模型中的網路層

2020 10 19 tcp ip參考模型與osi參考模型都有網路層,這一層次的重要性從tcp ip模型沒有將它與其它層合併就可見一斑了。網路層的目的是要實現資料報從源端網路到達目的端網路。我們可以將網路通訊模擬成現實世界中的快遞收發過程,網路層的作用就相當於快遞公司的物流網路一樣是供快件在其上高效...

關於網際網路運輸層

關於網際網路運輸層 一般而言,網際網路是乙個tcp ip網路。它為運輸層提供了兩種運輸層協議 一 tcp 傳輸控制協議 1.tcp是在不可靠的端到端網路層協議 ip 上實現的可靠資料傳輸協議 tcp報文段首部的序號欄位和確認號字段有助於解決資料報在運輸過程中發生的丟包 失序等問題。2.tcp是面向連...