IPv6基础
IPv6简介
IPv6(Internet Protocol version 6 ,网际协议第6版)是网际协议的最新版本,用作互联网的协议。用它来取代IPv4主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。
IPv6的设计目的是取代IPv4,然而长期以来IPv4在互联网流量中仍占据主要地位,IPv6的使用增长缓慢。
IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用128位的地址,而IPv4使用的是32位。因此新增的地址空间支持2128(约3.4×1038)个地址,具体数量为340,282,366,920,938,463,463,374,607,431,768,211,456
个,也可以说成1632个,因为每4位地址(128位分为32段,每段4位)可以取24=16个不同的值。就以地球人口70亿人计算,每人平均可分得约4.86×1028(486117667×1020)个IPv6地址。
IPv6格式
IPv6二进位制下为128位长度,以16位为一组,每组以冒号“:”隔开,可以分为8组,每组以4位十六进制方式表示。例如:2001:0db8:86a3:08d3:1319:8a2e:0370:7344
是一个合法的IPv6地址。类似于IPv4的点分十进制,同样也存在点分十六进制的写法,将8组16位十六进制地址的冒号去除后,每位以点号“.”分组,例如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344
则记为2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4
,其倒序写法用于ip6.arpa子域名记录IPv6地址与域名的映射。
同时IPv6在某些条件下可以省略:
-
每项数字前导的0可以省略,省略后前导数字仍是0则继续,例如下组IPv6是等价的。
2001:0db8:02de:0000:0000:0000:0000:0e13
2001:db8:2de:0000:0000:0000:0000:e13
2001:db8:2de:000:000:000:000:e13
2001:db8:2de:00:00:00:00:e13
2001:db8:2de:0:0:0:0:e13
-
可以用双冒号“
::
”表示一组或多组连续的0
,但只能出现一次:如果四组数字都是零,可以被省略。遵照以上省略规则,下面这组IPv6都是相等的。
2001:0db8:0000:0000:0000:0000:1428:57ab
2001:0db8::1428:57ab
2001**::25de::**cade 是非法的,因为双冒号出现了两次。它有可能是以下几种情形之一,造成无法推断。
2001:0000:0000:0000:0000:25de:0000:cade
2001:0000:0000:0000:25de:0000:0000:cade
2001:0000:0000:25de:0000:0000:0000:cade
2001:0000:25de:0000:0000:0000:0000:cade
-
如果地址实际上是IPv4的地址,后32位可以用10进制数表示;因此::ffff:192.168.89.9 相等于::ffff:c0a8:5909。 ::ffff:1.2.3.4 格式叫做IPv4映射地址。
IPv4位址可以很容易的转化为IPv6格式。举例来说,如果IPv4的一个地址为135.75.43.52(十六进制为0x874B2B34),它可以被转化为0000:0000:0000:0000:0000:FFFF:874B:2B34 或者::FFFF:874B:2B34。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为::ffff:135.75.43.52。
- 由于同一个非全局地址可能在同一范围的多个区域中使用(如,在两条独立的物理链路中使用链路本地地址 fe80::1),而且一个节点可能连接到同一范围的不同区域的接口(如,一个路由器通常有多个接口连接到不同的链路)。IPv6新增了区域ID(Zone ID)加以区分,或称作用域ID(Scope ID)。作用域ID仅用于本地链接,使用百分号追加在地址后面。其内容特定于操作系统,例如Windows使用数字 fe80::2%3 ,Linux使用网卡名字 fe80::2%eth0 。在URI中使用时,百分号需要进行编码,例如 fe80::a%en1 应显示为 http://[fe80::a%25en1] 。
IPv6地址的分类
IPv6 地址有几种不同的分类,根据它们的用途和范围可以分为以下几类:
单播地址(Unicast)
用于单一发送者和单一接收者之间的通信,IPv6中的单播地址类型包括:
-
全局单播地址(Global Unicast Address, GUA):
-
结构:通常包含以下几个部分:
-
全局路由前缀:通常由一个互联网服务提供商(ISP)分配,用于在全球范围内唯一标识网络。
-
子网标识:用于组织内部区分不同的子网。
-
接口标识(Interface ID):用于唯一标识子网内的单个设备,可通过将MAC地址分成两半,在中间插入
FFFE
,并反转MAC地址的第7位(通常称为“U/L位”)来生成;为了防止MAC地址的隐私泄露,也可以使用随机数来生成接口ID;也可管理员可以为设备手动分配。
-
-
特点:全局单播地址类似于IPv4中的公网地址,可以用于互联网上的端到端通信。
-
用途:连接到互联网的设备使用全局单播地址。
-
-
链路本地单播地址(Link-Local Address, LLA):
-
结构:链路本地地址以
FE80::/10
为前缀,后面是从MAC地址生成或随机生成的64位接口ID。 -
特点:链路本地地址仅在单个链路(例如局域网)内有效,不可跨链路路由。
-
用途:用于链路层的网络活动,如自动地址配置、邻居发现或当没有路由到全局地址时的本地通信。
-
-
唯一本地地址(Unique Local Address, ULA):
-
结构:唯一本地地址以
FC00::/7
为前缀,但实际使用中通常使用FD00::/8
,后面跟随一个40位的随机生成的全局ID和一个16位的子网ID,以及64位的接口ID。 -
特点:在本地或组织内部是唯一的,但不是全球可路由的,类似于IPv4的私有地址(
10.0.0.0/8
、172.16.0.0/12
和192.168.0.0/16
)。 -
用途:用于组织内部网络通信,适用于不需要与外界通信的局域网环境。这些地址用于组织内部或私有网络,不应该直接路由到全球互联网。
-
-
特定单播地址:
-
例如文档用地址(
2001:DB8::/32
),用于文档和示例中,不应在公共网络中使用。 -
环回地址(
::1/128
),用于设备自身内部通信测试。 -
fe80::/10
,用于自动私有IP地址配置,这些地址只在区域连线中是合法的,这有点类似于IPv4中的169.254.0.0/16
。
-
多播地址(Multicast)
IPv6 多播地址用于一对多通信,即一个发送者向多个接收者发送数据。多播地址标识一组监听特定多播流的接口。在IPv6中,多播替代了IPv4中的广播概念,因为IPv6不支持网络广播。多播地址的范围从 FF00::/8
到 FFFF::/8
。
IPv6 多播地址的结构如下:
-
前缀:每个IPv6多播地址以
FF
开头(在二进制中为11111111
)。 -
标志(Flags):接着是4位标志字段,其中第一位目前保留为0,第二位(T)定义了地址的临时性质(0为永久,1为临时),第三位(P)和第四位(R)目前未使用并保留为0。
-
范围(Scope):紧随标志字段之后的是4位的范围字段,用于指定多播地址的有效范围,比如链路本地、站点本地、组织本地或全局范围。
-
组ID(Group ID):最后是112位的组ID,它标识特定的多播组。组ID可以是随机分配的,也可以是根据特定规则分配的。
IPv6 多播地址的常见范围值包括:
-
0x2
:链路本地范围,多播仅在同一物理网络中有效。 -
0x5
:站点本地范围,多播在单个站点或组织内有效。 -
0x8
:组织本地范围,多播在指定的组织内有效。 -
0xE
:全球范围,多播在整个IPv6互联网中有效。
IPv6 多播地址的一些特殊用途和示例包括:
-
FF02::1
:所有节点的地址,用于向链路上的所有设备发送多播消息。 -
FF02::2
:所有路由器的地址,用于向链路上的所有路由器发送多播消息。 -
FF05::2
:所有站点内路由器的地址,用于站点内的路由器间多播。
多播地址在许多网络协议和应用中使用,如邻居发现(Neighbor Discovery, ND)、路由器广告(Router Advertisement, RA)、动态主机配置协议(DHCPv6)以及其他需要一对多通信的场景。
因为多播可以有效地将数据发送给多个目的地,而不需要单独发送给每个接收者,所以它是网络中流量分发的高效方式。它在流媒体、在线游戏、实时通讯等领域中非常有用。IPv6的多播能力为现代网络通信提供了极大的灵活性和效率。
任播地址(Anycast)
IPv6 任播地址(Anycast Address)是一种特殊类型的通信方式,用于一对一中最近的一个(通常是最近的一个接收者)。IPv6 的任播地址在概念上与多播相似,但在实际使用上有所不同。任播地址可以由网络中的多个节点共享,当数据发送到任播地址时,网络将数据路由到距离发送者最近的那个节点。
IPv6任播地址的特点和用途:
-
地址共享:任播地址可以分配给网络中的多个接口,这些接口通常属于不同的节点。
-
路由优化:数据包发送到任播地址时,路由器将它们路由到最近的(通常是拓扑上或距离上最近的)接收节点。这是通过最短路径优先的路由协议来实现的。
-
用途:任播常用于负载均衡和冗余,比如在多个服务器上提供相同的服务时。客户端可以使用单个任播地址来访问服务,而无需知道具体的服务器地址。
IPv6任播地址的配置和识别:
在IPv6中,并没有专门的任播地址范围。任意的单播地址都可以被当作任播地址来使用。关键在于这个单播地址是如何在网络中被配置和路由的。要配置任播服务,网络管理员需要在多个设备上配置相同的IPv6单播地址,并在路由器中适当地配置路由协议,以确保任播的工作原理得以实现。
例如,如果多个DNS服务器在不同的地理位置上配置了相同的IPv6地址,并且在网络中宣告了这个地址,那么当客户端尝试解析一个域名时,它发送的查询将被路由到最近的DNS服务器。
IPv6任播的工作原理依赖于路由协议的能力来确定最近的节点。通常,路由器使用诸如OSPF(开放最短路径优先)、IS-IS(中间系统到中间系统)或BGP(边界网关协议)等协议来确定最佳路径。
总结来说,IPv6任播地址是一种有效的网络资源和服务定位机制,它能够提高服务的可用性和负载均衡能力,对于提高网络效率和性能非常有帮助。
Window 配置IPv6
在Windows 通过网络和共享中心来同时配置IPv6的全局单播地址(GUA)实现外部网络访问和唯一本地地址(ULA)实现内部网络访问。
以下是配置步骤:
-
打开控制面板,然后点击
网络和共享中心
。 -
点击左侧的
更改适配器设置
。 -
找到你想要配置的网络连接(例如,以太网或本地连接),然后右键点击选择
属性
。 -
在网络连接属性窗口中,找到并双击
Internet 协议版本 6 (TCP/IPv6)
。 -
在弹出的
Internet 协议版本 6 (TCP/IPv6) 属性
窗口中,选择使用以下IPv6地址
,然后输入你的全局单播地址和子网前缀长度,全局单播地址通过互联网服务提供商(ISP)获取。 -
在
默认网关
中输入IPv6网关地址。 -
如果需要配置DNS,可以在
使用以下DNS服务器地址
部分输入首选和备用的IPv6 DNS服务器地址。 -
点击
高级
按钮,这时可以添加更多的IPv6地址。在IP地址
选项卡中,点击添加
来输入你的唯一本地地址(ULA)和相应的子网前缀长度。 -
点击确定保存配置。
Linux 配置IPv6
Linux 想要在系统重启之后保持IPv6配置,需要编辑网络配置文件,这取决于你使用的是哪种网络管理服务。
对于 NetworkManager
编辑 /etc/sysconfig/network-scripts/ifcfg-<interface-name>
文件,其中 <interface-name>
是你的网络接口名称,比如 ifcfg-eth0
。
添加或修改以下行,以包含你的IPv6配置:
[IPV6]
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6ADDR=2001:db8::2/64
IPV6ADDR_SECONDARIES=fd00:db8::2/64
IPV6_DEFAULTGW=2001:db8::1
-
IPV6ADDR
是主 IPv6 地址,通常是全局单播地址,后面应该跟上子网前缀长度。 -
IPV6ADDR_SECONDARIES
是次要 IPv6 地址列表,可以是一个或多个地址,每个地址后面也需要指定子网前缀长度。这里可以设置唯一本地地址(ULA)。
重启 NetworkManager
服务来应用更改:
sudo systemctl restart NetworkManager
对于 systemd-networkd
创建或编辑 /etc/systemd/network/10-eth0.network
文件(这里的 10-eth0.network
应该匹配你的网络接口)。
添加以下部分来配置IPv6地址和默认网关:
[Match]
Name=eth0
[Network]
Address=2001:db8::2/64
Address=fd00::2/64
Gateway=2001:db8::1
DNS=2001:db8::53
重启 systemd-networkd
服务来应用更改:
sudo systemctl restart systemd-networkd
请根据Linux发行版和网络管理服务选择合适的方法。如果不确定使用哪种服务,可以查阅发行版的文档或使用systemctl
来检查哪个服务是活跃的。记得在配置IPv6地址时,替换示例中的地址为自己的IPv6地址。