下面将谈谈MAC地址学习这块的东西,欢迎大家一块探讨,补充!
图1 网络拓扑结构
PC1要与PC2通信,基于以太网通信中,必须在数据帧中指定目标MAC地址才可以进行正常通信。
假定PC1的arp表项中没有对应通信的PC2的MAC地址B与IP映射,那么PC1将广播一个“arp请求”,交换机通过port1 接收到PC1广播的arp请求报文,通过查找交换机内部的转发表,发现没有PC1的MAC地址A与端口1对应关系(假定交换机处于初始化状态),如表1
表1 初始化的交换机转发表
MAC地址表 |
|
MAC地址 |
端口 |
|
|
|
|
|
|
于是,交换机会将PC1发来的数据帧的源MAC地址A与端口1的对应关系更新到自己的转发表中,如表2;
表2 更新PC1的MAC地址
MAC地址表 |
|
MAC地址 |
端口 |
MAC:A |
Port1 |
|
|
|
|
接着交换机会广播arp请求(flooding)到除了接收端口的的其他端口,如图2
图2 arp泛洪
PC2的情况:
PC2接收到arp请求后,通过对比目的IP与自己IP,如果相等,则会将PC1的MAC地址A与IP映射关系更新到自己的arp表项中,并且会以单播的形式通过端口2返回一个“arp应答”,交换机接收到此arp应答后,会将PC2发来的数据帧的源MAC地址B与对应的端口2更新到自己的转发表中,如表3
表3 更新PC2的MAC地址
MAC地址表 |
|
MAC地址 |
端口 |
MAC:A |
Port1 |
MAC:B |
Port2 |
|
|
接着交换机查看自己的转发表发现arp应答目标MAC地址A对应端口1,如表4,
表4 查找MAC:A
MAC地址表 |
|
MAC地址 |
端口 |
MAC:A |
Port1 |
MAC:B |
Port2 |
|
|
于是将此arp应答请求通过端口1发送给PC1,PC1得到arp应答,将PC2 的MAC地址B与IP映射关系更新到自己的arp表项中。PC1发送由链路层封装的数据帧给PC2,如图3
图3 PC1向PC2发送数据帧
经过交换机,交换机通过转发表发现目的MAC地址是B,如表5,对应端口为2,于是通过端口2 将此数据帧传给PC2。
表5 数据转发
MAC地址表 |
|
MAC地址 |
端口 |
MAC:A |
Port1 |
MAC:B |
Port2 |
|
|
PC3的情况
PC3也接收到交换机广播来的arp请求,如图2,发现目的IP不是自己的IP,于是不作出任何回应
下面是模拟Cisco交换机做的实验(用CiscoPacket Tracer 做的实验,不能抓包用wireshark分析)
网络拓扑如图1,交换机型号Cisco 2950-24
下图6是模拟交换机初始化的转发表,转发表为空
图6 模拟cisco交换机初始转发表
由于不能通过wireshark抓包分析,我查看PC1 ping PC2的动画演绎数据报收发过程。事先PC1、PC2 、PC3 arp表项均为空,均如图7,交换机转发表MAC表项为空,如图6
图7 PC1、PC2和PC3初始arp表项
PC1先广播arp请求,交换机接收到arp请求后,将PC1发来的arp数据帧中源MAC和端口映射关系更新到自己的转发表中,如图8,接着交换机会广播arp请求(flooding)到除了接收端口的其他端口,如图9、图10
图8 交换机接收到PC1广播的arp请求
图9 交换机广播arp请求
图10 交换机广播arp请求的模拟过程
PC2接收到广播来的arp请求后,查看目标IP发现是自己的IP,于是将PC1的MAC与IP映射关系更新到自己的arp表项中,并单播一个arp应答给交换机,而PC3查看收到的arp请求后查看目标IP并不是自己的IP,于是不做任何回应,如图11、图12。
图11 PC2单播arp应答
图12 PC2单播arp应答
交换机接收到arp应答后将源MAC和端口映射关系更新到自己的转发表中,如图13,然后将arp应答通过端口1扔给PC1,PC1将PC2的MAC与IP映射更新到自己的arp表项,然后向PC2发送ping包,数据帧到达交换机后,交换机查看转发表,发现PC2的MAC与端口2的映射关系,于是将数据帧通过端口2扔给PC2,如图14、图15和图16
图13 更新PC2的MAC后交换机中转发表
图14/15 数据帧转发模拟过程
图16 数据帧转发过程
Cisco交换机转发表老化时间默认也是300s,PC1与PC2自从上一次通信后没有进行数据交互,一段时间后查看转发表项,如图17
图17 PC1与PC2通信一段时间后交换机转发表
在Cisco这款交换机条件下做了一个错误链路实验,PC1的MAC与端口1映射在老化时间内,我断开PC1与交换机连接,查看交换机转发表,结果如下图18,PC1的MAC对应端口映射立即消失了。
图18 错误链路情况