IP地址分类与子网掩码
说起来很惭愧, 在工作了这么长时间, 居然一直没有弄清楚像 IP 地址分类 和 子网掩码 这些基础概念. 原因应该跟我不喜欢系统的看书学习有关, 最近闲下来看了一些关于 tcp/ip 的书, 总算有了比较清晰的了解. 特此记录一下.
IP 地址类型
大部分人都知道 IPv4 地址有 A, B, C, D 四类地址, 实际上他们的区别就在于地址在以二进制表示时是以什么数字开头.
A 类地址
IP 地址以 0 开头的都是 A 类地址, 范围包括 0.0.0.0 ~ 127.0.0.0
默认情况下, A 类地址的前 8 位为网络标识位, 后 24 位为主机标识位
| 0 | 7位 | 8位 | 8位 | 8位 |
加粗部分为网络地址位
B 类地址
IP 地址以 10 开头的都是 B 类地址, 范围包括 128.0.0.1 ~ 191.255.0.0
默认情况下, B 类地址的前 16 位为网络标识位, 后 16 位为主机标识位
| 10 | 6位 | 8位 | 8位 | 8位 |
加粗部分为网络地址位
C 类地址
IP 地址以 110 开头的都是 C 类地址, 范围包括 192.168.0.0 ~ 239.255.255.0
默认情况下, C 类地址的前 24 位为网络地址标识位, 后 8 位为主机标识位
| 110 | 5位 | 8位 | 8位 | 8位 |
加粗部分为网络地址位
D 类地址
IP 地址以 1110 开头的都是 D 类地址, 范围包括 224.0.0.0 ~ 239.255.255.255
D 类地址没有主机标识位, 所有 32 位都是网络标志位, 一般用于多播
| 1110 | 4位 | 8位 | 8位 | 8位 |
特殊地址
- 0.0.0.0 : 用于表示无法获取 ip 的地址
- 255.255.255.255 : 全为 1 地址通常用作广播地址 因为, 我们在计算地址个数的时候通常要减去这两个特殊地址
子网掩码
子网掩码用于划分哪些 IP 属于同一个子网, 一般的表示形式如下
172.20.100.52/26
首先这是个 B 类地址, 这个地址表示他的子网掩码是 26, 26 代表的意思子网掩码前 26 位全为 1, 即为 11111111.11111111.11111111.11000000, 化为整数形式则是 255.255.255.192
那么, 如何确定子网内的主机呢.
IP 地址: 172 . 20 . 100 . 52 ( 10101100 . 00010100 . 01100100 . 00110100 )
子网掩码: 255 . 255 . 255 . 192 ( 11111111 . 11111111 . 11111111 . 11*000000* )
网络地址: 172 . 20 . 100 . 0 ( 10101100 . 00010100 . 01100100 . 00*000000* )
实际上网络地址的计算就是用二进制的 IP 地址与上二进制的子网掩码, 那么最后得出了网络地址, 网络地址中与子网掩中为 0 对应的位即为可变化的子网内主机 ip 的位, 所以对于 172.20.100.52/26 来说, 他的子网的主机应该包括了
172.20.100.0 (10101100.00010100.01100100.00*000000) ~ 172.20.100.63 (10101100.00010100.01100100.00111111*)
CIDR (Classless Inter-Domain Routing)
前面提到过默认情况下 B 类地址的网络标识位应该是 16 位, 那么上面提到的 172.20.100.52/26 却有 26 位是为什么呢?
这是因为默认情况下的固定了网络标识位, 也就固定了某个子网的主机数, 这样很有可能会造成 ip 资源的浪费, 也许你并不需要这么大的子网. 例如 B 类地址的子网包括了 65534 台主机, C 类地址只有 254 台主机, 而你的子网却可能是 500 台主机. 这样, 如果可以自定义子网掩码的长度, 也就是自定义网络标识位的长度, 则可以更有效的利用 ip 资源来构成子网. 这种采用任意长度切割 IP 地址子网的方式叫 CIDR, 意为 "无类型域间选路".
小结
实际上, 一个地址是什么类型的地址仅需要通过地址的前几位去判断就可以了, 与子网掩码并没有关系. 而一个 IP 的子网掩码是多少, 则是需要通过 ISP 去向区域互联网注册管理机构申请 CIDR 地址块, 也就是说一次性会申请一个段的 IP, 而同时也确定了这些 IP 的子网掩码. 换句话说, 并不可能会同时存在 172.20.100.52/26 和 172.20.100.52/25 两个 IP 相同, 子网掩码却不同的地址.