5.2.3 IP数据报(一)IP数据报的格式
我们知道要想实现全球范围的通信除了地址要统一之外,数据格式也要统一,所以就有了IP分组,或者被称之为IP数据报,下面我们来学习IP分组的格式。如图
总体来说一个IP分组或者说IP数据报包括首部和数据部分两个部分,首部又包含了20字节的固定部分和可选的IP选项,在图中,每一行是32比特,也就是4个字节,所以固定部分一共是五行,下面我们就来介绍一下首部各个字段的含义。
-
第一个部分是版本号,占4bit,包含了创建数据报所用的IP协议的版本信息,目前广泛使用的版本号是4,这里我们学习的除了特别说明都指的是IPv4,指IP协议的版本,目前的IP协议版本号为0100,也就是4(即IPv4)
-
第二个部分是首部长度,占4bit,这里我们需要注意的是该字段表示的是以四字节为单位的IP首部的长度,如该字段的值是0101的话表示该IP数据报首部长度是5*4,也就是20个字节,也说明了数据报首部长度必须是4字节的整体数倍,如果有IP选项的时候可能需要在填充字段中填零,来保证首部长度是4字节的整数倍,因为该字段的最大值为1111,即表示的最大数值是15个单位(一个单位为4字节),也就意味着每个IP数据报首部长度不能超过 15 × 4 15\times 4 15×4因此IP的首部长度的最大值是60字节,实际上在日常应用上,由于选项字段很少使用,所以最常见的首部长度值是5,即首部长度值是20字节。
-
第三个部分是服务类型,如图,占8bit,用来获得更好的服务,这个字段以前一直没有被人们使用,通常是00000000,这个字段的本意是希望能够使用户获得更好的服务,但实际上一直没有用到,所以该字段目前一般是全零。
-
第四个部分是总长度,占16比特,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节。总长度必须不超过最大传送单元MTU。它表示以字节为单位的整个IP数据报的长度,因为该字段最大长度为全1,也就是16个1,转换为10进制说明IP数据报从理论上可以达到65535个字节。实际上对于IP数据报从一台主机传送到另外一台总是要通过底层的物理网络进行传输,在第四章中我们学习过网络最大传输单元(MTU),这里再次强调每种网络都规定了在其数据链路层传输的数据帧中封装的数据字段长度的最大值就成为最大传输单元(MTU),例如以太网的MTU为1500个字节,即在一个以太网帧中最多传送1500字节的数据。很多人误认为MTU是数据帧的总长度,这是错误的。当然有些网络的MTU值较小,只有128字节。为了使互联网传输更高效,一般尽量使每个IP数据报尽可能的长并且能封装在一个独立的数据帧中去发送。但实际上一个IP数据报在从源主机到目的主机的传送过程中可能回传与MTU不尽相同的多个网络,如图
对源主机A来说,它也不清楚将要发出去的IP数据报,有可能会经过那些网络的传输,如果要经历的网络的MTU值太小,IP数据报的长度大于了MTU的情况下,那么这个IP数据报是不是就没有办法封装到一个帧里面去了呢,如果碰到这种情况就涉及到了对IP数据报的分片处理,就会用到接下来的三个字段也就是标识、标志、片偏移,因为有关IP数据报的分片和重组相关内容会在后面专门的学习,所以这里我们先把这三个字段跳过去。 -
IP数据报第三行第一个字段是生存期TTL(Time To Live)占用一个字节8哥比特,表示IP数据报在网络中的寿命,目前的单位是跳,设计初衷是用来指明数据报在互联网系统中允许保留的以秒为单位的时间,但现在的路由器和网络完成一个数据报的转发一般仅仅需要几个毫秒,因此现在TTL实际上是起着跳数限制的作用,也就是说该字段现在的单位是跳,意思是数据报每经过路由器的转发就将其TTL值减一,一旦TTL值减为零,路由器就不再转发该数据报,而是将其丢弃,同时向数据报的源站发送一个ICMP(差错报告报文)。
-
IP数据报第三行第二个字段是协议字段,占8比特,1个字节。该字段指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给那个协议软件处理。
该字段对于源主机来说指明了该IP数据报的数据部分是来自于哪个协议,对于目的主机来说当它收到一个IP数据报的时候就会知道应该把封装的数据部分取出来送交由哪个协议软件来处理。如表:指定的网际协议编号,这个表列出了在实际网络中最长用到的协议以及协议的编号,如该字段是1的时候表示的是ICMP,6的时候表示的是TCP。
协议字段值(十进制表示) | 1 | 4 | 6 | 17 |
---|---|---|---|---|
协议名 | ICMP | IP | TCP | UDP |
-
IP数据报第三行第三个字段是首部检验和,占16比特,该字段只检验数据报的首部,不包括数据部分。这里不采用CRC检验码而采用简单的计算方法。前面我们曾经介绍过差错控制,同样在IP协议中也考虑到了差错控制的功能。首部校验和字段就是用来检错,这里要注意该字段不能纠错,同时要注意这个字段校验范围只是首部。对于数据部分的对错,该字段是不负责检测的。首部校验和字段占了16个比特,该校验和字段采用的算法与我们前面介绍的循环冗余码不一样,这里我们将会在传输层的UDP协议中学习,这里我们只用知道该字段的作用即可。
数据报从源主机发出后,沿途路由器以及目的主机都要根据首部校验和字段来检测首部的对错,如果发现首部有错就将该IP数据报丢弃,当然只要首部有变化,该字段就会被重新计算,如所有数据报的TTL字段在路由转发时都要被减1,因此路由器会对每个被转发的IP数据报都要重新计算一下它的首部校验和字段。
在这里我们需要强调网际协议IP提供的是一个无连接、不可靠、尽力而为的服务,也就是说源主机和目的主机之间是不需要建立连接的,想发就发,接收端收到以后也不需要给出确认,也没有重传机制,也没有对数据部分的差错控制,因为它只校验首部。这样做的优点是大大节省了路由器处理每个数据报的时间,也符合IP协议的尽力传递的思想。它的缺点是给高层的软件留下了数据不可靠的问题,增加了高层协议的负担。不过IP数据报首部和数据部分的分开校验,也允许高层协议自己选择所对应的校验方法。
-
IP数据报第四行、第五行就是源IP地址和目的IP地址字段,各占了4个字节,分别指明本IP数据报最初的发送者和最终接收者的IP地址,这里我们要注意的是一个IP数据报不管是经过了多少路由器的转发,这两个字段的值始终保持不变,路由器总是提取目的IP地址和路由表中的表项来进行匹配,以决定该把数据报发往何处,关于IP数据报的转发过程,后面我们会详细的学习。
-
最后一个字段是IP选项字段,也就是可有可无,主要用于控制和测试的目的。实际上这个字段用的不多,我们只需要知道为了保证数据报首部的长度是4字节的整数倍,如果用到选项字段的话,就有可能还需要在它的后面填充一些零比特即可。
以上就是我们学习的IP数据报的格式,我们一定要注意首部长度这个字段和总长度字段的单位是不一样的。还有一些关键字段如协议类型字段,TTL字段及源IP地址和目的IP地址的含义都需要掌握,在实际应用中我们可以利用数据报捕获工具Wireshark来吧IP数据报捕获下载进行对比分析。