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

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
當copied被設定時,若封包需要分段,IP層就必須把該選項拷貝至每個片段。class會根據四條準則對此選項分類;這些字段可根據IP選項過濾封包,或者把不同的Qos參數施加至這些封包。
不含選項的IP報頭的大小是20字節。當 IP選項的大小不是4字節的倍數時,傳送者會以IPOPT_END選項爲IP報頭補白,使其對齊4字節邊界。這是必要的,因爲IP報頭的Header Length字段是以4字節的倍數表示的。
IPOPT_NOOP選項可用於填補選項之間的空白,例如,爲了讓後續的IP選項對齊特定邊界。Linux可以利用此選項作爲從IP報頭中刪除選項的簡便方式(實現方式是把選項用IPOPT_NOOP覆蓋吧,我猜)。
這裏寫圖片描述
以上圖爲例,假設主機X想使用Strict Source Routing選項把封包傳給主機Y。這時,主機X必須指定所有居中路由器的地址。嚴格來源地路由的範例之一就是R_1 R_2 R_3 主機Y。以寬鬆來源地路由而言,像 R_1 R_3這樣的路徑就夠了。使用非相鄰的路由器是允許的,而且有些優:如果R_2失敗了,就可改用R_2b,反之亦然。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
上圖中,每個路由器在接收到封包時,都會記錄接收時間,但是隻是針對傳送者選擇的一些特定IP地址。
這裏寫圖片描述
這裏寫圖片描述
因爲內核無法將其數據交換到磁盤上(只交換用戶空間數據),爲了處理片段而造成的內存浪費對路由器的性能有很大的衝擊。Linux對片段能用的內存量可設限制。
要識別一個片段所屬的IP封包,內核會考慮下列參數:
1.發送方和目的地IP地址
2.IP封包ID
3.L4協議
可惜,不同封包可能共享所有這些參數。例如,兩個不同的傳送者可能碰巧爲封包選擇了相同的封包ID,而且封包又碰巧同時抵達。如果兩臺主機都位在NAT路由器會後,而NAT路由器又將其自己的IP地址放在封包上,接收端的IP將無法區分那些片段。你也不能仰賴IP ID字段,因爲這是一個16位字段,因此在一個高速網絡上很快就會卷繞。
通過數個同時運行的全局定時器,卷繞問題得以部分解決。Linux內核不是使用一個全局IP ID,而是爲每個目的IP地址都持有一個不同的計數器(直到可能的IP目的地達到的最大數目)。注意,通過使用數個IP ID,可以讓ID拖久一點才卷繞,但是它們最終還是會卷繞。
這裏寫圖片描述
這裏寫圖片描述
IPV6協議的設計決定只在源頭主機上允許IP分段,而在中間主機上(例如路由器)不允許。
這裏寫圖片描述
這裏寫圖片描述
較新的NIC在硬件中提供了IP和L4校驗和計算能力。雖然Linux利用了多數現代NIC的L4硬件校驗和計算能力,但是沒有利用IP硬件校驗和計算能力,因爲不值得多花這種複雜度(也就是說軟件計算已經夠快了,因爲IP報頭的尺寸有限)。
計算校驗和時,TCP和UDP所用的僞報頭:
這裏寫圖片描述
TCP和UDP協議所計算的校驗和會包括其報頭,有效載荷以及所謂的僞報頭。僞報頭基本上就是一個區塊,爲了方便起見,其中的字段是從IP報頭中取來。注意,僞報頭只是爲了計算校驗和而定義,僞報頭不存在於網絡中傳送的封包內。
可惜,爲了NAT或其他活動,IP層偶爾必須修改一些IP報頭字段,而這些字段又會被TCP和UDP用在其僞報頭中。對IP層的修改會使得L4校驗和失效。如果保留校驗和,IP層的節點就不會檢測到任何錯誤,因爲它們只驗證IP校驗和。然而,目的主機的TCP層會認爲封包已損毀。因此,這種情況必須由內核處理。

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