【網絡實驗】IP identification字段與TSO,GRO

IP頭的identification的值由IP層維持的計數器產生,每產生一個數據包,計數器就加1,,並賦值給ID。ID並不是序號,因爲IP是無連接服務。在IP分片(fragmentation)時,此值將被複制到各個片的ID,這樣能使各個片最終能被重新組裝爲原來的數據包。

一 、在開啓TSO後,內核每次發送大包,觀察到連續兩個大包的ID值和MTU、大包大小有關。Iperf TCP發包如下圖所示:



ID值增加了5,考慮Frame 44的包長爲7340,它能其實能拆分成5個MTU=1500的包。計算如下:7340 - 20(IP頭) - 20(TCP頭) = 7300. MTU爲1500時,實際TCP payload最大爲1500 - 20 - 20 = 1460. 而7300 / 1460 = 5.

假如此時關閉了接收方的GRO,那麼將收到拆分後的小包,可以觀察到ID每次加1的小包。


下圖Frame號加2是因爲應答上圖那個包消耗了一幀。


再看一張。


二、發送方的TSO大包大小也有規律,每次變化爲1460*N字節,其中N爲正負整數。


三、開啓TSO後,發送方內核棧仍然計算了正確的IP頭校驗和,但不計算TCP校驗和。這是因爲IP的校驗和只關心IP頭,TSO分包後IP頭的校驗和沒變。但TCP的校驗和與整個TCP包有關(僞首部涉及的少量IP頭字段對這裏沒有影響),所以沒必要計算。具體可以查看內核代碼驗證。

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