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

2021-07-05 13:52:32 字數 2570 閱讀 6414

這些分層通常稱為網路協議棧,因為通訊會往下傳播通過各個分層,直到實際上經過線路或無線頻道傳輸,然後再返回來。報頭也會以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為例:

if (ntohs(eth->h_proto) >= 1536)

190return eth->h_proto;

191192 rawp = skb->data;

193194 /*

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

forthe

rest.

199 */

200if

(*(unsigned short *)rawp == 0xffff)

201return htons(eth_p_802_3);

202203 /*

204 * real 802.2 llc

205 */

206return 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時,裝置本身要把幀的大小儲存至其暫存器之一,使得裝置驅動程式可以去讀取/

《深入理解Linux網路技術內幕》閱讀筆記(五)

通過中斷,nic能夠告知其驅動程式幾種不同的事情,包括 1.接收一幀。2.傳輸失敗。3.dma傳輸已成功完成。給定乙個幀傳輸,當幀上載至nic的記憶體準備在此媒介上傳輸時,驅動程式就會將持有該幀的緩衝區釋放掉。使用同步傳輸時 無dma 當該幀已上傳至nic,驅動程式就會立刻知道。但使用dma時,也就...

《深入理解Linux網路技術內幕》閱讀筆記(六)

pci的優點之一是,其支援尋找irq和每個裝置所需的其他資源的探測方式相當優雅。模組可以在載入期間接收一些輸入引數,以告知該如何配置其所負責的所有裝置。但是,有些時候,特別是pci這類匯流排,讓驅動程式自行檢查系統上的裝置,然後為其負責的那些裝置做配置會比較簡單一點。必要時,可以退回到手動配置。探測...

《深入理解Linux網路技術內幕》閱讀筆記(九)

當特定事件發生時,裝置驅動程式會代表核心指示裝置產生硬體中斷。處理函式會把該幀排入佇列某處,然後通知核心。該技術是低流量負載下的最佳選擇。遺憾的是,在高流量負載下就無法良好運作 每接收乙個幀就強制產生中斷,很快就會讓cpu為處理中斷事件浪費所有的時間。負責接收幀的 分成兩部分,首先,驅動程式把該幀拷...