pub struct Ipv6Addr { /* private fields */ }
Expand description
IPv6 地址。
IPv6 地址在 IETF RFC 4291 中定义为 128 位整数。 它们通常表示为八个 16 位段。
嵌入 IPv4 地址
有关同时包含 IPv4 和 IPv6 地址的类型,请参见 IpAddr
。
为了帮助从 IPv4 过渡到 IPv6,定义了两种类型的 IPv6 地址,它们嵌入了 IPv4 地址: IPv4 兼容地址和 IPv4 映射地址。其中这些与 IPv4 兼容的地址已被正式弃用。
除了相关标准规定的内容外,此实现并未为这两种类型的地址分配任何特殊含义。
这意味着像 ::ffff:127.0.0.1
这样的地址,虽然代表 IPv4 回环地址,但它本身并不是 IPv6 回环地址; 只有 ::1
是。
要处理这些所谓的 “IPv4-in-IPv6” 地址,必须首先将它们转换为规范的 IPv4 地址。
兼容 IPv4 的 IPv6 地址
IPv4 兼容的 IPv6 地址在 IETF RFC 4291 第 2.5.5.1 节 中定义,并已被正式弃用。 RFC 描述了 “IPv4 兼容 IPv6 地址” 的格式如下:
| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|0000| IPv4 address |
+--------------------------------------+----+---------------------+
因此 ::a.b.c.d
将是表示 IPv4 地址 a.b.c.d
的 IPv4 兼容 IPv6 地址。
要将 IPv4 地址转换为与 IPv4 兼容的 IPv6 地址,请使用 Ipv4Addr::to_ipv6_compatible
。
使用 Ipv6Addr::to_ipv4
将兼容 IPv4 的 IPv6 地址转换为规范的 IPv4 地址。
IPv4 映射的 IPv6 地址
IPv4 映射的 IPv6 地址在 IETF RFC 4291 第 2.5.5.2 节 中定义。 RFC 描述了 “IPv4-Mapped IPv6 address” 的格式如下:
| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|FFFF| IPv4 address |
+--------------------------------------+----+---------------------+
因此 ::ffff:a.b.c.d
将是表示 IPv4 地址 a.b.c.d
的 IPv4 映射 IPv6 地址。
要将 IPv4 地址转换为 IPv4 映射的 IPv6 地址,请使用 Ipv4Addr::to_ipv6_mapped
。
使用 Ipv6Addr::to_ipv4
将 IPv4 映射的 IPv6 地址转换为规范的 IPv4 地址。
请注意,这也会将 IPv6 回环地址 ::1
转换为 0.0.0.1
。使用 Ipv6Addr::to_ipv4_mapped
可以避免这种情况。
文字表达
Ipv6Addr
提供了一个 FromStr
的实现。
有多种方法可以用文本表示 IPv6 地址,但通常,每个段都以十六进制表示法,并且段之间用 :
分隔。
有关更多信息,请参见 IETF RFC 5952。
Examples
use std::net::Ipv6Addr;
let localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);
assert_eq!("::1".parse(), Ok(localhost));
assert_eq!(localhost.is_loopback(), true);
RunImplementations§
source§impl Ipv6Addr
impl Ipv6Addr
const: 1.32.0 · sourcepub const fn new(
a: u16,
b: u16,
c: u16,
d: u16,
e: u16,
f: u16,
g: u16,
h: u16
) -> Ipv6Addr
pub const fn new( a: u16, b: u16, c: u16, d: u16, e: u16, f: u16, g: u16, h: u16 ) -> Ipv6Addr
1.30.0 · sourcepub const UNSPECIFIED: Self = _
pub const UNSPECIFIED: Self = _
1.7.0 (const: 1.50.0) · sourcepub const fn is_unspecified(&self) -> bool
pub const fn is_unspecified(&self) -> bool
为特殊的 ‘unspecified’ 地址 (::
) 返回 true
。
此属性在 IETF RFC 4291 中定义。
Examples
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_unspecified(), false);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0).is_unspecified(), true);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_loopback(&self) -> bool
pub const fn is_loopback(&self) -> bool
如果这是 环回地址 (::1
),如 IETF RFC 4291 第 2.5.3 节 中所定义,则返回 true
。
与 IPv4 相反,IPv6 只有一个回环地址。
Examples
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_loopback(), false);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0x1).is_loopback(), true);
Runconst: unstable · sourcepub fn is_global(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_global(&self) -> bool
ip
#27709)如果地址看起来是由 IANA IPv6 Special-Purpose Address Registry 指定的全局可访问的,则返回 true
。
一个地址是否实际可访问将取决于您的网络配置。
大多数 IPv6 地址都是全局可达的; 除非它们被明确定义为 not 全局可达。
全球无法访问的显着地址的非详尽列表:
- unspecified address (
is_unspecified
) - loopback address (
is_loopback
) - IPv4 映射地址
- 为基准测试保留的地址
- 为文档 (
is_documentation
) 保留的地址 - 唯一的本地地址 (
is_unique_local
) - 具有链路本地作用域 (
is_unicast_link_local
) 的单播地址
有关哪些地址可全局访问的完整概览,请参见 IANA IPv6 Special-Purpose Address Registry 中的表格。
请注意,地址具有以下作用: 存在与全局可访问相同的地址,并且这两个概念之间没有直接关系是全球可访问的,没有具有非域范围的多播地址 (多播地址)。
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
// 大多数 IPv6 地址都是全局可达的:
assert_eq!(Ipv6Addr::new(0x26, 0, 0x1c9, 0, 0, 0xafc8, 0x10, 0x1).is_global(), true);
// 但是,某些地址已被赋予特殊含义,使它们无法全局访问。
// 一些例子是:
// 未指定的地址 (`::`)
assert_eq!(Ipv6Addr::UNSPECIFIED.is_global(), false);
// 回环地址 (`::1`)
assert_eq!(Ipv6Addr::LOCALHOST.is_global(), false);
// IPv4 映射地址 (`::ffff:0:0/96`)
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_global(), false);
// 为 (`2001:2::/48`) 基准测试保留的地址
assert_eq!(Ipv6Addr::new(0x2001, 2, 0, 0, 0, 0, 0, 1,).is_global(), false);
// 为文档 (`2001:db8::/32`) 保留的地址
assert_eq!(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1).is_global(), false);
// 唯一的本地地址 (`fc00::/7`)
assert_eq!(Ipv6Addr::new(0xfc02, 0, 0, 0, 0, 0, 0, 1).is_global(), false);
// 具有链路本地作用域 (`fe80::/10`) 的单播地址
assert_eq!(Ipv6Addr::new(0xfe81, 0, 0, 0, 0, 0, 0, 1).is_global(), false);
// 有关完整概述,请参见 IANA IPv6 专用地址注册表。
Runconst: unstable · sourcepub fn is_unique_local(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_unique_local(&self) -> bool
ip
#27709)如果这是唯一的本地地址 (fc00::/7
),则返回 true
。
此属性在 IETF RFC 4193 中定义。
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_unique_local(), false);
assert_eq!(Ipv6Addr::new(0xfc02, 0, 0, 0, 0, 0, 0, 0).is_unique_local(), true);
Runconst: unstable · sourcepub fn is_unicast(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_unicast(&self) -> bool
ip
#27709)如果这是 IETF RFC 4291 定义的单播地址,则返回 true
。
任何不是 多播地址 (ff00::/8
) 的地址都是单播的。
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
// 未指定地址和回环地址是单播的。
assert_eq!(Ipv6Addr::UNSPECIFIED.is_unicast(), true);
assert_eq!(Ipv6Addr::LOCALHOST.is_unicast(), true);
// 任何不是多播地址 (`ff00::/8`) 的地址都是单播的。
assert_eq!(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0).is_unicast(), true);
assert_eq!(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0).is_unicast(), false);
Runconst: unstable · sourcepub fn is_unicast_link_local(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_unicast_link_local(&self) -> bool
ip
#27709)如果地址是具有链接本地作用域的单播地址,则返回 true
,如 RFC 4291 中所定义。
如果单播地址具有前缀 fe80::/10
,则它具有链路本地作用域,如 RFC 4291 section 2.4。
请注意,这包含比 RFC 4291 第 2.5.6 节 中定义的地址更多的地址,[RFC 4291 第 2.5.6 节] 将 “链路本地 IPv6 单播地址” 描述为具有以下更严格的格式:
| 10 bits | 54 bits | 64 bits |
+----------+-------------------------+----------------------------+
|1111111010| 0 | interface ID |
+----------+-------------------------+----------------------------+
因此,虽然目前应用程序将遇到的唯一具有本地链接作用域的地址都在 fe80::/64
中,但随着新标准的发布,这可能会在 future 中发生变化。
fe80::/10
中可以分配更多的地址,这些地址将具有本地链接作用域。
另请注意,虽然 RFC 4291 第 2.5.3 章 提到 “它被视为具有 Link-Local 作用域” 的 环回地址 (::1
),但这并不意味着回环地址实际上具有链接本地作用域,并且此方法将在其上返回 false
。
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
// 回环地址 (`::1`) 实际上并没有链接本地作用域。
assert_eq!(Ipv6Addr::LOCALHOST.is_unicast_link_local(), false);
// 只有 `fe80::/10` 中的地址具有本地链接作用域。
assert_eq!(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0).is_unicast_link_local(), false);
assert_eq!(Ipv6Addr::new(0xfe80, 0, 0, 0, 0, 0, 0, 0).is_unicast_link_local(), true);
// 更严格的 `fe80::/64` 之外的地址也具有链接本地作用域。
assert_eq!(Ipv6Addr::new(0xfe80, 0, 0, 1, 0, 0, 0, 0).is_unicast_link_local(), true);
assert_eq!(Ipv6Addr::new(0xfe81, 0, 0, 0, 0, 0, 0, 0).is_unicast_link_local(), true);
Runconst: unstable · sourcepub fn is_documentation(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_documentation(&self) -> bool
ip
#27709)如果这是为文档 (2001:db8::/32
) 保留的地址,则返回 true
。
此属性在 IETF RFC 3849 中定义。
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_documentation(), false);
assert_eq!(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0).is_documentation(), true);
Runsourcepub const fn is_benchmarking(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub const fn is_benchmarking(&self) -> bool
ip
#27709)如果这是为基准测试 (2001:2::/48
) 保留的地址,则返回 true
。
此属性在 IETF RFC 5180 中定义,其中错误地将其指定为覆盖范围 2001:0200::/48
。
这在 IETF RFC Errata 1752 到 2001:0002::/48
中得到纠正。
#![feature(ip)]
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc613, 0x0).is_benchmarking(), false);
assert_eq!(Ipv6Addr::new(0x2001, 0x2, 0, 0, 0, 0, 0, 0).is_benchmarking(), true);
Runconst: unstable · sourcepub fn is_unicast_global(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_unicast_global(&self) -> bool
ip
#27709)如果该地址是全局可路由的单播地址,则返回 true
。
以下返回 false:
- 回环地址
- 链接本地地址
- 唯一的本地地址
- 未指定地址
- 保留用于文档的地址范围
此方法根据 RFC 4291 第 2.5.7 节 返回 true
作为站点本地地址
The special behavior of [the site-local unicast] prefix defined in [RFC3513] must no longer
be supported in new implementations (i.e., new implementations must treat this prefix as
Global Unicast).
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 0).is_unicast_global(), false);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_unicast_global(), true);
Runconst: unstable · sourcepub fn multicast_scope(&self) -> Option<Ipv6MulticastScope>
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn multicast_scope(&self) -> Option<Ipv6MulticastScope>
ip
#27709)1.7.0 (const: 1.50.0) · sourcepub const fn is_multicast(&self) -> bool
pub const fn is_multicast(&self) -> bool
如果这是多播地址 (ff00::/8
),则返回 true
。
此属性由 IETF RFC 4291 定义。
Examples
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0).is_multicast(), true);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_multicast(), false);
Run1.63.0 (const: unstable) · sourcepub fn to_ipv4_mapped(&self) -> Option<Ipv4Addr>
pub fn to_ipv4_mapped(&self) -> Option<Ipv4Addr>
如果它是 IPv4 映射 地址 (如 IETF RFC 4291 第 2.5.5.2 节 中所定义),则将此地址转换为 IPv4
address,否则返回 None
。
::ffff:a.b.c.d
变成 a.b.c.d
。
所有非以 ::ffff
开头的地址都将返回 None
。
Examples
use std::net::{Ipv4Addr, Ipv6Addr};
assert_eq!(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0).to_ipv4_mapped(), None);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).to_ipv4_mapped(),
Some(Ipv4Addr::new(192, 10, 2, 255)));
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).to_ipv4_mapped(), None);
Runconst: 1.50.0 · sourcepub const fn to_ipv4(&self) -> Option<Ipv4Addr>
pub const fn to_ipv4(&self) -> Option<Ipv4Addr>
如果此地址是 IETF RFC 4291 第 2.5.5.1 节 中定义的 IPv4 兼容 地址或 IETF RFC 4291 第 2.5.5.2 节 中定义的 IPv4 映射 地址,则将此地址转换为 IPv4
地址,否则返回 None
。
请注意,这将为 IPv6 回环地址 ::1
返回一个 IPv4
address。使用 Ipv6Addr::to_ipv4_mapped
可以避免这种情况。
::a.b.c.d
和 ::ffff:a.b.c.d
变成了 a.b.c.d
。::1
变成了 0.0.0.1
。
所有不以全零或 ::ffff
开头的地址都将返回 None
。
Examples
use std::net::{Ipv4Addr, Ipv6Addr};
assert_eq!(Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0).to_ipv4(), None);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).to_ipv4(),
Some(Ipv4Addr::new(192, 10, 2, 255)));
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1).to_ipv4(),
Some(Ipv4Addr::new(0, 0, 0, 1)));
Runconst: unstable · sourcepub fn to_canonical(&self) -> IpAddr
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn to_canonical(&self) -> IpAddr
ip
#27709)source§impl Ipv6Addr
impl Ipv6Addr
sourcepub fn parse_ascii(b: &[u8]) -> Result<Self, AddrParseError>
🔬This is a nightly-only experimental API. (addr_parse_ascii
#101035)
pub fn parse_ascii(b: &[u8]) -> Result<Self, AddrParseError>
addr_parse_ascii
#101035)从字节片中解析 IPv6 地址。
#![feature(addr_parse_ascii)]
use std::net::Ipv6Addr;
let localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);
assert_eq!(Ipv6Addr::parse_ascii(b"::1"), Ok(localhost));
Run