IP数据报概貌
完整的IP数据报由首部和数据两部分组成。首部第一部分20字节,是所有IP数据报必须具有的;首部第二部分是可选字段,其长度是可变的。其各字段如下图所示:
首部固定部分各字段含义
固定部分第一行
- 版本:占4位,指IP的协议版本。通信双方使用的IP协议的版本必须一致,目前广泛使用的IP协议的版本号为4(即IPv4),字段内填充为0100
- 首部长度:占4位,表示首部字段长度。其单位为4字节,通常情况下默认值为0101(十进制5),代表首部固定长度20字节。最大为1111(十进制15),即60字节。当IP分组首部长度不是4字节整数倍,需利用最后字段填充
- 区分服务:占8位,用来获得更好的服务。利用DS(Differentiated Services)字段的不同数值,提供不同等级的服务。一般情况下不使用
- 总长度:占16位,指首部和数据之和的长度。单位为字节,总长度字段为16位,因此数据报的最大长度为216 - 1 = 65535字节。实际上传送这样长的数据报在现实中是很少的
我们知道,在IP层下面的每一种数据链路层协议都规定了一个数据帧的数据字段的最大长度,这称为最大传送单元MTU(Maximun Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分),如果大于数据链路层规定的MTU值,就必须把过长的数据报进行那个分片处理。
IP协议规定,在因特网上的主机和路由器,必须能够接收长度不超过576字节的数据报。这是假定上层交下来的数据长度有512字节(合理长度),加上最长的IP首部60字节(15 * 4),再加上4字节的富裕量
固定部分第二行
- 标识:占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报由于长度超过网络的MTU值而必须分片时,这个标识字段的值就被复制进所有数据报片的标识字段中,相同的标识字段的值,使分片后各数据报片最后能正确地重装为原来的数据片
- 标志:占3位,最低位记为MF(More Fragment)。MF = 1表示后面还有分片数据报,MF = 0表示这是若干数据报分片中的最后一个。标志字段中间一位记为DF(Don’t Fragment),意思是不能分片,只有DF = 0才允许分片。标志最高位,目前没使用
- 片偏移:占13位,片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的七点,该片从何处开始。片偏移以8个字节为偏移单位
固定部分第三行
- 生存时间:占8位,其缩写为TTL(Time to live),表明数据报在网络中的寿命。由发出数据报原点设置这个字段,其目的是防止无法交付的数据报无限制在因特网中兜圈子。路由器在转发数据报之前将TTL数值减1,若TTL数值减为0,则丢弃这个数据报
- 协议:占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道将数据部分上交给哪个进程处理。常用的一些协议和相应的协议字段值如下:
- 首部校验和:占16位,这个字段只检验数据报的首部,不包含数据部分。这是因为每经过一个路由器,路由器都重新计算一下首部检验和(生存时间、标志、片偏移等可能发生变化)
举一个简单的例子,假如在发送端检验和为11010011 11001100,其取反码写入检验和字段的值为00101100 00110011,若在传输过程没有差错,则接收端(除检验和)依旧为11010011 11001100,与校验和相加为11111111 11111111, 取反码为00000000 00000000。需要注意的是在发送端,反码算数运算求和,初始化检验和字段为全0,接收端检验和字段参与运算,判定数据在传输过程中是否出现差错
固定部分第四五行
- 源地址:占32位,是源主机IP地址
- 目的地址:占32位,是目的主机IP地址
首部可变部分
IP首部的可选部分就是一个选项字段,用来支持排错、测量以及安全等措施。这些选项连接起来,中间不需要有分割符,最后使用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。增加了每一个路由器处理数据报的开销,实际上这些选项很少使用。很多路由器都不考虑IP首部的选项字段,因此新的IP版本IPv6就把IP数据报的首部长度做成固定的