文档详情可查看网页:
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfor
theIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1
随着IPv4地址池耗尽在即,企业和移动运营商正越来越多地部署IPv6 DNS64和NAT64网络。一个DNS64 / NAT64网络是继续提供通过翻译访问IPv4的内容仅IPv6网络。根据您的应用程序的性质,过渡有不同的含义:
如果您使用高层次的网络API,如编写客户端应用程序NSURLSession
和CFNetwork的框架和你的名字连接,你不需要改变任何东西为你的应用程序来使用IPv6地址的工作。如果你不上名字的连接,你可能应该。见避免解析DNS名称连接到主机之前,学习如何。有关CFNetwork的信息,请参见CFNetwork的框架参考。
如果你正在写一个服务器端的应用程序或其他低级别的网络应用程序,你需要确保你的套接字代码工作正常IPv4和IPv6地址。参见RFC4038:IPv6过渡中的应用方面。
主要的网络服务提供商,包括在美国各大移动运营商,正在积极推进和部署IPv6。这是由于多种因素。
注: 全球IPv6启动是在全球范围内部署跟踪活动的组织。要查看最近的趋势,请访问全球IPv6启动的网站。
几十年来,世界已经知道IPv4地址将最终被耗尽。技术,如无类别域间路由(CIDR)和网络地址转换(NAT)帮助拖延不可避免的。然而,在2011年1月31日,互联网编号分配机构(IANA)IPv4地址的顶层游泳池正式用尽。互联网号码美国注册机构(ARIN)预计将在今年夏天用完IPv4地址的2015年,一个倒计时,请点击这里。
除了求解IPv4的枯竭问题,IPv6是比IPv4更有效。例如,IPv6的:
避免了网络地址转换的需要(NAT)的
提供更快的使用简化的报头通过网络路由
防止网络碎片
避免了广播邻居地址解析
第四代移动通信技术(4G)是基于分组仅进行切换。由于IPv4地址的供应量有限,对IPv6的支持,以便需要4G部署可扩展性。
IP多媒体核心网络子系统(IMS)允许的服务,例如多媒体短信和LTE语音(VoLTE的)通过IP交付。一些服务提供商使用的IMS是只兼容IPv6。
服务供应商继续支持原有IPv4网络,而行业的不断迁移到IPv6支付额外运营成本和管理成本。
为了帮助延缓IPv4地址的枯竭,NAT在很多IPv4网络中实现。虽然这种解决方案暂时的工作,它证明了昂贵和脆弱。如今,随着越来越多的客户正在使用IPv6,供应商必须现在同时支持IPv4和IPv6。这是一个代价高昂的努力。
提供独立的IPv4和IPv6连接蜂窝网络理想情况下,供应商欲滴的IPv4网络的支持。但是,这样做可以防止客户端访问的IPv4服务器,这代表了因特网的显著一部分。为了解决这个问题,最重要的网络供应商正在实施DNS64 / NAT64过渡工作流程。这是继续提供通过翻译访问IPv4的内容仅IPv6网络。
的部署与DNS64和NAT64 IPv6网络的蜂窝网络在这种类型的工作流程中,客户端发送DNS查询到DNS64服务器,其从DNS服务器请求IPv6地址。当IPv6地址被发现,它的立即传递回客户端。然而,未找到地址时,所述DNS64服务器请求IPv4地址代替。所述DNS64服务器随后合成由前缀IPv4地址的IPv6地址,并传递回客户端。在这点上,客户端总是接收的IPv6就绪地址。参见图10-3。
DNS64 IPv4到IPv6的转换过程当客户端发送到服务器的请求时,发往合成地址的任何IPv6数据包自动由网络通过一个NAT64网关路由。网关进行IPv6到IPv4地址和协议转换的请求。它也执行IPv4到IPv6转换来自服务器的响应。参见图10-4。
一个DNS64的工作流程/ NAT64过渡方案使用IPv6 DNS64 / NAT64网络兼容性将是一个应用程序商店提交要求,因此有必要,应用程式将确保兼容性。好消息是,多数应用都已经支持IPv6兼容。对于这些应用程序,它仍然是重要的定期测试您的应用程序来监视回归。应用程序是不支持IPv6兼容的DNS64 / NAT64网络操作时可能会遇到的问题。幸运的是,它通常是相当简单的解决这些问题,在整个本章讨论。
有几种情况可以阻止应用程序从支持IPv6。以下各节描述了如何解决这些问题。
嵌入在协议IP地址文字。许多通信协议,如会话发起协议(SIP),文件传输协议(FTP)的WebSockets和对等网络协议(P2PP),包括在协议报文的IP地址文字。例如,FTP
参数命令数据端口
和被动
,包括IP地址,文字信息交流。同样,IP地址的文字可能会出现在SIP头字段的值,如要
,从
,联系方式
,记录-路由
和通过
。请参阅使用高级网络框架和不使用IP地址使用文字。
嵌入在配置文件中的IP地址文字。配置文件通常包含IP地址的文字。见不使用IP地址使用文字。
网络预检。许多应用程序试图主动检查Internet连接,或者通过IP地址常量来网络可达性的API活跃的Wi-Fi连接。见连接而无需预检。
使用低级别的网络API。有些应用与插座等原始的网络API,如直接合作的gethostbyname
,gethostbyname2
和INET_ATON
。这些API很容易误用或他们只支持IPv4,例如,主机名解析为AF_INET
地址族,而不是AF_UNSPEC
地址族。请参阅使用高级网络框架。
用小地址族的储存容器。有些应用程序和网络库使用的地址存储容器,如uint32_t的
,in_addr等
,并有sockaddr_in
-即都是32位或更小。请参阅使用大小合适的贮存容器。
坚持以下原则,以确保您的应用程序的IPv6 DNS64 / NAT64的兼容性。
需要联网的应用程序可以在高级别联网框架或低级别的POSIX插座的API来构建。在大多数情况下,在高级别框架是足够的。他们有能力,易于使用,并且不容易比低级别的API常见的陷阱。
网络架构和API层WebKit的。这个框架提供了一组类,用于显示在窗口的网页内容,并实现了浏览器的功能,如以下链接,管理后台转发列表和管理的页面的历史记录最近访问过的。WebKit的简化加载网页,也就是说,异步请求从HTTP服务器的网页内容,其中反应可能逐步到来,以随机顺序,或部分由于网络错误的复杂过程。欲了解更多信息,请参阅的WebKit框架参考。
可可网址加载系统,该系统是不提供明确的IP地址发送和接收网络上的数据最简单的方法。数据的发送和使用几类,如中的一个接收NSURLSession
,的NSURLRequest
和NSURLConnection的
-即与工作NSURL
对象。NSURL
对象可以让你的应用程序处理URL和它们引用的资源。创建NSURL
通过调用对象:initWithString
方法,并传递一个URL说明。调用checkResourceIsReachableAndReturnError:
该方法NSURL
类来检查主机是否可达。欲了解更多信息,请参阅网址会话编程指南。
CFNetwork的。该核心服务框架提供抽象的网络协议,这使得它易于进行各种网络任务,如与BSD套接字工作,解析DNS主机,并用HTTP / HTTPS工作的文库。要定位没有明确的IP地址的主机,调用CFHostCreateWithName
方法。要打开对TCP套接字的主机,调用CFStreamCreatePairWithSocketToCFHost
方法。欲了解更多信息,请参见CFNetwork的概念在CFNetwork的编程指南。
如果您确实需要低级别的Socket API的应用,遵循准则RFC4038:IPv6过渡中的应用方面。
注意: 开始使用网络,互联网和Web和网络概述提供网络架构和API的详细信息。
确保你不及格的IPv4地址文字的点符号的API,如的getaddrinfo
和SCNetworkReachabilityCreateWithName
。相反,使用高层次的网络架构和API的地址无关的版本,如的getaddrinfo
和则getnameinfo
,并通过他们的主机名或完全限定域名(FQDN)。见的getaddrinfo(3)的Mac OS X开发工具手册
和则getnameinfo(3)的Mac OS X开发工具手册
。
注: 在iOS中9和OS X 10.11及更高版本,NSURLSession
和CFNetwork会
自动合成的IPv6与IPv4文字当地上DNS64 / NAT64网络运营设备地址。不过,你还是应该努力摆脱你的IP地址文字的代码。
可达性的API(见SCNetworkReachability参考)拟用于诊断目的后,确定连接问题。许多应用程序不正确地使用这些API主动检查通过调用Internet连接SCNetworkReachabilityCreateWithAddress
方法,并传递给它的IPv4地址0.0.0.0
,这表明还有就是网络上的路由器。然而,路由器的存在并不能保证一个因特网连接是否存在。一般情况下,避免预检网络可达性。刚刚尝试做一个连接,并从容地处理故障。如果你必须检查网络的可用性,避免调用SCNetworkReachabilityCreateWithAddress
方法。调用SCNetworkReachabilityCreateWithName
方法,并传递给它一个主机名代替。
有些应用程序还通过SCNetworkReachabilityCreateWithAddress
方法的IPv4地址169.254.0.0
,自分配的链路本地地址,检查一个活动的Wi-Fi连接。要检查Wi-Fi或蜂窝连接,查找网络可达性标志kSCNetworkReachabilityFlagsIsWWAN
代替。
使用地址存储容器,例如sockaddr_storage
,是大到足以存储IPv6地址。
检查并消除特定的IPv4的API,如:
inet_addr()
INET_ATON()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
INET_NTOA()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
如果你的代码处理的IPv4类型,确保IPv6的形式被处理过。
IPv4的 |
IPv6的 |
---|---|
|
|
|
|
|
|
|
|
|
|
如果您的应用程序需要连接到仅支持IPv4的服务器没有DNS主机名,使用的getaddrinfo
来解决IPv4地址文字。如果当前网络接口不支持IPv4,但支持IPv6,NAT64和DNS64,执行此任务将会导致合成IPv6地址。
清单10-1显示了如何解析IPv4使用文字的getaddrinfo
。假定已存储在存储器中的IPv4地址为四个字节(如{192,0,2,1}
),本实施例中代码将其转换成字符串(如“192.0.2.1”
),使用的getaddrinfo
合成的IPv6地址(如结构体sockaddr_in6
包含IPv6地址“64:ff9b :: 192.0.2.1”
),并尝试连接到IPv6地址。
的getaddrinfo
以解析IPv4地址立即
的#include |
的#include |
的#include <阿尔帕/ inet.h> |
的#include |
|
uint8_t有IPv4的[4] = {192,0,2,1}; |
结构addrinfo中的提示,*资源* RES0; |
INT错误,S; |
为const char *的原因= NULL; |
|
烧焦ipv4_str_buf [INET_ADDRSTRLEN] = {0}; |
为const char * ipv4_str = inet_ntop(AF_INET,与IPv4中,ipv4_str_buf,sizeof的(ipv4_str_buf)); |
|
memset的(提示,0,sizeof的(提示)); |
hints.ai_family = PF_UNSPEC; |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_flags = AI_DEFAULT; |
错误=的getaddrinfo(ipv4_str,“HTTP”,与暗示,与RES0); |
如果(错误){ |
errx(1,“%S”,gai_strerror(错误)); |
/*还没到*/ |
} |
S = -1; |
对于(RES = RES0;资源;解析度=水库 - > ai_next){ |
S =插座(水库 - > ai_family,水库 - > ai_socktype, |
水库 - > ai_protocol); |
如果(S <0){ |
导致=“插座”; |
继续; |
} |
|
如果(连接(S,水库 - > ai_addr,水库 - > ai_addrlen)<0){ |
导致=“连接”; |
接近(S); |
S = -1; |
继续; |
} |
|
打破; / *好了,我们得到了一个* / |
} |
如果(S <0){ |
ERR(1,“%S”,原因); |
/*还没到*/ |
} |
freeaddrinfo(RES0); |
注: 加入合成IPv6地址的能力的getaddrinfo
在9.2的iOS和OS X 10.11.2。然而,利用它不会破坏与旧系统版本的兼容性。见的getaddrinfo(3)的Mac OS X开发工具手册
。
最简单的方法来测试你的应用的IPv6 DNS64 / NAT64兼容性是网络大多数蜂窝运营商的类型部署,是设立一个本地IPv6 DNS64 / NAT64网络与你的Mac。然后,您可以从您的用于测试目的的其他设备连接到该网络。参见图10-6。
重要提示: IPv6的DNS64 / NAT64网络设置选项在OS X 10.11及更高版本可用。此外,基于Mac的IPv6 DNS64 / NAT64网络是与已经执行了支持客户端设备兼容RFC6106:DNS的配置IPv6路由器广告选项。如果您的测试设备不是iOS或OS X设备,请确保它支持这一RFC。需要注意的是,不同于服务提供商部署DNS64 / NAT64工作流程,一台Mac,基于IPv6 DNS64 / NAT64总是产生合成的IPv6地址。因此,它不提供本地网络的外部访问仅IPv6服务器。
要建立本地IPv6 Wi-Fi网络使用Mac
请确保您的Mac连接到互联网,通过Wi-Fi,但没有。
从码头,LaunchPad的,或Apple菜单中启动系统偏好设置。
按选项键,然后单击共享。不要松开Option键呢。
打开共享偏好设置在共享服务列表中选择Internet共享。
配置共享上网松开Option键。
选择创建NAT64网络复选框。
启用本 地IPv6网络的NAT64选择网络接口,提供您的Internet连接,如迅雷以太网。
选择一个网络接口共享选择了Wi-Fi复选框。
启用共享通过Wi-Fi单击Wi-Fi选项,并配置为您的网络的网络名称和安全选项。
访问Wi-Fi网络的选项 设置本地Wi-Fi网络选项选择Internet共享复选框启用本地网络。
启用Internet共享当系统提示您确认您要开始共享,单击开始。
启动Internet共享一旦共享处于活动状态,你应该看到一个绿色的状态指示灯,并且说,Internet共享标签:开。在无线网络菜单中,您还将看到一个小的,淡淡的箭头朝上,表明互联网共享已启用。你现在有一个IPv6 NAT64网络,并可以从其他设备,以测试你的应用程序连接到它。
共享上网指标重要提示: 为了确保测试发生严把本地IPv6网络上,请确保您的测试设备没有其他活动的网络接口。例如,如果您正在使用iOS设备进行测试,确保蜂窝服务被禁用,所以你只能通过Wi-Fi测试。