Skip to content

IPv6地址的自动配置

考虑到移动网络的出现以及以后的物联网,IPv6中对IP地址的配置做了许多改进,以适应漫游节点越来越多的情况。 其中一个特性就是IPv6地址的自动配置功能,它可以在网络没有DHCP服务器的情况下自行为接入的节点配置IPv6地址,从而让节点可以与网络中的其它节点(也可能包括互联网上的其它节点)进行通讯。 IPv6的地址自动配置分为两种情况: 无状态自动配置(网络中有路由器,但无DHCPv6服务器),有状态自动配置(有DHCPv6服务器,可能有路由器)。 有人可能会想,如果一个网络中既没有路由器,也没有DHCPv6服务器,那是什么情况?这种情况就相当于几台电脑接入到一个交换机或者集线器上,这时各个节点只需要一个链路本地地址就可以互相通讯。而链路本地地址的配置无需任何网络,一个支持IPv6的节点自己就可以完成链路本地地址的配置了。所以这里我们说的IPv6地址的自动配置,说的是全球单播地址(相当于IPv4公网IP)的配置。 当一个支持IPv6的节点启动时,它首先会尝试为自己配置一个链路本地地址(link-local address),这个地址是根据链路本地地址的网络前缀FE80::/64以及接口的MAC地址来生成的,既不需要路由器也不需要DHCPv6服务器。有了这个地址以后,节点会以组播方式发送RS(Router Solicitation )报文,看看本地有没有路由器(有没有设备应答RS报文)。此时链路上的路由器会以RA(Router Advertisement)报文应答,应答报文中携带了网络前缀等相关信息,节点通过这些信息来配置自己的全球单播地址。注意,在无状态自动配置中无法为节点配置DNS服务器等一些选项。 如果节点没有收到路由器的RA报文,或者路由器RA报文中通知节点此网络中有DHCPv6服务器,则节点发送相应报文来请求DHCPv6服务器发送网络前缀等相关的网络配置信息。这种方式称为有状态自动配置。 大家也可以参考这个(英文的)PDF文件: https://www.6diss.org/tutorials/autoconfiguration.pdf

Read more

特殊IPv6地址

就像IPv4一样,IPv6也有一些特殊的地址。见下表: IPv4 地址 IPv6 地址 互联网地址类 (Internet address classes) 不适用于 IPv6 组播地址 (Multicast addresses 224.0.0.0/4) IPv6 组播地址 (multicast addresses (FF00::/8)) 广播地址(Broadcast addresses) 不适用于 IPv6 未指定地址 (Unspecified address is 0.0.0.0) 未指定地址  :: 环回接口地址 (Loopback address is 127.0.0.1) 环回接口地址 ::1 公网IP地址 (Public…

Read more

IPv6中的常见地址类型

IPv6中的地址类型相对与IPv4有一些明显的变化。IPv4中有三种类型: 单播地址、组播地址和广播地址。而IPv6中则是单播地址、组播地址和任播地址(Anycast)。IPv6中取消了广播地址(因为v6地址多,子网一般可包含更多的节点,这个时候用广播方式发送数据很容易形成网络风暴),而增加了任播地址。 先上图,看起来更直观一些: (via http://1.bp.blogspot.com/-D86FInU1mdY/UjqoFkWarBI/AAAAAAAAATY/9hPoD99J1UM/s1600/Untitled.png) 单播地址 顾名思义,单播地址就是用于标识网络中某一个特定接口的地址,对应于IPv4中的IP地址。 同样,就像IPv4中的地址又分为公网地址、私有地址(如192.168.0.0/16 …)等不同子类一样,IPv6的单播地址也分为很多种,比IPv4的种类更多 。下面简单的一一介绍一下。 1. 全球唯一单播地址 对应IPv4中的公网地址,以2000::/3开头 2. 站点唯一单播地址 对应于IPv4中的私有地址,以FEC:: ~ FFF::开头,用于标识本地站点上一个唯一的接口(可以想象为一个公司的局域网) 3. 链路唯一单播地址 对应于IPv4中的私有地址网段,以FE8:: ~ FEB::开头,用于标识本地链路上一个唯一的接口(可以想象为接入一个交换机上的接口) 组播地址 这个类型和IPv4中的组播地址功能一样,用于定义一组接口,发往组播地址的数据会被转发到组中的每个接口上 任播地址 任播地址也是用于标识一组接口地址。发往任播地址的数据会被转发给组中距离接收接口最近的一个地址(而不是组中所有的地址)。 当然,IPv6中还有用于标识本机的环回接口地址(::1,对应于IPv4的127.0.0.1),被保留的地址段,一起其他一些特殊地址(比如::,对应IPv4中的0.0.0.0),但主要用的就是上面三种地址类型。  

Read more

GETOPTS中的OPTIND

最近对shell中的OPTIND变量有些糊涂,想要查看文档弄清楚。可惜无论KSH还是BASH的手册中对这个变量都只是提了一下定义:OPTIND是一个索引,用于指向调用getopts函数时需要处理的参数,它的初始值为1。并没有展开论述,也没有范例。 如果只看这个定义的话,倒也很清楚。不过实际一测试,反而容易糊涂,尤其是碰到需要值(argument)的参数。请看下面一个简单的示例脚本: 在Linuxmint/ubuntu上: #!/bin/bash while getopts “abc:” flag do echo “$flag” $OPTIND $OPTARG done 这里我们的脚本可以处理3个参数,a, b和c,其中c参数需要跟一个值。实际运行结果如下: ┌[acheng@azalea]-(~) └> ./test.sh -a -b -c xd a 2 b 3 c 5 xd 调用getopts之前,OPTIND的值为初始值1,getopts被调用后返回第一个参数a,同时OPTIND变为2,因此第二次调用getopts时返回第二个参数b,同时OPTIND变为3。同理,第三次调用getopts时返回第三个参数c,同时OPTIND变为5,因为值xd也同样算一个数的。第四次调用getopts时,由于不存在第五个参数,getopts返回-1,while循环结束。 看起来很清楚,没什么好糊涂的。 下面我们再看一下把参数合并后脚本运行的结果: ┌[acheng@azalea]-(~) └> ./test.sh -abc xd a 1…

Read more

SED和GSED中N命令的不同

SED中的N命令的作用: 从输入文件中读入下一行,并附加到模式空间中,然后接着执行下面的SED命令。如果N碰到最后一行,则直接退出,不再执行后面的脚本。 传统的SED中,N命令遇到最后一行的话,SED直接退出,不输出最后那一行(模式空间中的内容),而GSED则输出。如果不是最后一行的话,则SED/GSED行为相同 用于测试的三行文本: ┌[acheng@vanilla]-(~) └> echo -e “test\necho\ntext” test echo text 当”echo”在最后一行时,sed直接退出,没有输出”echo”: ┌[acheng@vanilla]-(~) └> echo -e “test\necho” | sed ‘/^echo/ {N;}’ test 同样的情况,gsed则输出(OpenBSD上gsed需要另外安装。Linux上的sed和gsed多是一回事): ┌[acheng@vanilla]-(~) └> echo -e “test\necho” | gsed ‘/^echo/ {N;}’ test echo 当”echo”不为最后一行时,sed和gsed的输出相同: ┌[acheng@vanilla]-(~) └> echo -e…

Read more

使用mutt阅读HTML邮件

mutt在命令行下默认是无法阅读HTML格式的邮件的。我们可以通过以下设置来告诉mutt使用第三方软件(w3m,需要另行安装)来查看HTML邮件。 1. 在自己的主目录下创建或编辑.mailcap文件,添加以下内容: text/html; w3m -I %{charset} -T text/html; copiousoutput; 2. 然后在mutt的配置文件.muttrc中添加以下内容: auto_view text/html # view html automatically alternative_order text/plain text/enriched text/html # save html for last  

Read more

find命令的几个实用范例

今天在网上看到了几个find命令的实战用法,觉得很不错。这里分享一下。 1. 查看当前目录下(包括子目录;find后面的那个点表示当前目录)共有多少个文件: $ find . -type f | wc -l 187534 2. 查看当前目录下(包括子目录)最新或最老的文件: # 最老的文件 $ find -type f -printf ‘%T+ %p\n’ | sort | head -n 1 2006-02-03+02:40:33 ./skel/.xemacs/init.el # 最新的文件 $ find -type f -printf ‘%T+ %p\n’…

Read more

Ubuntu 15.04上折腾OpenSMTPD

Ubuntu 15.04上本来是有OpenSMTPD的安装包的,但是在我试图安装时报错,而且它用的是OpenSMTPD 5.4.2,比OpenBSD上的5.7.1版本低,于是我决定下载源码自己编译。 不过在编译之前先要安装一些软件: apt-get update apt-get install libevent libevent-dev automake autoconf bison libtool libdb 然后再编译、安装libasr库: wget https://opensmtpd.org/archives/libasr-1.0.2.tar.gz tar zxf libasr-1.0.2.tar.gz cd libasr-1.0.2 ./configure && make && make install 完成之后,开始编译opensmtpd wget http://www.opensmtpd.org/archives/opensmtpd-portable-latest.tar.gz tar zxf opensmtpd-portable-latest.tar.gz cd opensmtpd ./configure –with-asr=/usr/local make…

Read more
Sidebar