前言
虽然IPv6渐渐出现在了人们的视线之中,但是目前来看IPv4仍然占据着主导地位,在日常的编码过程中两者都会接触到,但实际上两者在使用范围、消息头结构等细节上有诸多不同,具体的那些细节对于应用层来说可能体会不到,所以我们先从两者的表示方式来看看,学会认出哪些是IPv4类型的地址,而哪些是IPv6类型的地址。
IPv4地址表示方法
每个IPv4地址占用4个字节,长度为32位,由网络号和主机号部分组成,最常采用点分十进制表示法,格式为 ddd.ddd.ddd.ddd
,其中 0 <= ddd <= 255
,而每个 d 都是十进制数,可省略前导零,比如常见的192.168.1.1
,理论上最多能表示的地址个数为$2^32$。
IPv6地址表示方法
每个IPv6地址占用16个字节,长度为128位,占用空间是IPv4地址的4倍,但是这里要注意,IPv4所能表示的地址个数相比于IPv4来说可不是4倍的关系,IPv6理论上最多能表示的地址个数为$2^128$,是IPv4能力的$2^96$倍,换算成10进制也就是大约79228162514264337593543950336倍,在很长一段时间内不用再担心IP地址不够用的问题了。
而IPv6地址由于占用位数较多,所以采用更容易书写和理解的冒分十六进制表示法,格式为xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
,其中每个 x 表示一个十六进制的符号,也就是0-9A-F,比如一个普通IPv6地址23CD:0F01:0005:0789:ABED:EF01:2345:67D9
,前导零也是可以省略的,例如前一个地址可以记作23CD:F01:5:789:ABED:EF01:2345:67D9
。
在某些情况下,一个IPv6地址内可能包含很长的一段0,这时可以把连续的一段0压缩为::
, 但要注意是,地址中::
只能出现一次,这样才能保证地址解析的唯一性,比如地址FF20:A:0:0:0:0:0:1AC2
,可以写成FF20:A::1AC2
,而地址FF20:A:0:0:1:0:0:1AC2
中间有两段0,为保证解析的唯一性,只能选择一段0来压缩,比如写成FF20:A::1:0:0:1AC2
或者是FF20:A:0:0:1::1AC2
。
为了实现IPv4地址和IPv6地址互相通信,在IPv6的环境下,IPv4地址会被扩展成IPv6地址,此时地址的格式常表示为:xxxx:xxxx:xxxx:xxxx:xxxx:FFFF:ddd.ddd.ddd.ddd
,前面的96位采用IPv6冒分十六进制表示,而后面32位地址则使用IPv4的点分十进制表示,例如常用的IPv4地址192.168.1.1
与表示成IPv6地址就是FFFF:192.168.1.1
。
IPv4地址常见分类
192.168.1.1
这个IP地址随着路由器的普及逐渐为人们所熟知,有些人可能知道这是一个C类地址,究竟什么是C类地址?难道还有A类、B类地址?不是说IP地址是惟一表示一台主机的吗,为什么我家的路由器和邻居家的路由器地址都是192.168.1.1
,关于这些问题就涉及到了IPv4地址的常见分类,其实IPv4地址一般被分为A、B、C、D、E五类,其中还包含一些保留地址和局域网地址,关于这些信息为了对比方便,我整理了下面这幅图,有关分类的疑惑可以看图了解一下:
书愤
陆游
早岁那知世事艰,中原北望气如山。
楼船夜雪瓜洲渡,铁马秋风大散关。
塞上长城空自许,镜中衰鬓已先斑。
出师一表真名世,千载谁堪伯仲间。