赞
踩
当我们在Linux系统中需要查看接口和地址关系时有两个文件可以查看
/proc/net/if_inet6 //接口和单播地址
/proc/net/igmp6 //接口和组播地址
最开始接触到IPv6的开源代码时看到代码中有去读取/proc/net/if_inet6文件,但是看完之后一脸懵逼,自己去网上搜索后发现关于这个文件内容的介绍是少之又少(实际上关于IPv6的资料网上是少之又少,英文的还有点中文的几乎没得~),所以就想着结合代码和自己的理解来写一个,希望能给刚接触IPv6的人一些帮助;
文件内容如上图具体格式是:
ipv6addr ifindex prefixlen scope flag devname
ipv6addr: 就是ipv6地址这个没什么好解释的。
ifindex: 就是接口ID,这个是每一个接口都不一样的,文件中显示的是十六进制数字,实际上这个文件中的数字除了都是十六进制的
prefixlen: 前缀长度,类似于IPv4的掩码,ipv6基础知识不做介绍
scope: 这个得好好讲讲了,scope这个单词就是范围的意思,那么在这里的意思肯定是这个地址的适用范围了。那么0x10 0x20 0x00分别又是什么意思呢?
在内核代码中找了找了一圈后发现了一个很像的宏定义 /* * Addr scopes */ #define IPV6_ADDR_MC_SCOPE(a) \ ((a)->s6_addr[1] & 0x0f) /* nonstandard */ #define __IPV6_ADDR_SCOPE_INVALID -1 #define IPV6_ADDR_SCOPE_NODELOCAL 0x01 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e 很可惜这个值和文件内容明显是不一样的,即使是给这些值向左移16位也是明显不对的, 比如fec0的站点本地地址在文件中是0x40但是这里定义的站点本地地址的宏定义为0x05 这样我们再回过头来看到IPV6_ADDR_MC_SCOPE的定义就很明显可以看出这些宏是对应 IPv6地址的第二个字节的后四位,也就是IPv6地址定义中的作用域 再把眼睛擦亮地查找了一翻之后发现了另一组宏定义 #define IPV6_ADDR_LOOPBACK 0x0010U #define IPV6_ADDR_LINKLOCAL 0x0020U #define IPV6_ADDR_SITELOCAL 0x0040U #define IPV6_ADDR_COMPATv4 0x0080U #define IPV6_ADDR_SCOPE_MASK 0x00f0U 诶,对了这组宏就有内味了,可是怎么就没有图片中第四行对应的0x00的定义呢? 在翻阅资料之后还有阅读了一些代码之后发现。。。。 并没有什么发现,恕我能力有限 我猜可能是0x00不是具体的某一类单播地址而是表示这个地址是除定义的那四种类型之外的类型
flag: 标志位,这个字段表示这个地址的状态,有以下几种值
/* ifa_flags */ #define IFA_F_SECONDARY 0x01 #define IFA_F_TEMPORARY IFA_F_SECONDARY #define IFA_F_NODAD 0x02 #define IFA_F_OPTIMISTIC 0x04 #define IFA_F_DADFAILED 0x08 #define IFA_F_HOMEADDRESS 0x10 #define IFA_F_DEPRECATED 0x20 #define IFA_F_TENTATIVE 0x40 #define IFA_F_PERMANENT 0x80 #define IFA_F_MANAGETEMPADDR 0x100 #define IFA_F_NOPREFIXROUTE 0x200 #define IFA_F_MCAUTOJOIN 0x400 #define IFA_F_STABLE_PRIVACY 0x800 其中每个标志位的具体含义大家自己细品。 一般用到的也就IFA_F_TENTATIVE,表示这个地址还是暂时的正在做DAD检查
本来想详细讲一下这些文件的,后面发现自己都还没完全整明白,那只能留个线索了。。
/proc/net/igmp6: 这个文件中我们可以看到每个接口加入的组播组,实际上我们可以在应用层去让某个接口加入或退出指定的组播组,而mld的查询包是内核在接口收到之后自动回复的
/proc/net/ip_mr_vif: 查看系统当前有哪些虚拟组播路由接口,这个接口也是可以在应用层去添加的,实际上组播路由就是指定从哪个接口到哪个接口
/proc/net/ip_mr_cache: 查看ipv6组播路由,这个里面会显示某条组播路由是从哪个接口到哪个接口的,但是使用的是ip_mr_vif中对应的vid
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。