码迷,mamicode.com
首页 > 其他好文 > 详细

IP 分片丢失重传

时间:2015-04-08 16:22:48      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:网络协议   网络   网络编程   ip   

尽管 IP 分片看起来是是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?


因为 IP 层本身没有超时重传的机制——由更高层来负责超时和重传( TCP 有超时和重传机制,但 UDP 没有。一些 UDP 应用程序本身也执行超时和重传)。当来自 TCP 报文段的某一片丢失后,TCP 在超时后重发整个 TCP 报文段,该报文段对应于一份 IP 数据报。没有办法只重传数据报中的一个数据片。事实上,如果对数据分片的是中间路由器,而不是起始端系统,那么起始端系统就不无知道数据报是如何被分片的,因为这个原因,经常要避免分片。

注意:把一份 IP 数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他的网络协议不同,它们要求在下一站就进行重新组装,而不是在最终的目的地)。重新组装由目的端的 IP 层来完成,其目的是使分片和重新组装过程对运输层 ( TCP 和UDP ) 是透明的,除了某些可能的越级操作处。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP 首部中包含的数据为分片和重新组装提供了足够的信息。
 
1、MTU(Maximum Transmission Unit,MTU),最大传输单元

(1)以太网和 802.3 对数据帧的长度都有一个限制,其最大值分别是 1500 和 1492 个字节。链路层的这个特性称作 MTU。不同类型的网络大多数都有一个上限。如果 IP 层有一个数据要传,且数据的长度比链路层的 MTU 还大,那么 IP 层就要进行分片(fragmentation),把数据报分成若干片,这样每一个分片都小于 MTU。


(2)把一份 IP 数据报进行分片以后,由到达目的端的 IP 层来进行重新组装,其目的是使分片和重新组装过程对运输层( TCP/UDP )是透明的。由于每一分片都是一个独立的包,当这些数据报的片到达目的端时有可能会失序,但是在 IP 首部中有足够的信息让接收端能正确组装这些数据报片。


(3)尽管 IP 分片过程看起来透明的,但有一点让人不想使用它:即使只丢失一片数据也要重新传整个数据报。why?因为 IP 层本身没有超时重传机制------由更高层(比如TCP)来负责超时和重传。当来自 TCP 报文段的某一片丢失后,TCP 在超时后会重发整个 TCP 报文段,该报文段对应于一份 IP 数据报(而不是一个分片),没有办法只重传数据报中的一个数据分片。


(4)使用 UDP 很容易导致 IP 分片,TCP 试图避免 IP 分片。那么 TCP 是如何试图避免IP分片的呢?其实说白了,采用 TCP 协议进行数据传输是不会造成 IP 分片的,因为一旦 TCP 数据过大,超过了 MSS,则在传输层会对 TCP 包进行分段(如何分,见下文!),自然到了 IP 层的数据报肯定不会超过 MTU,当然也就不用分片了。而对于 UDP 数据报,如果 UDP 组成的 IP 数据报长度超过了 1500,那么 IP 数据报显然就要进行分片,因为 UDP 不能像 TCP 一样自己进行分段。总结:UDP不会分段,就由我 IP 来分。TCP 会分段,当然也就不用我 IP 来分了!


2、MSS(Maxitum Segment Size)最大分段大小的缩写,是TCP协议里面的一个概念

(1)MSS 就是 TCP 数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP 协议在建立连接的时候通常要协商双方的 MSS 值,这个值 TCP 协议在实现的时候往往用 MTU 值代替(需要减去 IP 数据包包头的大小 20Bytes 和 TCP 数据段的包头 20Bytes )所以往往 MSS 为 1460。通讯双方会根据双方提供的 MSS 值得最小值确定为这次连接的最大 MSS 值。


 (2)相信看到这里,还有最后一个问题:TCP 是如何实现分段的呢?其实 TCP 无所谓分段,因为每个 TCP 数据报在组成前其大小就已经被 MSS 限制了,所以 TCP 数据报的长度是不可能大于 MSS 的,当然由它形成的 IP 包的长度也就不会大于 MTU,自然也就不用 IP 分片了。


转自:http://blog.163.com

IP 分片丢失重传

标签:网络协议   网络   网络编程   ip   

原文地址:http://blog.csdn.net/tennysonsky/article/details/44941957

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!