IpAddr
IpAddr是一个枚举,该枚举可以包含Ipv4Addr或Ipv6Addr
pub enum IpAddr {V4(Ipv4Addr),V6(Ipv6Addr),
}
创建IpAddr
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));println!("localhost_v4: {:?}", localhost_v4);println!("localhost_v6: {:?}", localhost_v6);
}
localhost_v4: 127.0.0.1
localhost_v6: ::1
判断
is_loopback
判断是否是一个回环地址
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));println!("loopback_v4: {}", localhost_v4.is_loopback());println!("loopback_v6: {}", localhost_v6.is_loopback());
}
loopback_v4: false
loopback_v6: true
is_unspecified
检测是否是
0.0.0.0网段
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v4_1 = IpAddr::V4(Ipv4Addr::new(192, 186, 0, 1));let localhost_v4_2 = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));println!("localhost_v4_1: {}", localhost_v4_1.is_unspecified());println!("localhost_v4_2: {}", localhost_v4_2.is_unspecified());
}
localhost_v4_1: false
localhost_v4_2: true
is_ipv4
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));println!("v4: {}", localhost_v4.is_ipv4());println!("v6: {}", localhost_v4.is_ipv6());
}
v4: true
v6: false
Is_ipv6
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));println!("v4: {}", localhost_v6.is_ipv4());println!("v6: {}", localhost_v6.is_ipv6());
}
v4: false
v6: true
is_multicast
是否是一个多播地址
- IPv4 多播地址:
224.0.0.0~239.255.255.255
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};fn main() {let localhost_v4_1 = IpAddr::V4(Ipv4Addr::new(192, 186, 0, 1));let localhost_v4_2 = IpAddr::V4(Ipv4Addr::new(224, 0, 0, 1));println!("localhost_v4_1: {}", localhost_v4_1.is_multicast());println!("localhost_v4_2: {}", localhost_v4_2.is_multicast());
}
localhost_v4_1: false
localhost_v4_2: true
Ipv4Addr
创建ipv4
指定ip创建
use std::net::Ipv4Addr;fn main() {let v4 = Ipv4Addr::new(127, 0, 0, 1);println!("v4: {:?}", v4);
}
v4: 127.0.0.1
预设ip创建
use std::net::Ipv4Addr;fn main() {let v4_local_host = Ipv4Addr::LOCALHOST;let v4_unspecified = Ipv4Addr::UNSPECIFIED;let v4_broadcast = Ipv4Addr::BROADCAST;println!("v4_local_host: {:?}", v4_local_host);println!("v4_unspecified: {:?}", v4_unspecified);println!("v4_broadcast: {:?}", v4_broadcast);}
v4_local_host: 127.0.0.1
v4_unspecified: 0.0.0.0
v4_broadcast: 255.255.255.255
获取ip
ip.octets()返回一个[8u:4]
use std::net::Ipv4Addr;fn main() {let v4_local_host = Ipv4Addr::LOCALHOST;let ip = v4_local_host.octets();println!("ip: {:?}", ip);
}
ip: [127, 0, 0, 1]
判断ip类型
is_unspecified
判断是否是
0.0.0.0
use std::net::Ipv4Addr;fn main() {let v4_local_host = Ipv4Addr::new(0, 0, 0, 0);println!("unspecified: {}", v4_local_host.is_unspecified());
}
unspecified: true
Is_loopback
判断是否是本地回环地址
127.0.0.0/8
use std::net::Ipv4Addr;fn main() {let v4_local_host = Ipv4Addr::new(127, 0, 0, 0);println!("loopback: {}", v4_local_host.is_loopback());
}
loopback: true
is_private
判断是否是专用地址
10.0.0.0/8172.16.0.0/12192.168.0.0/16
use std::net::Ipv4Addr;fn main() {let v4_1 = Ipv4Addr::new(127, 0, 0, 0);let v4_2 = Ipv4Addr::new(10, 0, 0, 0);println!("v4_1 private: {}", v4_1.is_private());println!("v4_2 private: {}", v4_2.is_private());
}
v4_1 private: false
v4_2 private: true
is_link_local
地址是本地链接 (
169.254.0.0/16)
use std::net::Ipv4Addr;fn main() {let v4_1 = Ipv4Addr::new(169, 254, 255, 255);let v4_2 = Ipv4Addr::new(169, 254, 0, 0);let v4_3 = Ipv4Addr::new(170, 0, 0, 0);println!("v4_1 link_local: {}", v4_1.is_link_local());println!("v4_2 link_local: {}", v4_2.is_link_local());println!("v4_3 link_local: {}", v4_3.is_link_local());
}
v4_1 link_local: true
v4_2 link_local: true
v4_3 link_local: false
is_multicast
检测多播地址:
224.0.0.0~239.255.255.255
use std::net::Ipv4Addr;fn main() {let v4_1 = Ipv4Addr::new(224, 254, 0, 0);let v4_2 = Ipv4Addr::new(236, 168, 10, 65);let v4_3 = Ipv4Addr::new(172, 16, 10, 65);println!("v4_1 multicast: {}", v4_1.is_multicast());println!("v4_2 multicast: {}", v4_2.is_multicast());println!("v4_3 multicast: {}", v4_3.is_multicast());
}
v4_1 multicast: true
v4_2 multicast: true
v4_3 multicast: false
is_broadcast
检测广播地址 (
255.255.255.255)
use std::net::Ipv4Addr;fn main() {let v4_1 = Ipv4Addr::new(255, 255, 255, 255);let v4_2 = Ipv4Addr::new(192, 168, 0, 1);println!("v4_1 broadcast: {}", v4_1.is_broadcast());println!("v4_2 broadcast: {}", v4_2.is_broadcast());
}
v4_1 broadcast: true
v4_2 broadcast: false
is_documentation
IETF RFC 5737 指定ip地址
192.0.2.0/24(TEST-NET-1)198.51.100.0/24(TEST-NET-2)203.0.113.0/24(TEST-NET-3)
use std::net::Ipv4Addr;fn main() {let v4_1 = Ipv4Addr::new(192, 0, 2, 255);let v4_2 = Ipv4Addr::new(198, 51, 100, 65);println!("v4_1 documentation: {}", v4_1.is_documentation());println!("v4_2 documentation: {}", v4_2.is_documentation());
}
v4_1 documentation: true
v4_2 documentation: true
地址转换
to_ipv6_mapped
ipv4映射ipv6地址:
::ffff:<ip4>
127.0.0.1: 映射::ffff:127.0.0.1
use std::net::Ipv4Addr;fn main() {let v4 = Ipv4Addr::new(192, 168, 0, 1);let v6 = v4.to_ipv6_mapped();println!("v4: {}", v4);println!("v6: {}", v6);
}
v4: 192.168.0.1
v6: ::ffff:192.168.0.1
Ipv6Addr
ipv6是8段
0:0:0:0:0:0:0:0-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff每段范围: 0~2^16 -1(65535)
创建ipv6
指定地址
use std::net::Ipv6Addr;fn main() {let v6 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);println!("v6: {}", v6);
}
v6: ::ffff:192.10.2.255
预设地址
use std::net::Ipv6Addr;fn main() {let v6_localhost = Ipv6Addr::LOCALHOST;let v6_unspecified = Ipv6Addr::UNSPECIFIED;println!("v6_localhost: {}", v6_localhost);println!("v6_unspecified: {}", v6_unspecified);
}
v6_localhost: ::1
v6_unspecified: ::
获取ip
segments
成该地址的八个16位段
[u16;8]
use std::net::Ipv6Addr;fn main() {let v6_localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);let ip = v6_localhost.segments();println!("ip: {:?}", ip);
}
ip: [0, 0, 0, 0, 0, 65535, 49162, 767]
octets
octets就是把segments拆分为16个8段[8u;16]
0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x02ff0→0x000x00→[0, 0]0→0x000x00→[0, 0]0→0x000x00→[0, 0]0→0x000x00→[0, 0]0→0x000x00→[0, 0]- ``0xFFFF
→0xFF0xFF→[255, 255]` 0xC00A→0xC00x0A→[192, 10]0x02FF→0x020xFF→[2, 255]
use std::net::Ipv6Addr;fn main() {let v6_localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);let ip = v6_localhost.octets();println!("ip: {:?}", ip);
}
ip: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 192, 10, 2, 255]
判断地址
is_unspecified
判断是否是 监听地址 (
::)
use std::net::Ipv6Addr;fn main() {let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0);let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);println!("v6_1 unspecified: {}", v6_1.is_unspecified());println!("v6_2 unspecified: {}", v6_2.is_unspecified());
}
v6_1 unspecified: true
v6_2 unspecified: false
is_loopback
判断是否是 本地回环地址 (
::1)
use std::net::Ipv6Addr;fn main() {let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);println!("v6_1 loopback: {}", v6_1.is_loopback());println!("v6_2 loopback: {}", v6_2.is_loopback());
}
v6_1 loopback: true
v6_2 loopback: false
is_multicast
判断是否是 多播地址 (
ff00::/8)
use std::net::Ipv6Addr;fn main() {let v6_1 = Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0);let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);println!("v6_1 multicast: {}", v6_1.is_multicast());println!("v6_2 multicast: {}", v6_2.is_multicast());
}
v6_1 multicast: true
v6_2 multicast: false
地址转换
to_ipv4_mapped
只有
::ffff:a.b.c.d才可以转ipv4,其他的都会返回None
use std::net::Ipv6Addr;fn main() {let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);println!("v4: {:?}", v6_1.to_ipv4_mapped());
}
v4: Some(192.10.2.255)
