Skip to content

Commit 688719e

Browse files
committed
ops/network-service/zeroconf: fmt update
1 parent e0e1cbc commit 688719e

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

docs/ops/network-service/zeroconf.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,29 +21,29 @@ Zeroconf 是一套在局域网中进行自动网络配置的方案,分为三
2121

2222
## Link-local 地址分配 {#link-local}
2323

24-
Link-local 在 IPv4 和 IPv6 中有着不同的表现。IPv4 下,如果网络中没有 DHCP 服务器,并且用户也没有手动配置 IP 地址,那么设备会自动为自己分配一个 Link-local 地址。这个地址在 169.254.0.0/16(除了 169.254.0.0/24 和 169.254.255.0/24 以外)中。在 IPv4 下的 Link-local 地址分配使用的是 APIPA(Automatic Private IP Addressing)协议,这个协议很简单:
24+
Link-local 在 IPv4 和 IPv6 中有着不同的表现。IPv4 下,如果网络中没有 DHCP 服务器,并且用户也没有手动配置 IP 地址,那么设备会自动为自己分配一个 link-local 地址。这个地址在 169.254.0.0/16(除了 169.254.0.0/24 和 169.254.255.0/24 以外)中。在 IPv4 下的 link-local 地址分配使用的是 APIPA(Automatic Private IP Addressing)协议,这个协议很简单:
2525

2626
1. 随机在上面的地址段中选择一个地址。
2727
2. 发送 ARP 请求,检查这个地址是否已经被使用。
2828
3. 如果有人回应了 ARP 请求,说明地址已经被使用,回到步骤 1。
2929

30-
而在 IPv6 下,Link-local 的地址段是 `fe80::/10`,无论如何,设备都会为自己分配一个 Link-local 地址(有些设备上会基于接口的 MAC 地址来分配),所以在支持 IPv6 的场合下,你会发现设备会有多个 IPv6 地址,其中就包括一个 Link-local 地址。和 IPv4 类似,在选择地址之后,也需要避免和其他人的地址冲突。IPv6 不再使用 ARP,而是使用基于 ICMPv6 的 NDP(Neighbor Discovery Protocol)完成地址冲突检测(DAD,Duplicate Address Detection)。
30+
而在 IPv6 下,link-local 的地址段是 fe80::/10,无论如何,设备都会为自己分配一个 link-local 地址(有些设备上会基于接口的 MAC 地址来分配),所以在支持 IPv6 的场合下,你会发现设备会有多个 IPv6 地址,其中就包括一个 link-local 地址。和 IPv4 类似,在选择地址之后,也需要避免和其他人的地址冲突。IPv6 不再使用 ARP,而是使用基于 ICMPv6 的 NDP(Neighbor Discovery Protocol)完成地址冲突检测(DAD,Duplicate Address Detection)。
3131

3232
!!! note "为什么 IPv6 没有 ARP?"
3333

3434
IPv6 并非「更大地址空间的 IPv4」。IPv6 的设计者在设计时,就希望将 IPv4 中能用,但是设计得不好的东西改进掉。ARP 是一个横跨二层(数据链路层,最常见的是以太网)和三层(网络层,这里是 IP)的特殊协议,在解析 IP 到 MAC 地址的过程中需要在二层广播(在以太网中,是将目标 MAC 地址设置为 ff:ff:ff:ff:ff:ff),在大型网络中这样做开销很大。而 ARP 也无法基于 ICMP 实现,因为 ICMP 协议依赖于 IP 层,而 ARP 要解决的问题就是在 IP 层还没有准备好的时候,获取 IP 到 MAC 的映射关系。
3535

36-
而在 IPv6 中,所有接口都必须有 Link-local 地址,因此 NDP 就可以在 ICMPv6 的基础上实现。在检测地址冲突时,NDP 会构造 [solicited-node multicast address](https://datatracker.ietf.org/doc/html/rfc4291#section-2.7.1) 多播地址,只有可能使用该地址的节点会收到这个多播包,从而避免了广播带来的开销。
36+
而在 IPv6 中,所有接口都必须有 link-local 地址,因此 NDP 就可以在 ICMPv6 的基础上实现。在检测地址冲突时,NDP 会构造 [solicited-node multicast address](https://datatracker.ietf.org/doc/html/rfc4291#section-2.7.1) 多播地址,只有可能使用该地址的节点会收到这个多播包,从而避免了广播带来的开销。
3737

3838
!!! note "Link-local 地址 = 网坏了?"
3939

4040
有一定网络经验的读者可能对 169.254.0.0/16 和 fe80::/10 这两个地址段比较熟悉,因为如果自己的设备只分配到了这个地址段的地址,通常意味着网络出现了问题。
4141

4242
对 IPv4 来说,这是因为 DHCP 服务器做的事情除了分配 IP 地址以外,还会将网关、DNS 服务器等信息一并发送给客户端,而如果没有网关信息的话,设备就无法和局域网外的设备通信了(无法连接到互联网),对很多场景来讲,这就是网络出现了故障的表现。
4343

44-
那么,假如我们回到过去,修改 IPv4 下关于 Link-local 的约定,让设备在 APIPA 的时候自动将默认网关和默认 DNS 设置为 169.254.0.1 的话,那么就可以不需要 DHCP 服务器,也能够组建小型的局域网络,并且让这个网络有访问外部网络的能力了(假设网关支持 NAT)——这个模型就比较接近 IPv6 有关 Link-local 的设计思路了。
44+
那么,假如我们回到过去,修改 IPv4 下关于 link-local 的约定,让设备在 APIPA 的时候自动将默认网关和默认 DNS 设置为 169.254.0.1 的话,那么就可以不需要 DHCP 服务器,也能够组建小型的局域网络,并且让这个网络有访问外部网络的能力了(假设网关支持 NAT)——这个模型就比较接近 IPv6 有关 link-local 的设计思路了。
4545

46-
在 IPv6 下,路由器需要通过 RA(Router Advertisement)消息告诉设备包括网关、网络前缀、DNS 等信息,在 Link-local 地址收到 RA 之后,设备会使用 SLAAC(Stateless Address Autoconfiguration)为自己分配一个全局单播地址(这个地址是全局唯一的——可以在其他的网络里面访问),从而实现和外部网络的通信。在 IPv6 下,Link-local 地址是「IPv6 控制面」接口,不承载其他的功能。
46+
在 IPv6 下,路由器需要通过 RA(Router Advertisement)消息告诉设备包括网关、网络前缀、DNS 等信息,在 link-local 地址收到 RA 之后,设备会使用 SLAAC(Stateless Address Autoconfiguration)为自己分配一个全局单播地址(这个地址是全局唯一的——可以在其他的网络里面访问),从而实现和外部网络的通信。在 IPv6 下,link-local 地址是「IPv6 控制面」接口,不承载其他的功能。
4747

4848
## 名称解析 {#name-resolution}
4949

0 commit comments

Comments
 (0)