你管这破玩意叫网络?
视频通过生动形象的类比,深入浅出地讲解了集线器、交换机、路由器等网络设备的工作原理及MAC地址的作用。
UP主: 飞天闪客 · 时长: 12:22 · 🔗 B站原视频
标签: 计算机网络 · 网络协议 · 交换机 · 路由器 · 硬核科普
从网线直连到集线器
假如你是一台电脑,名字就叫A。这个时候又来了一台电脑B,你们之间用一根网线一连,就可以这样突突地聊天了。不久之后又来了一台电脑C,那你们三个想互相聊天该怎么办?很简单,你们每个人身上开两个网口,用三根网线一连就可以了。但是随着越来越多的人加入,你发现身上开的网口实在是太多了,中间的网线也是密密麻麻十分混乱,要是哪根连错了都不知道。于是你们发明了一个中间设备,把各自的网线都插到这个设备上,再用这个设备做个转发,这样网线多的问题就解决了。你给它取名叫集线器,它仅仅是无脑将传进来的一个数据包转发到所有的出口,不做任何处理。
MAC地址与交换机的诞生
有人可能会说了,这样的话,假如A只想和B聊天,岂不是被所有人都看到了?而且大家也不知道是发给谁的。这还真让你给说对了。这个时候你们就想了个办法,给每个人都起了个新名字,叫MAC地址。这样当A发送数据给B时,在发送的数据包前面加上“从哪来、到哪去”这两个信息就可以了。作为接收方的电脑,看到目标MAC地址不是发给自己的,就可以忽略了。但又有人会说了,这样也不太好呀,其他人还是能看到不属于自己的数据包,想想都觉得奇怪。如果把这个集线器弄得更智能一些,只发送给其中一台电脑就好了。那这个神奇的设备很快就被你发明出来了,你给它取名叫交换机。虽然长得差不多,但是它稍稍有了点智能。在交换机的内部维护着一张MAC地址表,记录着每一个设备的MAC地址连接在它的哪一个端口上。这时候A给B发一个数据包,到了交换机这儿一查表,一看B设备连接在5号端口上,于是就把数据包从5号口直接丢出去了,后面就不管了。
交换机的学习机制
这个时候又有人会问了,最开始的时候这个MAC地址表应该是空的吧?怎么样一点点建立起来的呢?直接看,一开始的时候啥也没有,其实交换机和集线器就没什么区别,发送给所有人。不过交换机知道学习,偷偷把流经自己的数据包携带的信息给记录下来了。等到B响应这个数据包时,又偷偷把B这个信息给记录下来了。下次A再给B发数据包的时候,表里面就有映射关系了。这就说明一个极为深刻的道理:学习可以让我们进步。
突破交换机瓶颈:路由器的引入
好景不长,随着电脑的数量越来越多,交换机的端口也不够用了。这可怎么办呢?聪明的你发现,只要将多个交换机连接起来,这个问题就轻而易举地搞定了。给你两秒钟想想看为什么。但是请注意哦,上面那根蓝色的线,最终在左边的交换机中的MAC地址表可不是一条记录,而是要把右边的E、F、G、H四台机器与该端口(也就是6号端口)的映射全部记录在这个表中。同样对于右边的交换机也是如此。所以虽然看起来交换机的端口数量够用了,但是里面维护的MAC地址表确实是越来越大了。随着电脑数量越来越多,总会有一天出问题的,这可怎么办呢?这个时候你仔细思考了一下,发现问题的根本在于,连出去的那根蓝色的网线后面不知道有多少个设备不断地连接进来,从而使得这个表越来越大。那我们何不让这根蓝色的网线接入一个新的设备?这个设备就跟电脑一样,有自己独立的MAC地址,而且还能同时帮我们把数据包做一次转发。这个设备就是路由器。它的功能就是作为一台独立的、拥有MAC地址的设备,并且可以帮我们把数据包做一次转发。注意,路由器的每个端口都有独立的MAC地址。现在左边的交换机的MAC地址表中,只要多出一条路由器MAC地址与其端口的映射关系,就可以成功地把数据包转交给路由器了,后面的事情暂且不管。
为什么需要IP地址?
不过这里有个问题,如何做到把发送给E、F、G、H的数据包通通先发给路由器呢?当然你也可以一个一个地都记录下来,但是又会出现数量太多的问题,最好就记录一条规则就能把这个事说明白。这个时候你想了一个巧妙的办法,在给这些电脑的MAC地址命名上做些手脚:左边的电脑都以LL开头,右边的电脑都以RR开头。这时候我们就可以说,将目标MAC地址为RR开头的通通先发给路由器。这样是否可行呢?显然不可以。我们先从现实的MAC地址结构中入手。MAC地址也叫物理地址、硬件地址,长度为48位。其中前24位代表网络硬件制造商的编号,后面24位是该厂家自己分配的,一般表示序列号。MAC地址在全世界范围内都是唯一的,就像每个人的身份证号码一样。所以如果要实现刚刚的想法,你就得要求厂商在生产这些电脑并烧录它们的MAC地址时,提前按照你规划的网络来定这个MAC地址,这显然是不现实的。既然固定的MAC地址不能改了,那我们就给电脑起一个新的、随时都能改的名字。我们先用一个32位的0101编号,你觉得有些不清晰,于是把它们分成四个部分,中间用点儿相连;你觉得还不清晰,于是把它们转成十进制。最后,你给这个地址取了一个响亮的名字——IP地址。
网络层与路由转发过程
回到之前的网络结构,这里的电脑的数量太多了,可以先简化一点,只剩四台。我们给这四台电脑分别配置一个IP地址,注意看它们是不一样的哦。回到刚刚的需求,我想把数据包发送给C或者D,那么就可以用这样一句话来描述:将IP地址为192.168.0开头的全部先发给路由器,之后的事就交给它了。现在两个设备之间的传输,除了之前数据链路层头部的信息之外,还需要再加一个网络层的头部。假如A给B发送数据,由于它们直接连着交换机,所以A发出去这样的数据包通过数据链路层就传过去了,其实网络层在这里并没有体现出作用。但假如A给C发送数据,A就需要先转交给路由器,然后再由路由器转交给C。先不管过程,A要发给C,所以网络层的目标IP地址先写上C的。由于最底层的传输仍然需要依赖数据链路层,所以包是分成两段来发送的。A先要把数据包发给路由器,所以数据链路层的目标MAC地址要改成路由器的,直接发个包,顺利地通过交换机传给了路由器。这时候路由器有个神奇的功能,它可以根据目标IP地址把目标MAC地址给改了,就像这样。然后路由器把包发出去,通过另一个交换机,最终成功发给了C。
子网与子网掩码的作用
这时候你一定产生了很多疑问。别急,让我们一个一个来。第一个问题:A给C发送数据包,怎么就知道需要通过路由器来做转发呢?答案:子网。如果源IP与目的IP在同一个子网,直接将包通过交换机发出去就可以了;如果源IP与目的IP不在同一个子网,那交给路由器去处理。接下来就只剩一个问题了,什么叫在同一个子网?回到这里,对A来说,这三个就在同一个子网,这两个就不在同一个子网。用更严谨的语言来表示就是,对A来说,只要IP地址是192.168.0开头的,就算在同一个子网,否则就是处在不同的子网。现在你是用人话说明白了,但是对于傻呵呵的计算机来说,怎么表达刚刚这个意思呢?子网掩码。假如某台机器的子网掩码是255.255.255.0,这就表示将源IP与目的IP分别同这个子网掩码进行“与运算”,相等则是在同一个子网,不相等则是在不同的子网,就这么简单。举个例子,比如电脑A算下来就是192.168.0.0,剩下的B、C、D算下来分别是这个样子。如果你们还没有发现区别,那我再给你放大一下。这么细致,给个三连不过分吧兄弟们?所以对于A来说,B和它就在同一个子网,C和它就不在同一个子网。按照这个逻辑,回到刚刚的网络结构中,左边就属于同一个子网,右边也属于同一个子网,但是左右两边属于不同的子网。所以如果A给C发消息,A和C的IP地址分别与上A的机器配置的子网掩码,发现不相等,则A认为C和自己不在同一个子网,于是就把包先发给路由器,就不管了。之后再怎么发,A是不关心的。
默认网关与ARP协议
现在判断出什么时候发给路由器了,自然就产生了下一个问题:A怎么就知道哪个设备是路由器呢?答案:在A上要设置默认网关。默认网关就是个IP地址,像这样配置了这个东西,就是在告诉电脑A,当遇到不在同一个子网的电脑时,先把包发给这个IP地址。在这里自然就指先发给路由器,仅此而已。现在我们又知道什么时候发给路由器了,也知道路由器的IP地址是什么了,但是问题来了:我怎么知道路由器的MAC地址呢?ARP。其实不光是路由器,我们回到刚刚的场景把问题简化一下。之前A发送数据包给B时,我们直接把B的MAC地址写在了数据链路层,但实际上一开始的时候,我们并不知道B的MAC地址是多少,只知道B的IP地址是多少。那这个时候是谁把B的MAC地址填在这的呢?答案其实已经呼之欲出了,一定是有一个机制可以将某个IP地址映射到MAC地址上,这个机制就是ARP协议。和之前的MAC地址表类似,电脑A里面会存着一张ARP缓存表,记录着IP与MAC地址的对应关系。同样,一开始这个表是空的,需要经过一轮ARP请求将表中的数据填上。这个时候A再想给B发送数据包,就可以直接把MAC地址写在数据链路层了。
路由表与网络传输全景总结
回到之前的图,现在我们已经可以成功把任何一个数据包发出去了。在同个子网,就通过交换机在数据链路层的以太网内发到目的地;不在同一个子网,就把包丢给路由器。那下一个问题又呼之欲出了:路由器怎么把包再往下传递呢?答案:路由表。还记得我们之前A给C发送数据包的过程吗?首先先把包发给路由器,路由器中有个路由表,一看地址范围是192.168.0开头的,于是决定从1号口发出去。当然这个时候路由器也要做一下ARP,先把C的MAC地址拿到,然后把包丢出去就可以了,剩下就是以太网内的事情了。这个路由表中还有可能有一个下一跳地址,表示如果这个包不能直接传到目的地,可以再转交给下一个路由器来处理。A和C之间可能要经历好多好多好多路由器中间协作,才能把包传过去。
总结一下,到目前为止其实就几条规则。我们从各个节点的视角来看:
- 电脑视角:首先我要知道我的IP地址以及对方的IP地址,通过子网掩码判断我们是否在同一个子网。在同一个子网,就通过ARP获取对方的MAC地址直接扔出去;不在同一个子网,就通过ARP获取默认网关的MAC地址直接扔出去。
- 交换机视角:我收到的数据包必须拥有目标MAC地址。通过MAC地址查映射关系,查到了就按照映射关系从我的指定端口发出去;查不到,所有的端口发出去。
- 路由器视角:我收到的数据包必须拥有目标MAC地址。通过路由表查找映射关系,查到了就按照映射关系从我的指定端口发出去;查不到,则返回一个路由不可达的数据包。
如果你嗅觉足够敏锐,应该可以感受到下面这句话:网络层本身没有传输包的功能,包的实际传输是委托给数据链路层(也就是以太网中的交换机)来实现的。涉及到的三张表分别是:交换机中有MAC地址表,用于映射MAC地址和它的端口;路由器中有路由表,用于映射IP地址和它的端口;电脑和路由器中都有ARP缓存表,用于缓存IP和MAC地址的映射关系。
总结完毕。知道了以上这些内容,目前网络上两个节点是如何发送数据包的,这个过程就可以完全解释通了。这里的每个设备所需要做的事情都很简单,从集线器到交换机到路由器,它们的任务单一而明确。然而正是这些看似简单的个体,共同撑起了这座跨越时空的数字奇迹,这就是互联网。