IP分片浅析

在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。

当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。

IP分片的实现

IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。

在IP首部有4个字节是用于分片的,如下图所示。前16位是IP数据报的标识,同一个数据报的各个分片的标识是一样的,目的端会根据这个标识来判断IP分片是否属于同一个IP数据报。中间3位是标志位,其中有1位用来表示是否有更多的分片,如果是最后一个分片,该标志位为0,否则为1。后面13位表示分片在原始数据的偏移,这里的原始数据是IP层收到的传输的TCP或UDP数据,不包含IP首部。

标志字段:占16比特。用来唯一地标识主机发送的每一份数据报。通常每发一份报文,它的值会加1。就是IPID三个标志位的含义:R:保留未用;DF:Don’t Fragment,“不分片”位,如果将这一比特置1,IP 层将不对数据报进行分片;相反把数据报丢弃并发送一个I C M P差错报文并通知源主机废弃的原因MF:More Fragment,“更多的片”,除了最后一片外,其它每个组成数据报的片都要把比特置1;Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。

需要注意的,在分片的数据中,传输层的首部只会出现在第一个分片中,如下图所示。因为传输层的数据格式对IP层是透明的,传输层的首部只有在传输层才会有它的作用,IP层不知道也不需要保证在每个分片中都有传输层首部。所以,在网络上传输的数据包是有可能没有传输层首部的。

避免IP分片

在网络编程中,我们要避免出现IP分片,那么为什么要避免呢?原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。

对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU(1500)—UDP首部(8)—IP首部(20)。

对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片。

IP分片实例

1. UDP

从10.224.142.166向10.137.133.101发送3000字节的UDP数据,抓包的结果如下图。从图中可以看到这个UDP数据包被分成了3个IP片,从各分片的偏移量可以看出,3片包含的UDP数据大小分别是1480、1480、48(加上UDP首部8个字节),各分片加上IP首部的大小分别就是1500、1500、68,传送的总的UDP数据大小为3008,由此也看出只有一个分片包含UDP首部。

2. TCP

从10.224.142.166向10.137.133.101发送2000字节的TCP数据,抓包的结果如下图。从图中可以看出TCP数据被分成了2个IP片,包含的数据大小分别为1448、552,从三次握手可以看出双方通告的MSS都是1460字节,刚好是MTU(1500)—IP首部(20)—TCP首部(20),但实际为什么第一个分片只发送了1448字节呢,个人觉得应该是TCP首部还有一些选项占用了12个字节,也请知道的达人解释一下。

时间: 2025-01-17 16:56:58

IP分片浅析的相关文章

浅谈IP分片和组装的原理

分片是分组交换的思想体现,也是IP协议解决的两个主要问题之一.在IP协议中的分片算法主要解决不同物理网络最大传输单元(MTU) 的不同造成的传输问题.但是分组在传输过程中不断地分片和重组会带来很大的工作量还会增加一些不安全的因素.IP分片是网络上传输IP报文的一种技术手段.IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组.这一过程称为分片(fragmentation).每一种物理网络都会规定链路层数据帧的最大长度,称为链路层MTU(Maximum Transmiss

IP分片

当数据超过底层允许最大字节时(一个以太帧1514字节,14字节以太首部,20字节IP首部,UDP8/TCP20,因此IP包每次最大为1500==MTU.去掉协议头UDP有效数据1472字节,TCP为1460字节.)会进行IP分片.LwIP允许的最大IP由如下决定:IP_REASS_MAX_PBUFS 决定IP分片允许最大pbuf数量,IP_REASS_MAXAGE分片的生存时间,超过则错误并将之前接收的IP分片丢弃. 如果数据大于IP_REASS_MAX_PBUFS则有两种选择,一:直接删除数据

UDP与IP分片

一.引言 ? UDP是简单的面向数据报的运输层协议.UDP不提供可靠性:它负责把应用程序传给IP层的数据发送出去,不保证能导到目的地. 二.UDP首部 ? 端口号表示发送进程和接受进程.由于IP层已经把IP数据报分配给了TCP和UDP,因此TCP和UDP端口号是相互独立的. UDP长度字段指的是UDP首部和UDP数据的自己长度. 三.IP分片 由于物理网络层一般要限制每次发送数据帧的最大长度,因此当IP数据报的长度大于MTU时,就会发送IP分片. 分片可以发生在原始发送端主机上,也可以发生在中间

IP分片丢失重传 - Sacrifice的日志 - 网易博客

尽管IP分片看起来是是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报.为什么会发生这种情况呢? 因为IP层本身没有超时重传的机制--由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有.一些UDP应用程序本身也执行超时和重传).当来自TCP报文段的某一片丢失后,TCP在超时后重发整个TCP报文段,该报文段对应于一份IP 数据报.没有办法只重传数据报中的一个数据片.事实上,如果对数据分片的是中间路由器,而不是起始端系统,那么超始端系统就不无知道数据报是如何被分片的.

《网络协议》IP 分片与 TCP 分段

最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).数据链路层中的网络对数据帧的长度都有一个限制,不同网络的 MTU 值不同,常用的以太网为 1500 个字节. 若在 IP 层要传输的数据报大小比链路层的 MTU 还大,那么 IP 层就会对这个数据报进行分片.一个数据报会被分为若干片,每个分片的大小都小于或者等于链路层的 MTU 值. IP 数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装是达

IP分片丢失重传

尽管IP分片看起来是是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报.为什么会发生这种情况呢? 因为IP层本身没有超时重传的机制——由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有.一些UDP应用程序本身也执行超时和重传).当来自TCP报文段的某一片丢失后,TCP在超时后重发整个TCP报文段,该报文段对应于一份IP 数据报.没有办法只重传数据报中的一个数据片.事实上,如果对数据分片的是中间路由器,而不是起始端系统,那么超始端系统就不无知道数据报是如何被分片的.

TCP/IP具体解释--UDP数据报中的IP分片

1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标志,13位片偏移,这俩东西就是用来分片的. 3位标志中:一个很多其他的片标识.除了最后一个分片,其他分片都要有这个标识,另一个不分片标识,假设置上.则即便IP数据报再长.也不分片.可是会将该IP数据报丢弃,并发送一个ICMP差错报文给发送端. 13位片偏移:用于表示相对于起始的偏移量,就是个offs

IP分片重组的分析和常见碎片攻击 v0.2

IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl (mailto:[email protected])主页:http://www.nsfocus.com日期:2000-09-12 一 前言 本文对linux的IP组装算法进行了分析,因为IP碎片经常用于DOS等攻击,在文章后面我结合 了一些攻击方法进行了更进一步的说明.内核主要参考版本是2.2.16,另外简要的

IP分片和TCP分片 MTU和MSS

前期对分片分段概念有点不清晰,看到一篇好文,mark 本文转自:http://blog.csdn.net/keyouan2008/archive/2010/08/27/5843388.aspx 1,MTU(Maximum Transmission Unit,MTU),最大传输单元 (1)以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492个字节.链路层的这个特性称作MTU.不同类型的网络大多数都有一个上限.如果IP层有一个数据要传,且数据的长度比链路层的MTU还大,那么