← 返回 计算机网络原理

计算机网络原理

第四章 第4节

第四节:

一、IP 地址到底标识什么?

IP 地址不是给“主机整体”随便贴一个标签,而是给:

接口 interface

也就是一台设备连接网络的“口”。

比如:

笔记本有 WiFi 网卡,就有一个无线接口;

服务器有网线口,就有一个以太网接口;

路由器有多个端口,所以一个路由器通常有多个 IP 地址。

IP 地址分配给接口,不是严格分配给整台机器。

路由器为什么有好几个 IP 地址? 因为它连接了好几个不同网络,每个接口属于一个网络,所以每个接口都要有对应网络里的 IP 地址。

二、什么是子网?

第四章 第4节 配图 1

子网 subnet 的定义是:不经过路由器,各主机接口可以彼此直接到达的一组接口。

简单说:把路由器接口断开后,剩下的每一块独立网络就是一个子网。

比如里有几个蓝色区域:

223.1.1.x 这一块是一个子网;

223.1.2.x 这一块是一个子网;

223.1.3.x 这一块是一个子网。

它们分别可以写成:

223.1.1.0/24223.1.2.0/24223.1.3.0/24223.1.1.0/24223.1.2.0/24223.1.3.0/24

这里 /24 的意思是:

前 24 位是网络部分,后 8 位是主机部分。

三、IP 地址是有结构的

IP 地址不是完全随机的 32 位。

它一般分成两部分:

网络部分+主机部分\text{网络部分}+\text{主机部分}

或者说:

子网部分+主机部分\text{子网部分}+\text{主机部分}

例如:

223.1.1.2/24223.1.1.2/24

表示:

前 24 位:子网号,也就是 223.1.1

后 8 位:主机号,也就是 2

所以:

223.1.1.1,223.1.1.2,223.1.1.3223.1.1.1,223.1.1.2,223.1.1.3

都属于同一个子网:

223.1.1.0/24223.1.1.0/24

因为它们前 24 位相同。

四、子网掩码 subnet mask

子网掩码是用来区分:哪些位是网络部分,哪些位是主机部分。

子网掩码也是 32 位。

规则:

掩码中为 1 的位:网络部分

掩码中为 0 的位:主机部分

比如:

255.255.255.0255.255.255.0

写成二进制是:

11111111.11111111.11111111.0000000011111111.11111111.11111111.00000000

前 24 位是 1,所以它对应:

/24/24

常见掩码

CIDR 写法 | 子网掩码 | 网络位数 | 主机位数 /8 | 255.0.0.0 | 8 | 24 /16 | 255.255.0.0 | 16 | 16 /24 | 255.255.255.0 | 24 | 8 /23 | 255.255.254.0 | 23 | 9 /20 | 255.255.240.0 | 20 | 12

考试里常见的计算就是:

主机位数=32前缀长度\text{主机位数}=32-\text{前缀长度}

可用主机数一般是:

2主机位数2{2}^{\text{主机位数}}-2

因为主机号全 0 是网络地址,全 1 是广播地址。

五、怎么判断一个 IP 属于哪个子网?

核心公式:

IP地址&子网掩码=子网号IP\text{地址}\mathbin{\&}\text{子网掩码}=\text{子网号}

比如:

223.1.1.2/24223.1.1.2/24

掩码是:

255.255.255.0255.255.255.0

那么:

223.1.1.2&255.255.255.0=223.1.1.0223.1.1.2\mathbin{\&}255.255.255.0=223.1.1.0

所以它属于:

223.1.1.0/24223.1.1.0/24

六、路由器转发表怎么工作?

路由器收到一个 IP 数据报后,会取出:目的 IP 地址。

然后拿目的 IP 和转发表里的每一项比较。

转发表一般包括:

Destination Subnet Num | Mask | Next hop | Interface 130.130.130.0 | 255.255.255.0 | - | Eth1 140.140.140.0 | 255.255.255.0 | - | Eth2 150.150.150.0 | 255.255.255.0 | 140.140.140.8 | Eth2 default | - | 某个下一跳 | 某接口

判断公式:

目的IP&Mask=Destination\text{目的}IP\mathbin{\&}Mask=Destination

如果成立,就匹配这条表项。

如果没有任何表项匹配,就走默认路由 default。

七、传统 IPv4 地址分类

早期 IPv4 使用分类编址。

Class A

前缀以 0 开头。

范围大概是:

1.0.0.0126.255.255.2551.0.0.0∼126.255.255.255

默认掩码:

255.0.0.0255.0.0.0

也就是 /8。

特点:网络少,每个网络主机数特别多。

Class B

前缀以 10 开头。

范围:

128.0.0.0191.255.255.255128.0.0.0∼191.255.255.255

默认掩码:

255.255.0.0255.255.0.0

也就是 /16。

Class C

前缀以 110 开头。

范围:

192.0.0.0223.255.255.255192.0.0.0∼223.255.255.255

默认掩码:

255.255.255.0255.255.255.0

也就是 /24。

Class D

用于多播 multicast。

范围:

224.0.0.0239.255.255.255224.0.0.0∼239.255.255.255

Class E

保留地址。

范围:

240.0.0.0255.255.255.255240.0.0.0∼255.255.255.255

现在为什么不用分类编址?

比如一个机构只需要 2000 个地址:

Class C 只有 254 个可用主机地址,不够;

Class B 有 6 万多个地址,又太浪费。

所以后来用 CIDR。

八、特殊 IPv4 地址

1. 主机部分全 0

比如:

223.1.1.0/24223.1.1.0/24

表示网络地址。

不能分配给普通主机。

2. 主机部分全 1

比如:

223.1.1.255/24223.1.1.255/24

表示该子网的广播地址。

发到这个地址,子网内所有主机都能收到。

3. 0.0.0.0

通常表示:

本主机、未知地址、默认源地址。

比如 DHCP 刚开始时,主机还没有 IP 地址,就可能使用 0.0.0.0 作为源地址。

4. 255.255.255.255

表示受限广播地址。

通常用于本地网络广播。

5. 127.0.0.0/8

回环地址 loopback。

最常见:

127.0.0.1127.0.0.1

表示本机自己。

内网专用地址

专用地址不会在公网直接路由。

常见三段:

10.0.0.0/8172.16.0.0/1210.0.0.0/8172.16.0.0/12

也就是:

172.16.0.0172.31.255.255192.168.0.0/16172.16.0.0∼172.31.255.255192.168.0.0/16

也就是:

192.168.0.0192.168.255.255192.168.0.0∼192.168.255.255

路由器常见地址:

192.168.1.1192.168.1.1

就是私有地址。

私有地址有什么特点?

它只在局域网内部有意义。

公网路由器一般不会把目的地址是私有地址的数据报当作公网目标转发。

所以内网主机访问外网通常需要:

NAT,网络地址转换。

NAT 后面会专门学。

九、CIDR:无类别域间路由

CIDR 全称:

Classless InterDomain Routing

意思是:不再固定使用 A/B/C 类,而是允许任意长度的网络前缀。

格式:

a.b.c.d/xa.b.c.d/x

其中 $x$ 表示前面多少位是网络部分。

比如:

200.23.16.0/23200.23.16.0/23

表示:

前 23 位是网络部分

后 9 位是主机部分

地址总数:

29=512{2}^{9}=512

可用主机数通常:

5122=510512-2=510

如何获得 IP 地址?

这里有两个问题。

问题 1:主机如何获得一个 IP 地址?

方法有两种:手动配置

比如在系统里手动写:

IP 地址

子网掩码

默认网关

DNS 服务器

DHCP 自动获取

DHCP 全称:

Dynamic Host Configuration Protocol

动态主机配置协议。

它允许主机加入网络时,自动从 DHCP 服务器获得配置信息。

也就是俗称的:即插即用 plug-and-play。

问题 2:一个网络如何获得一个地址块?

一般是:从 ISP 那里获得一块地址。

ISP 的地址块又来自更上级的地址分配机构。

再往上就是区域注册机构和 ICANN。

DHCP 的作用

DHCP 不只是分配 IP 地址。

第四章 第4节 配图 2

它通常还会告诉主机:

分配给你的 IP 地址

子网掩码

默认网关

DNS 服务器地址

地址租用时间

所以 DHCP 让主机一接入网络,就知道:

我是谁,我在哪个子网,怎么出网,怎么解析域名。

DHCP 四步过程:DORA

DHCP 最经典的四步:

DiscoverOfferRequestACKDiscover\to Offer\to Request\to ACK

也可以记成 DORA。

1. DHCP Discover

新主机刚进网络,还不知道 DHCP 服务器在哪里,也没有自己的 IP。

所以它广播:

有没有 DHCP 服务器?

源 IP 可以是:

0.0.0.00.0.0.0

目的 IP 是广播地址。

2. DHCP Offer

DHCP 服务器收到 Discover 后,回复 Offer:

我是 DHCP 服务器,我可以给你这个 IP 地址。

Offer 里包含候选 IP 地址和其他配置。

3. DHCP Request

客户端选择一个 Offer,然后广播 Request:

好,我想使用这个 IP 地址。

为什么还广播?

因为可能有多个 DHCP 服务器发 Offer,广播 Request 可以告诉其他服务器:

我已经选择别人了,你们不用给我保留地址了。

4. DHCP ACK

DHCP 服务器回复 ACK:

好,这个 IP 地址正式分配给你。

到这里,主机获得完整网络配置。

DHCP 报文封装

DHCP 是应用层协议,但它实际传输时要层层封装:

DHCPUDPIPEthernetDHCP\to UDP\to IP\to Ethernet

也就是:

DHCP 报文放进 UDP 段

UDP 段放进 IP 数据报

IP 数据报放进以太网帧

常见端口:

DHCP server:UDP 67

DHCP client:UDP 68

主机刚开始不知道 IP,所以 DHCP 初始阶段需要广播。

路由聚合 route aggregation

这一块是 CIDR 的一个重要意义。

假设 ISP 拥有:

200.23.16.0/20200.23.16.0/20

它分给多个组织:

200.23.16.0/23200.23.18.0/23200.23.20.0/23200.23.16.0/23200.23.18.0/23200.23.20.0/23

等等。

对外部互联网来说,不需要知道每个组织的小网段。

ISP 可以只对外通告一条聚合路由:

200.23.16.0/20200.23.16.0/20

意思是:凡是目的地址以 200.23.16.0/20 开头的,都发给我。

路由聚合的好处

减少路由表项。

本来外部路由器可能要存 8 条:

200.23.16.0/23200.23.18.0/23...200.23.16.0/23200.23.18.0/23...

现在只需要存 1 条:

200.23.16.0/20200.23.16.0/20

这就是:层次化编址让路由信息可以聚合。

更具体的路由 more specific route

某个组织从一个 ISP 搬到了另一个 ISP。

比如 Organization 1 原来属于 Fly-By-Night-ISP,地址是:

200.23.18.0/23200.23.18.0/23

后来它接入了 ISPs-R-Us。

这时候 Fly-By-Night-ISP 仍然对外通告:

200.23.16.0/20200.23.16.0/20

但是 ISPs-R-Us 可以对外通告更具体的:

200.23.18.0/23200.23.18.0/23

当外部路由器看到:

200.23.16.0/20200.23.16.0/20

和:

200.23.18.0/23200.23.18.0/23

两个都能匹配目的地址 $200.23.18.x$ 时,会选:

200.23.18.0/23200.23.18.0/23

因为它前缀更长。

所以流量会被引到新的 ISP。

这就是:更具体的路由优先于聚合路由。本质仍然是最长前缀匹配。

十、ICANN 和 IPv4 地址耗尽

IP 地址块不是随便自己编的。

顶层分配机构是 ICANN。

它负责协调:

IP 地址分配

DNS 根区管理

顶级域名委派

IPv4 地址只有 32 位:

232{2}^{32}

大约 43 亿个。

听起来很多,但全球设备太多,所以 IPv4 地址后来逐渐耗尽。

缓解方法有:

NAT

CIDR 路由聚合

DHCP 动态分配

IPv6

IPv6 使用 128 位地址空间,地址数量远远大于 IPv4。

题型 1:判断子网

给一张拓扑图,让你数有几个子网。

做法:

把路由器接口看成边界,不经过路由器能直接互通的一块就是一个子网。

路由器两端一定属于不同子网。

题型 2:写出子网号

比如给:

223.1.1.7/24223.1.1.7/24

子网号就是:

223.1.1.0/24223.1.1.0/24

因为前 24 位是网络号。

题型 3:由前缀长度算地址数量

比如:

200.23.16.0/20200.23.16.0/20

主机位:

3220=1232-20=12

地址总数:

212=4096{2}^{12}=4096

可用主机数通常:

40962=40944096-2=4094

题型 4:大块地址划分成小块

比如 /20 分成 8 块。

因为:

8=238={2}^{3}

所以:

/20/23/20\to /23

每块地址数:

23223=512{2}^{32-23}=512

题型 5:转发表查找

给目的 IP 和转发表。

做法:

目的 IP 和每条 mask 做按位与;

看结果是否等于 destination subnet;

如果多个匹配,选最长前缀;

如果都不匹配,走 default。

题型 6:DHCP 四步

DiscoverOfferRequestACKDiscover\to Offer\to Request\to ACK

中文:发现、提供、请求、确认。

题型 7:DHCP 能给主机哪些信息

答:

IP 地址

子网掩码

默认网关

DNS 服务器

租期

题型 8:路由聚合的作用

答:

ISP 可以把多个连续小网段聚合成一个大前缀对外通告,从而减少全网路由表规模。

题型 9:为什么更具体路由能生效?

答:

因为路由器使用最长前缀匹配,/23 比 /20 更具体,所以目的地址属于 /23 时优先走 /23。