假设我成立了一家新公司并222.123.123.0/25
从 Internet 注册表租用了一个 IP 地址块,因此其中一个 IP 地址222.123.123.4
是我的主要 Web 服务器。
来自不同国家的客户想要向这个 IP 地址发送数据包,路由器(ISP 在他国家的路由器)如何知道这个 IP 地址的网络前缀是什么222.123.123.4
?因为classful IP addressing 被弃用了,当涉及到CIDR IP 地址时,它可以是,222.123.123.4/25
等等,而且IP header 当然没有一个header 叫做.222.123.123.4/26
222.123.123.4/27
network prefix
那么路由器是如何确定IP地址的网络前缀的呢?
您的路由器知道前缀长度,因为您对其进行了配置。每当为接口配置地址时,无论是在主机上还是在路由器上,前缀长度(或等效的网络掩码)都会与它一起输入。
它在功能上与您家中 Windows PC 的 IPv4 配置相同——PC 知道它是 192.168.1.x/24,因为它填写了“网络掩码:255.255.255.0”;路由器知道它是 .123.1/25,因为您(或 ISP)在执行 .123.1/25 时必须指定“/25”
ip addr add
。当您通过 BGP 向您的上游 ISP 通告它时,远程路由器 a) 不关心或 b) 将学习通往您的 /25 的路由,并且相同的 BGP 通告包括路由前缀长度和网络地址。今天使用的所有路由协议都已扩展为携带前缀长度——这就是“CIDR”工作的重点。
但是请注意,远程路由器最多只关心路由前缀。他们不关心你的子网大小——BGP 通告可能覆盖你的多个子网(聚合路由),或者它可能覆盖半个子网,它们对数据包传输没有任何影响。
“为广播保留”地址之类的东西在这里没有发挥作用,因此到“.0”和“.255”地址的数据包将被转发而不进行任何特殊处理(目的地甚至可能根本不是具有广播功能的子网; 它可能是任何地址都有效的 /31 或 /32 PtP 链接)。
(路由和子网的解耦甚至发生在 CIDR 之前——这就是为什么“子网掩码”被称为子网掩码的原因;过去 BGP 继续只承载有类路由很长一段时间,即使运营商已经有了他们的有类网络在内部细分为无类子网。)
这意味着主机或基本 CPE 路由器只能有一个 0.0.0.0/0 路由(“默认”路由),并且绝对不会关心某个远程网络是 /25 还是其他。
在大多数情况下,ISP 只会通过BGP 通告聚合路由,而不是单独的子网路由——否则通常不赞成这样做,因为全球 BGP 表已经很大。(事实上 ,您甚至不允许在公共 Internet 上发布 IPv4 /25 广告;ISP 只接受 /24 或更大的广告,或者类似的 IPv6 /48。)
换句话说,IP 标头中没有“网络前缀”字段,因为唯一需要知道它的设备——您站点的最终路由器——已经明确配置了该信息。