IPv6 scope id
在查看中sockaddr_in6代码时,发现有一个成员sin6_scope_id,表示IPv6 scope-id。而在sockaddr_in中是没有该成员的。
那么,这个成员是干什么的呢?
要讨论这个问题,先看一下IPv6的基础知识:IPv6地址分类及表示法。
IPv6地址分类及表示方法
参见:
IPv6地址类型
IPv6整体上分三类:单播地址,任播地址,组播地址。
- 一个IPv6地址字符表示
- 带有子网前缀的IPv6地址表示
- 带有端口号的IPv6地址表示
- 化简
| 化简前 | 化简后 | 备注 |
| ABCD:0000:2345:0000:ABCD:0000:2345:0000 | ABCD:0:2345:0:ABCD:0:2345:0 | 全0块"0000",简写为"0" |
| ABCD:EF01:0:0:0:0:0:6789 | ABCD:EF01::6789 | 多个全0块,简写为"::" |
| ABCD:0:0:0:ABCD:0:0:6789 | ABCD::ABCD:0:0:6789 | 多个可以简写的全0块,但只能简写最长的那个或者左边那个(如果同时2个最长) |
| 0:0:0:0:0:0:0:1 | ::1 | 开头多个全0块 |
| 2001:0:0:0:0:0:0:0 | 2001:: | 末尾多个全0块 |
- 单播地址:一个单播地址对应一个接口,发往单播地址的数据包会被对应的接口接收;
- 任播地址:一个任播地址对应一组接口,发往任播地址的数据包会被这组接口的其中一个接收,被哪个接口接收由具体的路由协议确定;
- 组播地址:一个组播地址对应一组接口,发往组播地址的数据包会被这组的所有接口接收;
| 地址类型 | 二进制前缀 | IPv6表示 |
| 未指定 | 00...0(全0) | ::/128 |
| 环回地址 | 00...1(最后1位是1) | ::1/128 |
| 组播地址 | 11111111 | FF00::/8 |
| 本地链路单播地址 | 1111111010 | FE80::/10 |
| 全球单播地址 | 剩余的所有 |
- 未指定地址:主要用于系统启动之初,尚未分配IP时,对外请求IP地址时,作为源地址使用,它不能用于数据包的目的地址之中。
- 环回地址:用于自己向自己发送数据包时使用,在日常网络排错中可用测试网络层协议状态。
- 本地链路单播地址(Link-Local addressing):前缀FE80::/10,作用是在没有路由(网关)存在的网络中,主机通过MAC地址自动配置生成IPv6地址,仅能在本地网络中使用。::FE80::/10 这些链路本地地址指明,这些地址只在区域连线中合法,有的类似于IPv4中的169.254.0.0/16。