IP数据报格式

通过IP数据报的格式,我们能够更清楚的知道IP协议的作用。IPv4的数据报一般以32位为单位来描述,下面的图是一个IP数据报格式图:

QQ截图20201212131523 - IP数据报格式

我们建议学习IP数据报格式时,可以使用抓包工具(如wireshark),抓取一些IP数据报,认真观察对比。

现在,我们来看IP数据报首部各个字段的作用:

(1)版本:占4位,指IP协议的版本。

(2)首部长度:占4位,指首部长度(不含数据部分),单位为4字节。因为首部固定部分为20字节,所以该字段值最小为5(0101)

(3)区分服务:占8位,目前没啥用途。

(4)总长度:占16位,首部长度数据部分长度,单位为字节。那么理论上,一个IPv4的数据报长度最大为2的16次方减1字节,及65535字节。但数据报最大长度是受MTU(最大传输单元)控制的,一个数据报的长度不可以超过MTU设定值。这个设定值一般设置为1500。因为过长的数据报,路由器的转发速度就会变慢,但如果数据报太小,那么转发效率就会上不去。当一个数据报长度超过MTU的时候,就需要将一个长的数据报拆分成几个数据报分片。

(5)标识:占16位,系统中有一个计数器,每当产生一个数据报,这个计数器就自增1,标识字段的值就是这个自增的数字。通过这个标识值,以及后面会说到的标志字段和偏移量,就可以将分片重装为原来的数据报。

(6)标志:占3位,但目前就只有后两位有意义:

  • 中间位,Don't fragment:不能分片。只有该位为0时,才允许分片
  • 最后一位,More fragments:还有分片。若该值为0表示已经是最后一个分片了,否则表示后面还有分片。

(7)偏移量:占13位。它表示某分片的在原始分组的数据部分的相对位置。单位为8字节。

(8)跳数限制:占8位,它是为了防止一个数据报在网络中无限制的传播。这个字段的值表示该数据报最多能经过多少个路由器,当经过一个路由器时,该值就减1,等到该值为0时数据报还未交付成功,那么路由器就丢弃此数据报。

(9)协议:表示此数据报携带的数据使用哪种协议,常用的协议有:

  • ICMP:值为0
  • IP:值为4
  • TCP:值为6
  • UDP:值为17

(10)首部校验和:占16位,这个字段只校验数据报的首部,但不包括数据部分。通过该字段可以计算该数据报是否出些差错。

(11)源地址:占32位。

(12)目的地址:占32位。

(13)可选部分:几乎用不到。