文件来自于前几天CyBRICS 2021中的lx100题目,因为做题时候被IP分片坑到了,发现自己对于网络这一块的知识掌握的并不好,所以写一篇文章来理一下。为了省事就直接用比赛的pcap文件做样例了:点击。
从Wireshark抓包来看IP分片
UDP/lPv4分片
一般来说我们都知道MTU是1500字节,因此超过1500字节的数据就需要进行ip分片。包含源和目的端口号的UDP头部只出现在第一个分片里,分片由IPv4头部中的标识(Identification)、分片偏移(Fragment offiet)和更多分片(More Fragments, MF)字段控制。
- 这些分片的标识(Identification)都是同样的而且分片偏移(Fragment offiet)是以8字节为单位的偏移。同样的标识和不同的偏移让接收方可以对分片进行重组。
- 而更多分片(More Fragments, MF)标志指明该数据报后面是否还有更多的分组, 只有最后一个分片才应置成0。当MF = 0的分片被接收到时, 重组程序才能确定原始数据报的长度, 它等于分片偏移字段的值(乘以8)加上当前分片IPv4总长度字段的值。
下图是一个长度为3000字节的udp包(包括了udp包头的8个字节)。原始数据报要加上ipv4包头为3020字节,它超过了MTU的限制,因此发送的时候会进行分片。
- 第一个分片中实际传送了1472字节的udp数据和8字节udp包头。此时偏移为0,因为接下来还有数据包要发因此MF置为1
- 第二个分片传送1480字节的udp数据,因为第一个分片已经传送了1480,因此这里的偏移为1480/8 = 185,因为接下来还有数据包要发因此MF置为1
- 最后一个分片传送剩下的40字节数据,并将MF置为0,此时接收方可以通过370*8+60来算出原始数据报的长度,因此也知道了udp包的大小为3000字节(减掉ip包头的20字节)。
wireshark中的视角
比赛用的这个pcap文件实际上抓的是照相机用udp传输图片的过程,我们以一个udp传输为例: