时间:2025-05-12
本文重点讲解集线器、交换机、路由器的基本定义以及它们之间的关键区别,并结合个人理解,摒弃大量的专业词汇,从另一个角度来谈谈这三者存在的必要性。
目录
假设我们现在有一台电脑A,我们需要和另一台电脑B进行通信,那么此时只需要一根网线即可完成两台电脑间的通信。后来,我们又多了一台电脑C,如果需要实现电脑A、B、C之间的通信,只需要在每台电脑上连接两条网线即可,此时电脑A、B、C便构成了一组包含三个设备的小网络。随着越来越多的设备加入到这个小网络中,若还想实现设备两两之间持续通信,就需要在每个设备上开多个网口,这显然是不现实的,因为每台设备网口资源有限。于是,接下来我们就要介绍第一种设备来解决上面的这个问题,即:集线器。
1. 集线器
集线器是这个网络中的中间设备,我们将每台电脑的网线都插到这个设备上,由这个设备做转发,就可以实现同一网络内多台设备彼此之间的通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱。此时,每台设备只需要一根网线连接到集线器即可,数据包到达集线器后,集线器并不会直接将此数据包转发给目标设备,而是会将这个数据包转发给其余全部设备(广播),然后由这些设备自行去判断数据包是否是发给他们的(通过MAC地址),这一步非常无脑,但解决了问题,因此集线器被定义在了物理层。
2. 交换机
集线器这种广播行为,既不安全,也浪费网络资源,所以我们想在集线器基础上做一步改进,把收到的数据包直接转发给目标MAC地址指向的那台设备即可。换句话说,之前集线器只有广播的功能,现在我们在这个基础上,对集线器功能加以改进,让集线器知道收到的数据包该直接发给谁,变成一台“智能集线器”,我们将这个“智能集线器”称之为交换机,他被定义在了数据链路层。
交换机本质上是在内部维护了一张MAC地址表,表中记录了每一个MAC地址连接在交换机的哪个端口上,比如我们想使用电脑A通过交换机向电脑B发送数据包,数据包到达交换机后,交换机通过MAC地址表发现数据包中所含的MAC地址连接的端口号是1号,因此交换机就会把这份数据包直接通过端口1发给电脑B,而不是像集线器那样做广播。
我们将通过这种传输方式组成的网络称之为Ethernet以太网。
那么肯定有人想要问了。交换机是怎么知道电脑B连在了交换机的端口1上呢?换句话说,刚开始交换机的MAC地址表是空的,是怎么逐步建立的呢?我们假设一开始MAC地址表为空,电脑A给电脑B发送了一个含有源MAC和目标MAC的数据包,假设这个包从交换机的端口4进入了交换机,所以此时交换机就可以在 MAC地址表记录第一条数据:
MAC:aa-aa-aa-aa-aa-aa-aa
端口:4
交换机看目标MAC地址(bb-bb-bb-bb-bb-bb)在地址表中并没有映射关系,于是将此包发给了所有端口(这一步做法与集线器的广播一样),即发给了连接在交换机上的所有设备。之后,只有机器B收到了确实是发给自己的包,于是做出了响应,响应数据从端口1进入交换机,于是交换机此时在地址表中更新了第二条数据:
MAC:bb-bb-bb-bb-bb-bb
端口:1
由此,交换机内部便构建了两条地址表,即电脑A、B的MAC地址与交换机端口的映射关系。经过该网络中的机器不断地通信,交换机最终将MAC地址表建立完毕,但随着机器数量越多,交换机的端口也不够了,所以我们想了一个办法:只要将多个交换机连接起来(交换机与交换机之间存在一些通信连接),这个问题就轻而易举的解决了。
3. 路由器
假设我们有两台交换机,分别是交换机A和交换机B,交换机A连接了5台电脑,交换机B也连接了5台电脑,如果交换机A所连接的电脑1想和交换机B所连接的电脑7通信,那么数据包在到达交换机A后,还需要再将数据包发给交换机B,通过交换机B来发给电脑7。显然,这样虽然能解决一台交换机端口不够用的问题,但同时也引入了新的问题,即:交换机A也要保存交换机B所连设备的MAC地址表,这样交换机A才知道进来的数据包的目的设备是连接在自己身上的,还是在其他交换机上的,因此,交换机简单的互联会导致每台交换机都要维护一张巨大的MAC地址表。
因此,我们在想,能不能让很多台交换机都连接在一个设备上,这个设备就像电脑一样拥有自己独立的MAC地址,并且还能帮其他交换机做一次数据包的转发呢?这台设备就叫做路由器!
我们还以刚才那个例子来说明,唯一区别是,我们将交换机A和交换机B没有直接相连,而是将他们两个分别连接到了路由器上。当电脑1将数据包发送给了交换机A,交换机A会发现这个数据包的目的MAC地址并不在自己的MAC地址表上,所以A应该将数据包发给路由器,对吧?但是交换机A怎么判断什么样的数据包该发给路由器,什么样的数据包该通过自己直接发给目的设备呢?
我们很自然的会想到,如果数据包中的目的设备不连接在交换机A上,我们就直接将这个数据包丢给路由器不就好了?但是该怎么判断目的设备是否在交换机A上呢?由此,我们引入了IP地址这一概念,IP地址位于网络层,我们将一台交换机下的所有设备都通过软件配置成相同的IP地址前缀,从而由这些设备构成一个小的网络,称之为子网,当交换机A收到了不同IP地址前缀的数据包时,便可直接将此数据包丢给路由器去处理。至于交换机怎么判断发来的数据包的目的IP地址是否为自己的子网内,很简单,只需要将源IP和目的IP分别于子网掩码进行与运算即可,结果相等则说明双方都在一个子网,否则就在不同子网。比如我们配置子网掩码为:255.255.255.0,有如下运算:
A电脑:192.168.0.1 & 255.255.255.0 = 192.168.0.0
B电脑:192.168.0.2 & 255.255.255.0 = 192.168.0.0
C电脑:192.168.1.1 & 255.255.255.0 = 192.168.1.0
D电脑:192.168.1.2 & 255.255.255.0 = 192.168.1.0
那么A与B在同一个子网,C与D在同一个子网,但是A与C就不在同一个子网,与D也不在同一个子网,以此类推。
所以如果A给C发消息,A和C的IP地址分别和A机器配置的子网掩码做与运算,发现不相等,则A认为C和自己不在同一个子网,于是A把包直接发给路由器(或是网关),之后路由器怎么转发,A并不关心。
补充一下,我们不用MAC地址而引入了新的IP地址这一概念原因是:MAC地址是设备的物理属性,是不可变的,而IP地址是软件定义的,是可变的,我们可以改变各设备的IP地址,从而实现同一交换机下的所有设备的IP地址是具有相同前缀的,我们将这一组具有相同IP前缀的设备所构成的小网络称之为子网,也可以认为一台交换机所对应的小网络就是一个子网。
最后,路由器会查询自己内部存储的路由表(该表由路由算法计算得到,这里不展开讨论),并根据IP地址前缀,将数据包发给对应子网的交换机,后续就和第二小节中交换机内容一样了。
4. 梳理总结(重点!)
我们只是为了讲明白集线器、交换机、路由器三者的区别,实际上具体还有很多细节没有深挖,比如路由器构造路由表的路由算法、由IP地址获得MAC地址的ARP地址解析协议等等,但这并不影响我们理解这三者的功能。最后,我们分别从设备、交换机、路由器三者视角总结一下:
(1)假设我们是台设备,我们想在计算机网络中与另一台设备通信,首先我们要知道自己的IP以及对方的IP(不需要知道MAC地址!),并通过子网掩码判断我们是否在同一个子网内(同一台交换机连接),如果在同一子网内,我们就通过ARP协议获取对方MAC地址直接扔出去,如果不在同一子网内,我们就通过ARP获取默认网关(可以认为就是路由器,但实际上网关比路由器的概念更广,交换机、PC也可以做网关,只不过现代路由器通常集成了网关的功能)的MAC地址直接扔给网关(路由器)即可。
(2)假设我们是交换机,我们收到的数据包必须有目标MAC地址(可以通过ARP解析IP来获取),然后通过MAC地址表查映射关系,查到了就按照映射关系从我的指定端口发出去,查不到就所有端口都发出去(广播,以构建MAC地址表)。
(3)假设我们是台路由器(网关),我们收到的数据包必须有目标IP地址,然后通过路由表查映射关系,查到了就按照映射关系从我的指定端口发出去,即发给另一个子网,查不到则返回一个路由不可达的数据包。总结一下就是三张表:
(1)交换机中有MAC地址表用于映射MAC地址和它的端口;
(2)路由器中有路由表用于映射IP地址(段)和它的端口;
(3)电脑和路由器中都有ARP缓存表用于缓存IP和MAC地址的映射关系。
其中,MAC地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的;路由表是各种路由算法和人工配置逐步完善起来的;ARP缓存表是不断通过ARP协议的广播请求逐步完善起来的。
接下来我们拿上面这张图来讲解全部流程,这张图来自知乎作者闪客,侵删。
(1)首先A(192.168.0.1)通过子网掩码(255.255.255.0)计算出自己与F(192.168.2.2)并不在同一个子网内,于是决定发送给默认网关(192.168.0.254);
(2)A通过ARP找到默认网关192.168.0.254的MAC地址;
(3)A将源MAC地址(AAAA)与网关MAC地址(ABAB)封装在数据链路层头部,又将源IP地址(192.168.0.1)和目的IP地址(192.168.2.2)(注意这里千万不要以为填写的是默认网关的IP地址,从始至终这个数据包的两个IP地址都是不变的,只有MAC地址在不断变化)封装在网络层头部,然后发包(不管二者是否在同一子网内,数据包都要经由交换机,而不是直接发给路由器);
(4)交换机1收到数据包后,发现目标MAC地址是ABAB,转发给路由器1;
(5)数据包来到了路由器1,发现其目标IP地址是192.168.2.2,查看其路由表,发现了下一跳的地址是192.168.100.5(路由器2);
(6)此时路由器1需要再次匹配路由表,发现匹配到了端口为2(即获取了路由器2的MAC地址),于是将其封装到数据链路层,最后把包从2号口发出去;
(7)此时路由器2收到了数据包,看到其目的地址是192.168.2.2,查询其路由表,匹配到端口号为1,准备从1号口把数据包送出去;
(8)但此时路由器2需要知道192.168.2.2的MAC地址了,于是查看其ARP缓存,找到其MAC地址为FFFF,将其封装在数据链路层头部,并从1号端口把包发出去。
(9)交换机3收到了数据包,发现目的MAC地址为FFFF,查询其MAC地址表,发现应该从其6号端口出去,于是从6号端口把数据包发出去。
(10)F最终收到了数据包!并且发现目的MAC地址就是自己,于是收下了这个包
注意,从始至终数据包中两个IP地址(即源IP和目标IP)都是不变的,只有MAC地址在不断变化,数据包在设备、交换机、路由器之间来回传输,都是通过MAC地址实现的,即每经过一个节点,该节点都会判断数据包下一去向,然后修改目标MAC地址,IP地址全程不变!