C语言编程对IPV6地址进行压缩算法用函数实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程对IPV6地址进行压缩算法用函数实现相关的知识,希望对你有一定的参考价值。
求救啊
#include <stdio.h>int main(void)
char s1[50],s2[50]=0;
int n;
scanf("%d",&n);
while(n--)
int f;
char *p=s1, *q=s2;
int t;
scanf("%s",s1);
while(p<s1+40)
sscanf(p, "%x",&t);
if(t==0 && f==0)
f=1;
else
sprintf(q, "%X", t);
while(*q)q++;
*q++=\':\';
p+=5;
*(q-1)=0;
puts(s2);
return 0;
参考技术A 太棒了,非常感谢
IPV6地址格式分析
IPV6地址格式分析
IPv6的地址长度是128位(bit)。
将这128位的地址按每16位划分为一个段,将每个段转换成十六进制数字,并用冒号隔开。
例如:2000:0000:0000:0000:0001:2345:6789:abcd
这个地址很长,可以用两种方法对这个地址进行压缩,
前导零压缩法:
将每一段的前导零省略,但是每一段都至少应该有一个数字
例如:2000:0:0:0:1:2345:6789:abcd
双冒号法:
如果一个以冒号十六进制数表示法表示的IPv6地址中,如果几个连续的段值都是0,那么这些0可以简记为::。每个地址中只能有一个::。
例如:2000::1:2345:6789:abcd
单播地址(Unicast IPv6 Addresses)
可聚合的全球单播地址(Aggregatable Global Unicast Addresses)
可在全球范围内路由和到达的,相当于IPv4里面的global addresses。前三个bit是001
例如:2000::1:2345:6789:abcd
链路本地地址(Link-Local Addresses)
用于同一个链路上的相邻节点之间通信,相当于IPv4里面的169.254.0.0/16地址。Ipv6的路由器不会转发链路本地地址的数据包。前10个bit是1111 1110 10,由于最后是64bit的interface ID,所以它的前缀总是FE80::/64
例如:FE80::1
站点本地地址(Site-Local Addresses)
对于无法访问internet的本地网络,可以使用站点本地地址,这个相当于IPv4里面的private address(10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16)。它的前10个bit是1111 1110 11,它最后是16bit的Subnet ID和64bit的interface ID,所以它的前缀是FEC0::/48。
值得注意的是,在RFC3879中,最终决定放弃单播站点本地地址。放弃的理由是,由于其固有的二义性带来的单播站点本地地址的复杂性超过了它们可能带来的好处。它在RFC4193中被ULA取代。
唯一的本地IPv6单播地址(ULA,Unique Local IPv6 Unicast Address)
在RFC4193中标准化了一种用来在本地通信中取代单播站点本地地址的地址。ULA拥有固定前缀FD00::/8,后面跟一个被称为全局ID的40bit随机标识符。
未指定地址(Unspecified address)
0:0:0:0:0:0:0:0 或者::
当一个有效地址还不能确定,一般用未指定地址作为源地址。未指定地址不能作为一个目标地址来使用。
回环地址(Loopback address)
回环地址::1用于标识一个回环接口,可以使一个节点可以给自己发送数据包。相当于IPv4的回环地址127.0.0.1
兼容IPv4的地址(IPv4-compatible address)
形如::w.x,y.z,这里的w.x.y.z是IPv4公共地址的十进制点号表示法,用于IPv6/IPv4节点们(同时支持)在使用仅支持IPv4的网络上用IPv6的协议进行通信。
但是事实证明这种技术不是个好主意,RFC4291中废弃了对这类地址的使用。
IPv4映射地址(IPv4-mapped address)
形如::FFFF:w.x.y.z,这里的w.x.y.z是IPv4公共地址的十进制点号表示法,用于一个仅支持IPv4的节点表现为一个IPv6的节点
6over4地址
[64bit-prefix]:0:0:WWXX:YYZZ,其中的WWXX:YYZZ是w.x.y.z IPv4公共地址的十进制点号表示法,用于一个使用6to4协议的隧道机制的节点。
6to4地址
2002:WWXX:YYZZ:[SLA ID]:[Interface ID],用于表示一个使用6to4协议的隧道机制节点。
多播IPv6地址(Multicast IPv6 Addresses)
前8个bit为1111 1111,
其中FF01::到FF0F::的多播地址是保留专用地址
FF01::1 节点本地范围所有节点多播地址
FF02::1 链路本地范围所有节点多播地址
FF01::2 节点本地范围所有路由器多播地址
FF02::2 链路本地范围所有路由器多播地址
FF05::2 站点本地范围所有路由器多播地址
一、引言
下一代网络(NGN)是以IP为中心,支持语音、数据和多媒体业务的全业务网络。因此,IP协议的研究对下一代网络的发展至关重要。然而,IPV4已经很难独自担当起支撑下一代网络发展的重任。相对于IPv4而言,IPv6改进了许多功能,如单播和组播地址空间、任意广播地址、分层路由的集体寻址等。通过这些改进,IPv6扩大了地址空间,提高了网络的整体吞吐量,改善了服务质量和安全性,增强了对即插即用和移动性的支持,更好地实现了多播功能,从而使IPv6成为下一代网络的基础。目前,IETF及相关机构正在努力完善IPv6地址结构体系和地址分配策略,使之能更好地为下一代网络服务。
二、IPv6地址结构体系研究的进展
RFC3513是IETF最近公布的IPv6地址结构体系,该体系取消了早期公布的RFC2373。虽然在RFC3513中保留了RFC2373的部分内容,IPv6地址仍分为单播、任播、组播三种类型,地址和地址前缀的表示方法也未变,但在其它许多方面作了重大调整。另外,IETF还在RFC3587公布了新的IPv6全球单播地址格式,并取消了RFC2374。
1.大大扩展了全球单播地址空间
在RFC3513中,IETF对IPv6的地址类型及其所占地址空间的比重进行了重新调整,调整的结果如表1所示。
表1 IPv6的地址类型及其所占地址空间的比重
通过与RFC2373对比可知,RFC3513取消了为NSAP和IPX等保留的地址,将原来的保留地址全部划入了全球单播地址的行列,从而大大扩展了全球单播地址的空间。
2.给出了新的全球单播地址格式
RFC3513给出了新的IPv6全球单播地址通用格式,见图1。
图1 新的IPv6全球单播地址的通用格式
在图1中,全球路由前缀是分配给站点(一组子网/链接)的一个典型层次结构值,子网ID是一个站点内子网的标识。全球路由前缀由RIR和ISP设计为分层结构,子网域由站点管理员设计为分层结构。在RFC3513中还删除了格式前缀(FP)这个术语,以保证执行简便,而不需要掌握任何有全球单播格式前缀的知识。
由于RFC3513要求所有的单播地址(除了以二进制00O开头的地址外)有64位接口ID并具有改进EUI-64格式的结构(以二进制000开头的全球单播地址在接口标识大小和结构方面没有这个限制),即要求n+m=64,为进一步明确IPv6全球单播地址格式,RFC3587给出了新的格式,见图2。
图2 RFC3587给出的IPv6全球单播地址新格式
RFC3513亦规定,IANA对IPv6全球单播地址的空间分配权限只局限于以二进制001开头的地址范围。RFC3587虽废除了RFC2374中全球可聚集单播地址的前缀格式001,但同时又指出,只有001前缀格式供IANA分配,其余的全球单播地址空间(大约是IPv6地址空间的85%)要保留下来,以备将来定义和使用,暂时不再由IANA分配。所以,由IANA代理、与RFC3177中的建议相一致的2000∷/3前缀的全球单播地址就成了如图3所示的格式。
图3 IANA代理的2000∷/3前缀的IPv6全球单播地址格式
根据RFC3177,RFC3513和RFC3587,并结合目前LIR的分配情况,可将IANA有权分配的全球单播地址格式表示为图4所列的形式。
图4 IANA有权分配的IPv6全球单播地址格式
从该格式可以看出,在IANA有权分配的地址空间中,前三个比特是固定的,29比特地址空间分配给各LIR,LIR可将后面的16比特地址空间分配给客户站点。这样,客户站点前缀即为48比特,并具有16比特的子网划分空间。
3.进一步明确了本地使用的IPv6单播地址
本地使用的单播地址有两种,分别是链路本地地址和站点本地地址。
链路本地地址格式见图5。
图5 链路本地地址格式
链路本地地址用于单个链接,可进行自动地址配置、邻居发现或在没有路由器时进行单个链接编址。RFC3513规定,路由器不能转发任何到达其他链路的具有链路本地源或目的地址的包。站点本地地址格式见图6。
图6 站点本地地址格式
站点本地地址用于单个站点,即用于不需要全球前缀站点的内部编址。尽管子网ID可以长达54位,但最好还是保证全球链接站点能在站点本地前缀和全球前缀中使用相同的子网ID。RFC3513规定,路由器不能转发站点以外的任何具有站点本地源或目的地址的包。
4.巩固了IPv4和IPv6联合应用的基础
在RFC3513进一步明确了“内嵌IPv4地址的IPv6地址”的概念。“内嵌IPv4地址的IPv6地址”包括“IPv4兼容的IPv6地址”和“IPv4映射的IPv6地址”。“IPv4兼容的IPv6地址”的格式如图7所示。
图7 IPv4兼容的IPv6地址格式
这里使用的IPv4地址必须是全球唯一IPv4单播地址。“IPv4映射的IPv6地址”用于代表IPv4节点的IPv6地址,其格式如图8所示。
图8 IPv4映射的IPv6地址格式
IPv4兼容地址和IPv4映射地址用于与传统网络之间的互联互通,以使IPv4网络和IPv6网络之间能进行无缝通信。
三、地址注册机构的IPv6地址分配策略
虽然新的IPv6地址结构已经发布,但还没有相应的新的地址分配策略出台,地址分配仍沿用按RFC3177制定的分配方法(RIPE-267)。
目前,IPv6的地址空间管理是按规定的等级结构在全球范围内分配,即IANA->区域注册机构RIR(->国家注册机构NIR)->ISP/本地注册机构LIR->最终用户(或ISP)。地址分配的方法分为两种。一种是上层注册机构将抵制划分给下层注册机构进行管理,称为分配。另一种是注册机构将地址划分给用户使用,称为指派。为了互联网发展的长期利益,IETF将IPv6地址空间管理的目标确定为保证世界范围内的唯一性、统一在注册数据库中注册、尽最大可能保证易聚合、避免无谓的空间浪费、分配公平公正及注册管理开销的最小化等。上面所描述的这些管理目标经常相互冲突或与某些注册机构(IR)个体及终端用户的需要相冲突,故必须寻求申请者的需要与整个互联网社区的需要之间相互平衡,并能正确地判断出哪方面的需要更为重要。一般情况下,在IPv6地址分配策略中,聚合的目标被认为是最重要的。
此外,IPv6地址空间管理还要遵循如下基本原则:
不能把地址空间当作私有财产。IPv6单播地址空间只能凭许可证使用而不能拥有。尤其IP地址是基于许可机制进行分配和指派的,许可证需进行周期性更新。许可证的批准取决于其初次申请或续借申请时的特殊要求。
不能保证路由的可选性。即不能保证所分配的任何地址在全球范围都能进行路由选择。因此,要求RIR采取措施减少产生地址空间碎片的可能性,以避免路由的可选性受影响。
IPv6地址空间的最小地址分配块为32比特。RIR使用最小地址块进行IPv6地址分配,这样做的目的是为了使基于前缀的过滤更加容易。对于已经持有IPv6地址空间的组织,也就是那些已经按照原有分配策略获得35比特IPv6地址的注册机构,一般不需要提供证明文件就可以直接将他们所分配的地址扩展到32比特。该32比特地址块包含已经分配的地址块(多数情况下为一个或多个35比特地址块),RIR已经将这些地址预留给原有组织以进行后续分配。超过最小地址块(32比特)的额外地址空间的申请需要在评估后再决定是否分配。
兼顾原有IPv4基础设施。已有的IPv4服务提供商由现有业务向IPv6过渡而申请IPv6地址空间时,可将现在IPv4客户数一并考虑。
LIR在将地址空间指派给用户时,要按照已有的RFC3177操作,即通常情况下,采用48比特进行分配,除非特大客户;已知一个且仅有一个子网需要设计时,采用64比特进行分配;仅有一个设备连接时,采用比特进行分配。 四、IPv6地址分配策略发展趋势
根据最新的IPv6地质结构体系的特点,结合目前地址分配的现状,可以看出IPv6地址分配策略正在向如下的趋势发展:
1.有利于市场推广和商业应用
虽然IPv6有许多IPv4所不具备的优点,但是我们也已经看到,IPv6的市场推广工作非常令人不满意。一方面的原因在于,IPv6并没有为用户带来所期望获得的好处:另一方面的原因也在于,在IPv6的地址申请时有较多的繁琐细节,用户认为暂时没有必要去找那些麻烦。
正如RFC3177中指出,IPv6地址空间决不是像IPv4地址空间那样有限,本来由于其他的原因就已经使得IPv6的市场非常低迷了,而毫无理由的保留行为更加重了其低进的程度。因此从市场前途方面来考虑,也应该使用户或ISP很容易地获得与他们实际所需的数量一样多的IPv6地址,而不期望其立即使用这些地址或度量其使用效率有多么低。这样,通过减少跟踪和评估的紧迫性,使得注册操作更高效、更集中。在当前的地址分配策略中(RIPE-267)中规定,分给小企业或大企业一个48比特地址,而且可以为特大客户分一个47比特或更短前缀的地址、或者是多个48比特地址;再加上RFC3513和RFC3587这两个文档
IPV6地址格式分析
地址表达方式
IPv4地址一般以4部分间点分的方法来表示,即4个数字用点分隔。例如, 下面是一些合法的IPv4地址,都用十进制整数表示:
10.5.3.1
127.0.0.1
201.199.244.101
IPv4地址也时常以一组4个2位的十六进制整数或4个8位的二进制整数表示,但后一种情况较少见。
IPv6地址长度4倍于IPv4地址,表达起来的复杂程度也是IPv4地址的4倍。IPv6地址的基本表达方式是X:X:X:X:X:X:X:X,其中X是一个4位十六进制整数( 16位)。每一个数字包含4位,每个整数包含4个数字,每个地址包括8个整数,共计1 2 8位( 4×4×8 = 128 )。例如,下面是一些合法的IPv6地址:
CDCD:910A:2222:5498:8475:1111:3900:2020
1030:0:0:0:C9B4:FF12:48AA:1A2B
2000:0:0:0:0:0:0:1
请注意这些整数是十六进制整数,其中A到F表示的是1 0到1 5。地址中的每个整数都必须表示出来,但起始的0可以不必表示。
这是一种比较标准的IPv6地址表达方式,此外还有另外两种更加清楚和易于使用的方式。
某些IPv6地址中可能包含一长串的0 (就像上面的第二和第三个例子一样)。当出现这种情况时,标准中允许用“空隙”来表示这一长串的0。换句话说,地址
2000:0:0:0:0:0:0:1
可以被表示为:
2000::1
这两个冒号表示该地址可以扩展到一个完整的1 2 8位地址。在这种方法中,只有当1 6位组全部为0时才会被两个冒号取代,且两个冒号在地址中只能出现一次。
在IPv4和IPv6的混合环境中可能有第三种方法。IPv6地址中的最低3 2位可以用于表示IPv4地址,该地址可以按照一种混合方式表达,即X:X:X:X:X:X:d.d.d.d,其中X表示一个1 6位整数,而d表示一个8位十进制整数。例如,地址
0:0:0:0:0:0:10.0.0.1
就是一个合法的IPv4地址。把两种可能的表达方式组合在一起,该地址也可以表示为:
::10.0.0.1
由于IPv6地址被分成两个部分—子网前缀和接口标识符,因此人们期待一个IP节点地址可以按照类似CIDR地址的方式被表示为一个携带额外数值的地址,其中指出了地址中有多少位是掩码。即,IPv6节点地址中指出了前缀长度,该长度与IPv6地址间以斜杠区分,例如:
1030:0:0:0:C9B4:FF12:48AA:1A2B/60
这个地址中用于选路的前缀长度为6 0位。
寻址模型
IPv6寻址模型与IPv4很相似。每个单播地址标识一个单独的网络接口。IP地址被指定给网络接口而不是节点,因此一个拥有多个网络接口的节点可以具备多个IPv6地址,其中任何一个IPv6地址都可以代表该节点。尽管一个网络接口能与多个单播地址相关联,但一个单播地址只能与一个网络接口相关联。每个网络接口必须至少具备一个单播地址。
这里有一个非常重要的声明和一个非常重要的例外。这个声明与点到点链路的使用有关。在IPv4中,所有的网络接口,其中包括连接一个节点与路由器的点到点链路(用许多拨号Internet连接中),都需要一个专用的IP地址。随着许多机构开始使用点到点链路来连接其分支机构,每条链路均需要其自己的子网,这样一来消耗了许多地址空间。在IPv6中,如果点到点链路的任何一个端点都不需要从非邻居节点接受和发送数据的话,它们就可以不需要特殊的地址。即,如果两个节点主要是传递业务流,则它们并不需要具备IPv6地址。
为每个网络接口分配一个全球唯一的单播地址的要求阻碍了IPv4地址的扩展。一个提供通用服务的服务器在高需求量的情况下可能会崩溃。因此, IPv6地址模型中又提出了一个重要的例外:如果硬件有能力在多个网络接口上正确地共享其网络负载的话,那么多个网络接口可以共享一个IPv6地址。这使得从服务器扩展至负载分担的服务器群成为可能,而不再需要在服务器的需求量上升时必须进行硬件升级。
下面将要讨论的组播和泛播地址也与网络接口有关。一个网络接口可以具备任意类型的多个地址。
地址空间
RFC 2373中包含了一个IPv6地址空间“图”,其中显示了地址空间是如何进行分配的,地址分配的不同类型,前缀(地址分配中前面的位值)和作为整个地址空间的一部分的地址分配的长度。
在IPv6地址分配中需要注意几点。首先,在RFC 1884中,地址空间的四分之一被用于两类不同地址:八分之一是基于供应商的单播地址,而另八分之一是基于地理位置的单播地址。人们希望地址的分配可以根据网络服务供应商或者用户所在网络的物理位置进行。基于供应商的集聚,正如它最初的名字一样,要求网络从提供Internet接入的供应商那里得到可集聚的IP地址。但是,这种方法对于具有距离较远的分支机构的大型机构来说并不是一种完美的解决办法,因为其中许多分支机构可能会使用不同的供应商。基于供应商的集聚将为这些大单位带来更多的IP地址管理问题。
Steve Deering提议把基于地理位置的地址分配方法作为SIP( SIPP的前身,在第4章中有介绍)中的一种办法。这些地址与基于供应商的地址不同,以一种非常类似IPv4的方法分配地址。这些地址与地理位置有关,且供应商将不得不保留额外的路由器来支持IPv6地址空间中可集聚部分外的这些网络。
ISP实际上并不赞同这个解决方案,因为管理基于地理位置的寻址将大大增加复杂性(和花费)。另一方面,难以对基于供应商的地址进行配置和重配置也引起许多对基于供应商的分配方案的反对。如果没有广泛使用基于IPv4自动配置方案(如DHCP ),那么所有机构的网络将会存在巨大的管理问题。尽管IPv6对于自动配置功能有着更好的支持,但并没有将地理位置的分配方法最终融合进去。
以上是关于C语言编程对IPV6地址进行压缩算法用函数实现的主要内容,如果未能解决你的问题,请参考以下文章