来了,没有花哨的开头和结尾,直接上干货。
IP地址分类(IPV4)
IP是可以分类的,你知道了吗?
首先,从IP地址说起,IP地址其实是一个32比特的整数,把这个32比特分为4段,每段8比特长,8比特正好是一个字节,把这个字节转换成十进制,用点隔开。这样4个数字三个点的表示方法就是我们现在大家熟悉的IP地址,如:192.168.1.1,其实,把这个IP地址写成二进制是这样的:
0d192 = 0b11000000
0d168 = 0b10101000
0d1 = 0b00000001
0d1 = 0b00000001
合起来: 192.168.1.1 = 0b11000000 10101000 00000001 00000001 = 0d3232235777
那这个IP地址真正的值就是整数:3232235777
以上例程中,0d开头的表示十进制数,0b开头的表示二进制数。
http://192.168.1.1 = http://3232235777
你不访可以在浏览器的地址栏里试下输入 http://3232235777 这种IP地址的表示方法,我这里是 OK 的,那你呢?
了解了IP地址的构成,那接下来言归正传,讲讲IP地址的分类吧。
IP 地址分为 5 类,分别是 A 类,B 类,C 类,D 类和 E 类。
为什么前面先讲 IP 地址的构成呢,因为分类用的到,把 IP 地址转成二进制,第一个比特为 0 的IP地址,也就是二进制以 0 开头的 IP 地址,为 A 类地址,10 开头的为 B 类地址,110 开头的为 C 类地址,1110 开头的为 D 类地址,1111开头的为 E 类地址。我们常用的是 A、B、C 类地址,D 类 IP 地址段是多播地址,E 类是保留段。
我们 IoT 工程师最常用的就是 A、B、C 类地址段,再把这三个段的具体范围用点分十进制表示出来。
A 类: 0 ~ 127
B 类: 128 ~ 191
C 类: 192 ~ 223
那这三类地址有什么区别呢?我们的路由器 IP 地址为什么通常都以 192.168 开头呢?下面我们分别聊一下这两点。
区别:A 类地址,一个网段可容纳 16777214 台主机;B 类地址,一个网段可容纳 65534 台主机,而 C 类地址,一个网段可容纳 254 台主机。为什么这样,下面会讲到。
特殊 IP 地址段:
A 类地址中的特殊地址段有:
广播地址段:以 0 开头的地址段广播地址段;
内网地址段:以 10 开头的地址段为内网地址段; (RFC 1918)
运营商私有地址段:以 100 开头的为运营商私有的地址段;如果你是移动宽带用户,理论上你从运营商这里得到的 IP 地址就应该是这个地址段,这也是所谓的移动宽带多个用户是共享一个公网 IP。
回环地址段,以 127 开头的地址段为回环地址;
B 类地址中的特殊地址段有: (RFC 1918)
无法获取 DHCP 时分配的 IP 地址段:如果你的设备获取 DHCP 失败,则会随机分配到一个以 169.254 开头的 IP 地址。
内网地址段:以 172.16 ~ 172.31 开头的地址段为内网地址段;
C 类地址中的特殊地址段有:
内网地址段:以 192.168 开头的地址段为内网地址段; (RFC 1918)
特殊地址段:以 192.0.0 开头的地址段为特殊地址段; (RFC 5736)
测试地址段:以 192.0.2 开头的地址段为测试地址段; (RFC 5737)
测试地址段:以 192.18 ~ 192.19 开头的地址段为测试地址段;
测试地址段:以 192.51.100 开头的地址段为测试地址段; (RFC 5737)
测试地址段:以 203.0.113 开头的地址段为测试地址段; (RFC 5737)
说了那么多,IP 地址分了类,有什么用呢?请往下看。
无类域间路由
无类域间路由 (Classless Inter-Domain Routing — CIDR),这里的类,就是上面 A、B、C 类,无类就是打破这个类的规则,上面说到的 A、B、C 类 IP 地址段容纳的主机数是怎么回事呢?往下看。
先介绍下子网掩码,子网掩码这个词我相信大家都不陌生了吧,很多时候将电脑的 IP 地址设置成 192.168.x.x,上面说过了,这是 C 类的内网地址,一般掩码会填 255.255.255.0,这是什么意思呢?255.255.255.0 是 C 类地址的默认掩码,同样,把 255.255.255.0 转换为二进制,为 0b11111111 11111111 11111111 00000000,很容易看出,这个掩码的前面有连续的 24 个 1,后面是连续的 8 个 0,把它和 IP 地址放在一起,就拿 192.168.1.1 来举例:
192.168.1.1 = 0b11000000 10101000 00000001 00000001
255.255.255.0 = 0b11111111 11111111 11111111 00000000
排一起:
11000000 10101000 00000001 00000001
11111111 11111111 11111111 00000000
这样,IP 地址和掩码对齐后,掩码的 1 和 0,分 IP 地址分为了两个部分, 0b11000000 10101000 00000001,和 0b00000001,即 192.168.1 和 1;
和掩码 1 对应的部分称为网络段,和掩码 0 对应的部分称为主机地址。
再来两个概念:网络地址和主机地址。
把上述 IP 地址的网络段部分保持不变,把主机地址变为全 0,则为上述 IP 地址所在的网段的网络地址;即 192.168.1.0
把上述 IP 地址的网络段部分保持不变,把主机地址变为全 1,则为上述 IP 地址所在的网段的广播地址;即 192.168.1.255
掩码的二进制都是全 1 到全 0,不然就是非法的,比如:255.255.254.0 是合法的掩码,而 255.255.253 就是不合法的掩码,如果不明白为什么,那转换成二进制一看就明白了,这里不多讲了。
所以有以上 IP 地址和掩码可以简写成 192.168.1.1/24,/24 就是掩码,表示有 24 个连续的 1 开头的 32 比特整数,实质上也就是 255.255.255.0。
A 类地址的默认掩码是:255.0.0.0
B 类地址的默认掩码是:255.255.0.0
C 类地址的默认掩码是:255.255.255.0
所以,A 类地址一共有 2 ^ (8 – 1) 个网段,去掉上述 0 外,实际可用的为 127 个网段,这是包括内网等特殊网段的,而每个网段可容纳的主机数是 2 ^ 24 – 2,则为 16777214 台主机,8 是掩码全 1 部分有 8 个 1,24 是掩码全 0 部分有 24 个 0,减去 2 是一个全 0 的网络地址和一个全 1 的广播地址。
同理, B 类地址一共有 2 ^ (16 – 2) 个网段,即 16384 个网段,这是包括内网等特殊网段的,而每个网段可容纳的主机数是 2 ^ 16 – 2,则为 65534 台主机;
再同理, C 类地址一共有 2 ^ (24 – 3) 个网段,即 2097152 个网段,这是包括内网等特殊网段的,而每个网段可容纳的主机数是 2 ^ 8 – 2,则为 254 台主机;
好了,终于到了 CIDR 登场的时候了。
也许大家有时也会看到过这样的 IP 地址和掩码吧,10.0.0.1 255.255.254.0,不是说 10 开头的是 A 类地址吗?A 类地址的掩码不就应该是 255.0.0.0 吗?这个组合合法吗?答案是肯定的,这个是合法的,这就是无类域间路由 — CIDR。就是为了根据实际需求,超越 A、B、C 类地地址的限制,对调整网段和主机数进行更合理的安排和划分。就拿上面的举例吧,10.0.0.1/23 (不知道这个写法的往前翻翻,这个文档前面有提到) 可容纳的主机数是 2 ^ 9 – 2,即 510 台主机。
那问题又来了,IP 地址分网络段和主机段有什么用呢?网络地址和广播地址有什么用呢?往下看。
交换机和路由器的区别
前面都是铺垫,纯理论知识,有了上面的理论,现在可以和实际结合了,交换机和路由器有什么区别呢?
还是要先从以太网讲起。以太网传输最终的识别信息是网卡的 MAC 地址,首先,我大概描述一下同网段之间的传输,注意,我只是用白话文方式描述原理,如果想了解具体细节的,请阅读相关文档。
网络拓普:
主机 A:IP:192.168.1.100/24 MAC:00:12:34:56:78:9A
主机 B:IP:192.168.1.101/24 MAC:00:12:34:56:2C:AB
场景:主机 A 发起通讯请求,欲与主机 B 交互数据
- 主机 A 比对自己的 IP 和 目标 IP,在同一网段;
- 主机 A 发起 ARP 广播,内容为:目标 IP 为 192.168.1.101,本机 MAC 为 00:12:34:56:78:9A;
- 只要在同网络且网段下在线的主机,均能收到该广播;
- 除主机 B 外,其它主机收到广播后,比对主机 A 的目标 IP 不是本机,则忽略广播;
- 主机 B 收到广播后,经比对,自己的 IP 和主机 A 广播的目标 IP 吻合,则把自己的 MAC 通过 ARP 广播应答主机 A;
- 双方通过 MAC 建立通讯;
当然,这时交换机还做了很多事,比如维护 ARP list 等,这里就不展开了,感兴趣的可以去关心下集线器(HUB),网桥(Bridge),交换机(Switch) 的区别,及以太网的冲突域(CSMA/CD),内容太多了,讲下去没完没了了。
那不同网段呢?
网络拓普:
主机 A:IP:192.168.1.100/24 MAC:00:12:34:56:78:9A
主机 B:IP:192.168.1.101/24 MAC:00:12:34:56:2C:AB
主机 C:IP:192.168.10.102/24 MAC:00:12:34:56:54:71
路由器A Port A:IP:192.168.1.1/24 MAC:00:12:34:56:D1:BB
路由器A Port B:IP:192.168.10.1/24 MAC:00:12:34:56:D1:BC
场景:主机 A 发起通讯请求,欲与主机 C 交互数据
- 主机 A 比对自己的 IP 和 目标 IP,不在同一网段;
- 主机 A 发起 ARP 广播,内容为:目标 IP 为192.168.10.102,本机 MAC 为 00:12:34:56:78:9A,广播的目标 IP 则为网关(路由器 A),即 192.168.0.1;
- 只要在同网络且网段下在线的主机,均能收到该广播;
- 除路由器 A 外,其它主机收到广播后,比对主机 A 的目标 IP 不是本机,则忽略广播;
- 路由器 A 收到广播后,经比对,自己的 IP 和主机 A 广播的目标 IP 吻合,则把自己的 MAC 通过 ARP 广播应答主机 A;
- 路由器 A 把主机 A 的目标 IP 与 其它端口的 IP 网段比对,如果在同一网段,则重复上述 ARP 广播的过程,如果不在同一网段,则再把请求发到自己的网关(上级路由器)上;
- 路由器A 在端口 B 上发出 ARP 广播,内容为目标 IP 为 192.168.10.102,本机 MAC 为 00:12:34:56:D1:BC;
- 主机 C 收到广播后,经比对,自己的 IP 和路由器 A 广播的目标 IP 吻合,则把自己的 MAC 通过 ARP 广播应答路由器 A;
- 路由器 A 再通过端口 A 把应答转给 主机 A;
- 双方通过路由器 A 建立通讯;
好了,总结一下:
- 集线器组成一个冲突域;
- 网桥切断冲突;
- 交换机其实相当于每个端口都是一个网桥,它组成的是一个广播域;
- 路由器切断了广播,承载着不同网段数据的交互;
最后值得一提的是,我们常用的宽带路由器是在普通路由器里固定设置了 NAT 转发功能,因为它的一端是可能是公网地址,而另一段肯定是内网地址,这样,它其实需要的是单向传输,有设置过端口转发经验的朋友应该注意到了,只有通过这样的设置,才能从公网反连到内网上的某台主机,这个我计划后面会另写一篇相关技术的文档,这里不再展开了,也正因为这个原因,有些地区把这种宽带路由器称为 IP 地址分享器。