IP分片

物理网络层通常要限制每次发送数据帧的最大长度。任什么时候候IP层接受到一份要发送的IP数据报时,它要判断向本地哪一个接口发送数据(选路),并查询该接口得到其MTU(最大传输单元:Maximum Transmission Unit,一般与通讯接口有关,单位:字节)。IP把MTU与数据报长度进行比较,若是须要则进行分配。分片能够发生在原始发送端主机上,也能够发生在中间路由器上。网络

把一份IP数据包分片之后,只有到达目的地才进行从新组装(这里的从新组装与其余网络协议不一样,他们要求在下一站就进行从新组装,而不是在最终的目的地)。从新组装由目的端的IP层来完成,其目的是使分片和从新组装过程对运输层(TCP和UDP)是透明的。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和从新组装提供了足够的信息。并发

对于发送端发送的每份IP数据报来讲,其标识字段都包含一个惟一值。该值在数据报分片时被复制到每一个片中。标志字段用其中一个比特来标示“更多的片”。除了最后一片,其余每一组成数据报的片都要把该比特置为1.片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每一个片的总长度值要改成该片的长度值。blog

最后,标志字段中有一个比特称做“不分片”位。若是将这一比特置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数据报的一个分片。it

相关文章
相关标签/搜索