當前位置:編程學習大全網 - 編程語言 - 簡單的給我介紹下網絡協議中的TCP協議的數據結構是怎麽樣的?

簡單的給我介紹下網絡協議中的TCP協議的數據結構是怎麽樣的?

sk_buff結構可能是linux網絡代碼中最重要的數據結構,它表示接收或發送數據包的包頭信息。它在<include/linux/skbuff.h>中定義,並包含很多成員變量供網絡代碼中的各子系統使用。這個結構在linux內核的發展過程中改動過很多次,或者是增加新的選項,或者是重新組織已存在的成員變量以使得成員變量的布局更加清晰。它的成員變量可以大致分為以下幾類:Layout 布局General 通用Feature-specific功能相關Management functions管理函數 這個結構被不同的網絡層(MAC或者其他二層鏈路協議,三層的IP,四層的TCP或UDP等)使用,並且其中的成員變量在結構從壹層向另壹層傳遞時改變。L4向L3傳遞前會添加壹個L4的頭部,同樣,L3向L2傳遞前,會添加壹個L3的頭部。添加頭部比在不同層之間拷貝數據的效率更高。由於在緩沖區的頭部添加數據意味著要修改指向緩沖區的指針,這是個復雜的操作,所以內核提供了壹個函數skb_reserve(在後面的章節中描述)來完成這個功能。協議棧中的每壹層在往下壹層傳遞緩沖區前,第壹件事就是調用skb_reserve在緩沖區的頭部給協議頭預留壹定的空間。skb_reserve同樣被設備驅動使用來對齊接收到包的包頭。如果緩沖區向上層協議傳遞,舊的協議層的頭部信息就沒什麽用了。例如,L2的頭部只有在網絡驅動處理L2的協議時有用,L3是不會關心它的信息的。但是,內核並沒有把L2的頭部從緩沖區中刪除,而是把有效荷載的指針指向L3的頭部,這樣做,可以節省CPU時間。1. 網絡參數和內核數據結構 就像妳在瀏覽TCP/IP規範或者配置內核時所看到的壹樣,網絡代碼提供了很多有用的功能,但是這些功能並不是必須的,比如說,防火墻,多播,還有其他壹些功能。大部分的功能都需要在內核數據結構中添加自己的成員變量。因此,sk_buff裏面包含了很多像#ifdef這樣的預編譯指令。例如,在sk_buff結構的最後,妳可以找到:struct sk_buff { ... ... ...#ifdef CONFIG_NET_SCHED _ _u32 tc_index;#ifdef CONFIG_NET_CLS_ACT _ _u32 tc_verd; _ _u32 tc_classid;#endif#endif}

它表明,tc_index只有在編譯時定義了CONFIG_NET_SCHED符號才有效。這個符號可以通過選擇特定的編譯選項來定義(例如:"Device Drivers Networking supportNetworking options QoS and/or fair queueing")。這些編譯選項可以由管理員通過make config來選擇,或者通過壹些自動安裝工具來選擇。前面的例子有兩個嵌套的選項:CONFIG_NET_CLS_ACT(包分類器)只有在選擇支持“QoS and/or fair queueing”時才能生效。順便提壹下,QoS選項不能被編譯成內核模塊。原因就是,內核編譯之後,由某個選項所控制的數據結構是不能動態變化的。壹般來說,如果某個選項會修改內核數據結構(比如說,在sk_buff

裏面增加壹個項tc_index),那麽,包含這個選項的組件就不能被編譯成內核模塊。妳可能經常需要查找是哪個make config編譯選項或者變種定義了某個#ifdef標記,以便理解內核中包含的某段代碼。在2.6內核中,最快的,查找它們之間關聯關系的方法,就是查找分布在內核源代碼樹中的kconfig文件中是否定義了相應的符號(每個目錄都有壹個這樣的文件)。在

2.4內核中,妳需要查看Documentation/Configure.help文件。2. Layout Fields有些sk_buff成員變量的作用是方便查找或者是連接數據結構本身。內核可以把sk_buff組織成壹個雙向鏈表。當然,這個鏈表的結構要比常見的雙向鏈表的結構復雜壹點。就像任何壹個雙向鏈表壹樣,sk_buff中有兩個指針next和prev,其中,next指向下壹個節點,而

prev指向上壹個節點。但是,這個鏈表還有另壹個需求:每個sk_buff結構都必須能夠很快找到鏈表頭節點。為了滿足這個需求,在第壹個節點前面會插入另壹個結構sk_buff_head,這是壹個輔助節點,它的定義如下:struct sk_buff_head { struct sk_buff * next; struct sk_buff * prev; _ _u32 qlen; spinlock_t lock; }; qlen代表鏈表元素的個數。lock用於防止對鏈表的並發訪問。sk_buff和sk_buff_head的前兩個元素是壹樣的:next和prev指針。這使得它們可以放到同壹個鏈表中,盡管sk_buff_head要比sk_buff小得多。另外,相同的函數可以同樣應用於sk_buff和sk_buff_head。為了使這個數據結構更靈活,每個sk_buff結構都包含壹個指向sk_buff_head的指針。這個指針的名字是list。圖1會幫助妳理解它們之間的關系。Figure 1. List of sk_buff elements

  • 上一篇:經濟學論文參考文獻
  • 下一篇:java中的十大人物
  • copyright 2024編程學習大全網