第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址。连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址。

路由器(见 IP 协议 一章)转发是用 IP 地址来识别流量去向的。IP 在某些方面与电话号码相似。但大多数用户不需要记住一位位的数字,而是被 DNS 屏蔽在视线之外。当用户自建网络或 DNS 失效,就需要直接处理 IP 地址。

当一台设备被连接到全球性的 Internet 时,分配 IP 地址需要经过协调。这项工作由一个管理实体来帮助用户和服务提供商来分配地址。个人用户一般向 Internet 服务提供商(ISP)支付费用,由 ISP 分配地址,用户获得地址以及路由。

IP 地址表示

IPv4

  • 点分四组(点分十进制)表示法。

例如 165.195.130.107 。四个用点分隔的十进制。每个数字是范围 [0, 255] 的整数,代表 8 个 bit。即每个数字是 IP 地址的四分之一,使用简便的十进制表示。完整的 IP 地址是 32 位。

IPv6

地址长度 128 位,是 IPv4 的 4 倍。写法是 8 个块,一个块是 4 个 16 进制数。例如:5f05:2000:80ad:5800:0058:0800:2023:1d71

  1. 一个块的前导零可以不写。5f05:2000:80ad:5800:58:800:2023:1d71
  2. 全零块可以省略,用符号 ::代替。但为了避免出现歧义,这个符号只能在一个地址中用一次。例如2001:0db8:0:0:0:0:0:2 可以写成:2001:db8::2
  3. IPv6 的低 32 位经常用 IPv4 的点分四组表示法,表示 IPv4 兼容的 IPv6 地址。

以上规则带来的灵活性,但要规避不必要的混淆,有如下规则:

  1. 前导零必须压缩。
  2. :: 用于压缩最多的零,如果多个连续块包含等长度的零,则顺序靠前的用::替换。
  3. 十六进制 a - f 用小写。

IP 地址结构

大多数 IPv4 最终被细分到一个地址,用于识别连接 Internet 或某些专用内联网的计算机网络接口。这种地址叫单播地址。其他类型包括广播、组播、任播地址,还有其他的特殊类型的地址。

分类寻址

每个单播 IP 地址都有一个网络号(Network ID),标识该接口使用的地址在哪个网络中可以被发现。还有一个主机地址(host ID),标识由网络号给出的网络中的特定主机。

  • 最初的地址划分方法有五大类,主要是由地址中的头几位来定义:
开头 网络号 主机号
A类 0 8位,除去开头一个1(下同),其余7位自由 24位
B类 10 16位,14位自由 16位
C类 110 24位,21位自由 8位
D类 1110 组播地址 32位,28位自由
E类 1111 保留 32位,28位自由
地址范围 用途 网络数 主机数
A 0.0.0.0 ~ 127.255.255.255 单播/特殊 128 16777216
B 128.0.0.0 ~ 191.255.255.255 单播/特殊 16384 65536
C 192.0.0.0 ~ 223.255.255.255 单播/特殊 2097152 256
D 224.0.0.0 ~ 239.255.255.255 组播 N/A N/A
E 240.0.0.0 ~ 255.255.255.255 保留 N/A N/A

可以看出来 A 类的网络数比较少,但主机数非常多。C 类相反。从这里就可以看到,这种固定的网络地址分类,固定的网络数和主机数势必会让分配 IP 地址产生困难,协调很不方便。A 类容易浪费很多主机号,而 C 类不能提供足够的主机号。B 类地址比较折中,但很快就会耗尽。

上述数字并不是准确的。例如,对于一个子网来说,第一个地址(主机号全为0)一般用来表示这个子网。最后一个地址(主机号全为 1)用来将数据报广播给该子网的所有主机。

子网寻址

针对之前的分配新网段的网络号的棘手问题,人们很自然想到一种方式,在一个站点接入 Internet 之后,为其分配一个网络号,站点管理员再进一步划分本地子网数。很重要的一点是:Internet 的其余部分依然只看得到 A、B、C 类部分。而对于站点本身,进一步进行更加精细的分配。,这种方法叫做子网寻址(subneting)【RFC0950】。子网寻址为 IP 地址结构增加了额外的灵活性,没有增加地址的真实长度。借此,站点管理员可以在子网数和每个子网的预期主机数中寻找一个折中。

图是一个 B 类地址被划分子网的例子。一个基础地址在站点内部进一步划分为一个子网号和一个主机号。这个 B 类地址使用 8 位作为子网 ID,这样,这个特殊配置的站点允许 256 个子网,每个子网最多包含 254 个主机。

站点之中的所有路由器和主机需要确定地址中的子网部分和主机部分。而 Internet 其他部分仍将其作为普通的 B 类地址看待。IP 协议中的 IP 转发操作,路由器需要区分网络中的不同子网,这需要额外的配置参数,具体例子看 CIDR 和聚合。

子网掩码

子网掩码(mask)用于确定一台主机对应的 IP 地址中的网络和子网信息。

  • 子网掩码中,设为 1 的部分,表示 IP 地址中对应的部分表示子网部分。设为 0 的部分,表示对应的是主机部分。

长度与 IP 地址相同。配置方法可以是静态的(路由器中),也可以是动态的(DHCP)。写法可以是点分十进制。也可以用一种容易记忆的前缀长度写法:斜杠带上连续的 1 的个数。

例如 子网掩码:255.255.255.192 可以写成 /27

广播地址

主机部分所有位置设置为 1。

例如,对于子网 128.32.1.0/24,广播地址就是 128.32.1.255,这种广播作为一个单播包通过路由器到达子网后,再作为广播数据报发送给子网中的所有主机。从安全的角度来说,定向广播至今仍在 Internet 中被禁用

特殊用途地址 255.255.255.255 称为本地网络广播,将被连接在同一网络中的计算机收到,除非终端主机明确禁用。这种本地广播不会经过路由器。广播地址经常出现在协议中,例如 UDP、ICMP。

IPv6 没有任何广播地址,仅使用组播地址。

CIDR 和聚合

使用子网掩码稍微缓解了连入 Internet 的设备增多的痛苦后(隔靴搔痒),Internet 立马又面临了更严重的两个问题:

  1. IP 地址的耗尽。主要是 B 类地址。
  2. 路由表条目的不断增长。由于每个网络号需要对应一条,随着规模不断增长,路由性能要受到严重影响。
  3. A、B、C类的划分方法太固定,因此效率低下。

下面介绍解决方案:CIDR 和聚合

前缀

分类寻址方案由子网掩码采取了一个类似于可变长度子网掩码的概念(可将不同长度的子网掩码用于相同的网络号),叫做 CIDR(classless interdomain routing,无类别域间路由

  • 提供一种方便的连续分配地址范围的方式。不只是单个 B 类或多个 C 类网络号可以分配给站点,使用 CIDR,任何未经过预定义的地址范围都可以作为一个类的一部分,只需要一个类似于子网掩码的掩码,称为 CIDR 掩码
  • CIDR 掩码不像 subnetting mask 只对一个站点局限,而对全球路由系统都是可见的。
  • 网络号和 CIDR 掩码的数字组合称为网络前缀(prefixes)
  • 消除 IP 地址中网络和主机号的分隔定义,将更细粒度的 IP 地址分配范围成为可能。
  • 前缀 n 的范围是 0~32 (IPv4),追加在 IP 地址后,跟着一个 / 字符。
  • 例如 C 类网络号 192.125.3.0 写成前缀形式:192.125.3.0/24。A 类和 B 类网络号用前缀 /8/16 表示。

更精细地分配 IP 地址的例子:

192.32.136.0/21

min address:11000000 00100000 10001000 00000001
mask: 11111111 11111111 11111--- --------
IP prefix: 11000000 00100000 10001--- --------
max address:11000000 00100000 10001111 11111110 8 C networks: 192.32.136.0/24 to 192.32.143.0/24 通过使用前缀,分配 192.32.136.0/21 相当于分配了 8 个 C 类地址
  • 可以看到,CIDR 允许根据对地址空间的不同需求,将不同大小的地址块分配给某个组织。

聚合

路由器要找出一个跨网段的数据报往哪发送,具体就是找到一条匹配的路由表条目,然后将其中的“下一跳”作为目的地,将包发送出去。

CIDR 能分配各种尺寸的地址块,但没解决路由表不断增长的问题。接下来这个聚合(Aggregation)方法解决了这个问题。

先举一个简单的例子 :

一家公司分配到以下后缀为 /24 的四个连续网络号。
在路由器上,四个网络中通常都使用相同的出口,
可以进行 CIDR 聚合,以减少路由表的数量。 128.56.24.0/24; 10000000 00111000 00011000 00000000
128.56.25.0/24; 10000000 00111000 00011001 00000000
128.56.26.0/24; 10000000 00111000 00011010 00000000
128.56.27.0/24. 10000000 00111000 00011011 00000000
                进行按位与 &                 
128.56.24.0/22 10000000 00111000 00011000 00000000 用聚合的思想,最后一行代替路由表中的 4 个条目
以这个前缀开头的任何目的地都将显示这个下一跳,只需要一个条目就足够。
  • 聚合的方法是对两个 IP 地址进行按位与。
  • 分层路由思想:
    • 路由聚合思想。相邻的多个 IP 地址前缀合并成同一个短前缀,以覆盖更多地址空间。
    • 这个行为是递归的。即使越来越多的路由器加入整个网络拓扑,这个良好的属性也会保持不变。
例如某台路由器的路由表中有三个条目:

190.154.27.0/26   10111110 10011010 00011011 00000000 …… entry 1
190.154.27.64/26 10111110 10011010 00011011 01000000 …… entry 2
190.154.27.192/26 10111110 10011010 00011011 11000000 …… entry 3 entry 1 与 entry 2 合并(按位与 &)结果:
190.154.27.0/25 10111110 10011010 00011011 00000000 …… entry 4 entry 3 目前不能合并,因为并不是相联的 IP 地址。 此时路由表中新加入了一个条目:
190.154.27.128/26 10111110 10011010 00011011 10000000 …… entry 5 entry 5 可与 entry 3 合并,因为是相邻的:
190.154.27.192/26 10111110 10011010 00011011 11000000 …… entry 3 结果:
190.154.27.128/25 10111110 10011010 00011011 10000000 …… entry 6 此时,entry 6 就可与 entry 4 合并了:
190.154.27.0/25 10111110 10011010 00011011 00000000 …… entry 4
190.154.27.128/25 10111110 10011010 00011011 10000000 …… entry 6 结果:
190.154.27.0/24 10111110 10011010 00011011 00000000 当在路由表条目中又遇到了相邻的 C类地址(递归):
190.154.26.0/24 10111110 10011010 00011010 00000000 又可以合并成: 190.154.26.0/23 10111110 10011010 00011010 00000000 …………
  • 可以说 CIDR 开发和部署是 Internet 核心路由系统的一个根本性变化,CIDR 成功地为分配地址空间提供了更多灵活性,聚合提升路由的可扩展性
  • IPv6 在 20世纪 90年代受到重视,这是出于很快就需要更多地址的想法。当时没有预见的是,NAT 的广泛使用显著推迟了 IPv6 的使用。
  • 但是,由于可用于路由的 IP 地址数量最终将减少到 0 ,因此未来将会出现一些变化。

IP转发行动:

简单的例题:
路由器在其路由表中具有以下CIDR条目: 地址 / 掩码 下一跳
128.56.24.0/22 interface 0
128.56.60.0/22 interface 1
default router 2 数据包的IP地址为 128.56.63.10。 路由器的转发行为是什么? 128.56.63.10 and mask 22 bits
IP address = 10000000 00111000 01111111 00001010
Mask = 11111111 11111111 11111100 00000000
By Per-bit &
Prefix = 10000000 00111000 01111100 00000000
result: 128.56.60 路由器表查找和匹配,应该去 interface 1

最长前缀匹配 Longest Prefix Match

当路由器的 IP 层需要向下一跳发送数据包时,检查目的 IP 地址,执行 最长前缀匹配 Longest Prefix Match。 IP 协议中的一个重要内容。

  • 因为使用了 CIDR ,对于一个给定的 IP 地址,可以有多个条目匹配

    • 匹配是指:目的 IP 地址与掩码按位与之后,和转发条目中的目的地字段值相同。
  • 数据包必须使用最具体最匹配的那条路由。

    • 最匹配就是在所有匹配的条目中,掩码中 1 最多的那个条目。

考虑下面这个IPv4的路由表: 192.168.0.0/16
192.168.20.16/28 在要查找地址192.168.20.19的时候,这两个表项都“匹配”。 192.168.20.19 = 11000000 10101000 00010100 00010011 匹配过程1: dst IP = 11000000 10101000 00010100 00010011
mask 16bit = 11111111 11111111 00000000 00000000
per-bit and = 11000000 10101000 00000000 00000000
192.168.0.0 = 11000000 10101000 00000000 00000000 match!! 匹配过程2: dst IP = 11000000 10101000 00010100 00010011
mask 28bit = 11111111 11111111 11111111 11110000
per-bit and = 11000000 10101000 00010100 00010000
192.168.20.16 = 11000000 10101000 00010100 00010000 match!! 也就是说,两个表项都包含着要查找的地址。 这种情况下,前缀最长的路由就是192.168.20.16/28,因为它的子网掩码(/28)比其他表项的掩码(/16)要长,使得它更加明确。

特殊用途地址

不全部列举:

地址 用途
0.0.0.0/8 本地网络中的主机
10.0.0.0/8 专用网络、内联网的地址,不会出现在公共 Internet 中
192.168.0.0/16 同上
224.0.0.0/4 组播地址
255.255.255.255/32 本地网络受限广播地址

专用地址空间管理由本地决定,在家庭网络、企业内部网络很常见,与此相关的话题是 NAT(网络地址转换)

分配

IP 地址被分为大的块,这由一些权威机构完成。权威机构是为各种“所有者”分配地址空间的组织。所有者就是 ISP 或其他较小的权威机构。

IANA:the Internet Assigned Number Authority 互联网数字分配机构,将分配权限分配给几个地区性 Internet 注册机构(RIR),它们未一些国家的小型机构、ISP 分配地址空间。ISP再给自己的客户提供地址空间。

  • 单播地址分配

    • 最简单的 Internet 服务:DSL 连接到 Internet,分配一个暂时的 IP 地址到 PPP 链路的一端。
    • 家庭局域网、无线局域网,使用一台路由器或一台主机作为路由器连接 Internet,执行 NAT。从 ISP 的角度来看,只有一个 IP 地址被使用。大部分操作是自动的 (DHCP)
    • 多个网络地址:需要固定的 IP,多个局域网、需要网络管理员确定需要多少地址、怎么划分子网、内外网(防火墙、NAT)
  • 组播