当存在长度为 22 字节的 IP 标头时,填充将如何工作?

网络工程 ip IPv4 协议论
2022-02-10 12:59:24

我用于选项的 20 字节 + 2 字节的基本 IPv4 标头使其成为 22 字节意味着 176 位,因此填充将添加 16 个零以使其成为 32 的倍数?这是正确的理解方式吗?

32位的边界意味着从上到下或从左到右计算所有字段?

1个回答

如果您的 IPv4 标头是 22 个八位字节,则必须添加两个八位字节(16 位)的零填充以使其成为 24 个八位字节。IPv4 标头中的八位字节数必须是四个八位位组(32 位)的倍数,最多为 60 个八位位组。

您还必须调整 IHL 字段以反映 32 位字的数量。对于正常的 20 字节报头,IHL 将为 5,但您要添加一个 32 位字,因此您的 IHL 必须为 6。

32位的边界意味着从上到下或从左到右计算所有字段?

这个问题实际上没有意义。IPv4 标头是串行发送的比特流,并在标头末尾添加填充。


此外,要了解 IPv4 标头选项还有其他规则(您不能简单地自己编造),并且数据包路径中的所有主机,包括中间路由器,都必须了解这些选项,其中大多数已被弃用或不受支持。今天的大多数路由器都配置为丢弃带有选项的 IPv4 数据包。

RFC 791, Internet Protocol, Section 3.1 Internet Header Format有关于 IPv4 头选项的解释:

选项:变量

这些选项可能出现在数据报中,也可能不出现。它们必须由所有 IP 模块(主机和网关)实现。可选的是它们在任何特定数据报中的传输,而不是它们的实现。

在某些环境中,所有数据报都可能需要安全选项。

选项字段的长度是可变的。可能有零个或多个选项。选项的格式有两种情况:

Case 1: A single octet of option-type.

Case 2: An option-type octet, an option-length octet, and the actual option-data octets.

option-length octet 计算 option-type octet 和 option-length octet 以及 option-data octet。

选项类型八位字节被视为具有 3 个字段:

1 bit   copied flag,
2 bits  option class,
5 bits  option number.

复制标志表示该选项被复制到分片时的所有分片中。

0 = not copied
1 = copied

选项类是:

0 = control
1 = reserved for future use
2 = debugging and measurement
3 = reserved for future use

定义了以下 Internet 选项:

CLASS NUMBER LENGTH DESCRIPTION
----- ------ ------ -----------
  0     0      -    End of Option list.  This option occupies only
                    1 octet; it has no length octet.
  0     1      -    No Operation. This option occupies only 1
                    octet; it has no length octet.
  0     2     11    Security. Used to carry Security,
                    Compartmentation, User Group (TCC), and
                    Handling Restriction Codes compatible with DOD
                    requirements.
  0     3     var.  Loose Source Routing. Used to route the
                    internet datagram based on information
                    supplied by the source.
  0     9     var.  Strict Source Routing. Used to route the
                    internet datagram based on information
                    supplied by the source.
  0     7     var.  Record Route. Used to trace the route an
                    internet datagram takes.
  0     8      4    Stream ID. Used to carry the stream
                    identifier.
  2     4     var.  Internet Timestamp.

特定选项定义

选项列表结束

  +--------+
  |00000000|
  +--------+
    Type=0

该选项表示选项列表的结束。根据 Internet 标头长度,这可能与 Internet 标头的结尾不一致。这用于所有选项的结尾,而不是每个选项的结尾,并且仅在选项的结尾与 Internet 标头的结尾不一致时才需要使用。

可能会因碎片或任何其他原因而被复制、引入或删除。

无操作

  +--------+
  |00000001|
  +--------+
    Type=1

此选项可用于选项之间,例如,将后续选项的开头对齐在 32 位边界上。

可能会因碎片或任何其他原因而被复制、引入或删除。

安全

此选项为主机提供了一种发送安全、隔离、处理限制和 TCC(封闭用户组)参数的方法。此选项的格式如下:

+--------+--------+---//---+---//---+---//---+---//---+
|10000010|00001011|SSS  SSS|CCC  CCC|HHH  HHH|  TCC   |
+--------+--------+---//---+---//---+---//---+---//---+
 Type=130 Length=11

安全性(S 字段):16 位

指定 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)

隔间(C 字段):16 位

当传输的信息没有分隔时,使用全零值。隔间字段的其他值可以从国防情报局获得。

处理限制(H 字段):16 位

控制和释放标记的值是字母数字二合字母,并在国防情报局手册 DIAM 65-19“标准安全标记”中定义。

传输控制码(TCC 字段):24 位

提供一种方法来隔离流量并定义订户之间的受控利益社区。TCC 值是三元组,可从 HQ DCA 代码 530 获得。

必须在碎片上复制。该选项在一个数据报中最多出现一次。

松散源和记录路径

+--------+--------+--------+---------//--------+
|10000011| length | pointer|     route data    |
+--------+--------+--------+---------//--------+
 Type=131

松散源和记录路由 (LSRR) 选项为 Internet 数据报的源提供了一种方法,以提供网关在将数据报转发到目的地时使用的路由信息​​,并记录路由信息。

该选项以选项类型代码开头。第二个八位位组是选项长度,包括选项类型代码和长度八位位组、指针八位位组和长度为 3 位的路由数据。第三个八位字节是指向路由数据的指针,指示开始下一个要处理的源地址的八位字节。指针是相对于这个选项的,指针的最小合法值是 4。

路由数据由一系列互联网地址组成。每个互联网地址是 32 位或 4 个八位字节。如果指针大于长度,则源路由为空(并且记录的路由已满),路由将基于目标地址字段。

如果已经到达目的地址域中的地址并且指针不大于长度,则源路由中的下一个地址替换目的地址域中的地址,并且记录的路由地址替换刚刚使用的源地址,并且指针增加了四。

记录的路由地址是该数据报转发到的环境中已知的互联网模块自己的互联网地址。

这个用记录的路由替换源路由的过程(尽管它与用作源路由的顺序相反)意味着选项(以及整个 IP 标头)保持恒定长度,如数据报通过互联网传输。

此选项是松散源路由,因为允许网关或主机 IP 使用任意数量的其他中间网关的任意路由到达路由中的下一个地址。

必须在碎片上复制。在一个数据报中最多出现一次。

严格的来源和记录路线

+--------+--------+--------+---------//--------+
|10001001| length | pointer|     route data    |
+--------+--------+--------+---------//--------+
 Type=137

严格源和记录路由 (SSRR) 选项为 Internet 数据报的源提供了一种方法,以提供网关在将数据报转发到目的地时使用的路由信息​​,并记录路由信息。

该选项以选项类型代码开头。第二个八位位组是选项长度,包括选项类型代码和长度八位位组、指针八位位组和长度为 3 位的路由数据。第三个八位字节是指向路由数据的指针,指示开始下一个要处理的源地址的八位字节。指针是相对于这个选项的,指针的最小合法值是 4。

路由数据由一系列互联网地址组成。每个互联网地址是 32 位或 4 个八位字节。如果指针大于长度,则源路由为空(并且记录的路由已满),路由将基于目标地址字段。

如果已经到达目的地址域中的地址并且指针不大于长度,则源路由中的下一个地址替换目的地址域中的地址,并且记录的路由地址替换刚刚使用的源地址,并且指针增加了四。

记录的路由地址是该数据报转发到的环境中已知的互联网模块自己的互联网地址。

这个用记录的路由替换源路由的过程(尽管它与用作源路由的顺序相反)意味着选项(以及整个 IP 标头)保持恒定长度,如数据报通过互联网传输。

此选项是严格源路由,因为网关或主机 IP 必须仅通过下一个地址中指示的直连网络将数据报直接发送到源路由中的下一个地址,才能到达路由中指定的下一个网关或主机。

必须在碎片上复制。在一个数据报中最多出现一次。

记录路线

+--------+--------+--------+---------//--------+
|00000111| length | pointer|     route data    |
+--------+--------+--------+---------//--------+
  Type=7

记录路由选项提供了一种记录互联网数据报路由的方法。

该选项以选项类型代码开头。第二个八位位组是选项长度,包括选项类型代码和长度八位位组、指针八位位组和长度为 3 位的路由数据。第三个八位字节是指向路由数据的指针,指示开始下一个区域以存储路由地址的八位字节。指针是相对于这个选项的,指针的最小合法值是 4。

记录的路线由一系列互联网地址组成。每个互联网地址是 32 位或 4 个八位字节。如果指针大于长度,则记录的路由数据区已满。始发主机必须将此选项与足够大的路由数据区域组成,以容纳所有预期的地址。选项的大小不会因添加地址而改变。路由数据区的初始内容必须为零。

当 Internet 模块路由数据报时,它会检查是否存在记录路由选项。如果是,它将其自己的互联网地址插入到从指针指示的八位字节开始的记录路由中,该数据报被转发到的环境中已知的互联网地址,并将指针增加四。

如果路由数据区已满(指针超过长度),则转发数据报而不将地址插入记录的路由中。如果有一些空间但没有足够的空间来插入完整地址,则原始数据报被认为是错误的并被丢弃。在任何一种情况下,ICMP 参数问题消息都可能被发送到源主机 [3]。

不复制碎片,只进入第一个碎片。在一个数据报中最多出现一次。

流标识符

+--------+--------+--------+--------+
|10001000|00000010|    Stream ID    |
+--------+--------+--------+--------+
 Type=136 Length=4

此选项为 16 位 SATNET 流标识符提供了一种通过不支持流概念的网络传输的方法。

必须在碎片上复制。在一个数据报中最多出现一次。

互联网时间戳

+--------+--------+--------+--------+
|01000100| length | pointer|oflw|flg|
+--------+--------+--------+--------+
|         internet address          |
+--------+--------+--------+--------+
|             timestamp             |
+--------+--------+--------+--------+
|                 .                 |
                  .
                  .
Type = 68

选项长度是选项中的八位字节数,计算类型、长度、指针和溢出/标志八位字节(最大长度为 40)。

指针是从该选项开始到时间戳结束的八位字节数加一(即,它指向开始下一个时间戳空间的八位字节)。最小的合法值为 5。当指针大于长度时,时间戳区域已满。

溢出 (oflw) [4 位] 是由于空间不足而无法注册时间戳的 IP 模块的数量。

The Flag (flg) [4 bits] values are

0 -- time stamps only, stored in consecutive 32-bit words,

1 -- each timestamp is preceded with internet address of the
     registering entity,

3 -- the internet address fields are prespecified. An IP
     module only registers its timestamp if it matches its own
     address with the next specified internet address.

Timestamp 是一个右对齐的 32 位时间戳,从 UT 午夜开始以毫秒为单位。如果时间不能以毫秒为单位或不能提供相对于午夜 UT 的时间,则可以插入任何时间作为时间戳,前提是时间戳字段的高位设置为 1 以指示使用非标准值。

始发主机必须将此选项与足够大的时间戳数据区域组成,以保存所有预期的时间戳信息。选项的大小不会因为添加时间戳而改变。时间戳数据区的初始内容必须为零或互联网地址/零对。

如果时间戳数据区已满(指针超出长度),则转发数据报而不插入时间戳,但溢出计数加一。

如果有一些空间但没有足够的空间来插入完整的时间戳,或者溢出计数本身溢出,则原始数据报被认为是错误的并被丢弃。在任何一种情况下,ICMP 参数问题消息都可能被发送到源主机 [3]。

分片时不会复制时间戳选项。它在第一个片段中携带。在一个数据报中最多出现一次。

填充:可变

Internet 标头填充用于确保 Internet 标头以 32 位边界结束。填充为零。