1--IPv6编程基础篇《为何输入对方…

来源:互联网 发布:php当中的 k 编辑:程序博客网 时间:2024/05/22 08:13

***************************************************

作者:flash胜龙 Email:liangzulin_001@163.com

***************************************************

IPv6地址举个例子,通常长成这样:fe80::4e0f:6eff:fed8:489a

但是大家会很好奇,在linux下用ifconfig查看地址的时候,为什么长成这样的:


=====================================================

wlan0 Linkencap:以太网 硬件地址4c:0f:6e:d8:48:9a

inet 地址:192.168.179.6广播:192.168.179.255掩码:255.255.255.0

inet6 地址:fe80::4e0f:6eff:fed8:489a/64Scope:Link

UP BROADCAST RUNNING MULTICASTMTU:1500 跃点数:1

接收数据包:222528 错误:0 丢弃:0 过载:0 帧数:0

发送数据包:202408 错误:0 丢弃:0 过载:0 载波:0

碰撞:0 发送队列长度:1000

接收字节:35912798 (35.9 MB)发送字节:21738075 (21.7MB)

=====================================================


那个奇怪的/64到底是什么东西呢?实验互联的时候会发现,有时候链接要加/64,有时候又不用。输入回环地址::1的时候通常是不用加的。由于在IPv4时候,我们习惯使用三点数字式的地址了,会条件反射地认为只要对方给个地址自己的机子就能正常使用了。其实这时候恰恰会出现问题。


比如一般我们自己测试自己机子的链接,IPv4时代会用: 127.0.0.1

到了IPv6时代我们如何使用回环地址呢?其实是这样的:::1


测试的时候没有问题。回到上面ifconfig出来的地址:

  • 如果我们用192.168.179.6来链接自己,是没有问题的。

  • 然而我们用 fe80::4e0f:6eff:fed8:489afe80::4e0f:6eff:fed8:489a/64来链接自己都出现了问题,无法顺利链接


自己编写ipv6程序的时候,链接同路由或者局域网的机子,用的地址叫Link-Local

由于Link-Local地址的形式都是:fe80::a:b:c:d格式,不带任何子网信息等指示路由。因此如果有多个网卡的机器上就有多个Link-Local地址,就必须指定从哪个接口出去,否则系统不知道是哪条链路上的地址。


由于自己编写的程序可能存在各种bug,所以拿自己的程序来测试链接地址是不明智的。很难分辨到底是地址写错了,还是程序写错了。这时候最好的解决方法就是用ping命令尝试链接。ping命令在IPv6时代会有少许不同,在windows下依然是ping,而在Linux下就变成了ping6


回到Link-Local的问题,解决办法是在地址后指定接口。这个接口可不是port,而是网卡或者输出端的设备标识符。我们看到ifconfig出来的一大堆信息前有个Wlan0,这个就是信息出口。使用ping6命令的时候,要在末尾加上%Wlan0,表示从这个出口发送信息。


例:ping6 fe80::4e0f:6eff:fed8:489a%wlan0


这样就能成功ping到信息。同样,这个地址拿到自己编写的程序来用就是可行的,如果不行就得检查port是否写错,其他程序是否编对了。


windows端下,同样要输入接口,不过windows下用的是设备号来解决:


===========================================

Ethernet adapterTest:

      Connection-specific DNSSuffix  . :
       IP Address. . . . . . . . . . . . : 192.168.39.137
       Subnet Mask . . . . . . . . . . . : 255.255.255.0
       IP Address. . . . . . . . . . . . : fe80::21a:a5ff:fec1:1060%6
       Default Gateway . . . . . . . . . : 192.168.39.1
                                           fe80::20f:e6ff:fed4:33da%6

===========================================


地址fe80::21a:a5ff:fec1:1060%6后面跟的百分号6就是设备号。若是想用windows链接linux端的机器,那么ping的时候,就得首先加上linux端的IPv6地址,然后再加上自己windows端的设备号。例如:



linux机器ipv6地址: fe80::4e0f:6eff:fed8:489a/64

windows机器ipv6地址:fe80::21a:a5ff:fec1:1060%6

linux运行下程序打开的端口号:1234

拼合后的链接地址: fe80::4e0f:6eff:fed8:489a%6   (即:目标地址%本地接口



ping的时候所用命令:pingfe80::4e0f:6eff:fed8:489a%6

加到自己的client程序上就是:clientfe80::4e0f:6eff:fed8:489a%6 1234

就可以成功链接了。



参考资料:

http://blog.csdn.net/hansel/article/details/5304103

http://lesca.me/archives/how-to-ping-ipv6-address.html

http://www.cyberciti.biz/faq/windows-vista-server-xp-pingexe-ipv6-command/

http://lesca.me/archives/the-percent-sign-following-link-local-address.html

http://superuser.com/questions/248392/why-cant-i-ping-local-ipv6-windows-machines-from-ubuntu

IPv6地址格式及类型

http://blog.sina.com.cn/s/blog_72a2ef140100pddx.html

IPv4地址和IPv6地址的区别

清华大学IPv6 /首页

IPv4地址

IPv6地址

组播地址(224.0.0.0/4)

IPv6组播地址(FF00::/8)

广播地址

无,只有任播( anycast)地址

未指定地址为 0.0.0 .0

未指定地址为 ::

回路地址为 127.0.0.1

回路地址为 ::1

公用 IP地址

可汇聚全球单播地址

私有地址(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)

本地站点地址( FEC0::/48)

Microsoft自动专用IP寻址自动配置的地址(169.254.0.0/16)

本地链路地址( FE80::/64)

表达方式:点分间隔十进制

表达方式:冒号间隔十六进制式

子网掩码表示:以点阵十进制表示法或前缀长度表示法(CIDR)

子网掩码表示:仅使用前缀长度表示法(CIDR)


0 0