IPv4 报文头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IPv4 报文头相关的知识,希望对你有一定的参考价值。

参考技术A

Author: Xu FC
References:
https://tools.ietf.org/html/rfc791
https://tools.ietf.org/html/rfc1393
http://www.iana.org/assignments/ip-parameters/ip-parameters.xhtml
http://www.bogpeople.com/networking/dscp.shtml
https://blog.csdn.net/u011784495/article/details/71636993
http://www.rhyshaden.com/ipdgram.htm
http://www.tcpipguide.com/free/t_IPDatagramOptionsandOptionFormat-2.htm

4 bits

0x4: IPv4, ethernetII type 为 0x0800
0x6: IPv6, ethernetII type 为 0x86dd

4 bits

8 bits

前 6 位 (0~5, RFC 2474) : 区分服务码点 (DSCP - Different Services Code Point), 是 IP 优先级和服务类型字段的组合。

后 2 位 (RFC 3168):拥塞通知 (ECN - Explicit Congestion Notification)。

IP 优先级表

16 bits

总长度 = IP 头部长度 + 数据长度
16 bit 能表示的最大长度为 65535 字节(2 的 16 次方 - 1),超过该长度的报文可以通过 IP 分片进行构造。

16 bits

每个数据报有唯一标识,每次加1,同一个数据报产生分片,所有分片的标识相同,给分片重组作为依据。

3 bits

分片标志:

13 bits

表示在当前分片在数据报的位置,如果没有分片,该字段为 0 ;如果有分片,首片片偏移为 0,偏移的一个单位表示 8 字节,因此非尾片的数据部分需是 8 字节的整数倍,如果当前分片为第二片,首片数据部分为 24 字节,即结束位置为第 24 * 8 - 1 = 191 位,因此当前分片的片偏移为 3,即起始位置为第 3 * 8 * 8 = 192 位。

8 bits

表示该报文传输中允许经过的跳数,没经过一个路由器,该值就减 1 ,当 TTL = 0 时,丢弃这个报文,从而阻止报文在网络上无限传输。TTL 最大值为 255 (2 的 8 次方 -1)。

8 bits

告诉主机的 IP 层应该将数据交给哪个上层处理过程。

16 bits

用于IP首部校验,校验失败则丢弃该报文。

32 bits

发送端 IP 地址。
Web 应用中,源 IP 不能是受限广播 IP。

32 bits

接收端 IP 地址。
255.255.255.255 为受限广播,路由器将丢弃该报文。
x.x.x.255 直接广播,该报文将被发送到 x.x.x.0/24 子网的每一台主机上。

可选的 IP 报头字段。
选项长度需要是 4 字节的整数倍,非整数倍将 PAD 填充。

无长度和数据,用于标记选项列表的结尾。

无长度和数据, 用于对齐 IP 头中 32 位边界对齐的内部填充。

向目的转发时指定路由,网关可以不遵守。

与 RR 类似,只是将路由改为时间戳,每个路由器都插入时间戳,用来查看路由之前的传输时长。
为了不暴露内网路径相关信息,防火墙应丢弃携带 TS Option 的报文。

记录数据报走过的每个路由,长度由始发设备设置,不能被放大,如果到达目的前被填满,则只会记录部分路由。
为了不暴露内网路径,防火墙应丢弃携带 RR Option 的报文。

指定路由,路由器必须按照该路由进行转发,并且在转发过程中将源路由替换为路由器地址。

路由器将 ICMP Traceroute 消息发送给始发主机,从而告诉发起方传输路径。

IPV4报文格式详解

ipv4报文格式

技术图片
? 版本(version):4比特(bit),4(二进制0100)代表ipv4,6(二进制0110)代表ipv6;
? 报文头长度(IHL,IP Header Length):4比特(bit),该值以4字节(Byte)为一个单位,因此最长可以表示15*4=60字节(Byte);最小为20(不带Option字段),最长为60;
? 服务类型(TOS,Type of Service):8比特(bit),用于实施QOS,RFC 791中TOS 的IP Precedence分为8个优先级,值越大优先级越高。RFC2474中对TOS重新定义,前6位定义成DSCP,可以标识64中等级,后两位保留;
? 报文总长度(Total Length):长度16比特(bit),以字节(Byte)为单位,包含报文头和数据,所有IP报文最长65535字节(Byte),2的16次方等于65536;
? 标识符(Identification):16比特(bit),主机每发一个报文,加1,分片重组时会用到该字段,与Flags和Fragment Offset联合使用进行分段操作,一个大包分段为多个小包时标记为相同的值;
? 标记(Flags):3比特(bit),第一位不使用,第二位是DF(Don’t Fragment)位,表示是否分片,0表示可以分片,1表示不能分片;第二位是MF(More Fragment)位,表示该报文是否为最后一片,0表示是,1表示否即还有后续报文;
? 片偏移(Fragment Offset):12比特(bit),表示分片在原分组中的相对位置,以8个字节为偏移单位;
? 生存时间(TTL,Time to Live):8比特(bit),报文发送设备赋值,报文没经过一台路设备,该设备会对TTL值减1,当TTL值为0时丢弃报文,用于防环;
? 协议(Protocol):8比特(bit),上层所用的协议;
? 头部校验(Header Checksum):16比特(bit),只检验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法;因为路由器需要改变包头里的TTL值,因此路由器需要为每个包重新计算头部校验值;
? 源地址(Source Address):32比特(bit), 源IP地址;
? 目的地址(Destination Address):32比特(bit), 目标IP地址;
? 可选项(Options):可变长度;主要用于测试,具体见下方
? 填充(Padding):填充字段,全0,因IP报文头长度单位为32bit(4Byte,),所以报文长度必须为32bit的整数倍。

扩展--服务类型(TOS,Type of Service):

COS、TOS和DSCP:
COS是二层报文优先级IEEE802.1p,TOS和DSCP是三层IP报文头的优先级
COS是字VLAN帧里的802.1Q tag里的一个PRI字段(3bit),代表8个优先级0-7
技术图片
报文分为三种情况:带优先级和VLAN ID的标签报文,其优先级值是自身带的值;只带优先级的标签报文,此时VLAN ID为0,其优先级值是自身带的值;未带标签的报文,一般默认的优先级值为0,也可以进行更改指定新的优先级。
TOS和DSCP是IP报文头的优先级,不同的RFC,具体参考QOS;
扩展--可选项(Options)
? 松散源路由(Loose source Routing):给出一连串路由器接口IP地址,IP包必须沿着这些IP传送,但允许相继的两个IP之间经过多跳;
技术图片

  • Type: 类型。占1字节,此处设为131。
  • length: 占1字节,记录整个选项的长度。
  • pointer: 指针项,占1个字节,指向下一个被处理的源站地址,最小值为4。
  • route data: 路由数据。
    ? 严格源路由(Strict Source Routing):给出一连串路由器接口IP地址,IP包必须沿着这些IP传送,如果下一跳不在IP列表则表示发生错误;
    技术图片
  • Type=137(10001001):占1字节,code 的值此处设为137。
  • length:占1字节,记录整个选项的长度。
  • pointer:指针项,占1个字节,指向下一个被处理的源站地址,最小值为4。
    ? 路有记录(Record Route):当IP包离开每个路由器时,记录路由器的出接口IP地址;
    技术图片
  • Type: 指明IP选项的类型。此处值为7。
  • length: 选项的总字节长度。不包含填充的长度,IP填满时最大为39;。
  • pointer: 它是一个基于1的指针,指向存放下一个IP地址的位置。它的最小值为4,指向存放第一个IP地址的位置。随着每个IP地址存入清单,ptr的值分别为8,12,16,最大到36,当记录下9个IP地址后,ptr的值为40,表示清单已满。
  • route data: 路由数据。
    ? 时间戳(Timestamps):当IP包离开每个路由器时纪录时间。
    技术图片
  • Type (01000100):时间戳选项,代码为68;
  • length:选项的总长度(一般为36或40);
  • ponter:指向下一个可用空间的指针(5,9,13等);
  • oflw:表示溢出字段;
  • flg:表示标志字段:
    ? 0:只记录时间戳。
    ? 1:每台路由器都记录它的IP地址和时间戳。在选项列表中只有存放4对地址和时间戳的空间。
    ? 3:发送端对选项列表进行初始化,存放了4个IP地址和4个取值为0的时间戳值。只有当列表中的下一个IP地址与当前路由器地址相匹配时,才记录它的时间戳。

以上是关于IPv4 报文头的主要内容,如果未能解决你的问题,请参考以下文章

IPv4如何实现IP报文的分片和重组

DHCP报文

IP报文头详解

IP报文分段时,为啥必须把头部复制到每个分段上

IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式

IPv4_数据报文首部格式