IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(The Internet Engineering Task Force,IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。
由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍。
互联网数字分配机构(IANA,The Internet Assigned Numbers Authority,互联网数字分配机构)在2016年已向国际互联网工程任务(IETF)提出建议,要求新制定的国际互联网标准只支持IPv6,不再兼容IPv4。
1、网络分层中的IP协议
通常来讲,网络分层有两种分法:OSI网络分层和TCP/IP网络分层。
1.1 OSI网络分层
开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,缩写为 OSI),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。
OSI将计算机网络体系结构(architecture)划分为以下七层:
![](https://img.haomeiwen.com/i744204/135acd246cafb70b.png)
1.2 TCP/IP分层
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP分层中,有的地方说是五层,有的地方说是四层。两者的区别就在于是否考虑物理层。如果不考虑最底层的物理层,TCP/IP的分层如下:
![](https://img.haomeiwen.com/i744204/361ca0d51627cca1.png)
层 | 作用 | 举例说明 |
---|---|---|
应用层 | 负责应用程序间沟通 | SMTP、FTP、Telnet、网络编程主要针对应用层 |
传输层 | 负责两台主机之间的数据传输 | 传输控制协议(TCP、UDP) |
网络层 | 负责地址管理和路由选择 | IP标识主机、路由表规划传输路线 |
数据链路层 | 负责设备之间数据帧的传送和识别 | 网卡设备驱动、帧同步、冲突检测、CRC |
物理层 | 负责光电信号的传输 | 以太网线、同轴电缆 |
IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP段,属于端到端的传输;网络层传输单位是数据报。数据传输示意图如下:
![](https://img.haomeiwen.com/i744204/50de71962f4057f3.png)
1.3 网络分层中的IP协议
两种分层方式的对比如下:
![](https://img.haomeiwen.com/i744204/d0e1916f12a18ac8.png)
IP协议是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。
可以看出,不管在哪种网络分层方式中,IP协议都是工作在网络层。
2、IPv6地址的表示
IPv4采用点分十进制格式表示ip地址。IPv6的地址长度为128位,是IPv4地址长度的4倍,采用十六进制表示。IPv6有3种表示方法。
2.1 冒分十六进制表示法
格式为X:X:X:X:X:X:X:X
,其中每个X表示地址中的16b,以十六进制表示,例如ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
。
这种表示法中,每个X的前导0是可以省略的,例如
2001:0DB8:0000:0023:0008:0800:200C:417A
可以表示为2001:DB8:0:23:8:800:200C:417A
。
在这种表示方式下,IPV6地址最多占39(4*8+7
,每组4个16进制数,一共有8组,通过7个冒号分隔)位的长度。
2.2 0位压缩表示法
在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:FF01:0:0:0:0:0:0:1101
可以表示为FF01::1101
;0:0:0:0:0:0:0:1
可以表示为::1
;0:0:0:0:0:0:0:0
可以表示为::
。
2.3 内嵌IPv4地址表示法
为了实现IPv4和IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为X:X:X:X:X:X:d.d.d.d
,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.0.1
与::FFFF:192.168.0.1
就是两个典型的例子,注意在前96b中压缩0位的方法依旧适用。
在这种表示方式下,IPV6地址最多占45(4*6+6 + 3*4+3
,前面冒分16进制中,每组4个16进制数,一共有6组,每组后面跟一个冒号分隔,后面的点分十进制中,每组3个十进制数,有4组通过3个点分隔)位的长度。
综上,如果要在数据库中存储ipv6的地址,最好将字段长度设置为45位。
3、IPv6下的ping和URL格式
3.0 IPv6网络环境准备
3.0.1 手机端启用IPv6
目前,我这边只在手机上折腾过,安卓、华为,百度上一搜也有好多带图的说明。打开设置
->无线和网络
->移动网络
->接入点名称(APN)
,可以看到有一些可选的APN,可以查看这些APN的设置信息。
通过新建一个APN协议为IPv6的协议(其它信息设置成和原有的APN一致):
![](https://img.haomeiwen.com/i744204/89fea84eba107fc5.png)
然后,选中这个新建的IPv6的APN使用手机的移动网络就是通过IPv6上网。如下图:
![](https://img.haomeiwen.com/i744204/9702e66babf1ae62.png)
3.0.2 电脑端的IPv6
这里用前面启用IPv6的手机开热点,给电脑(macbook)连接,这样,就可以测试IPv6了。如果想ifconfig查看下当前电脑的ip地址,运行ifconfig,会看到好多网卡信息,不好区分。需要先运行下命令networksetup -listallhardwareports
查看下那个是wifi。
Hardware Port: Wi-Fi
Device: en0
Ethernet Address: XX:XX:XX:XX:XX:XX
Hardware Port: Bluetooth PAN
Device: en3
Ethernet Address: XX:XX:XX:XX:XX:XX
Hardware Port: Thunderbolt 1
Device: en1
Ethernet Address: XX:XX:XX:XX:XX:XX
Hardware Port: Thunderbolt 2
Device: en2
Ethernet Address: XX:XX:XX:XX:XX:XX
Hardware Port: Thunderbolt Bridge
Device: bridge0
Ethernet Address: XX:XX:XX:XX:XX:XX
VLAN Configurations
===================
$
从上面的结果中可以看出,wifi对应的是en0
。可以单独查看这块网卡的信息:
$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether XX:XX:XX:XX:XX:XX
inet6 XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1ad1%en0 prefixlen 64 secured scopeid 0x4
inet6 XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX prefixlen 64 autoconf secured
inet6 XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX prefixlen 64 autoconf temporary
inet 192.168.XXX.XXX netmask 0xffffff00 broadcast 192.168.XXX.XXX
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
$
3.1 ping
IPv6下,如果想要ping一个IPv6的地址,不能直接用ping,需要用ping6,如下(这里用百度做实验,因为百度应该已经支持了IPv6):
$ ping www.baidu.com
PING www.a.shifen.com (61.135.169.125): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
^C
--- www.a.shifen.com ping statistics ---
5 packets transmitted, 0 packets received, 100.0% packet loss
$ ping6 www.baidu.com
PING6(56=40+8+8 bytes) 2408:84e1:80:5cf:c0ee:80ae:39bb:ecc4 --> 2408:80f0:410c:1c:0:ff:b00e:347f
16 bytes from 2408:80f0:410c:1c:0:ff:b00e:347f, icmp_seq=0 hlim=55 time=52.088 ms
16 bytes from 2408:80f0:410c:1c:0:ff:b00e:347f, icmp_seq=1 hlim=55 time=445.723 ms
16 bytes from 2408:80f0:410c:1c:0:ff:b00e:347f, icmp_seq=2 hlim=55 time=37.771 ms
16 bytes from 2408:80f0:410c:1c:0:ff:b00e:347f, icmp_seq=3 hlim=55 time=316.234 ms
16 bytes from 2408:80f0:410c:1c:0:ff:b00e:347f, icmp_seq=4 hlim=55 time=32.574 ms
^C
--- www.a.shifen.com ping6 statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 32.574/176.878/445.723/171.723 ms
$
3.2 URL格式
IPv6中,如果URL中有IPv6的地址,需要放在[]
中。如下是一些IPv6的URL的示例:
http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html
http://[1080:0:0:0:8:800:200C:417A]/index.html
http://[3ffe:2a00:100:7031::1]
http://[1080::8:800:200C:417A]/foo
http://[::192.9.5.5]/ipng
http://[::FFFF:129.144.52.38]:80/index.html
http://[2010:836B:4179::836B:4179]
如果要直接访问通过ip(前面的ping结果中可以看到)访问百度,需要在浏览器地址栏输入http://[2408:80f0:410c:1c:0:ff:b00e:347f]
,结果是空白页面如下:
![](https://img.haomeiwen.com/i744204/fb5c3e79ccf4d74a.png)
如果用curl直接访问,什么都拿不到。补充host信息后,可以得到正常的网页返回。如下:
$ curl "http://[2408:80f0:410c:1c:0:ff:b00e:347f]"
ChengdeMacBook-Pro:~ chengxia$ curl -o baidu.html "http://[2408:80f0:410c:1c:0:ff:b00e:347f]"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
$ curl --header "Host:www.baidu.com" -o baidu.html "http://[2408:80f0:410c:1c:0:ff:b00e:347f]"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 199k 0 199k 0 0 1012k 0 --:--:-- --:--:-- --:--:-- 1007k
$
通过chrome打开前面生成的文件baidu.html
![](https://img.haomeiwen.com/i744204/c21096910b6973b1.png)
可以看到补充host信息之后,拿到了正常的网页返回。
网友评论