1、交换原理
我们知道交换机有若干个物理端口,端口可以接入主机、路由或其他交换机。同时接入交换机的设备都有一个MAC地址,交换机内部存储着一张缓存表,表上记录着各个端口对应设备的MAC地址。这样当一台主机需要向另一台设备发送数据时,在数据帧中注明目的设备的MAC地址,交换机读取该MAC地址,查询缓存表找到对应的端口号,将帧直接发往该端口对应的设备即可。缓存表示意如下。
端口 | MAC地址 |
0 | 00-50-BA-CE-07-0C |
1 | 00-50-BA-CE-07-0D |
2 | 00-50-BA-CE-07-0E |
3 | 00-50-BA-CE-07-0F |
... |
2、交换机的功能
交换机主要有三个功能:交换、广播、学习。
交换:交换机收到主机A的帧,它查看该帧的目的MAC地址,然后查询缓存表中该MAC地址对应的端口,将帧转发到对应端口即可。
广播:交换机收到主机A的帧,它查看该帧的目的MAC地址,若目的MAC地址为FF-FF-FF-FF-FF-FF,则表明这是一个广播帧,交换机会将这个帧发往所有端口。若目的MAC地址在缓存表中找不到,交换机也会将这个帧广播到所有端口。
学习:最初缓存表中是没有任何MAC地址与端口的对应信息,当它收到某端口的帧时通过读取源MAC地址就知道了该端口对应的MAC地址并记录,通过这个过程就能把各端口对应的MAC地址都记录下来,对于未记录的目的MAC地址则采用广播的方式发出去。
3、交换机的级联
对于大型网络为接入更多设备必然出现级联的情况,然而即使再复杂的级联情况,交换机使用前面叙述的三种功能都能轻松应对。考虑下图所示的连接,SW1连接的主机A1要向SW2连接的主机B1发送数据。这里假设SW1和SW2中的缓存表都是空的。
1)当帧到达SW1时,SW1通过读取帧的源MAC地址获得了如下的缓存表。这里假设A2和A3后续也发出了类似的帧分别发往B2和B3,将其MAC加入缓存表方便后面分析。
MAC | 端口 | ||
00-50-BA-CE-07-A1 | 0 | ||
00-50-BA-CE-07-A2 | 5 | ||
00-50-BA-CE-07-A3 | 10 |
2)SW1再对比帧中目的MAC地址是否记录在缓存表中,当然是没有的。于是SW1向所有端口转发此帧。A2、A3通过查看目的MAC地址得知该帧不是发给自己的于是直接丢弃,与SW1连接的SW2自然也收到该帧,于是SW2通过读取帧的源MAC地址获得了如下的缓存表。因为A1、A2、A3的帧都只会通过SW2的端口0进来,所以这几个MAC地址对应的都是端口0。
MAC | 端口 | |
00-50-BA-CE-07-A1 | 0 | |
00-50-BA-CE-07-A2 | 0 | |
00-50-BA-CE-07-A3 | 0 |
3)SW2对比帧中目的MAC地址是否记录在缓存表中,当然没有。于是SW2向所有端口转发这些帧,主机B1、B2、B3通过查看目的MAC地址分别获取了发给自己的帧,同时SW2就得知了各端口连接主机的MAC地址并更新了其缓存表。
MAC | 端口 | |
00-50-BA-CE-07-A1 | 0 | |
00-50-BA-CE-07-A2 | 0 | |
00-50-BA-CE-07-A3 | 0 | |
00-50-BA-CE-07-B1 | 4 | |
00-50-BA-CE-07-B2 | 5 | |
00-50-BA-CE-07-B3 | 9 |
4)此时,若主机B1向A1返回一个帧,SW2通过查询缓存表就知道将帧发往其端口0,SW1获取该帧后也可通过查询缓存表得知应将帧发往端口4,于是主机A1就能快速收到来自主机B1的帧的。同时SW1也能得知主机B1、B2、B3的帧来自端口0并将其MAC地址与端口对应关系记录到缓存表中。
MAC | 端口 |
00-50-BA-CE-07-A1 | 4 |
00-50-BA-CE-07-A2 | 5 |
00-50-BA-CE-07-A3 | 10 |
00-50-BA-CE-07-B1 | 0 |
00-50-BA-CE-07-B2 | 0 |
00-50-BA-CE-07-B3 | 0 |
对于多层次的级联也是通过这种广播的方式来发现目标主机,交换机通过这种方式很好的实现了二层与三层的隔离,即帧转发完全没有涉及IP地址,仅靠MAC地址就能实现。
【MAC地址冲突的思考】通过前面的叙述我们知道,即使路由器工作在网络层使用IP寻址查找目标主机,而在帧传递时还是依赖于MAC地址,这也就是为什么需要对接入网络的网卡进行统一规划,避免MAC地址冲突。
【级联与广播】我们知道当交换机缓存表中没有目的MAC地址时就通过广播的方式传递该帧,其次交换机会定期删除不常用的缓存,那么对于多层次的交换机级联就有可能出现大量的广播包在网络中传递,对于环网甚至可能出现广播包的循环传递导致广播风暴。
【如何通过IP地址知道MAC地址】应用程序向外发送数据包时只指定目标的IP地址,那主机是如何得知IP对应的MAC地址呢,当然是前面讲过的ARP协议啦,也是通过广播的方式询问网络内所有主机的方式来得知目标IP的MAC地址。
【若目的IP位于其他网段】若数据要发往其他网段,主机会将目的MAC地址填为默认网关的MAC,则交换机会将帧发往路由器,路由器根据IP地址进行包转发,这就属于网络层的路由内容,后面会详细讲到。
【交换机与集线器】交换概念的提出是区别于早期的集线器技术,集线器的功能是将A端口收到的数据转发往其余所有端口,类似于广播的概念。这种传输技术缺点在于同一时间只能有一台接入的设备发送数据其他所有设备只能被动接收,对于大型网络这极大地影响传输效率。作为改良的交换技术它先是通过广播的方式获取网络中设备的MAC地址与端口的对应关系并记录到缓存表中,在以后的数据传输中就可以可以将A端口收到的数据转发往目标主机所在的端口,这就实现了接入的主机可将数据直接发往任意指定的其他主机,同时不影响其他接入主机的互相通信,极大地提升了效率。
【冲突域】我们将同一时间只能有一台设备发送数据的情况称为冲突域,即一台设备发送数据时其他所有互连的设备都只能接受不能发送,即为冲突,实际上只有集线器这种情况会形成一个冲突域。
【交换机隔离冲突域】交换机每一个端口的数据都可以并发的向另一个端口转发,所以说交换机可以隔离冲突域。考虑实际情况就是交换机不同端口上接入了若干个集线器,这些集线器分别组成了若干个冲突域,当这些集线器通过交换机连接时,交换机就将这些个冲突域隔离了,通俗点说就是不会形成更大的冲突域,表现形式就是各端口可自由通信。
【不同网段设备连接在交换机上能通信吗】若交换机上分别连接着多个网段的设备,根据交换机的转发原理,似乎是可以通信的,但实际上又确实不能通信,这是怎么回事呢?
我们先梳理一下两台设备互通的整个过程,首先主机A只知道主机B的IP地址不知道MAC地址的,IP报文到达网卡后,网卡可以通过ARP广播的方式通过IP地址找到MAC地址。得到MAC地址的网卡就可以组装帧啦,网卡将该帧发送给交换机,交换机通过MAC地址找到目标主机并转发。但是在ARP广播前发生了什么呢。
原来主机A自己本身有个路由表,表中记录着不同IP地址的数据该发往那个IP地址,其中同网段数据会标明直接从本地网卡出去,不同网段数据会默认发往网关。所以同网段的数据到达网卡后,网卡通过ARP查询IP地址对应的MAC地址并组成帧。不同网段的数据到达网卡后,网卡得知该数据是发往网关的,于是网卡填写目的MAC地址时就填写的是网关的MAC,最后组成的帧将被交换机发往网关。若主机没有配置网关,则发往不同网段的数据还没有到网卡就已经被丢弃了,并提示网络不可达。原因是在数据到达网卡前还要先查看自己的路由表,路由表上有注明的IP才能被发出否则不能发出(默认不认识的IP都是发往网关的)。
所以交换机上连接着的不同网段的设备是不能通信的。