IP前缀是如何传递给路由器的?

网络工程 ipv4 字首
2021-07-05 21:48:17

首先是一些关于我已经知道的背景信息:

IPv4 地址是一个 32 位地址,用于标识网络中的节点。IP 地址将有一个 IP 前缀,它确定 IP 地址的“网络”部分,其余部分将确定“主机”。

一个例子:

128.208.0.0/24 会告诉我前 24 位是 IP 地址的“网络”部分,其余 8 位将用于给定网络中的主机。另外,128.208.0.0。将是给定网络中可用的最低 IP 地址。

现在 Tannenbaum 在他的书中指出:

由于不能仅从 IP 地址推断前缀长度,因此路由协议必须将前缀携带到路由器。有时前缀简单地由它们的长度来描述,如在发音为“斜线 16”的“/16”中。前缀的长度对应于网络部分中 1 的二进制掩码。当以这种方式写出时,它被称为子网掩码。它可以与 IP 地址进行 AND 运算以仅提取网络部分。对于我们的示例,子网掩码是 255.255.255.0。

所以我的问题是:

1)路由协议如何携带前缀?“斜线”部分存储在哪里?

2)这到底是什么意思:

它可以与 IP 地址进行 AND 运算以仅提取网络部分。对于我们的示例,子网掩码是 255.255.255.0。

谢谢。

2个回答
  1. 路由协议如何携带前缀?“斜线”部分存储在哪里?

我会用 OSPF 尽可能直接地回答这个问题。下面是一个 Type 1 Hello 数据包,它从所有接口发出以形成邻接。

    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 #   |       1       |         Packet length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          Router ID                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Area ID                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |             AuType            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Authentication                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Authentication                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Network Mask                           |    <------
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         HelloInterval         |    Options    |    Rtr Pri    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     RouterDeadInterval                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Designated Router                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                   Backup Designated Router                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          Neighbor                             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                              ...                              |

RFC 2328, A.3.2 Hello 数据包

Network Mask字段填充有您在该接口中使用的子网掩码。

为简洁起见,CIDR 表示法只不过是子网掩码的较短版本。就此而言,子网掩码只是位位置的精简版本。想象一下,每次要配置端口时都必须以十进制写入。

11111111.11111111.11111111.00000000    <---- This would be painstaking
255.255.255.0                          <---- Better, but not optimal
0xffffff00                             <---- Shorter still, but still not optimal
/24                                    <---- Best-case scenario

一切到头来都是一样的。因此,使用这些表示相同数据的速记方式是有意义的。

这取决于路由协议。像 RIP v1 这样的旧协议假设一个有类掩码并且不通告掩码,但是像 RIP v2、OSPF、ISIS、BGP 等较新的协议会这样做。

问题第二部分的答案:要确定地址的网络部分,或测试给定地址是否属于特定网络的一部分,请使用子网掩码执行按位逻辑与。

例如,要获得 172.16.24.5/24 的网络地址,您将 32 位地址的每一位与掩码进行 AND,如下所示:

10101100 00010000 00011000 00000101 <- 172.16.24.5

11111111 11111111 11111111 00000000 <- 255.255.255.0


10101100 00010000 00011000 00000000 <- 结果:172.16.24.0

结果是 IP 地址的网络部分(也称为网络号)。这正是您的路由器和 PC 用来确定使用哪个网络传输数据包的方式。