交换机内部原理

 

交换机的设计是将网络包原样转发到目的地,下图 就是它的内部结构 , 我们边看图边讲 。

 

                           

怎么用wireshark在交换机上抓包_交换机内部原理

 

 

      首先, 信号到达网线接口 , 并由 PHY ( MAU ) 模块进行接收 , 这一部分和集线器是相同的。 也就是说 , 它的接口和 PHY ( MAU ) 模块也是以MDI-X 模式进行连接的 , 当信号从双绞线传入时 , 就会进入 PHY ( MAU )模块的接收部分。 接下来, PHY ( MAU ) 模块会将网线中的信号转换为通用格式 , 然后传递给 MAC 模块 。 MAC 模块将信号转换为数字信息 , 然后通过包末尾的FCS 校验错误 , 如果没有问题则存放到缓冲区中 。 这部分操作和网卡基本相同, 大家可以认为交换机的每个网线接口后面都是一块网卡 。 网线接口和后面的电路部分加在一起称为一个端口,也就是说交换机的一个端口就相当于计算机上的一块网卡。

 

        但交换机的工作方式和网卡有一点不同 。网 卡本身具有 MAC 地址 , 并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的, 如果不是发给自己的则丢弃 ; 相对地 , 交换机的端口不核对接收方 MAC 地址 , 而是直接接收所有的包并存放到缓冲区中 。 因此 , 和网卡不同, 交换机的端口不具有 MAC 地址 。 交换机端口的 MAC 模块不具有 MAC 地址。 将包存入缓冲区后, 接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了 。 MAC 地址表主要包含两个信息,一个是设备的 MAC 地址,另一个是该设备连接在交换机的哪个端口上 。 以图 中的地址表为例 , MAC 地址和端口是一一对应的 , 通过这张表就能够判断出收到的包应该转发到哪个端口。

 

     举个例子 , 如果收到的包的接收方 MAC 地址为 00-02-B3-1C-9C-F9 , 则与图中mac 表的第 3 行匹配 , 根据端口列的信息, 可知这个地址位于 8 号端口上 , 然后就可以通过交换电路将包发送到相应的端口了 。

 

 

 

交换机交换电路

 

     现在来看看交换电路到底是如何工作的。 交换电路的结构如图 所示, 它可以将输入端和输出端连接起来 。 其中 , 信号线排列成网格状 , 每一个交叉点都有一个交换开关, 交换开关是电子控制的 , 通过切换开关的状态就可以改变信号的流向。 交换电路的输入端和输出端分别连接各个接收端口和发送端口,网络包通过这个网格状的电路在端口之间流动 。

 

      举个例子, 假设现在要将包从 2 号端口发送到 7 号端口 , 那么信号会从输入端的 2 号线进入交换电路 , 这时 , 如果让左起的 6 个开关水平导通 , 然后将第 7 个开关切换为垂直导通 , 信号就会像图上一样流到输出端 7 号线路 ,于是网络包就被发送到了 7 号端口 。 每个交叉点上的交换开关都可以独立工作,因此只要路径不重复,就可以同时传输多路信号 。 当网络包通过交换电路到达发送端口时 , 端口中的 MAC 模块和 PHY ( MAU ) 模块会执行发送操作 , 将信号发送到网线中 , 这部分和网卡发送信 号的过程是一样的 。 根据以太网的规则 , 首先应该确认没有其他设备在发 送信号 , 也就是确认信号收发模块中的接收线路没有信号进来 。 如果检测 到其他设备在发送信号 , 则需要等待信号发送完毕 ; 如果没有其他信号 , 或者其他信号已经发送完毕 , 这时就可以将包的数字信息转换为电信号发 送出去 。 在发送信号的过程中 , 还需要对接收信号进行监控 , 这一点和网卡也是一样的。如果在发送过程中检测到其他设备发送信号,就意味着出现了信号碰撞,这时需要发送阻塞信号以停止网络中所有的发送操作,等待一段时间后再尝试重新发送 , 这一步和网卡也是一样的 。  

      交换机只将包转发到具有特定 MAC 地址的设备连接的端口 , 其他端口都是空闲的。 如图 中的例子所示 , 当包从最上面的端口发送到最下面的端口时, 其他端口都处于空闲状态 , 这些端口可以传输其他的包 , 因此交换机可以同时转发多个包 。 相对地, 集线器会将输入的信号广播到所有的端口 , 如果同时输入多个信号就会发生碰撞, 无法同时传输多路信号 , 因此从设备整体的转发能力来看, 交换机要高于集线器 。

 

 

 

怎么用wireshark在交换机上抓包_交换机内部原理_02

 

 

交换机MAC地址表

 

        交换机在转发包的过程中, 还需要对 MAC 地址表的内容进行维护 , 维护操作分为两种。

   

        第一种是收到包时,将发送方 MAC 地址以及其输入端口的号码写入MAC 地址表中 。 由于收到包的那个端口就连接着发送这个包的设备 , 所以只要将这个包的发送方 MAC 地址写入地址表 , 以后当收到发往这个地址的包时, 交换机就可以将它转发到正确的端口了 。 交换机每次收到包时都会执行这个操作, 因此只要某个设备发送过网络包 , 它的 MAC 地址就会被记录到地址表中。

 

       另一种是删除地址表中某条记录的操作 , 这是为了防止设备移动时产生问题。 比如 , 我们在开会时会把笔记本电脑从办公桌拿到会议室 , 这时设备就发生了移动。 从交换机的角度来看 , 就是本来连接在某个端口上的笔记本电脑消失了。 这时如果交换机收到了发往这台已经消失的笔记本电脑的包, 那么它依然会将包转发到原来的端口 , 通信就会出错 , 因此必须想办法删除那些过时的记录。 然而 , 交换机没办法知道这台笔记本电脑已经从原来的端口移走了。 因此地址表中的记录不能永久有效 , 而是要在一段时间不使用后就自动删除。 那么当笔记本电脑被拿到会议室之后, 会议室里的交换机又会如何工作呢? 只要笔记本电脑连接到会议室的交换机 , 交换机就会根据笔记本电脑发出的包来更新它的地址表。 因此 , 对于目的地的交换机来说 , 不需要什么特别的措施就可以正常工作了。综合来看, 为了防止终端设备移动产生问题 , 只需要将一段时间不使用的过时记录从地址表中删除就可以了。

 

 特殊情况:交换机与集线器一起工作的情况

 

     上面介绍了交换机的基本工作方式 , 下面来看一些特殊情况下的操作 。

 

     比如, 交换机查询地址表之后发现记录中的目标端口和这个包的源端口是同一个端口 。 当像图中 这样用集线器和交换机连接在一起时就会遇到这样的 情况, 那么这种情况要怎么处理呢 ?

 

     首先 , 计算机 A 发送的包到达集线器后会被集线器转发到所有端口上, 也就是会到达交换机和计算机 B ( 图 ① )。 这时, 交换机转发这个包之后 , 这个包会原路返回集线器 ( 图 ② ), 然后, 集线器又把包转发到所有端口(集线器广播) , 于是这个包又到达了计算机 A 和计算 机 B 。 所以计算机 B 就会收到两个相同的包 , 这会导致无法正常通信 。

 

     因此,当交换机发现一个包要发回到原端口时,就会直接丢弃这个包 。 还有另外一种特殊情况, 就是地址表中找不到指定的 MAC 地址 。 这可能是因为具有该地址的设备还没有向交换机发送过包, 或者这个设备一段时间没有工作导致地址被从地址表中删除了。 这种情况下 , 交换机无法 判断应该把包转发到哪个端口, 只能将包转发到除了源端口之外的所有端口上, 无论该设备连接在哪个端口上都能收到这个包 。 这样做不会产生什么问题, 因为以太网的设计本来就是将包发送到整个网络的 , 然后只有相应的接收者才接收包, 而其他设备则会忽略这个包。

 

怎么用wireshark在交换机上抓包_交换机交换电路_03

 

     有人会说 :“ 这样做会发送多余的包 , 会不会造成网络拥塞呢 ?” 其实完全不用过于担心, 因为发送了包之后目标设备会作出响应 , 只要返回了响应包, 交换机就可以将它的地址写入地址表 , 下次也就不需要把包发到所有端口了。 局域网中每秒可以传输上千个包 , 多出一两个包并无大碍。此外, 如果接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口之外的所有端口。