HttpDns iOS:IPv6相关问题与解答

  • 问题:SDK是否支持IPv6访问,SDK文档上所描述的IPv6环境具体指什么 ?

  • 回复:SDK 支持IPv6是指Apple的 IPv6-Only审核测试环境,兼容苹果审核时所使用的IPv6-Only环境,并能够通过审核,并非真实的IPv6环境,关于IPv6-Only相关的资料可以参考: https://developer.apple.com/support/ipv6/

  • 问题:IPv6-Only环境下,在使用HttpDns的业务侧需要做什么适配动作吗?

  • 回复: 分两种情况。1.如果业务侧是单栈模式(IPv4),则端上在使用HttpDns时不用做额外的适配。SDK当在IPv6-Only环境下,会自动把对应的IPv4地址合成IPv6的地址返回。2.如果业务侧是双栈模式(IPv4 + IPv6),并且想要自己根据当前网络环境来决策使用对应的IP,则需要主动开启enableIPv6开关,此时SDK不会自动把IPv4合成IPv6 ,需要业务侧自己判断网络环境来选择获取对应的IP。

注意:IP直连时URL在IPv4 和 IPv6地址的不同拼接方式

IPv4:http://192.168.0.1:8080/xxx这种形式,

IPv6:http://[64:ff9b::192.168.0.1]:8080/xxxxx ,SDK 提供了自动Format的方法getIpByHostAsyncInURLFormat

参考:https://developer.apple.com/library/archive/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html

  • 问题:如何判断IPv6-Only环境

  • 回复:通过本地的DNS地址类型来判断,如果地址都为IPv6地址,则当前环境为IPv6-Only环境

  • 问题:SDK 是如何把IPv4地址合成IPv6?

  • 回复:根据官方文档说明当>=iOS 9.2 时,可以使用getaddrinfo来合成IPv6地址。当版本小于iOS 9.2 则使用本地支持的Prefix进行转换,细节可以参考下列文档。rfc7050

注意:根据规范, Well-Known Prefix (64:ff9b::/96) 是NAT64必须要支持的,但是苹果的文档也说明了情况并不是这样,所以要根据本地实际Prefix来进行转换。

参考:

https://developer.apple.com/support/ipv6/

https://datatracker.ietf.org/doc/html/rfc6052

https://datatracker.ietf.org/doc/html/rfc7050

  • 问题:下面这个方法会不会自动区分IPV4和IPV6的地址返回?

    - (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
  • 回复:不会不一样的,getIpByHostAsyncInURLFormat是适配IPv6-only 网络环境,将IPv4地址转换为映射的IPv6 mapped的地址。

    - (NSString *)getIPv6ByHostAsync:(NSString *)host;

    getIPv6ByHostAsync 这个是返回域名本身的IPv6地址,跟设备所处的网络环境没有关系。



  • 问题:下面这个不设置会影响审核吗 ?也就是说不用设置enableIPv6 ?

    - (void)enableIPv6:(BOOL)enable;
  • 回复:不设置也支持苹果审核 。这个开关是主动使用我们提供的IPv6功能,是需要你们自己有IPv6的IP并且需要在控制台设置的 。这个由你们业务来确定。


  • 问题 :HTTPDNS SDK内部有对系统当前网络 IPv4/IPv6双栈配置做检测吗 ?如果系统当前网络栈在IPv4-Only的环境中,请求IPv6 IPs相关接口仍然会返回解析结果吗 ?反过来,如果系统当前网络栈在IPv6-Only的环境中,请求IPv4 IPs相关接口仍然会返回解析结果吗?结果会做DNS64合成吗?

  • 回复 :

 - (void)enableIPv6:(BOOL)enable;
 @param enable 是否开启 ,默认为 NO , 开启 IPv6 结果解析,
 开启后调用 getIPv6ByHostAsync: 接口使用 .

 - (NSString *)getIPv6ByHostAsync:(NSString *)host;
@param host 解析域名  @return IPv6解析结果,若没有IPv6地址,则返回 nil
 异步解析域名,返回 IPv6 地址  开启 IPv6 结果解析后,若域名存在 IPv6 地址,则返回 IPv6 解析结果 .

例:域名:ipv6.sjtu.edu.cn,
IPv4地址:202.120.XX.XX,
IPv6地址:2001:da8:8000:1:0:0:0:80,
解析成功后接口返回结果:2001:da8:8000:1:0:0:0:80

【注意】开启 IPv6 结果解析后,SDK 在 IPv6-Only 网络环境下,
             对 IPv4 解析结果不再自动转换为 IPv6 地址, 
             getIpsByHostAsync: 返回 IPv4 地址,getIPv6ByHostAsync: 返回 IPv6 地址 .