所有最新极客时间课程请加QQ群170701297

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

上一节,我们见证了IP地址的诞生,或者说是整个操作系统的诞生。一旦机器有了IP,就可以在网络的环境里和其他的机器展开沟通了。

故事就从我的大学宿舍开始讲起吧。作为一个八零后,我要暴露年龄了。

我们宿舍四个人,大一的时候学校不让上网,不给开通网络。但是,宿舍有一个人比较有钱,率先买了一台电脑。那买了电脑干什么呢?

首先,有单机游戏可以打,比如说《拳皇》。两个人用一个键盘,照样打得火热。后来有第二个人买了电脑,那两台电脑能不能连接起来呢?你会说,当然能啊,买个路由器不就行了。

现在一台家用路由器非常便宜,一百多块的事情。那时候路由器绝对是奢侈品。一直到大四,我们宿舍都没有买路由器。可能是因为那时候技术没有现在这么发达,导致我对网络技术的认知是逐渐深入的,而且每一层都是实实在在接触到的。

第一层(物理层)

使用路由器,是在第三层上。我们先从第一层物理层开始说。

物理层能折腾啥?现在的同学可能想不到,我们当时去学校配电脑的地方买网线,卖网线的师傅都会问,你的网线是要电脑连电脑啊,还是电脑连网口啊?

我们要的是电脑连电脑。这种方式就是一根网线,有两个头。一头插在一台电脑的网卡上,另一头插在另一台电脑的网卡上。但是在当时,普通的网线这样是通不了的,所以水晶头要做交叉线,用的就是所谓的1-32-6交叉接法

水晶头的第1、2和第3、6脚,它们分别起着收、发信号的作用。将一端的1号和3号线、2号和6号线互换一下位置,就能够在物理层实现一端发送的信号,另一端能收到。

当然电脑连电脑,除了网线要交叉,还需要配置这两台电脑的IP地址、子网掩码和默认网关。这三个概念上一节详细描述过了。要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是192.168.0.1/24,另一个是192.168.0.2/24,否则是不通的。

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

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

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

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

第二层(数据链路层)

你可能已经发现问题了。Hub采取的是广播的模式,如果每一台电脑发出的包,宿舍的每个电脑都能收到,那就麻烦了。这就需要解决几个问题:

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

这几个问题,都是第二层,数据链路层,也即MAC层要解决的问题。MAC的全称是Medium Access Control,即媒体访问控制。控制什么呢?其实就是控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱。这解决的是第二个问题。这个问题中的规则,学名叫多路访问。有很多算法可以解决这个问题。就像车管所管束马路上跑的车,能想的办法都想过了。

比如接下来这三种方式:

  • 方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分;

  • 方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议;

  • 方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议。著名的以太网,用的就是这个方式。

解决了第二个问题,就是解决了媒体接入控制的问题,MAC的问题也就解决好了。这和MAC地址没什么关系。

接下来要解决第一个问题:发给谁,谁接收?这里用到一个物理地址,叫作链路层地址。但是因为第二层主要解决媒体接入控制的问题,所以它常被称为MAC地址

解决第一个问题就牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标的MAC地址和源的MAC地址。

接下来是类型,大部分的类型是IP数据包,然后IP里面包含TCP、UDP,以及HTTP等,这都是里层封装的事情。

有了这个目标MAC地址,数据包在链路上广播,MAC的网卡才能发现,这个包是给它的。MAC的网卡把包收进来,然后打开IP包,发现IP地址也是自己的,再打开TCP包,发现端口是自己,也就是80,而nginx就是监听80。

于是将请求提交给nginx,nginx返回一个网页。然后将网页需要发回请求的机器。然后层层封装,最后到MAC层。因为来的时候有源MAC地址,返回的时候,源MAC就变成了目标MAC,再返给请求的机器。

对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过XOR异或的算法,来计算整个包是否在发送的过程中出现了错误,主要解决第三个问题。

这里还有一个没有解决的问题,当源机器知道目标机器的时候,可以将目标地址放入包里面,如果不知道呢?一个广播的网络里面接入了N台机器,我怎么知道每个MAC地址是谁呢?这就是ARP协议,也就是已知IP地址,求MAC地址的协议。

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

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

为了避免每次都用ARP请求,机器本地也会进行ARP缓存。当然机器会不断地上线下线,IP也可能会变,所以ARP的MAC地址缓存过一段时间就会过期。

局域网

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

打开游戏,进入“局域网选项”,选择一张地图,点击“创建游戏”,就可以进入这张地图的房间中。等同一个局域网里的其他小伙伴加入后,游戏就可以开始了。

这种组网的方法,对一个宿舍来说没有问题,但是一旦机器数目增多,问题就出现了。因为Hub是广播的,不管某个接口是否需要,所有的Bit都会被发送出去,然后让主机来判断是不是需要。这种方式路上的车少就没问题,车一多,产生冲突的概率就提高了。而且把不需要的包转发过去,纯属浪费。看来Hub这种不管三七二十一都转发的设备是不行了,需要点儿智能的。因为每个口都只连接一台电脑,这台电脑又不怎么换IP和MAC地址,只要记住这台电脑的MAC地址,如果目标MAC地址不是这台电脑的,这个口就不用转发了。

谁能知道目标MAC地址是否就是连接某个口的电脑的MAC地址呢?这就需要一个能把MAC头拿下来,检查一下目标MAC地址,然后根据策略转发的设备,按第二节课中讲过的,这个设备显然是个二层设备,我们称为交换机

交换机怎么知道每个口的电脑的MAC地址呢?这需要交换机会学习。

一台MAC1电脑将一个包发送给另一台MAC2电脑,当这个包到达交换机的时候,一开始交换机也不知道MAC2的电脑在哪个口,所以没办法,它只能将包转发给除了来的那个口之外的其他所有的口。但是,这个时候,交换机会干一件非常聪明的事情,就是交换机会记住,MAC1是来自一个明确的口。以后有包的目的地址是MAC1的,直接发送到这个口就可以了。

当交换机作为一个关卡一样,过了一段时间之后,就有了整个网络的一个结构了,这个时候,基本上不用广播了,全部可以准确转发。当然,每个机器的IP地址会变,所在的口也会变,因而交换机上的学习的结果,我们称为转发表,是有一个过期时间的。

有了交换机,一般来说,你接个几十台、上百台机器打游戏,应该没啥问题。你可以组个战队了。能上网了,就可以玩网游了。

这里,给你推荐一个课程,极客时间新上线了《从0开始学游戏开发》,由原网易游戏引擎架构师、资深底层技术专家蔡能老师,手把手带你梳理游戏开发的流程和细节,为你剖析热门游戏的成功之道。帮助普通程序员成为游戏开发工程师,步入游戏开发之路。你可以点击文末的图片进入课程。

小结

好了,今天的内容差不多了,我们来总结一下,有三个重点需要你记住:

第一,MAC层是用来解决多路访问的堵车问题的;

第二,ARP是通过吼的方式来寻找目标MAC地址的,吼完之后记住一段时间,这个叫作缓存;

第三,交换机是有MAC地址学习能力的,学完了它就知道谁在哪儿了,不用广播了。

最后,给你留两个思考题吧。

  1. 在二层中我们讲了ARP协议,即已知IP地址求MAC;还有一种RARP协议,即已知MAC求IP的,你知道它可以用来干什么吗?
  2. 如果一个局域网里面有多个交换机,ARP广播的模式会出现什么问题呢?

欢迎你留言和我讨论。趣谈网络协议,我们下期见!

精选留言

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

    2018-05-29 18:58

  • 没心没肺
    Hub:
    1.一个广播域,一个冲突域。
    2.传输数据的过程中易产生冲突,带宽利用率不高
    Switch:
    1.在划分vlan的前提下可以实现多个广播域,每个接口都是一个单独的冲突域
    2.通过自我学习的方法可以构建出CAM表,并基于CAM进行转发数据。
    3.支持生成树算法。可以构建出物理有环,逻辑无环的网络,网络冗余和数据传输效率都甩Hub好几条街。SW是目前组网的基本设备之一。
    2018-05-28 09:56
    作者回复

    2018-05-28 13:48

  • 阡陌
    不得不说,看留言也能学到很多东西
    2018-05-30 08:32
    作者回复

    高手还是很多的

    2018-05-30 10:28

  • 之前有无盘工作站,即没有硬盘的机器,无法持久化ip地址到本地,但有网卡,所以可以用RARP协议来获取IP地址。RARP可以用于局域网管理员想指定机器IP(与机器绑定,不可变),又不想每台机器去设置静态IP的情况,可以在RARP服务器上配置MAC和IP对应的ARP表,不过获取每台机器的MAC地址,好像也挺麻烦的。这个协议现在应该用得不多了吧,都用BOOTP或者DHCP了。
    2018-05-29 11:11
    作者回复

    对的,赞

    2018-05-29 11:36

  • 田豪杰
    一直坚持看到第五讲,我理解能力太差了,感觉还是一头雾水唉……
    2018-05-29 20:18
  • Z3
    当年玩魔兽经常出现他建房我看不见,我建房他能看见之类的问题。 这些可能是应用层的问题吗?

    2018-05-30 15:12
    作者回复

    这个,场景不在了,很难分析

    2018-05-30 17:57

  • 戴劼 DAI JIE🤪
    当年上课学习记住了交叉线和直连线的区别,工作后有一次两台机器对拷,发现网卡能自适应直连线,懵逼了。
    2018-06-07 01:37
    作者回复

    是的,现在自适应了

    2018-06-07 13:21

  • Amorfati
    1. rarp 除了通过mac地址去向dhcp之类服务要一个IP,其他没有想到有什么用,按照我的理解,如果非直联同一交换机,一个设备去找另一个设备,知道其mac地址而不知其ip,说不通

    2. 多个交换机,若pc1所连交换机为A,pc2,pc3所连交换机为B,AB直连,pc1找pc2的时候A会把直连B的端口缓存为pc2的mac地址,在过期时间内,pc1都没有办法找到pc3

    这个就是我的理解,如有误还请老师指正

    2018-05-28 11:03
  • kivensu
    是不是可以理解成交换机是具备学习功能的hub
    2018-08-25 16:43
  • 楊_宵夜
    连续看了好几篇!真的是大道至简!逻辑无比清晰!细节的深度刚刚好!赞!以太网也是个很有趣的东西,记得在知乎上看到过,最离奇的Bug都有哪些。其中一个关于以太网的是说,某个大学因为建筑施工,挖掘机的声波频率影响了光纤电缆中的信号传输,导致信号最多只能传输520多公里哈哈哈,也就是说520公里以外的服务器都访问不到了。
    这里细节肯定记错了,抛个砖,有兴趣的各位可以在知乎搜搜😂😂
    2018-06-08 13:13
    作者回复

    谢谢啦

    2018-06-08 16:29

  • 采菇凉的小🍄
    能说一下XOR异或具体操作什么吗?以及如何通过操作进行检验的
    2018-10-26 18:48
  • hujunr
    当时用的交换机,把一条网线的2端同时接到交换机了,结果所有电脑都连不上网了,这是为什么?
    2018-07-30 14:46
    作者回复

    arp广播塞满了

    2018-07-31 20:23

  • 匿名用户
    为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。当然机器会不断地上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。这就是路由表存在的意义?这里应该提一下啊…
    2018-06-03 07:18
  • 徐良红
    rarp现网似乎很少见,理论上应该是根据mac去查询对应的ip。
    一个局域网如果没有划分vlan,广播报文会传播到整个网内所有主机。

    请老师指正
    2018-05-28 23:47
  • MrGuo
    老师 mac缓存这些有个有效时间 如果有效时间还没到 但是局域网有其他设备改变了ip mac,这时缓存的mac不就不对了吗
    2018-11-23 09:24
    作者回复

    是的,这个时候会发送不成功,会刷新

    2018-11-23 12:27

  • wrzgeek
    网络小白,终于知道交换机和集线器的区别了,每天进步一点点,很开心
    2018-09-16 14:00
  • 远心
    用网线直接连接两台计算机的方式,如何知道另一台计算机的 MAC 地址?使用 ARP 协议吗?也就是说其实每一台计算机都安装着 ARP Client/Server 吗?
    2018-09-15 18:46
    作者回复

    是arp,内核里面就有这部分逻辑

    2018-09-15 21:40

  • 天天向⬆️
    老师,一直没明白你说的mac层是什么?是物理层吗?还是数据链路层?
    2018-07-12 15:27
    作者回复

    链路层,后面也解释了尴尬的叫法,但是约定俗成

    2018-07-12 20:11

  • magict4
    两台电脑直连的情况下,谁是网关呢?电脑可以充当网关吗?
    2018-06-18 07:41
    作者回复

    不用配置网关就能通

    2018-06-18 14:57

  • hunterlodge
    交换机学习后如果把两个网口的线互换会出现什么情况呢?交换机能识别出错误更新配置吗?
    2018-06-15 18:23
    作者回复

    会有超时时间,也会重新学习

    2018-06-15 19:37