题外话
本文实非大佬们的科普著作,而是犬余学习过程中的笔记略作润色,内容如有错误或不当之处,欢迎指正。
再此也小推一下本人的公众号,记录一下学习过程,立个flag:坚持学习,每周一更,欢迎监督~
引言:
在计算机网络中,数据传输的高效性和稳定性是至关重要的。为了实现这一目标,我们需要依赖一些特定的网络设备,如交换机和路由器。这两种设备在网络传输中起着不可或缺的作用,但它们之间有何区别?这便是今天要探讨的内容。
先说结论:
-
交换机工作在数据链路层,通过MAC地址进行寻址,而路由器则工作在网络层,通过IP地址进行寻址;
-
交换机主要用于局域网内部的数据传输,无法实现跨网络的数据传输。相比之下,路由器则可以在不同的网络之间进行数据传输;
-
路由器和交换机都能实现局域网的搭建,但交换机效率更高,更简单,相对来说也更便宜;
-
交换机还具有通过VLAN技术实现虚拟局域网划分的能力。虽然部分路由器也能实现这一功能,但在操作简便性上,交换机通常更具优势。
再看细节:
要理清楚路由器和交换机的区别,需要先从网络模型的结构入手,计算机网络结构有三种划分方式:OSI七层模型、TCP/IP四层模型、以及折中的TCP/IP五层模型
这三种模型的细节这里不做深究,这里以五层模型为例,我们需要略作了解的是五层模型中的网络层以及数据链路层:
网络层主要负责连接多个计算机网络,根据IP协议将上层交付的数据封装成IP报文,然后通过一定的算法进行路由的选择,将报文分组转发出去,达成在不同网络之间传输数据的目的;
而数据链路层主要是提供具体的数据传输服务的,根据HDLC协议或PPP协议等其他数据链路层协议,将网络层传输过来的数据报文封装成数据帧,按照MAC地址将数据帧发送给具体的设备。
简单了解了网络层和数据链路层的功能之后,路由器和交换机的区别就很好理解了:
路由器工作在五层网络模型中的网络层,是一种较复杂的网络设备, 作为网络层的中继系统,它不仅实现了网络层需要的全部功能,由于强大的功能和复杂的处理过程,其性能通常也比交换机更强,但相应的,一般情况下路由器的价格相对也会比交换机更贵一些;
交换机则工作在上述的数据链路层,除了根据各种数据链路层协议和数据帧中的MAC地址在局域网内寻址转发数据之外,交换机还可以通过VLAN技术实现对虚拟局域网的划分。并且由于交换机只需处理MAC地址,其处理速度通常比路由器更快。
总的来讲,交换机和路由器在网络设备中各有其独特的作用和优势。交换机主要用于提供高效的数据传输,而路由器则用于实现不同网络之间的通信。
继续扩展:
交换机如何根据MAC地址将数据帧转发给特定的机器:
交换机内部维护着一张帧交换表,这张表记录了MAC地址与对应的交换机接口。例如,当交换机收到目的地址为A的数据帧时,它会在帧交换表中找到对应的接口1,并通过此接口发送数据帧,从而完成基础的数据发送过程。那么,这张帧交换表是如何维护的呢?交换机又是如何知道A地址连接的是1端口呢?这就涉及到交换机的自学习功能:
如图,有四台设备ABCD分别连接交换机的1234四个接口,且交换机内部的帧交换表为空。此时,设备A要将数据帧发送给设备B。交换机收到的数据帧的来源MAC为A,目的MAC为B。交换机会将收到数据的1接口和来源MAC关联存储到帧交换表中(A->1)。由于帧交换表内没有记录B对应哪个接口,交换机会将数据帧广播给所有接口。设备C和设备D收到数据后,由于目的MAC地址不是自己的MAC地址,所以不会处理收到的数据。设备B收到数据后,确认数据是发给自己的,若B此时对A做出了响应,即B又向A发送了数据帧,此时响应帧的来源MAC地址为B,目的MAC地址为A。交换机收到响应帧后,就会将(B->2)记录到帧交换表中。而由于响应帧的目的MAC地址A已经存在于帧交换表中(A->1),交换机直接将响应帧发送到1接口。经过一轮数据的发送,交换机内部的帧交换表便记录下了A和B的MAC地址以及其对应的接口1和2。
需要注意的是,每台设备的MAC地址与交换机接口的关系并不是永久的(每个接口连接的设备都有可能被更换),因此帧交换表中的每条记录都有自己的有效时间,到期后记录会自动删除。
路由器如何根据IP地址将数据报文转发给特定的网络:
在网络通信中,主机之间的数据传输需要遵循特定的规则和流程。以两台主机A和B为例,我们来探讨它们如何进行数据交换。
首先,主机A的IP地址为192.168.0.84,子网掩码为255.255.255.0。主机B的IP地址为192.168.2.54,子网掩码同样为255.255.255.0。当主机A想要发送数据给主机B时,它首先需要确定目标主机是否位于同一网络中。
通过对IP地址和子网掩码进行按位与(AND)运算,主机A得到自己的网络地址为192.168.0.0,而对主机B的IP地址进行同样的运算后得到的网络地址为192.168.2.0。由于这两个网络地址不相同,我们可以判断出A和B不处于同一网络。在这种情况下,主机A无法直接将数据发送给B。它需要通过默认网关来转发数据。主机A会将数据包发送给路由器R,路由器R在收到数据包后,会首先检查数据包首部是否有错误。如果发现错误,路由器将丢弃该数据包并通知源主机A。如果数据包首部没有错误,路由器则会根据数据包中的目的IP地址,在其路由表中查找匹配的路由记录。若找到匹配路由,则转发给对应路由的下一跳地址,若找不到,则直接丢弃该数据报并通知源主机。
路由表是路由器用来决定数据包如何传输到目的地的关键信息集合。在Linux系统中,我们可以通过route -n命令查看主机维护的路由表:
这里我们主要关注的是第一列目的网络地址,第二列网关以及第三列子网掩码;
例如当我们需要向IP地址为192.168.122.25的主机发送数据时,系统会将这个IP地址与路由表中每条记录的子网掩码进行按位与运算。通过比较运算结果和记录中的网络地址,命中网络地址为192.168.122.0的记录,数据就会被发送到该记录对应的网关。值得注意的是,如上图该记录的网关地址为0.0.0.0,这表示目的地址与当前主机的virbr0网卡(上图的最后一列)处于同一网络,因此数据包可以直接在内部网络中传输,无需经过其他网络:
此外,路由表中还存在一条特殊的记录,即目的网络地址为0.0.0.0的记录:
这条记录被称为默认路由。当所有其他记录都无法与目标IP地址匹配时,数据包会与默认路由匹配。由于任何IP地址与子网掩码0.0.0.0进行按位与运算后都会得到0.0.0.0,这就确保了数据包能够匹配到默认路由。在这种情况下,数据包会被发送到默认路由指定的网关,例如192.168.153.2,这个网关地址就是我们的默认网关。
通过上述流程,主机A和B即使不在同一网络中,也能够通过路由器R和路由表中的信息实现数据的有效传输。