组网 —— IPv4 网络简介

in 开发 with 0 comment

近期要整家里的网络,新办了移动宽带,碰到的第一个问题就是没有公网 IPv4 地址,只有 IPv6 地址,这样就不能用 DDNS 了,于是就想到了用 IPv6 组网。

内网 IPv4

广播

在深入了解 IPv6 之前,我们知道 IPv4 是由 IP 地址和掩码组成的,对 IP 地址 mask 处理后填满 1 即为网络号:

比如 192.168.200.0/24 (子网掩码为255.255.255.0),掩码后填完 1,变成 192.168.200.255,这个就是 IPv4 的广播地址,也就是说,一台主机,往这个地址发数据,会被这个网络内所有主机收到。

那么如何做到这一点呢?或者换个问法说,当我们给 192.168.200.255 发一个包的时候,网络上到底是怎么执行的呢?

在介绍三层转发数据之前,我们需要知道一个协议叫 ARP。实际上在交换机上发数据,交换机是不认识 IP 层的数据的,交换机只认识 MAC 地址,它维护了一个接口和 MAC 地址的映射(当然,一个接口可以对应多个 MAC 地址)。当 mac 地址设置成ff:ff:ff:ff:ff:ff的时候,交换机就会把这个包从所有接口发出去,这样就完成了一次链路层广播:比如 IPv4 的 DHCP 就是依赖链路层广播实现的,因为在此之前,主机连 IP 地址也没有。

当主机知道目标 IP 地址设置成192.168.200.255的时候,目标的 MAC 地址就会设置成ff:ff:ff:ff:ff:ff,从当前主机的接口发送出去。这时候主机其实并不会去管这个包发送到哪,但是它知道目标 IP 地址(也就是192.168.200.255)那么它会根据路由表的记录,知道从哪个接口发出去。物理接口在启用的状态下,必然连接着另外一头,不用管另外一头是什么设备,发出去就完事了。

以下是我尝试 ping 192.168.200.255 的抓包结果,注意这里的二层和三层:

ping

可以发现,网络上很多的主机都回应了这个 ping
echo

这证明了一点:只要你往广播地址上发送数据,那么所有本地网络内的主机都能收到相应的帧。但是愿意不愿意回应你,那就看对面主机的意愿。

我们这里定义 SRC 主机,DST 主机。DST主机收到网络上的包有多种情况:

  1. 如果这个包的 DST IP 是网络地址,那么证明这个包可以被任何人接收,于是会进入内部流程。
  2. 如果这个包的 DST IP 是 DST 主机地址,那么证明这个包只有 DST 主机能收到,那么会接收这个包,进入内部流程。
  3. 如果这个包的 DST IP 是另外一台主机,那么这一台主机会根据配置的规则(是否开启 ip forwarding),来确定是否转发或者丢弃包。

看到第三种情况,你想到了什么?没错,它就是路由器。

我们在这下一个结论:狭义的网络的概念,其实就是广播包可达的最大范围内所有主机组成的系统

「网络」规模越大越好吗?当然不是,相反规模越小越好,这是为什么呢?

路由 和 ARP

如果我们要往一个特定的 IP 地址发包,计算机会采用几种方式来完成工作:直连 / 网关转发 / 广播。当然,直连的速度是最快的,内网直连主要依赖交换机的二层转发功能,也就是需要知道对方的 MAC 地址。那么只知道对方的 IP 地址却不知道 MAC 地址的时候怎么办呢?这就是 ARP 协议的工作内容了。ARP 的工作方式就是往 FF:FF:FF:FF:FF:FF 发送一个报文,问指定的 IP 主机,它的 MAC 地址是什么。注意 ARP 协议不是在 IP 协议之上的,它是一个和 IP 协议同级的三层协议。

以下是一个 ARP Request,它的 Source MAC 没有问题, DST MAC 是广播地址。
ARP Request

以下是一个 ARP Response
ARP Response
会标识 Source MAC 和 Dst MAC,那么交换机会帮忙送到指定的方向。交换机是怎么知道指定方向在哪里?交换机可以根据 ARP 或者 Source MAC 的来源方向 cache 相关记录。

如果你发送的包,不在当前子网中怎么办呢?这时候就要引入一个我们经常看见的名词:默认网关。比如我要 ping 一下百度,那么抓包后会看见如下信息:
ping 百度

其中 IP SRC 和 IP DST 都没问题,神奇的是二层的 Dst MAC 地址,它是我们默认网关的 MAC 地址,有了它,交换机就会把包发给网关
网关

上面说了一条原则,我们回顾下: 如果这个包的 DST IP 是另外一台主机,那么这一台主机会根据配置的规则(是否开启 ip forwarding),来确定是否转发或者丢弃包。

当网关收到这个 DST IP 是 180.101.50.188 的包的时候,根据路由表的设置,会把这个包发给 WAN 口,同时做一次 NAT(一般的家庭路由器默认开启,内网外网地址转换),把包从入户线上发出去。 这就是路由器的工作啦!下一次我们介绍 NAT

网络

想象这么个场景,城市里开了一家学校,有多位老师,然后有非常多的学生。这里学生的角色就是主机,每位学生都有不同的需求,学生在刚进入学校的时候,碰到问题不知道找谁解决就会大喊让自己的声音能让整个学校听见以便解决自己的问题。第一位学生开始大喊问问题,比如:下一节课是什么课程?我应该被分配到几班?坐在哪个位置?那么某一位老师知道答案就会回复学生这个问题的答案。一两个学生的问题对于校长影响可能不那么大,当学生规模变得很多,变到 25x(192.168.1.0/24) 个学生 或者 25x * 25x (192.168.0.0/16) 个学生的时候,因为学生的声音能被所有学生和老师听见,所以整个学校的所有人都要忙于「处理」每一位学生的问题 ———— 要么回应,要么无视。没有任何的空隙去处理自己手上的事情了,这就是「广播风暴」的概念。

所以其实「网络」要在满足需求的同时,尽可能地小。那么网络怎么「小」呢?其实很简单,把学生划分为班,让学生坐到班级里,然后把班级的门关上,并分配一个老师,负责不同班级的沟通就行。这里的一个班级就是一个子网,老师就是路由器的角色。

解决了三层上的子网划分问题,别忘了,我们还有二层上的广播,也就是 ff:ff:ff:ff:ff:ff 这个 MAC 地址的广播问题。解决二层广播风暴的方案就是一个既熟悉又陌生的词:VLAN

VLAN

VLAN 本身的原理其实很简单,在二层的以太网帧中多加入一段 802.1Q 定义的 Header 就搞定了
VLAN

VLAN 将交换机划分出多个区域,通过设置后,可以决定一个接口是否接收和发出特定 VLAN ID 的包。简单的理解:如果以太网帧里面的 VLAN ID 和接口 ID 不同,那么以太网帧的传输就容易出问题。关于 VLAN 以后有机会可以做更多的分享(因为我现在手上没有支持 VLAN 的交换机 =。=)

也就是说,如果配置不正确的话,设置了 VLAN 的网络,哪怕你是同一个 IPv4 子网,也会出现访问不通的现象,所以一般来说,VLAN 是配合子网划分来一起工作的。

最后

以上就是 IPv4 中网络的概念了,因为 IPv6 中没有广播的概念,所以本文的广播特指 IPv4 的广播。接下来会介绍 VLAN / NAT / 组播 / IPv6 组网相关的概念