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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version:版本号。IPv4是4。IPv6是6。
IHL:ip header length 首部长度。即数据部分的偏移量。以4字节为单位。有选项时,当IP报文首部的长度不是4字节的整数倍时,用0填充为4字节的整数倍。最小值是5,即首部最短20个字节,最大值是15,即首部最长60个字节。
Type of Servie:ToS服务类型。指明以何种方式处理数据报文。目前前6位是DSCP(differentiated services codepoint),定义了一组区分服务。最后两位目前作为ECN比特,用于显式通知TCP发生了拥塞。ECN比特具体参见TCP相关文档。DSCP的右边三位为0时,前三位是优先级字段。111用于本地网络控制协议,110用于网际控制协议,比如OSPF、BGP,000是常规的数据,其它级别是具有优先级的数据报文。关于DSCP的详细讲解,参见QoS相关文档。
Total Length:IP报文总长度。包括首部长度和数据部分。需要注意的是,如果IP报文被分片,这个字段表示的只是当前分片的总长度,而不是原始的IP报文的总长度。
Identification:IP报文标识。IP协议通过源IP、目的IP、协议号和ID来标识一个IP报文。同一个IP报文的所有分片的Identification相同,都是原始IP报文的Identification。
Flags:标志位。3个比特。高比特保留,必须是0。中间比特是不分片标志位(do not fragment),如果该比特是1,则数据报不能被分片。当IP报文长度大于出接口MTU,但是不分片bit置位时,路由器丢弃该报文,并向源主机发送一个ICMP消息。低比特是还有更多分片标志位(more fragment)。如果IP报文未被分片,则这个bit为1。如果被分片,该比特为0表示该分片不是原始IP报文的最后一个分片,该比特为1表示该分片是原始IP报文的最后一个分片。
Fragment offset:片偏移。指明分片中的数据在原始的IP报文数据部分中的偏移量,以8字节为单位,所以除了最后一个分片,其它分片的IP报文数据部分长度必须是8字节的整数倍。如果IP报文没有被分片,那么这个字段的值为0。如果IP报文被分片,那么第一个分片中这个字段的值是0,后续分片中这个字段的值都不是0。假设第一个分片中数据部分的长度为1480字节,那么第二个分片的片偏移字段的值为185(1480/8=185)。
TTL:time to live,实际上指明了报文能经过的路由器的最大数目,又叫最大跳数。因为是8个bit长,所以最大值为255。每台路由器转发报文时,就将其TTL值减1。如果减一之后这个字段的值变成了0,那么路由器就丢弃这个报文。这防止因为路由环路导致的IP报文在网络中无限转发。如果不希望一个报文跨跳传输,那么TTL值应该设置为1,比如OSPF报文。
Protocol:协议号。表示上层协议是什么。常见值有ICMP:1;IGMP:2;TCP:6;UDP:17;RSVP:46;OSPF:89;PIM:103;VRRP:112。
Header checksum:首部检验和。因为TTL逐跳递减,所在每一跳首部校验和都会变化。有人认为链路层有CRC字段,比如PPP、以太,但是IP并不限定于特定的链路层,并不能保证所有的链路层协议都有CRC字段。退一万步,即使所有的链路层协议都有CRC字段,在主机内部报文从链路层送到网络层时也可能发生错误。所以IP层需要计算校验和。那么为什么不计算整个报文的校验和呢?这会导致很大的开销,所以只检查对报文转发而言最重要的IP首部。IP协议把计算数据部分校验和的工作交给了上层协议。比如UDP和TCP,它们只需要在报文的目的地计算一次校验和,而不用每一跳都计算。另外,有些应用并不在乎少量的数据错误,比如实时视频流,UDP也可以不检查校验和。如果IP层将少量数据错误的报文都丢弃了,那会影响这种应用的工作。
Source Address:源主机的IP地址。
Destination Address:目的主机的IP地址。
Options:选项头部。
Padding:为当IP报文首部的长度不是4字节的整数倍时,用0填充为4字节的整数倍。
IP报文首部之后就是数据部分。