协议头详解一:IP及IP分片

来源:互联网 发布:软件开发管理制度 编辑:程序博客网 时间:2024/05/21 12:01

写在前面
        I P是T C P / I P协议族中最为核心的协议。所有的 T C P、U D P、I C M P及I G M P数据都以I P数据 报格式传输 。许多刚开始接触 T C P / I P的人对 I P 提供不可靠、无连接的数据报传送服务感到很奇怪,特别是那些有 X . 2 5或S N A背景知识的人。
        不可靠( u n r e l i a b l e)的意思是它不能保证 I P 数据报能成功地到达目的地。 I P仅提供最好 的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, I P 有一个简单的错误处理算法:丢弃该数据报,然后发送 I C M P消息报给信源端。任何要求的可靠性必须由上层来提供(如T C P)。 
        无连接( c o n n e c t i o n l e s s)这个术语的意思是 I P并不维护任何关于后续数据报的状态信息。 每个数据报的处理是相互独立的。这也说明, I P 数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是 A,然后是 B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此 B可能在A到达之前先到达。
IP首部
       IP数据报的格式如下图所示。普通的IP首部长为20个字节,除非含有选项字段。
IP首部格式及各个字段

分析图中的首部。
        最高位在左边,记为 0 bit ;最低位在右边,记为 31 bit。4个字节的32 bit 值以下面的次序传输:首先是 0~7 bit ,其次8~15 bit ,然后1 6~23 bit,最后是24~31 bit。这种传输次序称作 big endian字节序。由于 T C P / I P首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。以其他形式存储二进制整数的机器,如 little endian 格式,则必须在传输数据之前把首部转换成网络字节序。 
目前的协议版本号是 4,因此I P有时也称作 I P v 4。
首部长度指的是首部占 32 bit 字的数目,包括任何选项。由于它是一个 4比特字段,因此首部最长为6 0个字节。普通 I P 数据报(没有任何选择项)字段的值是 5。 
服务类型( TO S)字段包括一个 3 bit 的优先权子字段(现在已被忽略) ,4 bit 的TO S子字段和1 bit 未用位但必须置 0。4 bit 的TO S分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置其中1 bit 。如果所有 4 bit 均为0,那么就意味着是一般服务。 RFC 1340[Reynolds and Postel 1992] 描述了所有的标准应用如何设置这些服务类型。 RFC 1349 
[Almquist 1992] 对该R F C进行了修正,更为详细地描述了 TO S的特性。
总长度字段是指整个 I P 数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道 I P 数据报中数据内容的起始位置和长度。由于该字段长 1 6比特,所以 I P数据报最长可达 6 5 5 3 5 字节(回忆图 2 - 5 ,超级通道的 M T U为6 5 5 3 5 。它的意思其实不是一个真正的M T U—它使用了最长的 I P 数据报)。当数据报被分片时,该字段的值也随着变化。
标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1。
T T L(t i m e - t o - l i v e )生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。T T L的初始值由源主机设置(通常为 3 2或6 4) ,一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0时,数据报就被丢弃,并发送 I C M P 报文通知源主机。
首部检验和字段是根据 I P首部计算的检验和码。它不对首部后面的数据进行计算。 I C M P、I G M P、U D P和T C P在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的 I P 检验和,首先把检验和字段置为 0。然后,对首部中每个 16 bit进行二进制反码求和(整个首部看成是由一串 16 bit 的字组成) ,结果存在检验和字段中。当收到一份 I P数据报后,同样对首部中每个 16 bit 进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如果结果不是全 1(即检验和错误) ,那么I P就丢弃收到的 
数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。I C M P、I G M P、U D P和T C P都采用相同的检验和算法,尽管 T C P和U D P除了本身的首部和数据外,在 I P首部中还包含不同的字段。在 RFC 1071[Braden, Borman and Patridge 1988]中有关于如何计算 I n t e r n e t 检验和的实现技术。由于路由器经常只修改 T T L字段(减 1) ,因此当路由器转发一份报文时可以增加它的检验和,而不需要对 I P 整个首部进行重新计算。 R F C1141[Mallory and Kullberg 1990]为此给出了一个很有效的方法。
IP分片
        物理网络层一般要限制每次发送数据帧的最大长度。任何时候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首部,下面这些字段用于分片过程。对于发送端发送的每份 I P数据报来说,其标识字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到这个字段的用途)。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置 1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。
        最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置 1,I P将不对数据报进行分片。相反把数据报丢弃并发送一个 I C M P 差错报文("需要进行分片但设置了不分片比特”)给起始端。
        当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]对避免分片进行了论述。

0 0