*文/得物技术保障团队
导读:
网信中国 2022 年 1 月 28 日发布的《2021年我国IPv6发展取得明显进展 87款App的IPv6流量占比超过65%》显示,截至 2021 年 12 月底,我国国内网民使用频度较高的200款移动应用程序(App)均支持IPv6访问,其中得物App的 IPv6 浓度达到94.60%, 此次检查排名第一。我们一起来看下得物App全场景 IPv6 到底是怎么做的。公众号:网信中国2021年我国IPv6发展取得明显进展 87款APP的IPv6流量占比超过65%
以下为正文:
IPv6 相对 IPv4 可以提供海量的网络地址,同时 IPv6 在协议上预留了广阔的创新空间,为互联网长期升级演进提供了新的基础平台,已成为全球下一代
互联网发展的核心方向,也是支撑我国互联网升级演进的唯一正确路径。
对于任何一家月活上亿用户的互联网公司来说,IPv6 升级改造都是一件很复杂的事情。很多同学可能好奇 IPv6 到底要怎么改造,本文将整体介绍下『得物 App 全场景 IPv6 改造』的项目经验,供大家参考。
一、目前各大系统 IPv6 支持情况
此前,工业和信息化部组织召开部署推进 IPv6 网络专项行动会议,明确提出:各应用商店要对新上架的 App 开展 IPv6 支持度检测工作,支持度不好的 App 要加快改造。
为了快速响应 IPv6 全面升级,得物 App 决定在2021 年 Q4 末完成相关系统IPv6改造,于是盘点现有的系统对 IPv6 的支持情况,具体情况具体分析,根据实际来进行对应的改造。
iOS
早在 WWDC2015 上苹果宣布 iOS 9 将支持纯 IPv6 的网络服务,2016年初开始所有提交到 App Store 的应用必须支持IPv6 【1】,苹果系统在 iOS 12.1 版本后,已全面支持 IPv4/IPv6 双栈协议。
Android
安卓系统在 Android 8.0 版本后,已全面支持 IPv4/IPv6 双栈协议,各大安卓手机厂商也提供了相应的支持。
由于IOS系统对IPv6兼容性较好,网信办IPv6浓度检测主要针对Android App,所以 Android App 是我们改造的重点。
Web官网
目前各大公司官网的改造大部分是首页 IPv6 可达,更深层次的链接还未支持 IPv6 访问,后续网信办会加大网站 IPv6 改造深度检查。
公有云服务
在工信部的推动下,目前全国范围三大运营商、阿里云等公有云产品、主流商业 CDN 基本都已支持对公网用户提供IPv6访问服务。
二、架构梳理
网络应用架构图
要让 App 全场景支持 IPv6 ,需要先理清App现有的网络应用架构,运维侧正好借此机会梳理了完整的 App 网络应用架构图:
请求流程说明:
1. 解析层
HttpDNS是面向多端应用(移动端App,PC客户端应用)的域名解析服务,具有域名防劫持、精准调度、实时解析生效的特性。客户端控制主站、直播等核心业务使用httpdns解析;
localdns是指用户所在城市位置的运营商解析服务;
异地双活模块是客户端上基于异地机房的服务端IP做的业务高可用容灾调度策略,优点是可以做到IP直连、按需调度、秒级生效,实现业务层双活。
2. 服务端(业务接口)
大数据埋点上报,用户IP地址通过经负载均衡(X-Forwarded-For字段)透传给业务网关,实时flink任务消费上报的kafka数据后存入数仓;
图片、音视频、apk、js等静态文件由第三方CDN提供缓存服务;
主站、风控、订单等业务接口,用户访问通过https请求经过安全网关转发到业务网关,然后分发到对应的后端服务,实现用户画像、风控、投放等业务逻辑;
前端H5展示主要是首页banner的各种会场(大部分都是增长和用户平台的场景,比如天天领券、学生专区、0元抽奖之类的)。
3. 客户端/播放器
Android和IOS客户端还集成了很多第三方 SDK,如 HttpDNS SDK,大数据埋点上报 SDK、极验 SDK 等;
直播业务中使用到自研直播推流 SDK 和声网连麦 SDK,播放器 SDK 集成了一些开源库如 ffmpeg。
三、改造方案
1. 得物App IPv6改造方案图:
2. 改造要点
有了前面的应用架构图梳理,IPv6 改造就相对清晰许多了。但 IPv6 改造稍有不慎就会引发严重的生产事故,下面沉淀的经验,基本可以成为互联网行业 IPv6 改造的指导规范。
2.1 服务端/业务接口:
a. 兼容 IPv6
所有涉及使用用户 IP 地址的系统或应用均要能正确的识别、存储并兼容 IPv6 地址,涉及代码改造,数据库地址存储空间改造,风控系统和监控系统改造等;
b. 网关层
网关层(L4/L7负载均衡、业务网关等)要验证,可以通过http header(X-Forwarded-For字段)把用户IPv6地址正确地传递给下游服务;
c. 风控系统
风控策略要能正确放行 IPv6 用户访问应用系统,做到不误伤、不漏放;
d. 监控系统
监控系统支持基于用户 IPv6 地址的访问成功率、错误率、延时等关键指标监控;
e. IP转地理位置
推荐/投放等系统或应用要改造支持基于 IPv6 地址的地理位置发现服务(可以使用外部地址库)。
2.2 客户端/播放器:
a. IPv6 网络优选策略
客户端和播放器SDK支持 IPv4+IPv6 双协议栈,当用户在双栈网络下时,要优先走 IPv6 访问;
b. IPv6降级策略
客户端在使用 IPv6 建联失败情况下,增加兜底逻辑走 IPv4 网络访问,确保用户访问不受影响;
c. 上线灰度可控
客户端支持基于用户和版本灰度放量的能力,确保业务质量可控。
3. 改造上线步骤:
3.1 业务调研
确认改造范围,可以通过 charles 抓包,获取 Android App 各业务模块调用的所有域名清单;
IPv6 改造是否彻底直接关系到最终的 IPv6 浓度检测结果,所以改造范围确认必须准确到位;
调研域名对应业务线,针对有使用用户 IP 地址做业务逻辑(风控、投放、推荐、用户画像等)的应用或系统,推进兼容改造 IPv6;
确保 App 集成的 SDK 和网络库都支持 IPv6;
前端 H5 和小程序页面,如果有使用 IP 地址的逻辑,也要支持 IPv6;
涉及有和外部广告商使用用户 IP 做广告投放归因和承接的,也要有对应改造方案;
改造顺序:先改造分支业务,然后核心业务。
3.2 业务测试
IPv6 改造测试重点项目:IPv4 原有业务流程回归测试 + 内部用户体验测试 + IPv6上线回退机制验证;
3.3 App改造
客户端完成 IPv6 改造后,发布测试 App 进行灰度验证,确保 IPv6 开关是开启状态;
运行稳定后,含 IPv6 特性的正式版 App 上应用市场,按比例或省市运营商灰度 IPv6 放量;
3.4 监控
基础设施改造容易引发大故障,改造前要经过测试验证,灰度过程中需做到可实时监控、可随时回退,关注业务成功率、秒开率、延时监控以及订单变化监控等。
四、改造案例
IPv6 改造基本涉及公司所有业务线,下面就几个关键的业务改造案例进行分享,项目改造时间线如下:
1. 商业CDN
CDN 域名覆盖了社区视频、商品图片、直播等业务场景,目前主流商业 CDN 节点已全国范围支持 IPv6 访问。像视频/图片/apk 下载、JS /CSS 前端资源等静态类 CDN 业务,直接在 CDN 控制台开启 IPv6 支持。
开启 IPv6 后,需要关注 IPv6 带宽占比和访问 5xx/回源5xx 状态码变化,并通过听云等工具对全国范围三大运营商 IPv6 支持情况进行检测,确保都支持 IPv6。
最后这点需重点注意,以往网信办检测后经常有公司反映自测 IPv6 浓度在 80%+,但网信办验收结果很多地区 IPv6 浓度都是个位数甚至0。
2. 直播业务
2.1 改造方案:
2.1.1 直播推流SDK
Android
ffmpeg推流使用native rtmp,由于ffmpeg内部做了IPv4、IPv6处理,只需要重新编译ffmpeg即可。
iOS
(1)基于系统 API (getaddrinfo) ,获取IPv6是否支持的结果:
如果支持IPv6,使用IPv6进行socket连接;
如果不支持,使用IPv4 来进行socket连接;
(2)直播业务层接入使用AB策略开关控制,保证上线后出现异常可回退。
2.1.2 直播播放器SDK
Android
(1)打开 ffmpeg 中的 IPv6 使用开关,重新编译 ffmpeg 库文件;
(2)在初期改造完后,发现直播板块 IPv6 浓度非常低(5%左右),经查是播放器的 ffmeg 不支持 httpdns 和 IPv6 融合使用预解析功能;
(3)由于 Android 拉流业务层使用 HttpDNS 进行IP地址预解析,拼接生成 IP 类型 url 传给播放器,而目前 ffmpeg 暂不支持 IPv6 的 IP 类型 url,需要兼容处理;
(4)调用 HttpDNS 获取到 IPs 列表后,如果判断是否包含 IPv6 类型 IP:
如果包含 IPv6,则将原始 host 类型 url 传给播放器,使用 localdns 解析;
如果不包含 IPv6,则拼接生成IP类型 url 传给播放器 。
iOS
打开ffmpeg中的IPv6使用开关,重新编译 ffmpeg即可(ffmpeg使用的系统APIgetaddrInfo来进行IPv6 支持判断)。
2.2 改造效果:
改造后,直播板块的IPv6浓度从个位数稳定提升到90%+,极大提高了App IPv6检测整体通过的概率。
3. 大数据埋点上报
3.1 业务影响梳理:
大数据埋点是实时上报的且流量较大,由于改造后埋点上报的用户IP将会存在 IPv6 地址,所有涉及使用大数据埋点用户IP的业务,都要能够识别、存储、兼容IPv6地址,并且能够正确地实现基于用户IP地址的业务逻辑。
大数据埋点涉及的业务线较多,比如数仓、反作弊、广告投放、画像、算法、风控等等,业务影响梳理不能遗漏。
3.2 测试环境验证:
搭建测试环境,需要验证大数据埋点在android、ios、H5前端和小程序场景,分别在V4和V6网络下的上报是否正常,验证网关层可以通过header头透传用户 IPv6 地址。
3.3 改造注意点:
由于大数据埋点改造支持 IPv6 后,埋点上报的用户IP地址将有 IPv6 地址,但媒体侧可能还是传的用户 IPv4 地址,这样广告投放就会有影响,进而影响广告归因和承接。
像这种和外部公司有业务交互的场景,需要特别注意,IPv6 改造不能影响业务正常的使用。
4. 主站域名
4.1 业务影响梳理:
主站域名作为各家 App 最核心的业务,涉及面较广并且稳定性要求最高,也是 IPv6 改造项目中最容易吵架和最难推动的业务,核心api域名是每家互联网公司 IPv6 改造项目的深水区。
由于改造后将有 IPv6 网络用户访问,所以业务影响也是要求和主站有交互的所有业务,都要能够正确识别、存储、兼容 IPv6 地址,并且能够正确地实现基于用户 IP 地址的业务逻辑。
4.2 灰度验证
在灰度环境,部署支持v4+v6双栈的负载均衡和业务网关后,先将办公网IPv6 WIFI切到灰度环境,测试内部用户IPv6地址可以正常传递和验证业务回归情况,然后引流1%线上流量到灰度环境,再次做业务回归验证。
4.3 改造方案
这里有个注意点是接入层如果是4层负载均衡的话,可能会丢失 X-Forwarded-For 字段,导致后端业务无法获取客户端源IP。四层负载均衡传递源客户端信息,一般采用 Proxy Protocol 模式,业务网关开发支持 Proxy Protocol 后可以透传用户端 IP 地址。
业务回归验证成功后,再对生产环境 IPv6 切量。生产环境安全网关使用 NATv6 转 v4 技术,用户 IPv6 地址经安全网关 http header 传入下游服务,所以内部负载均衡和业务网关都是 IPv4 环境。
5. 客户端改造
客户端由于涉及双栈网络的选择逻辑,使用不当会引发用户访问异常,这也是 IPv6 改造项目的重点。
比如在 482 版本发灰度前的几天,我们就测试发现在公司纯 V4 WiFi 环境下商品图片打不开的 case,经查是在纯 IPv4 网络下通过 httpdns v6 SDK 解析依然能返回 IPv6 地址,而 IPv6 地址在纯 V4 网络下会访问异常。
得物 App Android 客户端 IPv6 改造,大致分为三方面:
(1)针对图片、视频、直播、主站等核心业务使用httpdns解析的,客户端要支持优先使用IPv6网络访问,并且有降级措施(具体见前面的改造要点说明),确保在IPv6网络不可用情况下用户还能通过IPv4网络访问。
(2)走LocalDNS解析部分,由用户所在地运营商控制,在工信部的推动下全国范围三大运营商基本都支持IPv6解析;
(3)客户端异地双活模块,由网关侧下发所有机房的服务端IP列表,客户端控制优先使用IPv6网络访问:
客户端获取IPv6和IPv4混合列表,根据ip字符长度或:号进行区分 ;
同机房优先取IPv6,否则取IPv4,机房优先级高于IP版本 ;
客户端需要支持IPv6灰度控制能力,会对服务端IP进行连通性探测;
补充:Android端 IPv6 解析兼容逻辑概图如下图所示,供大家参考。
以上就是得物App全场景改造,经过官方 IPv6 浓度检测工具以及网信办验收,最终拿到了 200 款 App 的 IPv6 全场景改造浓度排名第一的成绩。希望我们的方案能对你有一定的启发。
引用链接:
【1】https://blog.csdn.net/Michaelin1208/article/details/51660061?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242.2
*文/得物技术保障团队