摘 要
互联网已经成为现代社会信息基础设施的重要组成部分,在国民经济发展和社会进步中起着举足轻重的作用,同时也成为当今高科技发展的重要支撑环境,互联网的巨大成功有目共睹。现在被全球广泛使用的互联网协议IPv4是“互联网协议第四版”,已经有30年的历史。从技术上看,尽管IPv4在过去的应用具有辉煌的业绩,但是现在看来已经露出很多弊端。现有的IPv4已经远远不能满足网络市场对地址空间、端到端的IP连接、服务质量、网络安全和移动性能的要求。因此人们寄希望于新一代的IP协议来解决IPv4中所存在的问题。IPv6协议正是基于这一思想提出的,它是“互联网协议第六版”的缩写。在设计IPv6时不仅仅扩充了IPv4的地址空间,而且对原IPv4协议各方面都进行了重新考虑,做了大量改进。除了提出庞大的地址数量外,IPv6与IPv4相比,还有很多的工作正在进行以期得到更高的安全性、更好的可管理性,对QoS和多播技术的支持也更为良好。
关键词:IPv4 IPv6协议 互联网
正文
前言
互联网是一个由各种不同类型和规模的、独立运行和管理的计算机网络组成的世界范围的巨大计算机网络,它已经成为现代社会信息基础设施的重要组成部分,在国民经济发展和社会进步中起着举足轻重的作用,同时也成为当今高科技发展的重要支撑环境,互联网的巨大成功有目共睹。现在被全球广泛使用的互联网协议IPv4是“互联网协议第四版”,已经有30年的历史。从技术上看,尽管IPv4在过去的应用具有辉煌的业绩,但是现在看来已经露出很多弊端,例如地址匮乏等等。IPv6是"Internet Protocol Version 6"的缩写,也被称作下一代互联网协议,它是为了解决IPv4所存在的一些问题和不足而提出的,在IPv6的设计过程中除了一劳永逸地解决地址短缺问题以外,还考虑了在IPv4中解决不好的其它问题。IPv6的主要优势体现在以下几方面:扩大地址空间、提高网络的整体吞吐量、改善服务质量(QoS)、安全性有更好的保证、支持即插即用和移动性、更好实现多播功能。当然,IPv6并非十全十美、一劳永逸,不可能解决所有问题。IPv6只能在发展中不断完善,也不可能在一夜之间发生,过渡需要时间和成本,但从长远的角度来看,IPv6有利于互联网的持续和长久发展。经过一个较长的IPv4和IPv6共存的时期,IPv6最终会完全取代IPv4在互连网上占据统治地位。
第一章 IPv4协议的概况
11 互联网的起源和发展
因特网源于美国国防部的ARPANET。在上世纪60年代中期,正是冷战的高峰,美国国防部希望有一个命令和控制网络能够在核战争的条件下幸免于难,而传统的电路交换的电话网络则显得太脆弱。国防部指定其下属的高级研究计划局(ARPA)解决这个问题,此后诞生的一个新型网络便称为ARPANET。1983年,TCP/IP协议成为ARPANET上唯一的正式协议以后,ARPANET上连接的网络、机器和用户得到了快速的增长。当ARPANET与美国国家科学基金会(NSF)建成的NSFNET互联以后,其上的用户数以指数增长,并且开始与加拿大、欧洲和太平洋地区的网络连接。到了80年代中期,人们开始把互联的网络称为互联网。互联网在1994年进入商业化应用后得到了飞速的发展,1998年,因特网全球用户人数已激增到147亿。
70年代中期,ARPA为了实现异种网之间的互联与互通,开始制定TCP/IP体系结构和协议规范。时至今日,TCP/IP协议也成为最流行的网际互联协议。它不是国际标准化组织制定的,却已成为互联网协议上的标准,并由单纯的TCP/IP协议发展成为一系列以IP为基础的TCP/IP协议簇。TCP/IP协议簇为互联网提供了基本的通信机制。随着互联网的指数增长,其体系结构也由ARPANET基于集中控制模型的网络体系结构演变为由ISP运营的分散的基于自治系统(Autonomous systems,AS)模型的体系结构。互联网目前几乎覆盖了全球的每一个角落,其飞速发展充分说明了TCP/IP协议取得了巨大的成功。
12 IPv4工作原理
TCP/IP协议是用于计算机通信的一组协议,我们通常称它为TCP/IP协议族。之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。
TCP/IP协议栈(按TCP/IP参考模型划分)
IPv4,是互联网协议IP的第四版,也是第一个被广泛使用,构成现今互联网技术的基石的协议,它包含寻址信息和控制信息 ,可使数据包在网络中路由(把信息从源穿过网络传递到目的地的行为,在路上,至少遇到一个中间节点)。IP协议是TCP/IP协议族中的主要网络层协议,与TCP 协议结合组成整个因特网协议的核心协议。IP协议同样都适用于LAN(局域网)和WAN(广域网)通信。
IP 协议有两个基本任务:提供无连接的和最有效的数据包传送;提供数据包的分割及重组以支持不同最大传输单元大小的数据连接。对于互联网络中 IP 数据报的路由选择处理,有一套完善的 IP 寻址方式。每一个 IP 地址都有其特定的组成但同时遵循基本格式。IP 地址可以进行细分并可用于建立子网地址。TCP/IP 网络中的每台计算机都被分配了一个唯一的 32 位逻辑地址,这个地址分为两个主要部分:网络号和主机号。网络号用以确认网络,如果该网络是因特网的一部分,其网络号必须由InterNIC统一分配。一个网络服务器供应商(ISP)可以从 InterNIC 那里获得一块网络地址,按照需要自己分配地址空间。主机号确认网络中的主机,它由本地网络管理员分配。
当你发送或接受数据时(例如,一封电子信函或网页),消息分成若干个块,也就是我们所说的“包”。每个包既包含发送者的网络地址又包含接受者的地址。由于消息被划分为大量的包,若需要,每个包都可以通过不同的网络路径发送出去。包到达时的顺序不一定和发送顺序相同, IP 协议只用于发送包,而 TCP 协议负责将其按正确顺序排列。
以采用TCP/IP协议传送文件为例,说明TCP/IP的工作原理,其中应用层传输文件采用文件传输协议(FTP)。
TCP/IP协议的工作流程如下:
1在源主机上,应用层将一串应用数据流传送给传输层。
2传输层将应用层的数据流截成分组,并加上TCP报头形成TCP段,送交网络层。
3在网络层给TCP段加上包括源、目的主机IP地址的IP报头,生成一个IP数据包,并将IP数据包送交链路层。
4链路层在其MAC帧的数据部分装上IP数据包,再加上源、目的主机的MAC地址和帧头,并根据其目的MAC地址,将MAC帧发往目的主机或IP路由器。
5在目的主机,链路层将MAC帧的帧头去掉,并将IP数据包送交网络层。
6网络层检查IP报头,如果报头中校验和与计算结果不一致,则丢弃该IP数据包;若校验和与计算结果一致,则去掉IP报头,将TCP段送交传输层。
7传输层检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据。若正确,则向源主机发确认信息;若不正确或丢包,则向源主机要求重发信息。
8在目的主机,传输层去掉TCP报头,将排好顺序的分组组成应用数据流送给应用程序。这样目的主机接收到的来自源主机的字节流,就像是直接接收来自源主机的字节流一样。
1983年TCP/IP协议被ARPAnet采用,直至发展到后来的互联网。那时只有几百台计算机互相联网。到1989年联网计算机数量突破10万台,并且同年出现了15Mbits的骨干网。
13 IPv4的现状
131 IP地址的分布现状
由于IPv4地址的分配采用的是“先到先得,按需要分配”的原则,互联网在全球各个国家和各个国家内的各个区域的发展又是极不均衡的,这就势必造成大量IP地址资源集中分布在某些发达国家和各个国家的某些发达地区的情况。全球可提供的IPv4地址大约有40多亿个,估计在不久的将来被分配完毕。
132 IP地址的应用现状
由于IP地址分布的极不均衡,使得真正应用中就出现了部分国家和某些国家部分区域的不够用的现状,这也就出现了IP地址资源跨区域交易的现象。
尽管如此,但目前全球各国几乎全部使用的还是IPv4地址,几乎每个网络及其连接的设备都支持的是IPv4。现行的IPv4自1981年RFC 791标准发布以来并没有多大的改变。事实证明,IPv4具有相当强盛的生命力,易于实现且互 *** 作性良好,经受住了从早期小规模互联网络扩展到如今全球范围Internet应用的考验。所有这一切都应归功于IPv4最初的优良设计。
14 IPv4现存的问题
随着Internet的发展尤其是规模爆炸式的增长,IPv4固有的一些缺陷也逐渐暴露出来,主要集中于以下三个方面:�
141 地址枯竭
IPv4使用32位长的地址,地址空间超过40亿。但由于地址类别的划分不尽合理,目前地址分配效率系数H(=log地址数 /位数)约为0.22~0.26,即只有不到5%的地址得到利用,已分配的地址尤其是A类地址大量闲置,但可用来分配的地址所剩无几,据估计在2005~2010年IPv4地址将出现枯竭。另外,目前占有互联网地址的主要设备早已由20年前的大型机变为PC机,并且在将来,越来越多的其他设备也会连接到互联网上,包括PDA、汽车、手机、各种家用电器等。特别是手机,为了向第三代移动通信标准靠拢,几乎所有的手机厂商都在向国际因特网地址管理机构ICANN申请,要给他们生产的每一部手机都分配一个IP地址。而竞争激烈的家电企业也要给每一台带有联网功能的电视、空调、微波炉等设置一个IP地址。IPv4显然已经无法满足这些要求。
142 路由瓶颈
Internet规模的增长也导致路由器的路由表迅速膨胀,路由效率特别是骨干网络路由效率急剧下降。IPv4的地址归用户所有,这使得移动IP路由复杂,难以适应当今移动业务发展的需要。在IPv4地址枯竭之前,路由问题已经成为制约Internet效率和发展的瓶颈。
143 安全和服务质量难以保障
电子商务、电子政务的基础是网络的安全性和可靠性,语音视频等新业务的开展对服务质量(QoS)提出了更高的要求。而IPv4本身缺乏安全和服务质量的保障机制,很多黑客攻击手段(如DDoS)正是利用了IPv4的缺陷。
尽管NAT(英文全称是“Network Address Translation”,中文意思是“网络地址转换”)、CIDR(英文全称“Classless InterDomain Routing”,中文译名“ 无类别域际路由选择”)等技术能够在一定程度上缓解IPv4的危机,但都只是权宜之计,同时还会带来费用、服务质量、安全等方面的新问题。因此,新一代网络层协议IPv6就是要从根本上解决IPv4的危机。
第二章 IPv6协议
21 IPv6产生的背景
随着互联网发展的速度和规模,远远出乎于二十多年前互联网的先驱们制定TCP/IP协议时的意料之外,他们从未想过互联网会发展到如此的规模,并且仍在飞速增长。随着互联网的普及,网络同人们的生活和工作已经密切相关。同时伴随互联网用户数膨胀所出现的地址不足的问题也越来越严重。
为了缓解地址危机的发生,相应地产生了两种新的技术无类型网络区域路由技术CIDR和网络地址翻译技术NAT。
无类别域间路由(CIDR)是开发用于帮助减缓IP地址和路由表增大问题的一项技术。CIDR的基本思想是取消IP地址的分类结构,将多个地址块聚合在一起生成一个更大的网络,以包含更多的主机。CIDR支持路由聚合,能够将路由表中的许多路由条目合并为成更少的数目,因此可以限制路由器中路由表的增大,减少路由通告。同时,CIDR有助于IPv4地址的充分利用。
NAT的主要作用是节约了地址空间,减少了对合法地址的需求,多个内部节点共享一个外部地址,使用端口进行区分(Network Address Port Translation,NAPT),这样就能更有效的节约合法地址。由于目前要想得到一个A类或B类地址十分困难,因此许多企业纷纷采用了NAT 。NAT使企业不必再为无法得到足够的合法IP地址而发愁了。然而,NAT也有其无法克服的弊端。首先,NAT会使网络吞吐量降低,由此影响网络的性能。其次,NAT必须对所有IP包进行地址转换,但是大多数NAT无法将转换后的地址信息传递给IP包负载,这个缺陷将导致某些必须将地址信息嵌在IP包负载中的高层应用如FTP和WINS注册等的失败。
NAT示意图
22 下一代网络协议IPng的目标和提案
221 IPng的设计目标
为了解决这些问题,早在90年代初期,互联网工程任务组IETF(Internet Engineering Task Force)就开始着手下一代互联网协议IPng的制定工作。IETF在RFC1550里进行了征求新的IP协议的呼吁,并公布了新的协议需实现的主要目标:
1支持几乎无限大的地址空间
2减小路由表的大小
3简化协议,使路由器能更快地处理数据包
4提供更好的安全性,实现IP级的安全
5支持多种服务类型,尤其是实时业务
6支持多目传送,即支持组播
7允许主机不更改地址实现异地漫游
8支持未来协议的演变
9允许新旧协议共存一段时间
10支持未来协议的演变以适应底层网络环境或上层应用环境的变化
11支持自动地址配置
12协议必须能扩展,它必须能通过扩展来满足将来因特网的服务需求;扩展必须是不需要网络软件升级就可实现的
13协议必须支持可移动主机和网络
222 下一代互联网协议IPng的提案
1TUBA:含有更多地址的TCP和UDP,采用ISO/OSI的CLNP协议来代替IPv4,这种解决方案允许用户有20字节的NSAP地址,以及一个可以使用的OSI传输协议的平台。
2IP in IP,IPAE:IP in IP是1992年提出的建议,计划采用两个IPv4层来解决互联网地址的匮乏:一层用于全球骨干网络,另一层用于某些特定的范围。到了1993年,这个建议得到了进一步的发展,名称也改为了IPAE(IP Address Encapsulation),并且被采纳为SIP的过渡方案。
3SIP:SIP(Simple IP)是由Steve Deering在1992年11月提出的,他的想法是把IP地址改为64位,并且去除IPv4中一些已经过时的字段。这个建议由于其简单性立刻得到了许多公司的支持
4PIP:PIP(Paul’s Internet Protocol)由Paul Francis提出,PIP是一个基于新的结构的IP。PIP支持以16位为单位的变长地址,地址间通过标识符进行区分,它允许高效的策略路由并实现了可移动性。1994年9月,PIP和SIP合并,称为SIPP。
5SIPP:SIPP(Simple IP Plus,由RFC1710描述)试图结合SIP的简单性和PIP路由的灵活性。SIPP设计为在高性能的网络上运作,比如ATM,同时也可以在低带宽的网络上运行,如无线网络。SIPP去掉了IPv4包头的一些字段,使得包头很小,并且采用64位地址。与IPv4将选项作为IP头的基本组成部分不同,SIPP中把IP选项与包头进行了隔离。该选项如果有的话,将被放在包头后的数据报中并位于传输层协议头之前。使用这种方法后,路由器只有在必要的时候才会对选项头进行处理,这样一来就提高了对于所有数据进行处理的性能。
23 IPv6协议
1994年7月,IETF决定以SIPP作为IPng地基础,同时把地址数由64位增加到128位。新的IP协议称为IPv6。其版本是在1994年由IETF批准的RFC1752,在RFC1884中介绍了IPv6的地址结构。现在RFC1884已经被RFC2373所替代。
制定IPv6的专家们充分总结了早期制定IPv4的经验以及互联网的发展和市场需求,认为下一代互联网协议应侧重于网络的容量和网络的性能。IPv6继承了IPv4的优点,摒弃了它的缺点。IPv6与IPv4是不兼容的,但它同所有其他的TCP/IP协议簇中的协议兼容。即IPv6完全可以取代IPv4。同IPv4相比较,IPv6在地址容量、安全性、网络管理、移动性以及服务质量等方面有明显的改进,是下一代互联网可采用的比较合理的协议。
24与IPv4比较,IPv6协议的主要特征
241 IPv6的地址格式和结构
IPv6采用了长度为128位的IP地址,而IPv4的IP地址仅有32位,因此IPv6的地址资源要比IPv4丰富得多。
IPv6的地址格式与IPv4不同。一个IPv6的IP地址由8个地址节组成,每节包含16个地址位,以4个十六进制数书写,节与节之间用冒号分隔,其书写格式为x:x:x:x:x:x:x:x,其中每一个x代表四位十六进制数。除了128位的地址空间,IPv6还为点对点通信设计了一种具有分级结构的地址,这种地址被称为可聚合全局单点广播地址(aggregatable global unicast address),开头3个地址位是地址类型前缀,用于区别其它地址类型,其后依次为13位TLA ID、32位 NLA ID、16位SLA ID和64位主机接口ID,分别用于标识分级结构中自顶向底排列的TLA(Top Level Aggregator,顶级聚合体)、NLA(Next Level Aggregator,下级聚合体)、SLA(Site Level Aggregator,位置级聚合体)和主机接口。TLA是与长途服务供应商和电话公司相互连接的公共网络接入点,它从国际Internet注册机构(如IANA)处获得地址。NLA通常是大型ISP,它从TLA处申请获得地址,并为SLA分配地址。SLA也可称为订阅者(subscriber),它可以是一个机构或一个小型 ISP。SLA负责为属于它的订阅者分配地址。SLA通常为其订阅者分配由连续地址组成的地址块,以便这些机构可以建立自己的地址分级结构以识别不同的子网。分级结构的最底层是网络主机。
242 IPv6中的地址配置
当主机IP地址需要经常改动的时候,手工配置和管理静态IP地址是一件非常烦琐和困难的工作。在IPv4中,DHCP协议可以实现主机IP地址的自动设置。其工作过程大致如下:一个DHCP服务器拥有一个IP地址池,主机从DHCP服务器申请IP地址并获得有关的配置信息(如缺省网关、DNS服务器等),由此达到自动设置主机IP地址的目的。IPv6继承了IPv4的这种自动配置服务,并将其称为全状态自动配置(stateful autoconfiguration)。除了全状态自动配置,IPv6还采用了一种被称为无状态自动配置(stateless autoconfiguration)的自动配置服务。在无状态自动配置过程中,主机首先通过将它的网卡MAC地址附加在链接本地地址前缀1111111010之后,产生一个链接本地单点广播地址(IEEE已经将网卡MAC地址由48位改为了64位。如果主机采用的网卡的MAC地址依然是48位,那么IPv6网卡驱动程序会根据IEEE的一个公式将48位MAC地址转换为64位MAC地址)。接着主机向该地址发出一个被称为邻居探测(neighbor discovrey)的请求,以验证地址的唯一性。如果请求没有得到响应,则表明主机自我设置的链接本地单点广播地址是唯一的。否则,主机将使用一个随机产生的接口ID组成一个新的链接本地单点广播地址。然后,以该地址为源地址,主机向本地链接中所有路由器多点广播一个被称为路由器请求(router solicitation)的数据包,路由器以一个包含一个可聚合全局单点广播地址前缀和其它相关配置信息的路由器公告来响应该请求。主机用它从路由器得到的全局地址前缀加上自己的接口ID,自动配置全局地址,然后就可以与Internet中的其它主机通信了。用无状态自动配置,无需手动干预就能够改变网络中所有主机的IP地址。
243 IPv6中的安全协议
安全问题始终是Internet与生俱来。由于在 IP协议设计之初没有考虑安全性,因而在早期的Internet上时常发生诸如企业或机构网络遭到攻击、机密数据被窃取等不幸的事情。为了加强Internet的安全性,从1995年开始,IETF着手研究制定了一套用于保护IP通信的IP安全(IPSec)协议。IPSec是IPv4的一个可选扩展协议,是IPv6的一个必须组成部分。
IPv6协议内置安全机制,并已经标准化。IPSec的主要功能是在网络层对数据分组提供加密和鉴别等安全服务,它提供了两种安全机制:认证和加密。认证机制使 IP通信的数据接收方能够确认数据发送方的真实身份以及数据在传输过程中是否遭到改动。加密机制通过对数据进行编码来保证数据的机密性,以防数据在传输过程中被他人截获而失密。IPSec的认证报头(Authentication Header,AH)协议定义了认证的应用方法,安全负载封装(Encapsulating Security Payload,ESP)协议定义了加密和可选认证的应用方法。在实际进行IP通信时,可以根据安全需求同时使用这两种协议或选择使用其中的一种。AH和ESP都可以提供认证服务,不过,AH提供的认证服务要强于ESP。
做为IPv6的一个组成部分,IPSec是一个网络层协议。它从底层开始实施安全策略,避免了数据传输(直至应用层)中的安全问题。但它只负责其下层的网络安全,并不负责其上层应用的安全,如Web、电子邮件和文件传输等。
作为IPSec的一项重要应用,IPv6集成了虚拟专用网()的功能,使用IPv6可以更容易地、实现更为安全可靠的虚拟专用网。
244 IPv6的功能变化
IPv6技术在IP报头中删除了一些不必要的IPv4功能,加强了IPv4原有的一些功能,并且还增加了许多新功能。这些新增的功能是:
1anycast功能
anycast是指向提供同一服务的所有服务器都能识别的通用地址(anycast地址)发送IP分组,路由控制系统可以将该分组送至最近的服务器。 例如,利用anycast功能用户可以访问到离他最近的DNS服务器和文件服务器等。
2即插即用功能
即插即用功能是指计算机在接入Internet时可自动获取、登录必要的参数的自动配置功能和地址检索等功能。
3QoS功能
利用IPv6头标中的4比特优先级域和24比特的流标记域为进行业务优先级控制提供了广阔的空间。随着互联网接入设备的日益复杂化和服务类型的多样化,网络基础设施为上层提供各种服务质量已经越来越得到人们的关注。
4手机上网功能
IPv6为手机上网提供了良好的协议平台和许多增值特性,将成为全球移动IP的基础域名解析
245 报头简化
IPv6对数据报头作了简化,以减少处理器开销并节省网络带宽。IPv6的报头由一个基本报头和多个扩展报头(Extension Header)构成,基本报头具有固定的长度(40字节)(当然,由于字段长短的关系,总的来说,Ipv4的基本报头长度要短的多),放置所有路由器都需要处理的信息。由于Internet上的绝大部分包都只是被路由器简单的转发,因此固定的报头长度有助于加快路由速度。IPv4的报头有15个域,而IPv6的只有8个域,IPv4的报头长度是由IHL域来指定的,而IPv6的是固定40个字节。这就使得路由器在处理IPv6报头时显得更为轻松。与此同时,IPv6还定义了多种扩展报头,这使得IPv6变得极其灵活,能提供对多种应用的强力支持,同时又为以后支持新的应用提供了可能。这些报头被放置在IPv6报头和上层报头之间,每一个可以通过独特的“下一报头”的值来确认。除了逐个路程段选项报头(它携带了在传输路径上每一个节点都必须进行处理的信息)外,扩展报头只有在它到达了在IPv6的报头中所指定的目标节点时才会得到处理(当多点播送时,则是所规定的每一个目标节点)。在那里,在IPv6的下一报头域中所使用的标准的解码方法调用相应的模块去处理第一个扩展报头(如果没有扩展报头,则处理上层报头)。每一个扩展报头的内容和语义决定了是否去处理下一个报头。因此,扩展报头必须按照它们在包中出现的次序依次处理。一个完整的IPv6的实现包括下面这些扩展报头的实现:逐个路程段选项报头,目的选项报头,路由报头,分段报头,身份认证报头,有效载荷安全封装报头,最终目的报头。
246 域名解析
在IPv6中,域名的体系结构仍然保持了Ipv4的层次原理。而且IPv6地址本身的层级体系也就更加支持了域名解析体系中的地址集聚和地址更改。同样,在IPv6的域名解析中包括了正向解析和反向解析。正向解析是从域名到IP地址的解释。IPv6地址的正向解析目前有两种资源记录,即“AAAA”和“A6”记录。其中“AAAA”较早提出,它是对IPv4协议“A"”录的简单扩展,由于IP地址由32位扩展到128位,扩大了4倍,所以资源记录由“A”扩大成4个“A”。但“AAAA”用来表示域名和IPv6地址的对应关系,并不支持地址的层次性。“A6”是在RFC2874基础上提出,它是把一个IPv6地址根据其本身的层次性分解,然后多个“A6”记录建立联系,每个“A6”记录都只包含了IPv6地址的一部分,结合后拼装成一个完整的IPv6地址。反向解析则是从IP地址到域名的解释。它与IPv4的“PTR”一样,但地址表示形式有两种。一种是用“”分隔的半字节16进制数字格式(Nibble Format),低位地址在前,高位地址在后,域后缀是“IP6INT”。另一种是二进制串(Bit-string)格式,以“\[”开头,16进制地址(无分隔符,高位在前,低位在后)居中,地址后加“]”,域后缀是“IP6ARPA”。
目前,Windows 2000、Unix、Solaris *** 作系统的一些测试版本中已经引入了IPv6,其他一些 *** 作系统的IPv6版本也正在逐步开发。另外,已经有厂商尝试应用IPv6开发新型应用软件。
IPv6是用于建立可靠的、可管理的、安全和高效的IP网络的一个长期解决方案。因此,尽管IPv6的实际应用还需要一段时间,但是了解和研究IPv6的重要特性以及它针对目前IP网络存在的问题而提供的解决方案,对于制定企业网络的长期发展计划,规划网络应用的未来发展方向,都是十分有益的。
第三章 IPv4向IPv6过渡方案
如今,Internet在全球范围内的普及应用超过了历史上的任何一项新技术所产生的影响和带来的变化,实践证明,IPv4不仅是健壮的、而且是易于实现的,并具有很好的互 *** 作性。这些都充分肯定了IPv4协议初始设计的正确性。但是随着Internet迅速发展,接入Internet的网络设备和运行在其上的应用程序急剧增加,由此带来了IP地址的迅速耗尽与路由表膨胀等问题,对IP地址范围的扩大也迫在眉睫。针对IP地址的问题,IETF提出了
参考资料:
1进入控制面板 -> 查看网络状态和任务 -> 左侧栏里的更改适配器设置
2在你要禁用 IPV6 的网络连接上点击右键,选择属性
3取消 Internet 协议版本 6 (TCP/IPv6) 前面的选择框,服务器我一般只保留 Internet 协议版本 4 (TCP/IPv4)
4开始 -> 运行 - > 输入 Regedit 进入注册表编辑器
5定位到: 1[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters]
6右键点击 Parameters,选择新建 -> DWORD (32-位)值
7命名值为 DisabledComponents,然后修改值为 ffffffff (16进制)
8重启后生效
DisableComponents 值定义:
10,启用所有 IPv 6 组件,默认设置
20xffffffff,禁用所有 IPv 6 组件, 除 IPv 6 环回接口
30x20,以前缀策略中使用 IPv 4 而不是 IPv 6
40x10,禁用本机 IPv 6 接口
50x01,禁用所有隧道 IPv 6 接口
60x11,禁用除用于 IPv 6 环回接口所有 IPv 6 接口
IPv 背景介绍
目前我们使用的是第二代互联网 IPv 技术 它的最大问题是网络地址资源有限 从理论上讲 可以编址 万个网络 亿台主机 但采用 A B C 三类编址方式后 可用的网络地址和主机地址的数目大打折扣 以至目前的 IP 地址近乎枯竭 网络地址不足 严重地制约了全球互联网的应用和发展
一方面是地址资源数量的限制 另一方面是随着电子技术及网络技术的发展 计算机网络将进入人们的日常生活 可能身边的每一样东西都需要连入全球因特网 在这种网络空间匮乏的环境下 IPv 应运而生 它的产生不但解决了网络地址资源数量的问题 同时也为除电脑外的设备连入互联网在数量限制上扫清了障碍
如果说 IPv 实现的只是人机对话 那么 IPv 则扩展到任意事物之间的对话 它不仅可以为人类服务 还将服务于众多硬件设备 如家用电器 传感器 远程照相机 汽车等 它将是无时不在 无处不在的深入社会每个角落的真正的宽带网 它所带来的经济效益也将非常巨大
当然 IPv 并非十全十美 一劳永逸 不可能解决所有问题 IPv 只能在发展中不断完善 也不可能在一夜之间发生 过渡需要时间和成本 但从长远看 IPv 有利于互联网的持续和长久发展 目前 国际互联网组织已经决定成立两个专门工作组 制定相应的国际标准
Java 对 IPv 的支持
随着 IPv 越来越受到业界的重视 Java 从 版开始支持 Linux 和 Solaris 平台上的 IPv 版起又加入了 Windows 平台上的支持 相对于 C++ Java 很好得封装了 IPv 和 IPv 的变化部分 遗留代码都可以原生支持 IPv 而不用随底层具体实现的变化而变化
那么 Java 是如何来支持 IPv 的呢 Java 网络栈会优先检查底层系统是否支持 IPv 以及采用的何种 IP 栈系统 如果是双栈系统 那它直接创建一个 IPv 套接字(如图 )
图 双栈结构
对于分隔栈系统 Java 则创建 IPv /v 两个套接字(如图 ) 如果是 TCP 客户端程序 一旦其中某个套接字连接成功 另一个套接字就会被关闭 这个套接字连接使用的 IP 协议类型也就此被固定下来 如果是 TCP 服务器端程序 因为无法预期客户端使用的 IP 协议 所以 IPv /v 两个套接字会被一直保留 对于 UDP 应用程序 无论是客户端还是服务器端程序 两个套接字都会保留来完成通信
图 分隔栈结构
如何验证 IPv 地址
IPv 地址表示
从 IPv 到 IPv 最显著的变化就是网络地址的长度 IPv 地址为 位长度 一般采用 个十六进制数 但通常写做 组每组 个十六进制的形式 例如
: db : a : d : : a e: : 是一个合法的 IPv 地址 如果四个数字都是零 则可以被省略
: db : a : : : a e: : 等同于 : db : a :: : a e: :
遵从这些规则 如果因为省略而出现了两个以上的冒号的话 可以压缩为一个 但这种零压缩在地址中只能出现一次 因此
: DB : : : : : : ab
: DB : : : :: : ab
: DB : : : : : : ab
: DB : :: : : ab
: DB :: : ab
都是合法的地址 并且他们是等价的 但 :: de::cade 是非法的 (因为这样会使得搞不清楚每个压缩中有几个全零的分组) 同时前导的零可以省略 因此 : DB : de:: e 等于 :DB : de::e
IPv 地址校验
IPv 地址可以很容易的转化为 IPv 格式 举例来说 如果 IPv 的一个地址为 (十六进制为 x B B ) 它可以被转化为 : : : : : : B: B 或者 : B: B 同时 还可以使用混合符号(IPv patible address) 则地址可以为 :
在 IPv 的环境下开发 Java 应用 或者移植已有的 IPv 环境下开发的 Java 应用到 IPv 环境中来 对于 IPv 网络地址的验证是必须的步骤 尤其是对那些提供了 UI(用户接口)的 Java 应用
所幸的是 从 Java 开始 Sun 就增加了对 IPv 网络地址校验的 Java 支持 程序员可以通过简单地调用方法 util IPAddressUtil isIPv LiteralAddress() 来验证一个 String 类型的输入是否是一个合法的 IPv 网络地址
为了更深入一步地了解 IPv 的网络地址规范 及其验证算法 笔者参阅了一些材料 包括上文所述的方法 util IPAddressUtil isIPv LiteralAddress() 的源代码 以及目前网络上流传的一些 IPv 网络地址的正则表达式 发现
由于 IPv 协议所允许的网络地址格式较多 规范较宽松(例如零压缩地址 IPv 映射地址等) 所以导致了 IPv 网络地址的格式变化很大
Java 对于 IPv 网络地址的验证是通过对输入字符的循环匹配做到的 并没有采取正则表达式的做法 其匹配过程中还依赖于其它的 Java 方法
目前网络上流传的 IPv 网络地址验证的正则表达式通常都只能涵盖部分地址格式 而且表达式冗长难读 非常不易于理解
基于通用性考虑 以及为了使验证方法尽量简单易读 笔者尝试将 IPv 网络地址的格式简单分类以后 使用多个正则表达式进行验证
这种做法兼顾了通用性(基于正则表达式 所以方便用各种不同的编程语言进行实现) 以及易读性(每个独立的正则表达式相对简短);并且根据测试 支持目前所有的 IPv 网络地址格式类型 尚未发现例外
以下是笔者用 Java 编写的对于 IPv 网络地址的验证方法 此算法可被简单地用其它编程语言仿照重写
清单 验证地址
//IPv address validator matches these IPv formats //::ffff: : | : db : a : d : : a e: : //| :: a e: : : | : db : a : d : : a e: //| : db :: a e: | :: | ffff:: //And such addresses are invalid //:: a e: : : | :idb :: : | :: a //| : :: public static boolean isIPV Format(String ip) { ip = ip trim(); //in many cases such as URLs IPv addresses are wrapped by [] if(ip substring( ) equals( [ ) && ip substring(ip length() ) equals( ] )) ip = ip substring( ip length() ); return ( < pile( : ) split(ip) length) //a valid IPv address should contains no less than //and no more than : as separators && (pile( : ) split(ip) length <= ) //the address can be pressed but :: can appear only once && (pile( :: ) split(ip) length <= ) //if a pressed address && (pile( :: ) split(ip) length == ) //if starts with :: – leading zeros are pressed (((ip substring( ) equals( :: )) Pattern matches( ^::([\\da f]{ }(:)){ }(([\\da f]{ }(:)[\\da f]{ }) |([\\da f]{ })|((\\d{ } ){ }\\d{ })) ip) : Pattern matches( ^([\\da f]{ }(:|::)){ } (([\\da f]{ }(:|::)[\\da f]{ })|([\\da f]{ }) |((\\d{ } ){ }\\d{ })) ip))) //if ends with :: ending zeros are pressed : ((ip substring(ip length() ) equals( :: )) Pattern matches( ^([\\da f]{ }(:|::)){ } ip) : Pattern matches( ^([\\da f]{ }:){ }(([\\da f]{ } :[\\da f]{ })|((\\d{ } ){ }\\d{ })) ip)); }}
如何正规化 IPv 地址
在网络程序开发中 经常使用 IP 地址来标识一个主机 例如记录终端用户的访问记录等 由于 IPv 具有有零压缩地址等多种表示形式 因此直接使用 IPv 地址作为标示符 可能会带来一些问题 为了避免这些问题 在使用 IPv 地址之前 有必要将其正规化 除了通过我们熟知的正则表达式 笔者在开发过程中发现使用一个简单的 Java API 也可以达到相同的效果
清单 正规化地址
InetAddress inetAddr = InetAddress getByName(ipAddr); ipAddr = inetAddr getHostAddress(); System out println(ipAddr);
InetAddress getByName(String) 方法接受的参数既可以是一个主机名 也可以是一个 IP 地址字符串 我们输入任一信息的合法 IPv 地址 再通过 getHostAddress() 方法取出主机 IP 时 地址字符串 ipAddr 已经被转换为完整形式 例如输入 : b:e aa:: b:e aa 上述代码执行过后 零压缩部分将被还原 ipAddr 变为 : b:e aa: : : : b:e aa
如何获取本机 IPv 地址
有时为了能够注册 listener 开发人员需要使用本机的 IPv 地址 这一地址不能简单得通过 InetAddress getLocalhost() 获得 因为这样有可能获得诸如 : : : : : : : 这样的特殊地址 使用这样的地址 其他服务器将无法把通知发送到本机上 因此必须先进行过滤 选出确实可用的地址 以下代码实现了这一功能 思路是遍历网络接口的各个地址 直至找到符合要求的地址
清单 获取本机 IP 地址
public static String getLocalIPv Address() throws IOException { InetAddress inetAddress = null; Enumeration neorkInterfaces = NeorkInterface getNeorkInterfaces(); outer: while (neorkInterfaces hasMoreElements()) { Enumeration inetAds = neorkInterfaces nextElement() getInetAddresses(); while (inetAds hasMoreElements()) { inetAddress = inetAds nextElement(); //Check if it s ipv address and reserved address if (inetAddress instanceof Inet Address && !isReservedAddr(inetAddress)) { break outer; } } } String ipAddr = inetAddress getHostAddress(); // Filter neork card No int index = ipAddr indexOf( % ); if (index > ) { ipAddr = ipAddr substring( index); } return ipAddr; } / Check if it s local address or link local address or loopbackaddress @param ip address @return result / private static boolean isReservedAddr(InetAddress inetAddr) { if (inetAddr isAnyLocalAddress() || inetAddr isLinkLocalAddress() || inetAddr isLoopbackAddress()) { return true; } return false; }
为了支持 IPv Java 中增加了两个 InetAddress 的子类 Inet Address 和 Inet Address 一般情况下这两个子类并不会被使用到 但是当我们需要分别处理不同的 IP 协议时就非常有用 在这我们根据 Inet Address 来筛选地址
isReservedAddr() 方法过滤了本机特殊 IP 地址 包括 LocalAddress LinkLocalAddress 和 LoopbackAddress 读者可根据自己的需要修改过滤标准
另一个需要注意的地方是 在 windows 平台上 取得的 IPv 地址后面可能跟了一个百分号加数字 这里的数字是本机网络适配器的编号 这个后缀并不是 IPv 标准地址的一部分 可以去除
IPv /IPv 双环境下 网络的选择和测试
我们先看一下笔者所在的 IPv /IPv 开发测试环境及其配置方法
笔者所处的 IPv /IPv 双环境是一个典型的 to 双栈网络 其中存在着一个 IPv 到 IPv 的映射机制 即任意一个 IPv 地址 : a: f a: :a:b:c:d 在路由时会被默认映射为 IPv 地址 a b c d 所以路由表只有一套
在此环境内 IPv 地址与 IPv 地址的一一对应是人工保证的 如果一台客户机使用不匹配的 IPv 和 IPv 双地址 或者同时使用 DHCPv 和 DHCPv (可能会导致 IPv 地址和 IPv 地址不匹配) 会导致 IPv 的路由寻址失败
正因为如此 为了配置双地址环境 我们一般使用 DHCPv 来自动获取 IPv 地址 然后人工配置相对应的 IPv 地址
Windows 系统
Windows 及以下 不支持 IPv
Windows 和 Windows XP 使用 Windows 自带的 netsh 命令行方式添加 IPv 地址以及 DNS 例如 C:\>netsh interface ipv add address Local Area Connection : a: f a: : : : : 和 C:\>netsh interface ipv add dns Local Area Connection : a: f a: : ::
Windows 和 Windows Vista 既可以使用 Windows 网络属性页面进行配置 也可以使用类似 Windows 和 Windows XP 的 netsh 命令行来配置
Linux 系统 (以下是 IPv 的临时配置方法 即不修改配置文件 计算机重启后配置失效)
Redhat Linux 最简单的方法是使用 ifconfig 命令行添加 IPv 地址 例如 ifconfig eth inet add : a: f a: : : : : /
SUSE Linux 同上
从实践上讲 由于 Java 的面向对象特性 以及 包对于 IP 地址的良好封装 从而使得将 Java 应用从 IPv 环境移植到 IPv /IPv 双环境 或者纯 IPv 环境变得异常简单 通常我们需要做的仅是检查代码并移除明码编写的 IPv 地址 用主机名来替代则可
除此以外 对于一些特殊的需求 Java 还提供了 InetAddress 的两个扩展类以供使用 Inet Address 和 Inet Address 其中封装了对于 IPv 和 IPv 的特殊属性和行为 然而由于 Java 的多态特性 使得程序员一般只需要使用父类 InetAddress Java 虚拟机可以根据所封装的 IP 地址类型的不同 在运行时选择正确的行为逻辑 所以在多数情况下 程序员并不需要精确控制所使用的类型及其行为 一切交给 Java 虚拟机即可
具体的新增类型及其新增方法 请具体参阅 Sun 公司的 JavaDoc
另外 在 IPv /IPv 双环境中 对于使用 Java 开发的网络应用 比较值得注意的是以下两个 IPv 相关的 Java 虚拟机系统属性
preferIPv Stack=<true|false> preferIPv Addresses=<true|false>
preferIPv Stack(默认 false)表示如果存在 IPv 和 IPv 双栈 Java 程序是否优先使用 IPv 套接字 默认值是优先使用 IPv 套接字 因为 IPv 套接字可以与对应的 IPv 或 IPv 主机进行对话;相反如果优先使用 IPv 则只不能与 IPv 主机进行通信
preferIPv Addresses(默认 false)表示在查询本地或远端 IP 地址时 如果存在 IPv 和 IPv 双地址 Java 程序是否优先返回 IPv 地址 Java 默认返回 IPv 地址主要是为了向后兼容 以支持旧有的 IPv 验证逻辑 以及旧有的仅支持 IPv 地址的服务
总结
lishixinzhi/Article/program/Java/hx/201311/26767
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)