【CAPL实战:以太网】对IPv4报文的Payload部分进行分片并创建分片包
As we know,TCP/IP协议栈网络层接收到来自上层的数据时,并不是简单地添加报头发送出去,而是会受到来自网卡配置参数MTU的约束。也就是从网卡上发送出去的以太网帧报文的数据部分的长度不能大于MTU值。即网络层头部 + 有效载荷不能大于MTU。
所以网络层在发送上层的数据时,要判断这个数据加上网络层头部的总长度是否大于MTU?如果是,则要把数据部分分成多段,分别添加IP头部后发送到链路层。最终的目的是要确保所有的分段 + IP头部的总长度小于等于MTU。
我们今天要编写一个自定义函数,不是对网络层的数据部分分段,而是对一条给定的IPv4报文(我们姑且称之为源报文)的Payload部分,按照我们的需求,把想要的部分取出,封装成一条分片包。其中IPv4 Header和Eth Header的字段尽量保证和源报文的相同。比如说source mac/destination mac/eth type/source ip/destination ip/ttl/identification等。
而像total length/flags/checksum等必须要根据分片包的实际设置或填写!
比如一条ICMPv4 Echo Request报文: