注: 本文为 “IPv6 地址格式及报文” 相关文章合辑。
篇 1:IPv6 地址介绍
篇 2:IPv6 报文介绍
篇 3:IPv6 地址格式
篇 4:IPv6 地址格式浅谈
篇 5:IPv4 与 IPv6:协议解析与报文对比
前两篇原作分两篇,此文略作重排,合二为一。中间两篇为简解。
更新于 2024.12.29
IPv6 地址介绍
Jacob71 于 2022-03-16 13:05:23 发布
IPv6 地址格式
IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits,IPv6 地址的表示、书写方式也从 IPv4 的点分十进制,如 192.168.1.1,转变为:
即,16 bits 一组,采用 16 进制表示,共 8 组字段,每个字段之间使用 “:”
分隔。
为了方便书写、表示 IPv6 地址,IETF 在标准中规定了 IPv6 的规范文本表示形式:
-
抑制每个字段中的前导零
-
使用双冒号
“::”
替换连续全零的字段,注意一个 IPv6 地址只能压缩一个零字段序列
- 如果一个 IPv6 地址中有多个连续全零字段,只压缩最长的零字段序列
- 如果一个 IPv6 地址中有多个相等长度的序列,则只压缩第一个
-
不允许压缩单个零字段
-
十六进制中的 a, b, c, d, e, f 必须是小写的
一个规范的 IPv6 地址表示如下:
IPv6 地址分为三种类型:
-
单播 (Unicast):单播地址唯一标识一个 IPv6 节点的接口。发送到单播地址的报文将被发送到由该地址标识的接口。
-
组播 (Multicast):组播地址用于标识一组 IPv6 接口。发送到组播地址的报文由组播组的所有成员处理。
-
任播 (Anycast):一个任播地址被分配给多个接口 (通常是在多个节点上)。发送到任播地址的数据包只被发送到这些接口中的一个,通常是最近的一个。
IPv6 地址的作用范围
IPv6 支持不同范围的地址,即作用域,典型如:
- Interface-Local scope
- Link-Local scope
- Site-Local scope
- Global scop
IPv6 的设计包括基本架构中的地址范围。除未指定的地址外,每个 IPv6 地址都有一个特定的范围,这是一个拓扑、逻辑范围,在这个范围内,该地址可以作为一个接口或一组接口的唯一标识符。地址的范围被编码为地址的一部分。
IPv6 单播地址
IPv6 单播地址分成以下几种类型:
-
全局单播地址 (Global Unicast Addresses)
-
链路本地地址 (Link Local Addresses)
-
唯一本地地址 (Unique Local Addresses - ULA)
-
环回地址 (Loopback (
::1
) ) -
未指定地址 (Unspecified (
::
) )
全局单播地址 (Global Unicast Addresses)
全局单播地址也被称为可聚合全局单播地址,是 lPv6 互联网全局范围内可路由、可达的 IPv6 地址,等同于 IPv4 的公有地址,在 IPv6 编址架构中充当了非常重要的角色。全局单播地址的前缀为:2000::/3,占据整个 IPv6 地址空间的 1/8,其格式如下:
全局路由前缀 (Global Routing prefix) 标识分配给一个网络的地址范围。这部分地址是由国际注册服务和互联网服务提供商 (ISP) 分配的,并具有层次结构。
子网 ID (Subnet ID) 用于子网的划分,网络的管理员分配这部分地址。
接口 ID (Interface ID) 用于标识子网中的接口,在子网中不能重复。接口 ID 始终为 64 位,因此 IPv6 子网始终为 / 64 子网。接口 ID 可以由接口的 MAC 地址生成,生成规则参加上面的图中示意。
链路本地地址 (Link Local Addresses)
链路本地地址是仅用于与同一本地链路上的设备进行通信。必须保证这些地址在链路上的唯一性,因为数据包不会被路由到该链路之外。也就是说,路由器不会转发任何以链路本地地址为源地址或目的地址的数据包。所有 IPv6 网络接口都配置链路本地地址,前缀为 fe80::/10 (实际上是 fe80::/64 的子集)。
唯一本地地址 (Unique Local Addresses - ULA)
唯一本地地址的前缀为:fc00::/7,是对 IPv4 私有地址的替换 (RFC 1918),仅供在一个站点或一组站点中本地使用。唯一本地地址具有全局唯一性,但无法在全球互联网上路由。唯一本地地址解决了 IPv4 和 RFC 1918 地址中出现的一些操作问题,被设计用于企业站点或有限的网络集。
ULAs 必须通过在路由器上配置本地前缀 (Router Advertisement) 或通过 DHCPv6 来分配,地址结构如下:
环回地址 (Loopback )
与 IPv4 环回地址 127.0.0.1 等价。不能将该地址分配给任何物理接口,主机可以利用此地址向自己发送 IPv6 数据包。在路由器等网络设备上,通常使用环回地址来建立路由协议的邻居。
未指定地址 (Unspedfied address )
未指定地址是全 0 地址,不能分配给接口。未指定地址被用作源地址以表示接口无 IPv6 地址,仅被用做源地址。
IPv4 mapped IPv6 address
映射 IPv4 地址的 IPv6 地址,用来帮助从 IPv4 迁移到 IPv6,如在 IPv6 套接字上处理 IPv4 连接。使用前缀 ::ffff:0:0/96 (0:0:0:0:0:ffff:0:0/96),例如 ::ffff:192.0.2.124。注意,这里的文本表示方式略有不同,以便更容易在 IPv6 地址中嵌入 32 位 IPv4 地址。
IPv6 多播地址
IPv6 前缀 ff00::/8 用于标识组播组地址,希望接收多播流量的主机 “加入” 相关的多播组。多播地址有多种范围,如链接本地,站点,全局等。在 IPv6 中,加入和离开组的协议是 MLD (Multicast Listener Discovery)。IPv6 多播地址如下所示:
多播地址范围(如图):
Well-Known Multicast Addresses
Interface-local scope
Link-local scope
Site-local scope
多播地址示例:
-
IPv6 标准为所有的 NTP servers 定义了组播组 ID:0x101
-
这个组 ID 可以与不同的范围值一起使用:
注意:
-
临时分配的多播地址只有在定义的范围内才有意义。
-
组播地址不应用作 IPv6 报文的源地址或出现在任何路由报头中。
-
node-local scope 修改为 interface-local scope
任播地址
任播地址的设计是为了在多个主机或路由器提供相同服务的情况下提供冗余和负载均衡。
IPv6 没有为任播地址指定特殊前缀。IPv6 任播地址与全球单播地址在同一个地址范围内,并且每个参与接口必须配置一个任播地址。在包含相同任播地址的接口所在的区域内,每台主机必须在路由表中作为单独的条目发布。
当发送方向某个任播地址发送多个报文时,由于路由表的不稳定或请求过程中的变化,报文可能会到达不同的目的地。如果有一系列的请求和应答,或者数据包必须被分片,这可能会导致问题。
RFC 4291 规定的子网路由器的任播地址如下:
基本上,该地址看起来像一个常规的单播地址,带有指定子网的前缀和设置为全零的标识符。发送到这个地址的数据包将被发送到该子网的一台路由器上。所有路由器都需要支持它们有接口的子网的子网路由器任播地址。
保留子网任播地址可以有两种格式:
RFC 2526 规定在每个子网内,最大的 128 个接口标识值将保留为子网任播地址分配。
Reserved anycast IDs
这种形式的任播地址和共享单播地址之间的主要区别是,在后者中,应用程序需要支持任播,而在前者中,如果可能的话,将避免这种支持。我们需要指导如何使用它和修改现有的有状态传输协议。
IPv6 报文介绍
Jacob71 于 2022-03-25 11:59:52 发布
IPv6 报文结构在 RFC 2460 “Internet Protocol, Version 6 (IPv6) Specification” 中有详细的定义。
IPv4 报文头
首先回顾一下 IPv4 报文结构(如图):
报文中各个字段意义如下:
- 版本(Version):4 bits,IP 协议版本号,固定为 4
- IHL(Internet Header Lenght):4 bits,IP 报文头长度,以 4 字节(32 bits)为单位,即报文头实际长度 = (IHL × 4) 字节。IPv4 报文头最小长度为 20 字节,该字段最小值为 5
- 服务类型(Type of Service – ToS):8 bits,指示网络中设备如何处理该报文,用于提供 QoS (Quality of Service),IETF 与 1998 年在 RFC2747 中使用差分服务 (Differentiated Service) 重新定义该字段,即 DSCP
- 数据包总长(Total Length):16 bits,IPv4 报文的中长度,包括报文头和数据
- 标识符(Ident