目录
IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据包时,将数据报文分为若千分片进行传输,并在目标系统中进行重组,这一过程称为分片(fragmentation).
(1500) 6+6+2+4以太网技术支持帧大小最大为1518字节。通常以太网接口默认的链路MTU通常被设置1500字节。1500---》1482
每一种物理网络都会规定链路层数据帧的最大长度,称为蟭路层MTU(Maximum Transmission Unit) IP协议在传输数据包时,若IP数据报加上数据帧头部后长度大于链路MTU,则将数据报文分为若干分片进行传输,并在目标系统中进行重组。比如说,在以太网环境中可传输最大IP报文大小(MTU)为1500字节。如果要传输的数据帧大小超过1500字节,即IP数据报负载长度大于1472(1500-20(IP) -(UDP)=1472,普通数据报)字节,则需要分片之后进行传输。
分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达目的站时,才可进行重新组装,且它是由目的端的IP层来完成的。分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID,具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表中间的3位标志则标志着该分片后面是否还有新的分片。这三个标志就组成了IP分片的所有信息(将在后面介绍),接受方就可以利用这些信息对IP数据进行重新组织。
标志字段在分片数据报中起了很大作用,在数据报分片时把它的值复制到每片中的标志字段的其中一个比特称作"不分片"位,用其中一个比特来表示更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。
另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。如果将标志字段的比特置1,则IP将不对数据报进行分片,若在某个中间路由器上需要对其分片,则仅仅把数据报丢弃并发送一个ICMP不可达差错报文给源主机。
如果不是特殊需要,则不应该置1;最右比特置1表示该报文不是最后一个IP分片。故意发送部分IP分片而不是全部,则会导致目标主机总是等待分片消耗并占用系统资源。某些分片风暴攻击就是这种原理。这里以以太网为例,由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,抛去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这就是前面所说的MTU的值。这个也是网络层协议非常关心的地方,因为网络层的IP协议会根据这个值来决定是否把上层传达下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里是一个道理。
ldentification 标识号
flag: R DF MF
R 保留,没有定义用途
DF (不分片位) 1代表不允许对此数据包做分片,0代表可以分片
MF 1 我是分片,但我不是最后一个分片,0我是分片,并且是最后的分片(M=more 更多的意思)
Fragment Offset (分偏移量)
R: 保留未用;DF: Don't Fragment,"不分片"位,如果将这一比特置1,IP层将不对数据报进行分片;MF: More
Fragment,"更多的片”,除了最后一片外,其它每个组成数据报的片都要把比特置1;
Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。
TTL : 防止报文在网络中转发的环路,数据报文在网络中的转发次数。每次转发数据报文被下个设备接收时,TTL值减一。当下一个接收设备发现TTL值等于0时,就不会再把这个数据报文转发,而是丢弃这个数据报文。
TTL取值范围:0~255 (8个bit)
标明数据报文使用的什么传输层协议
Protocol: 8 bit, 协议:下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。·常见值:
-1: ICMP ,Internet Control Message;
-2: IGMP ,Internet Group Management;
6: TCP .Transmission Control Protocol;
17: UDP ,User Datagram Protocol.
Protocol为-1即是ICMP协议,为17就是UDP协议:
Header Checksum: 16 bit, 首部检验和。
Source IP Address: 32 bit,源IP地址。
Destination IP Address: 32 bit,目的IP地址。
Options: 可变,选项字段。
Paddina: 可变填充字段,全填0
只有第一个分片才会携带传输层字段(TCP/UDP),非第一个字段不携带传输层字段。
offset:第一个分片的(传输层大小+PDU)/8= 第二个分片的偏移量
第一个分片的((传输层大小+PDU)+第二个分片的PDU) /8 = 第三个分片的偏移量。
后续分片的偏移量以此类推
每个分片的长度一定是8字节(64位)的整数倍