一、布景

关于加快推进互联网协议第六版(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.3×10^9个地址;为了便利回忆选用了点分十进制的符号办法,如114.114.114.114便是一个IPv4地址。

IPv6地址: 选用128位正整数表明,需求16字节存储,可以供给约2^128≈3.4×10^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,如下图:

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

3.1.2、测验设备支撑 IPv6

iPhoneA 运用 5G 流量敞开热门,Mac 电脑和 iPhoneB 都衔接到该热门,而且 iPhoneB 代理恳求到 Mac 电脑上:

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

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

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

然后在 Mac 电脑进行测验是否现已支撑:

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

3.2、数据收集及处理

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

3.2.1、出产数据

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

3.2.2、数据整合

# 遍历并剖析.har文件
# 遍历当时目录下的一切.har文件(HTTP归档文件,用于记录web浏览器和网站之间的交互)。
# 对每个.har文件进行解析,提取出每个恳求的URL、呼应状况、传输巨细、服务器IP地址等信息。
# 对服务器IP地址进行检查,判别其是IPv4仍是IPv6,并计算IPv6数据的巨细和总数据巨细的比例。
# 对于IPv4的恳求,提取出其域名,并计算每个域名的数据巨细。
# 将每个文件的页面标题、IPv6数据占比、未支撑IPv6的域名信息等数据保存下来。
# 最终,将一切文件的这些数据导出为一个Excel文件。
# 脚本运用办法:
# python3 analysis_ipv6.py --d '/Users/denglibing/Desktop/京喜特价H5页面IPv6验证/priorityPage'
# 或者
# python3 analysis_ipv6.py --directory '/Users/denglibing/Desktop/京喜特价H5页面IPv6验证/priorityPage'
# 生成的数据在传入的途径中,output.xlsx
import argparse
import json
import os
import glob
import ipaddress
# 获取url的domain
from urllib.parse import urlparse
# 导出表格数据
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Alignment
# IPv6占比基线
ipv6_baseline = 1.0
def get_domain(url):
    return urlparse(url).netloc
def check_ip_address(ip):
    try:
        ip_obj = ipaddress.ip_address(ip)
        return ip_obj.version == 6
    except ValueError:
        print("无效的IP地址")
        return False
def calculate_sizes(entries):
    domains = {}
    sizes = 0
    ipv6sizes = 0
    for entry in entries:
        url = entry['request']['url']
        response = entry['response']
        size = response.get('_transferSize', response.get(
            'bodySize', 0) + response.get('headersSize', 0))
        if 'serverIPAddress' in entry:
            serverIPAddress = entry['serverIPAddress']
            if check_ip_address(serverIPAddress):
                ipv6sizes += size
            else:
                domain = get_domain(url)
                domains[domain] = domains.get(domain, 0) + size
        if size > 0:
            sizes += size
    return domains, sizes, ipv6sizes
def print_results(domains, sizes, ipv6sizes):
    ipv6point = ipv6sizes / sizes * 100
    print("IPv6 数据巨细:{:.2f}kb".format(ipv6sizes / 1024))
    print("总数据巨细:{:.2f}kb".format(sizes / 1024))
    print("IPv6 数据占比:{:.2f}%".format(ipv6point))
    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("")
    return ipv6point, ipv4info
def analysis_request(entries):
    domains, sizes, ipv6sizes = calculate_sizes(entries)
    ipv6point, ipv4info = print_results(domains, sizes, ipv6sizes)
    results = {}
    if ipv6sizes / sizes < ipv6_baseline:
        results['ipv6point'] = '{:.2f}%'.format(ipv6point)
        results['ipv4list'] = ipv4info
    return results
def read_jsonfile(file):
    json_data = json.load(file)
    log = json_data['log']
    pages = log.get('pages', [])
    if not pages:
        print('har无页面数据')
        page_title = "不知道页面"
    else:
        page = pages[0]
        page_title = page['title']
        print("")
        print("加载的页面:", page_title)
    entries = log.get('entries', [])
    if 'entries' in log:
        results = analysis_request(entries)
        if results:
            results['page'] = page_title
            return results
def export_excel(data):
    # 创立一个数据字典
    # data = {'Name': ['Tom', 'Nick', 'John'],'Age': [20, 21, 19]}
    # 将数据字典转换为pandas DataFrame
    df = pd.DataFrame(data)
    # 将DataFrame导出为Excel文件
    df.to_excel(output_file, index=False)
def format_excel():
    # 加载Excel文件
    wb = load_workbook(output_file)
    # 选择要修正的作业表
    ws = wb.active
    # 设置第一列的宽度为特定值
    ws.column_dimensions['A'].width = 40
    ws.column_dimensions['B'].width = 15
    ws.column_dimensions['C'].width = 80
    # 遍历一切单元格,设置其对齐办法为上下居中
    for row in ws.iter_rows():
        for cell in row:
            cell.alignment = Alignment(vertical='center', wrap_text=True)
    # 获取C列的一切单元格
    # c_column_cells = ws['C']
    # for cell in c_column_cells:
    #     # 设置其对齐办法为自动换行
    #     cell.alignment = Alignment(wrap_text=True)
    # 保存修正后的Excel文件
    wb.save(output_file)
def traverse_files(directory):
    # 指定当时目录途径
    # 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 = read_jsonfile(file)
            if result:
                pages.append(result['page'])
                ipv6points.append(result['ipv6point'])
                ipv4lists.append(result['ipv4list'])
    if pages:
        data = {
            '页面': pages,
            'IPv6占比': ipv6points,
            'IPv4域名列表': ipv4lists
        }
        export_excel(data)
        format_excel()
# 创立一个解析器
parser = argparse.ArgumentParser(description='剖析IPv6数据')
# 增加一个命令行参数
parser.add_argument('--directory', type=str, help='要剖析的文件的目录')
parser.add_argument('--d', type=str, help='要剖析的文件的目录')
# 解析命令行参数
args = parser.parse_args()
directory = os.getcwd()
if args.directory:
    directory = args.directory
elif args.d:
    directory = args.d
output_file = directory + '/output.xlsx'
# 运用命令行参数
traverse_files(directory)

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

✗ tree -L 2
.
├── analysis_ipv6.py
├── other
│  ├── native.har

3.2.3、数据剖析

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

✗ 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

✗ 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 页面,这儿以【特价团】页面举例阐明:

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

该页面中 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 敞开网页检测器(调试模式):

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

4.2.2、页面测验收集数据

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

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

4.2.3、数据剖析

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

➜  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 流量监控剖析