Skip to main content

IP报文格式

IP协议(Internet Protocol)是TCP/IP协议族中最核心的协议,提供不可靠的、无连接的、尽力而为的数据报传输服务。

协议栈结构

IP协议栈结构
   +------+ +-----+ +-----+     +-----+
  |Telnet| | FTP | | TFTP| ... | ... |
  +------+ +-----+ +-----+     +-----+
        |   |         |           |
       +-----+     +-----+     +-----+
       | TCP |     | UDP | ... | ... |
       +-----+     +-----+     +-----+
          |           |           |
       +-------------------------------+
       |    Internet Protocol & ICMP   |
       +-------------------------------+
       |        L2 Type = 0x0800       |
       +-------------------------------+
       |               L1              |
       +-------------------------------+        

报文格式

IP头格式
 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP头字段解释
字段 长度 含义
Version 4bits 4:表示为IPv4; 6:表示为IPv6。
IHL 4bits 首部长度,如果不带Option字段,则为20,最长为60,该值限制了记录路由选项。以4字节为一个单位。
Type of Service 8bits 服务类型。只有在有QoS差分服务要求时这个字段才起作用。
Total Length 16bits 总长度,整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。
Identification 16比特 标识,主机每发一个报文,加1,分片重组时会用到该字段。
Flags 3比特 标志位。详见IP Flags字段
Fragment Offset 13比特 片偏移,分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位。
Time to Live 8比特 生存时间,可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。
Protocol 8比特 下一层协议,指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。
Header Checksum 16比特 首部检验和,只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。
Source Address 32比特 源IP地址。
Destination Address 32比特 目的IP地址。
Options 可变 选项字段,用来支持排错,测量以及安全等措施,内容丰富(请参见IP Header Options)。 选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。
Padding 可变 填充字段,全填0。
IP Flags字段
   0     1       2   
+-----+------+------+
|  0  |  DF  |  MF  |
+-----+------+------+
  • Bit 0: 保留位,必须为0。

  • Bit 1: DF(Don't Fragment),能否分片位,0表示可以分片,1表示不能分片。

  • Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。

IP Protocol字段对照表
Value 含义 标准
0 保留Reserved  
1 ICMP, Internet Control Message RFC792
2 IGMP, Internet Group Management RFC1112
3 GGP, Gateway-to-Gateway RFC823
4 IP in IP (encapsulation) RFC2003
6 TCP Transmission Control Protocol RFC793
17 UDP User Datagram Protocol RFC768
20 HMP Host Monitoring Protocol RFC869
27 RDP Reliable Data Protocol RFC908
46 RSVP (Reservation Protocol)  
47 GRE (General Routing Encapsulation)  
50 ESP Encap Security Payload RFC2406
51 AH (Authentication Header) RFC2402
54 NARP (NBMA Address Resolution Protocol) RFC1735
58 IPv6-ICMP (ICMP for IPv6) RFC1883
59 IPv6-NoNxt (No Next Header for IPv6) RFC1883
60 IPv6-Opts (Destination Options for IPv6) RFC1883
89 OSPF (OSPF Version 2) RFC1583
112 VRRP (Virtual Router Redundancy Protocol) RFC3768
115 L2TP (Layer Two Tunneling Protocol)  
124 ISIS over IPv4  
126 CRTP (Combat Radio Transport Protocol)  
127 CRUDP (Combat Radio User Protocol)  
132 SCTP (Stream Control Transmission Protocol)  
136 UDPLite RFC3828
137 MPLS-in-IP RFC4023

IP Header Options

IP Header Options
CLASS NUMBER 长度 含义
0 0 - Code为0代表了选项列表的结束,放在所有选项链表的后面,用来补字节对齐。该选项无长度字段,占一个字节。详见选项结束选项
0 1 - 表示无操作的选项。用在各种选项之间,占一个字节。用于填充4字节对齐。详见IP 无操作选项
0 2 11B 表示安全和处理限制的选项。 该选项提供一种主机可以发送安全、分隔、处理限制及TCC(关闭使用组)的参数功能。详见IP 安全和处理限制的选项
0 3 可变 松散的源站选路(为数据报指定一系列必须经过的IP地址)。详见IP 松散源站选路选项
0 7 可变 记录路径(让每个路由器都记下它的IP地址)。详见IP 记录路径选项
0 8 4B 流标识选项。详见流标识选项.
0 9 可变 严格的源站选路选项。与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。详见IP 严格源选路选项
2 4 可变 时间戳选项。详见时间戳选项
选项结束选项
+--------+
|00000000|
+--------+     Type=0
IP 无操作选项
+--------+        
|00000001|
+--------+     Type=1

表示无操作的选项。用在各种选项之间,占一个字节。用于填充4字节对齐。

IP 安全和处理限制的选项
+--------+--------+--...---+--...---+--...---+--...---+
|10000010|00001011|SSS  SSS|CCC  CCC|HHH  HHH|  TCC   |
+--------+--------+--...---+--...---+--...---+--...---+     Type=130 Length=11
  • Type=130(10000010):占1字节,code 的值此处设为130

  • length=11:占1字节,长度选项固定为11,表示该选项的长度为11字节

  • SSS:占2字节,表示安全域,下面列出了16种不同的安全标准,其中8个至今还没使用,预留将来使用,列表如下:

    • 00000000 00000000 - Unclassified

    • 11110001 00110101 - Confidential

    • 01111000 10011010 - EFTO

    • 10111100 01001101 - MMMM

    • 01011110 00100110 - PROG

    • 10101111 00010011 - Restricted

    • 11010111 10001000 - Secret

    • 01101011 11000101 - Top Secret

    • 00110101 11100010 - (Reserved for future use)

    • 10011010 11110001 - (Reserved for future use)

    • 01001101 01111000 - (Reserved for future use)

    • 00100100 10111101 - (Reserved for future use)

    • 00010011 01011110 - (Reserved for future use)

    • 10001001 10101111 - (Reserved for future use)

    • 11000100 11010110 - (Reserved for future use)

    • 11100010 01101011 - (Reserved for future use)

  • CCC:占2个字节,表示分隔域,当传输的数据没被分隔的时候,此值设为0。

  • HHH:占2个字节,操作限制域。

  • TCC:占3个字节,传输控制码。提供一种传输隔离的手段,该值为3字母词,可用值从HQ DCA Code 530。

IP 松散源站选路选项
+--------+--------+--------+---------...--------+
|10000011| length | pointer|   route data...    |
+--------+--------+--------+---------...--------+     Type=131
  • Type: 类型。占1字节,此处设为131。

  • length: 占1字节,记录整个选项的长度。

  • pointer: 指针项,占1个字节,指向下一个被处理的源站地址,最小值为4。

  • route data: 路由数据。

IP 记录路径选项
+--------+--------+--------+---------...--------+
|00000111| length | pointer|    route data...   |
+--------+--------+--------+---------...--------+     Type=7 Length=Variable
  • Type: 指明IP选项的类型。此处值为7。

  • length: 选项的总字节长度。不包含填充的长度,IP填满时最大为39;。

  • pointer: 它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12,16,最大到36,当记录下9个IP地址后,ptr的值为40,表示清单已满。

  • route data: 路由数据。

IP 流标识选项
+--------+--------+--------+--------+        
|10001000|00000010| Stream ID |
+--------+--------+--------+--------+ Type=136 Length=4B

流标识选项。该选项长度固定为4字节,code值为136,后面的字段固定为0x02,流ID为2字节。该选项提供了一种携带SATNET流标识符通过不支持流方式的网络。

IP 严格源选路选项
+--------+--------+--------+---------...--------+        
|10001001| length | pointer| route data ... |
+--------+--------+--------+---------...--------+ Type=137 Length=1B
  • Type=137(10001001):占1字节,code 的值此处设为137。

  • length:占1字节,记录整个选项的长度。

  • pointer:指针项,占1个字节,指向下一个被处理的源站地址,最小值为4。

IP 时间戳选项
0       7        15       23       31
+--------+--------+--------+--------+
|01000100| length | pointer|oflw|flg|
+--------+--------+--------+--------+
| internet address |
+--------+--------+--------+--------+
| timestamp |
+--------+--------+--------+--------+
| ... |
  • Type (01000100):时间戳选项,代码为68;

  • length:选项的总长度(一般为36或40);

  • ponter:指向下一个可用空间的指针(5,9,13等);

  • oflw:表示溢出字段;

  • flg:表示标志字段:

    • 0:只记录时间戳。

    • 1:每台路由器都记录它的IP地址和时间戳。在选项列表中只有存放4对地址和时间戳的空间。

    • 3:发送端对选项列表进行初始化,存放了4个IP地址和4个取值为0的时间戳值。只有当列表中的下一个IP地址与当前路由器地址相匹配时,才记录它的时间戳。

参考标准

IP参考标准
标准 描述
RFC 791 INTERNET PROTOCOL(Updated by: 1349, 2474, 6864 )