虽然IPv6渐渐出现在了人们的视线之中,但是目前来看IPv4仍然占据着主导地位,在日常的编码过程中两者都会接触到,但实际上两者在使用范围、消息头结构等细节上有诸多不同,具体的那些细节对于应用层来说可能体会不到,所以我们先从两者的表示方式来看看,学会认出哪些是IPv4类型的地址,而哪些是IPv6类型的地址。
每个IPv4地址占用4个字节,长度为32位,由网络号和主机号部分组成,最常采用点分十进制表示法,格式为 ddd.ddd.ddd.ddd
,其中 0 <= ddd <= 255
,而每个 d 都是十进制数,可省略前导零,比如常见的192.168.1.1
,理论上最多能表示的地址个数为 2 32 2^{32} 232。
每个IPv6地址占用16个字节,长度为128位,占用空间是IPv4地址的4倍,但是这里要注意,IPv4所能表示的地址个数相比于IPv4来说可不是4倍的关系,IPv6理论上最多能表示的地址个数为 2 128 2^{128} 2128,是IPv4能力的 2 96 2^{96} 296倍,换算成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
。
192.168.1.1
这个IP地址随着路由器的普及逐渐为人们所熟知,有些人可能知道这是一个C类地址,究竟什么是C类地址?难道还有A类、B类地址?不是说IP地址是惟一表示一台主机的吗,为什么我家的路由器和邻居家的路由器地址都是192.168.1.1
,关于这些问题就涉及到了IPv4地址的常见分类,其实IPv4地址一般被分为A、B、C、D、E五类,其中还包含一些保留地址和局域网地址,关于这些信息为了对比方便,我整理了下面这幅图,有关分类的疑惑可以看图了解一下: