IP分片
物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接受到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU(最大传输单元:Maximum Transmission Unit,通常与通信接口有关,单位:字节)。IP把MTU与数据报长度进行比较,如果需要则进行分配。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一份IP数据包分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网络协议不同,他们要求在下一站就进行重新组装,而不是在最终的目的地)。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对运输层(TCP和UDP)是透明的。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和重新组装提供了足够的信息。
对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中。标志字段用其中一个比特来标示“更多的片”。除了最后一片,其他每一组成数据报的片都要把该比特置为1.片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文给起始端。
当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会丢失,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。
尽管IP分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个IP数据报。为什么会发生这种情况呢?因为IP层本身没哟超时重传的机制--由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有)。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,该报文段对应于一份IP数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常要避免分片。
使用UDP很容易导致IP分片,而TCP试图避免分片(但对于应用程序来说几乎不可能强迫TCP发送一个需要进行分片的长报文段)。
在一个以太网上,数据帧的最大长度是1500字节,其中1472字节留给数据,假定IP首部为20字节,UDP首部为8字节。
例如,分别以数据长度为1471,1472,1473和1474字节运行sock程序,最后两次应该发生分片:

(1)前两份UDP数据报能装入以太网数据帧,没有被分配。,但是对应于写1473和1474字节的IP数据报长度为1501和1502,就必须进行分片。
(2)当IP数据报被分片后,frag 26304和frag 26313指的是IP首部中标示字段的值,冒号和@号之间的1480是除IP首部外的片长。两份数据报第一片的长度均为1480:UDP首部8字节,用户数据1472字节(加上IP首部20字节正好为1500字节)。
(3)第一份数据报的第2片只包含1字节数据,第二份数据报的第2片只包含2字节的数据。
(4)位于@后的数字是从数据报开始处计算的片偏移值。跟在偏移值后面的加号对应于IP首部中3bit标志字段中的“更多片”比特。设置这一比特的目的是让接收端知道什么时候完成所有的分片组装。
(5)注意4和6行省略了协议名UDP,源端口和目的端口号协议名可以打印出来,因为它在IP首部并被复制到各个片中,但是,端口号在UDP首部,只能在第1片中被发现。任何运输层首部只出现在第一片数据中。
在分片时,除了最后一片外,其他每一片中的数据部分(除了IP首部外的其他部分)必须是8字节的整数倍。
IP数据报时指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指IP层和链路层之间传送的数据单元。一个分组可以使一个完整的IP数据报,也可以是IP数据报的一个分片。

IP分片的更多相关文章
- IP分片详解
IP分片是网络上传输IP报文的一种技术手段.IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组.不同的链路类型规定有不同最大长度的链路层数据帧,称为链路层MTU(最大传输单 ...
- IP分片重组的分析和常见碎片攻击 v0.2
IP分片重组的分析和常见碎片攻击 v0.2http://www.nsfocus.net/index.php?act=magazine&do=view&mid=584 作者:yawl ( ...
- TCP/IP 协议难点之一—— IP分片
1 IP协议简单介绍 就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方: IP分片与重组 TCP滑动窗口与TCP状态的改变 TCP定时器 其实协议本身根据<TC ...
- 【转】IP分片和TCP分段
ZC: 由于 TCP中 MSS 的关系,TCP 不会造成 IP分片和TCP分段 ! 1.http://zhidao.baidu.com/link?url=YCnR8B-1EN4-cgauRtwa-iV ...
- tcp/ip分片
from http://blog.csdn.net/cumirror/article/details/5071234 前段时间要做一个关于网络嗅探的程序,里面要重组IP分片,TCP分片. 但做的时候忽 ...
- IP分片浅析
在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头, ...
- IP分片和TCP分片 MTU和MSS(转)
IP分片和TCP分片 MTU和MSS(转) 访问原文:http://blog.csdn.net/keyouan2008/article/details/5843388 1,MTU(Maximum Tr ...
- TCP/IP具体解释--UDP数据报中的IP分片
1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...
- 数据帧、MTU、MSS、IP分片
1.以太网帧 在以太网链路上的数据包称作以太帧,在802.3标准里,规定了一个以太帧的数据部分(Payload)的最大长度是1500个字节(MTU),再加上14字节链路头和4字节的FCS,所以以太网帧 ...
- TCP/IP 笔记 - 用户数据报协议和IP分片
关于本章中的IP分片部分,参考第五章IP分片头部知识点.需要注意的是,TCP有超时重传,UDP的超时重传则依赖上层应用程序实现. 用户数据报协议(UDP) UDP是一个简单的面向无连接.不可靠的数据报 ...
随机推荐
- socket编程—— 服务器遇到Broken Pipe崩溃
我写了一个服务器程序, 在Linux下测试时, 总是莫名退出. 最后跟踪到是write调用导致退出. 用gdb执行程序, 退出时提示"Broken pipe". 最后问题确定为, ...
- uni-app 如何引入全局方法或变量?
利用Vue.prototype挂载到Vue实例上即可
- 霍纳法则(Horner Rule)介绍及C语言实现
参考自:http://flynoi.blog.hexun.com/31272178_d.html 霍纳法则简介 假设有n+2个实数a0,a1,-,an,和x的序列,要对多项式Pn(x)= anxn+a ...
- Linux中-POSIX 线程详解
一种支持内存共享的简捷工具 摘自https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/ 线程是有趣的 了解如何正确运用线 ...
- ehcache.xml的配置详解和示例
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLoc ...
- Protobuf学习 - 入门(转)
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- maven中央仓库
https://search.maven.org (查看版本和文件列表:http://repo1.maven.org/maven2/) http://mvnrepository.com/ https: ...
- openstack里面的Provider network 和 Tenant network 的区别
openstack里面的Provider network 和 Tenant network 的区别 openstack里面的网络相对复杂.经常有人对几个网络概念搞混淆,这里基本说明下 Openstac ...
- FCT需求分析
1. 系统组成 系统从硬件角度看是由芯片.电源,时钟,总线组成, 当中总线分为控制总线和数据总线. 芯片是单个的硬件单元,可实现多种功能.有些功能有性能需求,在计算机系统中大部分功能都须要软件配合. ...
- windows系统定时重启自定义exe程序
工作需要, Windows系统定时重启自定义exe程序. 写了如下程序, 按照说明(readme.txt)修改批处理文件中的四个参数即可: 1.readme.txt 第一个参数:进程名(不用带exe) ...