缩写规则
IPv6 地址 128 位分成 8 个 16 位组,规范写法允许两类缩写:每组内部的前导零可以省略,连续的全零组可以用双冒号替代。RFC 5952 进一步规定:双冒号只能出现一次,必须压缩最长的一段零组,长度相同时压缩靠前的那段,而单独一个零组不缩写。掌握这几条,多数考试题目可以直接判定。
基本信息
| 地址长度 | 128 位,写成 8 组十六进制,每组 4 位 |
|---|---|
| 规则一 | 每组前导零可省略,0000 写作 0 |
| 规则二 | 连续全零组可用 :: 替代,且只能用一次 |
| 规则三 | :: 至少要代表一组零,不能表示零组 |
| 规则四 | 必须压缩最长的一段零组,长度相同压缩靠前者 |
| 规则五 | 字母统一小写,组内不做零的补齐 |
缩写对照表
| 原始写法 | 规范缩写 | 说明 |
|---|---|---|
| 2001:0db8:0000:0000:0000:ff00:0042:8329 | 2001:db8::ff00:42:8329 | 中间四组零最长,用 :: 压缩 |
| 2001:0db8:0000:0001:0001:0001:0001:0001 | 2001:db8:0:1:1:1:1:1 | 只有一个零组,按规范写作 0 |
| ff02:0000:0000:0000:0000:0000:0000:0001 | ff02::1 | 前导零全部省略后压缩零串 |
| 2001:0000:0000:0001:0000:0000:0001:0001 | 2001::1:0:0:1:1 | 两段零长度相同,压缩靠前那段 |
| 0000:0000:0000:0000:0000:0000:0000:0001 | ::1 | 全零地址与回环地址的极端情况 |
程序校验与还原
程序校验与还原
python - <<'PY'
import ipaddress as ipa
for c in ['2001:0db8:0000:0000:0000:ff00:0042:8329', '2001:0:0:1:0:0:1:1', 'FF02::1']:
print(ipa.IPv6Address(c).compressed) # 输出规范缩写形式
# 还原成完整 8 组:exploded 属性不缩写任何零组
print(ipa.IPv6Address('2001:db8::1').exploded)
PY常见判断题思路
- 问“2001:db8::1::2 是否合法”:双冒号出现两次,直接判非法,:: 只能使用一次
- 问“2001:db8:0:0:1:0:0:1 的最短写法”:两组零长度相同都是 2 组,按规范压缩靠前那组,得到 2001:db8::1:0:0:1
- 问“:: 能否代表一组零”:规范不推荐也不允许用于仅省略一个零组的场景,应写作 0
- 问“地址里有几个组”:把 :: 按补足 8 组来还原,数一数缺了几组即可
- 问“大写是否等价”:大小写不敏感,但书写规范要求统一小写
记不住靠前还是靠后压缩时,用 Python 的 compressed 属性验证最快:规范只允许一种最短写法,机器给出的结果就是标准答案。