TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

本文详细介绍了IP分片的概念,解释了为何在网络传输中需要进行IP分片,主要是由于以太网MTU的限制。IP分片涉及到IP头中的标志字段、分片偏移量等关键信息,用于在目的主机上进行数据报的重组。此外,文中还阐述了TTL和Protocol字段的作用,并给出了分片包文的示例及其偏移量计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、什么是IP分片

二,为什么要进行IP分片

三、IP分片原理及分析

标志字段的作用

 下面是标志位在IP首部中的格式以及各个标志的意义:

 TTL

 Protocol 协议号

分片包文示例:

分片偏移量计算方法:

 第一个分片:

 第二个分片:

 第三个分片:


一、什么是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 MF
    保留,没有定义用途
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值减一。当下一个接收设备发现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位)的整数倍

 第二个分片:

 第三个分片:

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python-派大星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值