对于IPv6其实一直都不算怎么了解,最近在这方面遇到了些问题,所以特意看了一下,做个学习笔记。
1.ipv6地址的格式
ipv6是由128位比特组成,通常将其分为8组,每组有4个16进制数字,组与组之间通过":"进行分割,如:FC00:0000:130F:0000:0000:09C0:876A:130B
如果每组的4个16进制中前面是0,则可以进行缩写,因此上面的地址可以缩写为:
FC00:0:130F:0:0:9C0:876A:130B
如果有连续的多组地址都为0,可以进一步将其缩写为"::"
FC00:0:130F::9C0:876A:130B
但是一个ipv6地址中只能出现一次"::"
2.ipv6地址的掩码表示
ipv6直接通过在地址后面添加/xx来表示掩码的位数,比如:
FC00:0:130F::9C0:876A:130B/64
3.ipv6地址的单播地址分类
3.1 ipv6公网ip,类似于ipv4的公网ip,就是在互联网上可以访问的ip,其地址范围是:2000::/3
3.2 ipv6私网ip,类似于ipv4的私网ip,也就是ipv4保留给局域网用的ip地址,该地址不能在internel上进行路由,ipv4的私房ip范围是:
10.0.0.0
- 10.255.255.255
(10.0.0.0/8)
172.16.0.0
- 172.31.255.255
(172.16.0.0/12)
192.168.0.0
- 192.168.255.255
(192.168.0.0/16)
ipv6的私网ip范围是FC00::/7,在局域网内可以跨路由通信
3.3ipv6的link-local地址,类似于ipv4的169.254.0.0/16,169.254.x.x地址通常用于当DHCP无法使用时,主机给自己分配的地址,这样可以保证在同一子网下的主机还能正常的通信。
同理ipv6的link-local地址相当于为网口自动分配的一个本地链路地址,两个连接在同一交换机上的link-local主机可以直接进行通信,但是link-local地址不能跨路由进行通信。
link-local的地址范围是:FE80::/10,默认情况下11比特到64比特会被设置为0,后面65-128比特通过MAC地址进行填充
4.ipv6的本地回环地址:
与ipv4的127.0.0.1类似,用于本地回环,ipv6的回环地址是:::1/128
4.ipv6地址的组播地址分类
组播地址的范围是:FF00::/8
4.1预定义组播地址,用于网络协议定义的组播,类似于ipv4的224.0.0.x
FF02:0:0:0:0:0:0:1,所有节点的组播地址。
FF02:0:0:0:0:0:0:2,所有路由器的组播地址。
FF02:0:0:0:0:1:FFXX:XXXX ,Solicited-Node组播地址。
FF02:0:0:0:0:0:0:5,所有OSPF路由器组播地址。
FF02:0:0:0:0:0:0:6,所有OSPF的DR路由器组播地址。
FF02:0:0:0:0:0:0:D,所有PIM路由器组播地址。
4.2其他组播,组播比较复杂,目前还没有仔细研究
5.ipv6有状态与无状态
ipv6的公网ip和私网ip可以通过手动设定也可以通过自动分配。
如果采用自动分配,地址又分为有状态地址和无状态地址,简单的说,如果地址是通过DHCPv6服务器进行分配的(DHCPv6还可以提供DNS地址等),就是由状态的;如果是通过路由通告报文RA(Router Advertisement)包含的prefix前缀信息自动配置IPv6地址,组成方式是Prefix + (EUI64 or 随机),那么就是无状态的。
6.Windows/Linux下的ipv6如何进行ping操作
6.1Windows下ipv6的ping方式为:
>ipconfig
Windows IP 配置
以太网适配器 以太网:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 以太网 2:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 1:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 10:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::mmmm:nnnn:xxxx:yyyy%5
IPv4 地址 . . . . . . . . . . . . : 192.168.0.88
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.0.1
其中本地链接地址后面有一个%5,%5是用于表示本机的网络接口的标示符
使用ping fe80::kkkk:llll:vvvvv:wwww%5
的形式ping其他处于同一链接的ipv6地址,必须得指定网络接口标示符,因为如果一个主机有多个网口,那么每个网口都会有一个link-local地址,所以必须得指定网络接口标示符,才能知道通过那个网口ping处于同一链接上的其他主机
6.2Linix下 ipv6的ping方式为
$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:1b:e7:7e:b8 txqueuelen 0 (以太网)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.102 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::gggg:hhhh:tttt:ssss prefixlen 64 scopeid 0x20<link>
ether 08:00:27:b4:aa:9a txqueuelen 1000 (以太网)
RX packets 3488 bytes 3495134 (3.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1510 bytes 137916 (137.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#或者通过ip进行查询
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:b4:aa:9a brd ff:ff:ff:ff:ff:ff
inet 192.168.0.102/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3
valid_lft 11148sec preferred_lft 11148sec
inet6 fe80::gggg:hhhh:tttt:ssss/64 scope link noprefixroute
可以看到Linux下为每个网络接口起了一个名字,也就是lo,enp0s3...
所以ping的时候需要通过-I指定这个名字
ping6 fe80::mmmm:nnnn:xxxx:yyyy -I enp0s3
需要说明的是:
Windows与Linux之间互相ping对方,也是按照自己的规则即Windows下通过%xxx指定网络接口标示符, Linux是通过-I指定网络接口名字。