《深入理解Linux網絡技術內幕》閱讀筆記(十二)

這裏寫圖片描述
這些分層通常稱爲網絡協議棧,因爲通信會往下傳播通過各個分層,直到實際上經過線路或無線頻道傳輸,然後再返回來。報頭也會以LIFO的方式添加和刪除掉。
每一層都有很多種協議可以用。在最底層的接口交換數據,而所用的協議是預先決定的(協議的驅動程序被關聯至該接口)。
接收幀的時候,會傳送幀副本給網絡嗅探器(如tcpdump)。
這裏寫圖片描述
這裏寫圖片描述
封包要往下傳送到另一層以便於被傳送至該路由器。但是,IP層必須在此層找出路由器的正確地址。因爲L2涉及到相鄰主機間的通信,因此,IP層用於找出特定IP地址相關聯的L2地址的流程就稱爲鄰居協議。
這裏寫圖片描述
這裏寫圖片描述
在最低的軟件層L2上,所用的硬件決定所用的協議。如果幀是在Ethernet接口上被接收,接收者就知道其包含了一個Ethernet報頭。這裏不能模棱兩可,除非指定了LLC或SNAP。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
在特殊情況下,單一封包可以傳遞給多個處理函數。例如,當封包探嗅器(一般用於糾錯或收集統計數據)在運行時就是這種情況。這種模式有時稱爲混雜模式(ETH_P_ALL)。
這裏寫圖片描述
這裏寫圖片描述
如上圖所示,爲了訪問快一點,多數協議都用到一個很簡單的hash函數(ptype_base所指的數組)。而那些ETH_P_ALL協議被組織在ptype_all所指的列表。此列表中的協議數目存儲在netdev_nit中。
爲了節省空間,IEEE決定用大於1536的值表示Ethernet協議。然後802.2和802.3協議使用這個字段存儲幀的長度。區分方式部分代碼,以eth_type_trans爲例:

189         if (ntohs(eth->h_proto) >= 1536)
190                 return eth->h_proto;
191                 
192         rawp = skb->data;
193         
194         /*
195          *      This is a magic hack to spot IPX packets. Older Novell breaks
196          *      the protocol design and runs IPX over 802.3 without an 802.2 LLC
197          *      layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
198          *      won't work for fault tolerant netware but does for the rest.
199          */
200         if (*(unsigned short *)rawp == 0xFFFF)
201                 return htons(ETH_P_802_3);
202                 
203         /*
204          *      Real 802.2 LLC
205          */
206         return htons(ETH_P_802_2);

其中的語句,

200         if (*(unsigned short *)rawp == 0xFFFF)

其0xFFFF含義爲:
通常不會使用純粹的802.3幀格式,唯一的例外涉及IPX。IPX的封包可以通過未加工的802.3幀(也就是沒有LLC報頭的幀)而傳送。IPX報頭的第一個字段是16位的校驗和字段,正常來講通過簡單地設成0xFFFF予以關閉。因爲0xFFFF是無效的SSAP/DSAP組合,而且沒有Ethertype有改值,因此,使用未加工的802.3的IPX封包就可以通過0xFFFF輕易被標識。可參考下圖:
這裏寫圖片描述
這裏寫圖片描述
/當協議長度小於1500或大於1536時,設備本身要把幀的大小存儲至其寄存器之一,使得設備驅動程序可以去讀取/
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章