TCP/IP 协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4 报文格式
一、什么是 IP 分片
IP 分片是网络上传输 IP 报文的一种技术手段。IP 协议在传输数据包时,将数据报文分为若千分片进行传输,并在目标系统中进行重组,这一过程称为分片(fragmentation).
编辑
二,为什么要进行 IP 分片
(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 报文差不多拥有相同的 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 协议会根据这个值来决定是否把上层传达下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里是一个道理。
下面是标志位在 IP 首部中的格式以及各个标志的意义:
编辑
ldentification 标识号 flag: R DF MFR 保留,没有定义用途 DF (不分片位) 1 代表不允许对此数据包做分片,0 代表可以分片 MF 1 我是分片,但我不是最后一个分片,0 我是分片,并且是最后的分片(M=more 更多的意思)
Fragment Offset (分偏移量)R: 保留未用;DF: Don't Fragment,"不分片"位,如果将这一比特置 1,IP 层将不对数据报进行分片;MF: MoreFragment,"更多的片”,除了最后一片外,其它每个组成数据报的片都要把比特置 1;
Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以 8。
TTL
TTL : 防止报文在网络中转发的环路,数据报文在网络中的转发次数。每次转发数据报文被下个设备接收时,TTL 值减一。当下一个接收设备发现 TTL 值等于 0 时,就不会再把这个数据报文转发,而是丢弃这个数据报文。
TTL 取值范围:0~255 (8 个 bit)
编辑
编辑
Protocol 协议号
标明数据报文使用的什么传输层协议
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 位)的整数倍
第二个分片:
第三个分片:
版权声明: 本文为 InfoQ 作者【Python-派大星】的原创文章。
原文链接:【http://xie.infoq.cn/article/f582d595ccb3d9441d3ff6115】。文章转载请联系作者。
评论