一. IPv6 地址介绍
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 报文介绍
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 报文的中长度,包括报文头和数据
- 标识符(Identifier):16 bits,每个报文有一个唯一的标识符,网络设备对报文进行分片时,需要保证所有分片的标识符字段与原始报文保持一致,接收端基于标识符进行报文重组
- 标志(Flag):3 bits,有 DF (Don’t Fragment) 标志位,和更多分片标志位 (More Fragments Flag) 用于表示该分片是否是最后一个分片
- 分段偏移(Fragment Offset):13 bits,该分片在原数据报文中的偏移量,以 8 字节为单位
- 生存时间(Time To Live):数据报文在网络中存在的最大跳数
- 协议(Protocol):8 bits,指示 IP 报文中数据部分承载的协议类型,如 ICMP (1)、TCP (6)、UDP (17)
- 报文头校验和(Header Checksum):16 bits,IPv4 报文头的校验和,网络中的每台设备转发报文时均需要进行校验该字段,失败则丢弃报文
- 源 IP 地址(Source IP Address):32 bits,发送数据报文节点的 IPv4 地址
- 目的 IP 地址(Destination IP Address):32 bits,接收数据报文节点的 IPv4 地址
- 可选项(Options):长度可变,很少使用,常用的选项有源路由选项、时间戳选项等
- 填充(Padding):长度可变,用于将选项填充到 32 bits 的整数倍,即 32 bits 对齐
- 数据(Data):报文承载传输的数据
IPv6 报文头
IPv6 报文结构(如图):
报文中各个字段意义如下:
- 版本(Version):4 bits,IP 协议版本号,固定为 6
- 流量类别(Traffic Class):8 bits,与 IPv4 中的 ToS 类似,使用 RFC 2647 中规定的 DSCP
- 流标签(Flow Label):20 bits,标记一条流,详细使用信息参见 RFC 6437 ”IPv6 Flow Label Specification”
- 净荷长度(Payload Length):16 bits,IPv6 基本报文头后的数据部分长度(包括扩展头的长度),以字节为单位
- 下一报头(Next Header):8 bits,指示基本报文头后的扩展报文头,如果没有扩展报文头,则指示数据部分所承载的协议
- 跳数限制(Hop Limit):与 IPv4 的 TTL 相同
- 源 IPv6 地址(Source IPv6 Address):128 bits,发送数据报文节点的 IPv6 地址
- 目的 IPv6 地址(Destination IPv6 Address):128 bits,接收数据报文节点的 IPv6 地址
- 扩展报文头(Extension Header):可变长度,包含下一报头字段、扩展报头长度字段和扩展报头的内容,RFC 2460 中定义了 6 中扩展报头
- 数据(Data):报文承载传输的数据
IPv4 与 IPv6 报文头差别
IPv4 与 IPv6 报文的区别(如图所示):
相对于 IPv4,IPv6 简化了基本报文头的内容,且大小固定,方便网络设备高性能转发处理。比较大的变化就是 IPv6 报文头中删掉的字段:
- IHL(IP 报文头长度)字段,由于 IPv6 基本报文头长度固定,扩展报文头长度算入数据长度部分,因此不再需要这个字段
- 标识符、标志和分段偏移等三个字段用于 IPv4 数据包的分段与重组,IPv6 报文在网络设备中不允许进行分片操作,因此从 IPv6 报文头中却掉。但是 IPv6 允许源主机对报文进行分片,这时将增加 IPv6 分片扩展报头。实际上,这三个字段移动到分片扩展报头中
- 报文头校验和字段,IPv6 在报文头中删除了这个字段。因为目前在二层(以太网)有校验和与差错控制机制,在传输层(TCP 和 UDP)也有校验和机制,而在 IP 层做校验和操作已经没有必要
- 可变长度的选项字段,IPv6 使用扩展报头替代了这个字段
IPv6 扩展报文头
IPv6 扩展报文头是可选项,在 IPv6 基本报文头中的下一报头字段指明是否有扩展头,如果没有扩展头,则该字段指明 IPv6 报文所携带的数据部分使用的协议,例如图,数据部分是 TCP 协议:
下面的表格给出了下一报头字段的取值即意义:
目前,IPv6 已经定义的扩展头有:
- 逐跳扩展头(Hop-by-Hop):必须由网络转发路径上的所有路由器检查处理
- 目的选项扩展头(Destination Options):有 RH 扩展头时,可以放在逐跳扩展头后,或者是最后一个扩展头
- 路由扩展头(Routing): (Note: RFC 5095, Dec 2007, deprecated RH type 0)
- 分片扩展头(Fragment):由于 IPv6 使用 path MTU 机制,很少使用分片机制
- AH 扩展头(Authentication):IPsec AH
- ESP 扩展头(Encapsulating Security Payload):IPsec ESP
- 其他扩展头:MIPv6, HIP, SHIM6, …
IPv6 扩展头使用如图所示:
最后一个扩展报文头中的下一个报文头字段总是指示哪种协议被封装在数据部分。
RFC 2460 建议一个报文使用多个扩展头时,扩展报头的出现顺序如下: - IPv6 基本报头
- 逐跳选项报头
- 目的选项报头
- 路由报头
- 分段报头
- AH 报头
- ESP 报头
- 目的选项报头
- 上层协议报头
逐跳选项扩展报文头
逐跳选项扩展报文头要求网络转发路径上每台路由器都必须处理报头中的信息。报文头中的选项为 IPv6 报文提供了很好的灵活性,可以通过扩展报头标准组中未定义的一组值对 IPv6 包进行补充定义,这组值采用 TLV (Type-Length-Value,类型・长度・值) 三元组进行定义。下图是巨帧负载选项 (Jumbo Payload Option) 逐跳选项报文头格式的例子:
IPv6 报文默认最大为 64K 字节,需要时可以采用巨帧的逐跳选项报文头,报文最大可以支持 2^32 长度。
路由扩展报文头
路由扩展报文头允许数据报文发送端指定去往目的端的路径,扩展头中包含去往数据报文目的端路径上的一台或多台中间路由器。该功能与 IPv4 使用的源路由选项类似,路由扩展报文头由前一个报文头中的下一报头值 43 来标识。
分片扩展报文头
IPv6 路由器不对数据包进行分片,只有发送 IPv6 数据包的源节点才能执行分段操作,如果网络中的节点(如路由器)收到一个需要被分片的 IPv6 报文,网络节点会丢弃该数据包并向源节点发送一条 ICMPv6 消息,即 “分组过大 “ 差错消息。
IPv6 分片扩展头的格式如下:
- Fragment Offset,与 IPv4 报头中的分段偏移类似
- M flag:用于表示是否是最后一个分片,与 IPv4 报头中分段标志类似
- Identification:与 IPv4 报头中的标识符类似,唯一标识一个原始数据包,接收端用来组装报文
可以看到,实际上是将 IPv4 报文头中的三个字段移到了分片扩展报文头中。
目的选项扩展报文头
目的选项扩展报文头用于承载仅需要数据包目前节点处理的选项信息,使用 TLV 选项,由前一个报头中的下一报头字段值 60 米标识。目的选项扩展报文头格式如下:
与 IPSec 相关的 AH 扩展头和 ESP 扩展头,参见相关的标准定义。
注: 原作分两篇,此文略作调版,合二为一。
via:
IPv6 专题系列:01. IPv6 地址介绍_唯一本地地址 - CSDN 博客 Jacob71 于 2022-03-16 13:05:23 发布
https://blog.csdn.net/Jacob71/article/details/123523661
IPv6 专题系列:02 IPv6 报文介绍 - CSDN 博客 Jacob71 于 2022-03-25 11:59:52 发布
https://blog.csdn.net/Jacob71/article/details/123731939