【网络实验】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头字段对这里没有影响),所以没必要计算。具体可以查看内核代码验证。

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