开发者工具箱-鸿蒙IPv6子网计算器开发笔记
2025-06-04 13:13:56
148次阅读
0个评论
鸿蒙IPv6子网计算器开发笔记
基础知识
先来唠唠IPv6是啥玩意:
-
IPv6地址长啥样
- 8组16位的十六进制数
- 用冒号分开
- 比如 2001:0db8:0000:0000:0000:0000:0000:0001
- 可以简写成 2001:db8::1
-
IPv6地址类型
- 全局单播地址:公网用的
- 链路本地地址:局域网用的
- 唯一本地地址:私网用的
- 多播地址:一对多通信
- 环回地址:本地测试用
-
地址压缩规则
- 每组前面的0可以省略
- 连续的0可以用::代替
- 但::只能用一次
- 比如 2001:0db8:0000:0000:0000:0000:0000:0001
- 可以写成 2001:db8::1
-
子网前缀
- 用/后面的数字表示
- 范围是0-128
- 比如 /64 表示前64位是网络号
- 后64位是主机号
-
IPv6地址结构
- 前48位:全球路由前缀
- 中间16位:子网ID
- 后64位:接口ID
- 比如 2001:db8:1234:5678::1
- 2001:db8 是前缀
- 1234 是子网
- 5678::1 是接口
-
特殊地址
- ::/128:未指定地址
- ::1/128:环回地址
- fe80::/10:链路本地
- ff00::/8:多播地址
- 2000::/3:全局单播
-
地址分配
- 2000::/3:公网地址
- fc00::/7:私网地址
- fe80::/10:本地链路
- ff00::/8:多播地址
-
子网划分
- /64:标准子网
- /48:大型网络
- /56:中型网络
- /64:小型网络
- /128:单机地址
-
地址配置
- 手动配置
- DHCPv6
- SLAAC(无状态)
- 双栈模式
-
常见问题
- 地址太长不好记
- 配置比较复杂
- 需要双栈支持
- 工具支持不够
前言
最近在搞鸿蒙开发者工具箱,想着加个IPv6子网计算器。这玩意比IPv4复杂多了,光是地址格式就够喝一壶的。不过好在最后搞定了,现在可以算IPv6的子网信息了。
一、功能说明
1.1 主要功能
- 算网络地址
- 算可用主机数
- 算首尾可用地址
- 支持地址压缩
- 支持地址展开
- 支持多种地址类型
1.2 界面功能
- IPv6地址输入框
- 一键复制结果
- 显示详细计算
- 支持收藏
- 有使用说明
二、实现过程
2.1 计算原理
IPv6子网计算主要是位运算:
-
网络地址计算
- IP地址和子网掩码做与运算
- 比如 2001:db8::1/64
- 网络地址就是 2001:db8::
-
可用主机数计算
- 2^(128-前缀长度) - 2
- 比如 /64 就是 2^64 - 2
- 这个数太大了,用字符串表示
-
首尾地址计算
- 首地址:网络地址+1
- 尾地址:广播地址-1
- 比如 2001:db8::1 到 2001:db8::ffff
2.2 代码实现
// IPv6工具类
class IPv6UtilsClass {
// 展开IPv6地址
expandIPv6(ip: string): string {
// 处理双冒号
if (ip.includes('::')) {
const parts = ip.split('::');
const left = parts[0].split(':').filter(p => p);
const right = parts[1].split(':').filter(p => p);
const missing = 8 - left.length - right.length;
const expanded = left.concat(Array(missing).fill('0000'), right);
return expanded.map(p => p.padStart(4, '0')).join(':');
}
return ip.split(':').map(p => p.padStart(4, '0')).join(':');
}
// 压缩IPv6地址
compressIPv6(ip: string): string {
const parts = ip.split(':').map(p => p.replace(/^0+/, '') || '0');
// 找最长的连续0
let maxZeroStart = -1;
let maxZeroLength = 0;
let currentZeroStart = -1;
let currentZeroLength = 0;
for (let i = 0; i < parts.length; i++) {
if (parts[i] === '0') {
if (currentZeroStart === -1) {
currentZeroStart = i;
}
currentZeroLength++;
} else {
if (currentZeroLength > maxZeroLength) {
maxZeroLength = currentZeroLength;
maxZeroStart = currentZeroStart;
}
currentZeroStart = -1;
currentZeroLength = 0;
}
}
if (maxZeroLength > 1) {
const before = parts.slice(0, maxZeroStart);
const after = parts.slice(maxZeroStart + maxZeroLength);
return [...before, '', ...after].join(':');
}
return parts.join(':');
}
// 计算网络地址
calculateNetworkAddress(ip: string, prefix: number): string {
const binary = this.ipv6ToBinary(ip);
const networkBinary = binary.map((bit, index) => index < prefix ? bit : 0);
return this.binaryToIPv6(networkBinary);
}
// 计算可用主机数
calculateHostCount(prefix: number): string {
const hostBits = 128 - prefix;
if (hostBits > 64) {
return `2^${hostBits}`;
}
const count = BigInt(2) ** BigInt(hostBits) - BigInt(2);
return count.toString();
}
}
三、踩坑记录
3.1 遇到的问题
-
地址格式验证
- 问题:IPv6地址格式太复杂
- 解决:写了个超长的正则表达式
-
大数计算
- 问题:2^64 这种数太大了
- 解决:用 BigInt 和字符串
-
地址压缩
- 问题:压缩规则太复杂
- 解决:写了个专门的压缩函数
-
性能问题
- 问题:计算太慢
- 解决:优化了算法
3.2 优化建议
-
功能优化
- 支持更多格式
- 加个计算历史
- 支持批量计算
-
性能优化
- 优化计算速度
- 减少内存占用
- 及时释放资源
-
用户体验
- 加个计算历史
- 支持分享结果
- 优化动画效果
-
安全性
- 验证输入格式
- 限制计算频率
- 保护用户隐私
四、总结
这个IPv6子网计算器基本功能都有了,可以:
- 计算子网信息
- 规划网络地址
- 排查网络问题
- 学习网络知识
五、参考资料
欢迎体验
这个IPv6子网计算器已经集成到鸿蒙开发者工具箱里了,欢迎下载体验!
作者:在人间耕耘 邮箱:1743914721@qq.com 版权声明:本文为原创文章
00
- 0回答
- 0粉丝
- 0关注