问题背景
最近有一位用户反馈iOS app在国内可以正常使用,但是去海外度假时,使用app时会报错,具体错误就是点击按钮时,提示"网络连接失败", 然后赶紧排查日常,发现如下错误
ini
URL = http://::ffff:47.95.183.21/{api路径}
error = Error Domain=NSURLErrorDomain Code=-1002 "不支持的URL" UserInfo={NSUnderlyingError=0x131575140 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <6FAD6B24-D657-422F-8411-EFC951A10CDF>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <6FAD6B24-D657-422F-8411-EFC951A10CDF>.<1>"
), NSLocalizedDescription=不支持的URL}
解决这个错误,还是花费了不少时间的,下面就来详细分析一下。
错误原因分析
(1) 为什么 URL http://::ffff:47.95.183.21/...
会报错?
-
IPv4 映射的 IPv6 地址格式问题
::ffff:47.95.183.21
是一个 IPv4-mapped IPv6 地址 ,表示 IPv4 地址47.95.183.21
在 IPv6 环境下的兼容格式。-
正确写法:
- IPv4 地址 →
http://47.95.183.21/...
- IPv6 地址 →
http://[2001:db8::1]/...
(IPv6 地址必须用[]
包裹)
- IPv4 地址 →
-
错误原因:
iOS 的
NSURLSession
无法直接解析::ffff:47.95.183.21
这种混合格式,导致NSURLErrorDomain Code=-1002
(不支持的 URL)。
-
(2) 那::ffff:是如何出现的呢?
查看客户端代码,发现这个IP是通过阿里HTTPDNS 返回的,但正常情况下,我们服务配置不会返回::ffff:这种格式,因为 httpDNS服务这个服务我们使用的策略是自定义解析-函数计算策略,函数计算策略是基于go的二进制可执行文件,会返回固定IP。
提工单咨询阿里:
原理是sdk版本使用太老了,我们使用的1.19,最新的已经3.x了,老版本会存在问题:客户端正在切换网络环境,比如wifi到4G/5G,或者切回来,短暂处于网络断开的状态, 这时候设备对网络环境的判断可能会不准。
问题解决方案
方案一:修复 URL 格式
如果不想升级, HTTPDNS 返回 ::ffff:47.95.183.21
,就先对带ffff的进行处理,也就是判断ip地址含有这个, 就字符串截断,在用ip请求。
方案二:升级新版本SDK(建议)
方案一可能还是存在问题,如果用户在ipv6的环境中,直接通过解析的IP请求可能还是有问题,因此阿里工程师也是建议升级SDK。
HTTPDNS 是什么?为什么需要它?
传统 DNS 的问题
- DNS 劫持 :运营商可能篡改 DNS 结果。
- 解析慢 :递归查询耗时。
- TTL 过期问题 :DNS 缓存可能导致 IP 切换延迟。
HTTPDNS 的优势
HTTPDNS 通过 HTTP 协议直接访问 DNS 服务器 (如阿里云 HTTPDNS),解决传统 DNS 的问题:
- 防劫持 :使用 HTTPS 加密请求。
- 低延迟 :智能调度最优 IP。
- 返回 IPv6/IPv4 双栈地址 :支持新一代网络协议。
典型工作流程
markdown
1. App → HTTPDNS API 请求(携带域名)
2. HTTPDNS 返回最优 IP(可能是 IPv4 或 IPv6)
3. App 直接用 IP 访问服务(跳过 Local DNS)
IPv4 vs IPv6 关键知识点
特性 | IPv4 | IPv6 |
---|---|---|
地址格式 | 192.168.1.1 |
2001:0db8:85a3::8a2e:0370:7334 |
地址空间 | 约 42 亿个 | 3.4×10³⁸ 个(近乎无限) |
NAT 需求 | 必需(地址不足) | 不需要(全局唯一地址) |
报文头 | 20 字节(可变) | 40 字节(固定) |
安全性 | 依赖 IPSec(可选) | 原生集成 IPSec |
移动设备支持 | 广泛支持 | iOS/Android 5+ 默认启用 |
最后
IPv6 是未来,但过渡期需保证兼容性。通过 HTTPDNS 优化 和 双栈部署 ,可显著提升网络可靠性和用户体验。