5、从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?

开篇词

一旦机器有了 IP,就可以在网络的环境里和其他的机器展开沟通了。

故事就从我的大学宿舍开始讲起吧。

  • 我们宿舍四个人,大一的时候学校不让上网,不给开通网络。
  • 但是,宿舍有一个人比较有钱,率先买了一台电脑。那买了电脑干什么呢?
  • 首先,有单机游戏可以打,比如说《拳皇》。两个人用一个键盘,照样打得火热。
  • 后来有第二个人买了电脑,那两台电脑能不能连接起来呢?你会说,当然能啊,买个路由器不就行了。

5.1、第一层(物理层)

使用路由器,是在第三层上。

我们先从第一层物理层开始说。

电脑连电脑,除了网线要交叉,还需要配置这两台电脑的 IP 地址、子网掩码和默认网关。

要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是 192.168.0.1/24,另一个是 192.168.0.2/24,否则是不通的。

这里我想问你一个问题,两台电脑之间的网络包,包含 MAC 层吗? 当然包含,要完整。IP 层要封装了 MAC 层才能将包放入物理层。

到此为止,两台电脑已经构成了一个最小的局域网,也即 LAN。 可以玩联机局域网游戏啦!

等到第三个哥们也买了一台电脑,怎么把三台电脑连在一起呢?

先别说交换机,当时交换机也贵。

  • 有一个叫做 Hub 的东西,也就是集线器。
  • 这种设备有多个口,可以将宿舍里的多台电脑连接起来。
  • 但是,和交换机不同,集线器没有大脑,它完全在物理层工作。
  • 它会将自己收到的每一个字节,都复制到其他端口上去。 这是第一层物理层联通的方案。

5.2、第二层(数据链路层)

问题:

Hub 采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。

需要解决几个问题:

  1. 这个包是发给谁的?谁应该接收?
  2. 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
  3. 如果发送的时候出现了错误,怎么办?

这几个问题,都是第二层,数据链路层,也即 MAC 层要解决的问题。

MAC 的全称是 Medium Access Control,即媒体访问控制控制什么呢?

其实就是**控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱。**这解决的是第二个问题。

这个问题中的规则,学名叫多路访问。有很多算法可以解决这个问题。就像车管所管束马路上跑的车,能想的办法都想过了。

解决第二个问题:

接下来这三种方式:

  • 方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分
  • 方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议
  • 方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这

解决第一个问题: 发给谁,谁接收?

用到一个物理地址,叫作链路层地址。常被称为MAC 地址

牵扯到第二层的网络包格式对于以太网

  • 第二层的最开始,就是目标的 MAC 地址源的 MAC 地址
  • 接下来是类型,大部分的类型是 IP 数据包;
  • IP 里面包含 TCP、UDP,以及 HTTP 等,这都是里层封装的事情。
  • 第二层的最后面是 CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误主要解决第三个问题。

还有一个问题:

源机器知道目标机器的时候,可以将目标地址放入包里面,如果不知道呢

一个广播的网络里面接入了 N 台机器,我怎么知道每个 MAC 地址是谁呢

这就是 ARP 协议,也就是已知 IP 地址,求 MAC 地址的协议

mac本地搭局域网git仓库_缓存

在一个局域网里面,当知道了 IP 地址,不知道 MAC 怎么办呢?靠“吼”。

mac本地搭局域网git仓库_网络安全_02

广而告之,**发送一个广播包,谁是这个 IP 谁来回答。**具体询问和回答的报文就像下面这样:

mac本地搭局域网git仓库_网络协议_03

为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存

当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期

5.3、局域网

至此我们宿舍四个电脑就组成了一个局域网。用 Hub 连接起来,就可以玩局域网版的《魔兽争霸》了。

mac本地搭局域网git仓库_mac本地搭局域网git仓库_04

这种组网的方法,对一个宿舍来说没有问题,但是一旦机器数目增多,问题就出现了。

因为 Hub 是广播的不管某个接口是否需要,所有的 Bit 都会被发送出去,然后让主机来判断是不是需要。

这种方式路上的车少就没问题,车一多,产生冲突的概率就提高了。而且把不需要的包转发过去,纯属浪费。

看来 Hub 这种不管三七二十一都转发的设备是不行了,需要点儿智能的。

因为每个口都只连接一台电脑,这台电脑又不怎么换 IP 和 MAC 地址,只要记住这台电脑的 MAC 地址,如果目标 MAC 地址不是这台电脑的,这个口就不用转发了。

谁能知道目标 MAC 地址是否就是连接某个口的电脑的 MAC 地址呢?

这就需要一个能把 MAC 头拿下来,检查一下目标 MAC 地址,然后根据策略转发的设备—二层设备,交换机

交换机怎么知道每个口的电脑的 MAC 地址呢?

交换机会学习

学习方法:

  • 一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。
  • 此时,交换机会记住,MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的,直接发送到这个口就可以了;
  • 学习一段时间后,就有了整个网络的一个结构了,这个时候,基本上不用广播了,全部可以准确转发
  • 当然,每个机器的 IP 地址会变,所在的口也会变,因而交换机上的学习的结果,我们称为转发表,是有一个过期时间的

小结

  1. MAC 层是用来解决多路访问的堵车问题的;
  2. ARP 是通过吼的方式来寻找目标 MAC 地址的,吼完之后记住一段时间,这个叫作缓存;
  3. 第三,交换机是有 MAC 地址学习能力的,学完了它就知道谁在哪儿了,不用广播了。

思考

1、ARP 协议,即已知 IP 地址求 MAC;还有一种 RARP 协议,即已知 MAC 求 IP 的,你知道它可以用来干什么吗?

之前有无盘工作站,即没有硬盘的机器,无法持久化ip地址到本地,但有网卡,所以可以用RARP协议来获取IP地址。

RARP可以用于局域网管理员想指定机器IP(与机器绑定,不可变),又不想每台机器去设置静态IP的情况;

可以在RARP服务器上配置MAC和IP对应的ARP表,不过获取每台机器的MAC地址,好像也挺麻烦的。

2、如果一个局域网里面有多个交换机,ARP 广播的模式会出现什么问题呢

  • ARP广播时,交换机会将一个端口收到的包转发到其它所有的端口上。
  • 比如数据包经过交换机A到达交换机B,交换机B又将包复制为多份广播出去。
  • 如果整个局域网存在一个环路,使得数据包又重新回到了最开始的交换机A,这个包又会被A再次复制多份广播出去。
  • 如此循环,数据包会不停得转发,而且越来越多,最终占满带宽,或者使解析协议的硬件过载,行成广播风暴。