IP分片-软件无线电原理与应用第二版
11.5 IP分片正如我们在2 . 8节描述的那样,物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的I P数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其M T U。I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。把一份I P数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。重新组装由目的端的I P层来完成,其目的是使分片和重新组装过程对运输层( T C P和U D P)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。 I P首部中包含的数据为分片和重新组装提供了足够的信息。回忆I P首部(图3 - 1),下面这些字段用于分片过程。对于发送端发送的每份I P数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,I P将不对数据报进行分片。相反把数据报丢弃并发送一个I C M P差错报文(“需要进行分片但设置了不分片比特”,见图6 - 3)给起始端。在下一节我们将看到出现这个差错的例子。当I P数据报被分片后,每一片都成为一个分组,具有自己的I P首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在I P首部中有足够的信息让接收端能正确组装这些数据报片。尽管I P分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。为什么会发生这种情况呢?因为I P层本身没有超时重传的机制——由更高层来负责超时和重传(T C P有超时和重传机制,但U D P没有。一些U D P应用程序本身也执行超时和重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对应于一份I P数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常要避免分片。文献[Kent and Mogul 1987]对避免分片进行了论述。使用U D P很容易导致I P分片(在后面我们将看到, T C P试图避免分片,但对于应用程序来说几乎不可能强迫T C P发送一个需要进行分片的长报文段)。我们可以用s o c k程序来增加数据报的长度,直到分片发生。在一个以太网上,数据帧的最大长度是1 5 0 0字节(见图2 - 1),其中1 4 7 2字节留给数据,假定I P首部为2 0字节,U D P首部为8字节。我们分别以数据长度为1471, 1472, 1473和1 4 7 4字节运行s o c k程序。最后两次应该发生分片: bsdi % sock -u -i -nl -w1471 svr4 discard bsdi % sock -u -i -nl -w1472 svr4 discard bsdi % sock -u -i -nl -w1473 svr4 discard bsdi % sock -u -i -nl -w1474 svr4 discard相应的t c p d u m p输出如图11 - 7所示。第11章UDP:用户数据报协议使用111下载
下载地址
用户评论