尽管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分片了