Struct std::net::Ipv6Addr 1.0.0[−][src]
pub struct Ipv6Addr { /* fields omitted */ }
Expand description
IPv6 地址。
IPv6 地址在 IETF RFC 4291 中定义为 128 位整数。 它们通常表示为八个 16 位段。
Ipv6Addr
结构体的大小可能会因目标操作系统而异。
嵌入 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 地址。
文字表达
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
为特殊的 ‘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);
Run如果这是 环回地址 (::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);
Run如果该地址似乎是可全局路由的,则返回 true
。
以下返回 false
:
- 回环地址
- 本地链接和唯一本地单播地址
- 接口,链路,领域,管理和站点本地多播地址
Examples
#![feature(ip)]
use std::net::Ipv6Addr;
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff).is_global(), true);
assert_eq!(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0x1).is_global(), false);
assert_eq!(Ipv6Addr::new(0, 0, 0x1c9, 0, 0, 0xafc8, 0, 0x1).is_global(), true);
Run如果这是唯一的本地地址 (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);
Run如果这是 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);
Run如果地址是具有链接本地作用域的单播地址,则返回 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);
Run如果这是为文档 (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);
Run如果这是为基准测试 (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);
Run如果该地址是全局可路由的单播地址,则返回 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);
Run如果这是多播地址 (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);
Run如果它是 IPv4 映射 地址 (如 IETF RFC 4291 第 2.5.5.2 节 中所定义),则将此地址转换为 IPv4
address,否则返回 None
。
::ffff:a.b.c.d
变成 a.b.c.d
。
所有非以 ::ffff
开头的地址都将返回 None
。
Examples
#![feature(ip)]
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);
Run如果此地址是 IETF RFC 4291 第 2.5.5.1 节 中定义的 IPv4 兼容 地址或 IETF RFC 4291 第 2.5.5.2 节 中定义的 IPv4 映射 地址,则将此地址转换为 IPv4
地址,否则返回 None
。
::a.b.c.d
和 ::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(), 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)));
RunTrait Implementations
编写一个符合 RFC 5952 描述的规范样式的 Ivv6Addr。
type Err = AddrParseError
type Err = AddrParseError
可以从解析中返回的相关错误。
如果存在,则此方法返回 self
和 other
值之间的顺序。 Read more
如果存在,则此方法返回 self
和 other
值之间的顺序。 Read more
如果存在,则此方法返回 self
和 other
值之间的顺序。 Read more