這些分層通常稱爲網絡協議棧,因爲通信會往下傳播通過各個分層,直到實際上經過線路或無線頻道傳輸,然後再返回來。報頭也會以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時,設備本身要把幀的大小存儲至其寄存器之一,使得設備驅動程序可以去讀取/