IP报文格式详解

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报文首部之后就是数据部分。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值