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