开箱即用-移动网络IPv6浓度检测工具

一、背景

关于加快推进互联网协议第六版(IPv6)规模部署和应用工作的通知

到2023年末,基本建成先进自主的 IPv6 技术、产业、设施、应用和安全体系,形成市场驱动、协同互促的良性发展格局。IPv6 活跃用户数达到7亿,物联网 IPv6 连接数达到2亿。移动网络IPv6流量占比达到50% ,城域网IPv6流量占比达到15%。

名称解释

移动网络 IPv6 流量占比(浓度) =(4G 网络IPv6 流量+5G网络IPv6 流量)/(4G 网络总流量+5G 网络总流量)。

测试指标: 互联网应用(APP)IPv6 浓度指在移动终端上使用APP10 分钟内所通过 IPv6 协议承载的网络流量占全部网络流量 - 5 - 的比例,取三次测试的平均值。

IPv4地址: 使用32位正整数表示,需要4字节存储,可以提供约2^32≈4.3x10^9个地址;为了方便记忆采用了点分十进制的标记方式,如114.114.114.114就是一个IPv4地址。

IPv6地址: 采用128位正整数表示,需要16字节存储,可以提供约2^128≈3.4x10^38个地址;采用了冒号十六进制法来表示IPv6地址,它将每个16位的值用十六进制表示,各值之间用冒号分隔,如2001:0DB8:0000:0023:0008:0800:200C:417A就是一个IPv6地址

二、效果展示

这里以 App内 IPv6 浓度检测为例,提高移动网络的 IPv6 浓度,关键是找到App内请求的接口域名中还有哪些还没有支持 IPv6。

该工具的关键点是通过获取抓包数据,通过对抓包数据分析聚合,然后找到走 IPv4 的域名列表,通过该工具生成的最终产物如下:

页面 IPv6流量占比 IPv4域名列表
京喜特价 99.87% 域名:gold.jd.com,数据大小:1.52kb,占比:0.01% 域名:httpfereport.jd.com,数据大小:0.10kb,占比:0.00% 域名:fd.3.cn,数据大小:-0.00kb,占比:-0.00% 域名:mcard.jd.com,数据大小:6.80kb,占比:0.04% 域名:gia.jd.com,数据大小:0.98kb,占比:0.01% 域名:blackhole-m.m.jd.com,数据大小:1.16kb,占比:0.01% 域名:lbsgwh5.m.jd.com,数据大小:0.09kb,占比:0.00% 域名:cactus.jd.com,数据大小:3.04kb,占比:0.02% 域名:sp-desk.jd.com,数据大小:1.14kb,占比:0.01% 域名:sh.jd.com,数据大小:-0.05kb,占比:-0.00% 域名:im-x.jd.com,数据大小:0.01kb,占比:0.00% 域名:blackhole.m.jd.com,数据大小:1.01kb,占比:0.01% 域名:sdkfp.jd.com,数据大小:3.15kb,占比:0.02% 域名:mllog.jd.com,数据大小:0.22kb,占比:0.00% 域名:aks.jdpay.com,数据大小:0.02kb,占比:0.00% 域名:gs-loc-cn.apple.com,数据大小:0.08kb,占比:0.00% 域名:ccc-x.jd.com,数据大小:0.05kb,占比:0.00% 域名:storage.jd.com,数据大小:-0.00kb,占比:-0.00% 域名:shop-license.jd.com,数据大小:1.39kb,占比:0.01% 域名:rjsb-token-m.jd.com,数据大小:0.52kb,占比:0.00% 域名:daily-redpacket.jd.com,数据大小:1.28kb,占比:0.01%

有了这一份数据,整个App 的 IPv6 的流量占比及整改方向一目了然。

三、自检工具使用

这里以 京喜特价 App为例来实践演习。

京喜特价(原京东特价版)是京东旗下满足大众消费需求的特价购物平台,以"省出新生活"为价值主张,为百姓提供质优价低的商品,让大家享受实惠购物、赚钱乐趣的同时也体验到京东品质服务。

3.1、环境准备

先保障客户端支持 IPv6 地址,这样才有可能对等连接后台的 IPv6 地址

最差的情况下是:有些公司可能没有 Wi-Fi 支持 IPv6 环境,需要使用 5G 网络进行检测。

硬件要求:

需要准备两台手机( iPhoneA 支持4/5G网络、iPhoneB 安装好检测的App)、一台 Mac电脑

软件要求:

Mac电脑安装 whistle 抓包环境(其他抓包环境类似)

3.1.1、IPv6 网络检测

iPhoneA 在手机浏览器打开 test-ipv6.com 后,会提示你当前网络是否支持 IPv6 地址,如果同时支持 IPv4/6,正常通讯会优先使用 IPv6,如下图:

3.1.2、测试设备支持 IPv6

iPhoneA 使用 5G 流量开启热点,Mac 电脑和 iPhoneB 都连接到该热点,并且 iPhoneB 代理请求到 Mac 电脑上:

3.1.3、并确保 Mac 电脑和 iPhoneB 都支持 IPv6 环境,Mac 电脑上需要在网络配置 IPv6 为自动:

然后在 Mac 电脑进行测试是否已经支持:

3.2、数据采集及处理

装有 App 的设备 iPhoneB 支持 IPv6 网络环境,具备抓包环境的 Mac电脑就绪后,接下来就是对数据的采集工作。

3.2.1、生产数据

使用 iPhoneB 对目标App进行各种页面进行测试,这里最好是每一个页面及涉及到网络请求的地方都要验证一下,保证数据相对完善,然后导出所有的抓包数据,命名为:native.har

3.2.2、数据整合

python 复制代码
import json
import os
import glob

import ipaddress

# 获取url的domain
from urllib.parse import urlparse

# 导出表格数据
import pandas as pd

# IPv6占比基线
ipv6_baseline = 0.9

def get_domain(url):
    parsed_url = urlparse(url)
    domain = parsed_url.netloc
    return domain

def check_ip_address(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        if ip_obj.version == 4:
            return False
        elif ip_obj.version == 6:
            return True
    except ValueError:
        print("无效的IP地址")
        return False


def analysisRequest(entries):
	domains = {}
	sizes = 0
	ipv6sizes = 0
	for entry in entries:
		url = entry['request']['url']
		response = entry['response']
		status = response['status']
		if '_transferSize' in response:
			size = response['_transferSize']
		else:
			if 'bodySize' in response:
				size = response['bodySize']
			if 'headersSize' in response:
				size += response['headersSize']

		if 'serverIPAddress' in entry:
			serverIPAddress = entry['serverIPAddress']
			if check_ip_address(serverIPAddress):
				ipv6sizes += size
			else:
				domain = get_domain(url)
				if domain in domains:
					domainSize = domains[domain]
					domainSize += size
					domains[domain] = domainSize
				else:
					domains[domain] = size

		if size > 0:
			sizes += size

	ipv6point = ipv6sizes/sizes*100
	print("IPv6 数据大小:{:.2f}kb".format(ipv6sizes/1024))
	print("总数据大小:{:.2f}kb".format(sizes/1024))
	print("IPv6 数据占比:{:.2f}%".format(ipv6sizes/sizes*100))
	print("⚠️  未支持IPv6的域名信息:")
	ipv4info = ''
	for key, value in domains.items():
		info = "域名:{},数据大小:{:.2f}kb,占比:{:.2f}%".format(key, value/1024, value/sizes*100)
		ipv4info += info + '\n'
		print(info)
	print("====================")
	print("")

	results = {}
	if ipv6sizes/sizes < ipv6_baseline:
		results['ipv6point'] = '{:.2f}%'.format(ipv6point)
		results['ipv4list'] = ipv4info
	return results


def readJsonFile(file):
	fcc_data = json.load(file)
	json_str = json.dumps(fcc_data)

	# 将 JSON 对象转换为 Python 字典
	data = json.loads(json_str)
	log = data['log']
	pages = log['pages']
	if not pages:
		print('')
	else:
		page = pages[0]
		page_time = page['startedDateTime']
		page_title = page['title']
		onLoad = page['pageTimings']['onLoad']
		onContentLoad = page['pageTimings']['onContentLoad']

		print("")
		print("加载的页面:", page_title)
		# print("请求开始时间:", page_time)
		# print("onLoad耗时:", onLoad)
		# print("onContentLoad耗时:", onContentLoad)

		entries = log['entries']
		results = analysisRequest(entries)
		if results:
			results['page'] = page_title
			return results


def exportExcel(data):
	# 创建一个数据字典
	# data = {'Name': ['Tom', 'Nick', 'John'],'Age': [20, 21, 19]}

	# 将数据字典转换为pandas DataFrame
	df = pd.DataFrame(data)

	# 将DataFrame导出为Excel文件
	df.to_excel('output.xlsx', index=False)


def traverseFiles():
	# 指定目录路径
	directory = os.getcwd()
	print(directory)
	# 指定文件格式
	file_format = '*.har'

	# 使用glob模块获取匹配的文件路径列表
	file_list = glob.glob(os.path.join(directory, file_format))

	pages = []
	ipv6points = []
	ipv4lists = []
	# 遍历文件列表
	for file_path in file_list:
	    # 打开文件进行处理
	    with open(file_path, 'r') as file:
	        result = readJsonFile(file)
	        if result:
		        pages.append(result['page'])
		        ipv6points.append(result['ipv6point'])
		        ipv4lists.append(result['ipv4list'])
	
	if pages:
		data = {}
		data['页面'] = pages
		data['IPv6占比'] = ipv6points
		data['IPv4域名列表'] = ipv4lists
		exportExcel(data)


traverseFiles()

下载 analysis_ipv6.py 脚本代码(下载失败请直接使用上面的源码),将上一步生产的数据 native.har 建议放在同一个目录下,本文是放在 Desktop/IPv6Data 中:

java 复制代码
✗ tree -L 2
.
├── analysis_ipv6.py
├── other
│   ├── native.har

3.2.3、数据分析

在终端执行如下命令,即可得到每一个页面 IPv6 的数据量及占比,未支持 IPv6 的域名数据:

erlang 复制代码
✗ python3 analysis_ipv6.py --d /Users/denglibing/Desktop/IPv6Data/other
/Users/denglibing/Desktop/IPv6Data/other
har无页面数据
IPv6 数据大小:17130.18kb
总数据大小:17152.94kb
IPv6 数据占比:99.87%
⚠️  未支持IPv6的域名信息:
域名:gold.jd.com,数据大小:1.52kb,占比:0.01%
域名:httpfereport.jd.com,数据大小:0.10kb,占比:0.00%
域名:fd.3.cn,数据大小:-0.00kb,占比:-0.00%
域名:mcard.jd.com,数据大小:6.80kb,占比:0.04%
域名:gia.jd.com,数据大小:0.98kb,占比:0.01%
域名:blackhole-m.m.jd.com,数据大小:1.16kb,占比:0.01%
域名:lbsgwh5.m.jd.com,数据大小:0.09kb,占比:0.00%
域名:cactus.jd.com,数据大小:3.04kb,占比:0.02%
域名:sp-desk.jd.com,数据大小:1.14kb,占比:0.01%
域名:sh.jd.com,数据大小:-0.05kb,占比:-0.00%
域名:im-x.jd.com,数据大小:0.01kb,占比:0.00%
域名:blackhole.m.jd.com,数据大小:1.01kb,占比:0.01%
域名:sdkfp.jd.com,数据大小:3.15kb,占比:0.02%
域名:mllog.jd.com,数据大小:0.22kb,占比:0.00%
域名:aks.jdpay.com,数据大小:0.02kb,占比:0.00%
域名:gs-loc-cn.apple.com,数据大小:0.08kb,占比:0.00%
域名:ccc-x.jd.com,数据大小:0.05kb,占比:0.00%
域名:storage.jd.com,数据大小:-0.00kb,占比:-0.00%
域名:shop-license.jd.com,数据大小:1.39kb,占比:0.01%
域名:rjsb-token-m.jd.com,数据大小:0.52kb,占比:0.00%
域名:daily-redpacket.jd.com,数据大小:1.28kb,占比:0.01%
====================

同时会在 native.har 同一级目录下自动生成表格数据(目录下的 output.xlsx 文件),方便跟进哪些域名还未支持IPv6

java 复制代码
✗ tree -L 2
.
├── analysis_ipv6.py
├── other
│   ├── native.har
│   ├── output.xlsx
页面 IPv6占比 IPv4域名列表
未知页面 99.87% 域名:gold.jd.com,数据大小:1.52kb,占比:0.01% ... ...

四、其他检测方式

4.1、手机安装抓包软件

推荐在 App Store 搜索【蜻蜓抓包】,根据【蜻蜓抓包】引导安装对应的证书后,开启抓包,然后打开 h5 页面,这里以【特价团】页面举例说明:

该页面中 h5speed.m.jd.com(120.52.148.150即为 IPv4 地址,目前已经支持 IPv6 ) 未支持 IPv6,而 uranus.jd.com (2408:xxxx) 已支持。

说明不仅当前页面域名可能不支持 IPv6 ,页面内部的一些请求不支持 IPv6 的域名也需要一一找出来,然后在公司内部找到负责人推动支持。

该方式优点是简单快速验证有限数量的域名是否支持,缺点在于无法统计整个页面或者整个App的数据,然后有效持续跟进。

当然也可以通过导出 har 文件,然后通过上面的工具分析,得到的数据是一致的。

4.2、Safari调试h5页面分析

前提条件是需要在 iPhone 上安装 debug 包。

这里以 【京喜特价首页】 入口去【特价团】页面举例说明:

4.2.1、 开启调试模式

iPhone 安装 debug 包后,通过 Mac 上 Safri 开启网页检测器(调试模式):

4.2.2、页面测试采集数据

在【特价团】页面进行浏览5分钟左右,在网页检测器中选择导出命名 pro.jingxi.com-tjt.har 文件:

4.2.3、数据分析

pro.jingxi.com-tjt.har 文件和如下脚本 在同一个目录下,然后终端执行脚本会得到下面的数据:

ini 复制代码
➜  tree -L 2
.
├── analysis_ipv6.py
└── priorityPage
    ├── pro.jingxi.com-tjt.har
​
加载的页面: https://pro.jingxi.com/jx/active/2maPuB2FfzqTEmzuebGqrZsjfhLw/index.html?babelChannel=ttt1&un_area=19_1607_4773_62130&sid=fc1430bfb1f06f42118dbf15f94a5adw
IPv6 数据大小:2261.62kb
总数据大小:2262.93kb
IPv6 数据占比:99.94%
⚠️  未支持IPv6的域名信息:
域名blackhole-m.m.jd.com:数据大小:0.43kb
域名blackhole.m.jd.com:数据大小:0.43kb
域名rjsb-token-m.jd.com:数据大小:0.45kb
====================

并且自动导出 IPv6 浓度低于 90%(脚本中 ipv6_baseline 可以自己控制阈值) 的页面,还有哪些域名走 IPv4 地址的表格(如上表)。

该方式优点是可以聚合统计某一个 h5 页面维度的数据,提供当前 IPv6 的流量占比及整改方向,缺点在于依赖 debug 包环境及对工具的依赖,当然不支持统计原生页面的数据。

五、参考资料

占比首破50%!我国移动网络IPv6流量超过IPv4流量

IPv6 改造相关指标和测试方法说明

IPv6与IPv4对比学习

iOS 流量监控分析

相关推荐
以对_14 分钟前
uview表单校验不生效问题
前端·uni-app
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
奔跑吧邓邓子2 小时前
npm包管理深度探索:从基础到进阶全面教程!
前端·npm·node.js
不灭锦鲤2 小时前
ssrf学习(ctfhub靶场)
网络·学习·安全
前端李易安2 小时前
ajax的原理,使用场景以及如何实现
前端·ajax·okhttp
汪子熙3 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js
Envyᥫᩣ3 小时前
《ASP.NET Web Forms 实现视频点赞功能的完整示例》
前端·asp.net·音视频·视频点赞
网络研究院5 小时前
如何安全地大规模部署 GenAI 应用程序
网络·人工智能·安全·ai·部署·观点
Мартин.7 小时前
[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入
前端·xss
昨天;明天。今天。8 小时前
案例-表白墙简单实现
前端·javascript·css