R1---------------(vlan10)SW(vlan20)--------------------R2
条件:R1:192.168.1.1 mac:a R2: 192.168.1.2 mac:b
sw是3层交换
R1数据包转发给R2过程:
R1收到数据包后,查询R1的路由表,查路由表的目的是查找数据包从那个接口出,找到出接口后,目的封装什么类型的帧,完成 二层帧封装后,查ARP表,目的是找R2的MAC地址,有2种情况:
(1) R1在ARP表项中找到,完成2层封装,发出去
(2) R1如在ARP中没找到,将数据包丢弃(丢弃的是二层以太网帧),引发R1的ARP表查询,现象是ping 第一个包不通。 R1 以出接 口的mac:a 为源mac,以自己的IP:192.168.1.1 为源IP, 以R2的IP:192.168.1.2为目的IP,目的mac为全F的广播。
SW收到R1发来的arp请求帧后,打开帧头,查看源和目的mac,发现目的mac是自己的mac,在向上打开ip层,发现目的ip不是自己,说明自己是网关,查找路由表,查看ip是从那个出接口出去,找到出接口的封装格式,封装。sw会以自己的出接口mac为源mac,以R1的IP为源IP,以R2的mac为目的mac,R2的ip为目的ip,发arp请求帧。此时r1与sw建立起arp表项。
R2收到arp请求帧后,R2以自己的mac为源mac,以自己的ip为源ip,给sw发一个arp回应帧,
sw收到r2发来的arp请求帧后,与r2建立arp表项,
到此,r1通过sw给r2的目标ip发送第二个icmp echo请求,在收到第二个icmp echo请求后,sw已有r2的arp表项,sw将源mac重新改写成自己的mac,目标ip改为r2的ip,随后把帧传给r2, r2收到icmp echo请求后,以sw的目标mac向r1的ip发送icmp echo回应,ping 通。
3层转发
(3层包头不改变,2层封装发生变化)
源ip地址 目标ip地址不改变 修改源mac和目的mac
R1
1.查询路由表找到目的地址的下一跳地址,并且通过递归查询获得最终到达目的地址的出包接口,因为这里运行了路由协议,所以R1查询路由表的结果必须通过SW上的3层接口才可以到达目的地址,而出包接口指示的是到达下一跳的接口.
2.判断layer 2的封装,并且查询对应的ARP表项,完成对数据包的封装,此时查询获得的将是下一跳的ip地址所对应的2层地址,这里不做关于ARP表查询的结果的讨论,可以参考2层转发
注意:这里ARP查询到的地址同样是同一个子网的MAC地址
sw:
1.收到来自R1的数据帧,并且完成对于数据帧源mac地址的检测。
2.检测数据帧的目的mac地址,并且发现该地址是一个本地的mac地址,此时意味着这里有两种可能性:
2.1 该数据包没有到达目的地,sw将试图拆开数据包检测上层应用。
2.2 该数据包没有到达目的地,sw只是作为该数据包转发过程中的一个中间节点,sw会通过对包头的检测,获得该数据包的目的IP地址。
以上两种结果都会导致sw检测数据包头,而检测包头获得的将是数据包IP地址,而此时对应的查询表项为RoutingTable sw开启layer3 forwording
3.sw查询完路由表,找到到达目的地址的下一跳以及出包接口
4.查询对应的ARP表项,完成封装,此时SW将用自己的下一跳地址所对应的2层地址作为目的,以及自己出包接口的2层地址作为源来封装该数据包.
目的mac未知,一定是泛洪转发
目的mac已知,而且目的mac地址是交换机自己,交换机就会把二层包头拆掉
结论:
当sw检测接收的数据帧,并且发现目的mac地址是本地接口地址时且目的IP又不是我,那么layer 3 forwarding自动开启,并且原有数据帧被改变。
开启layer 3 forwarding同时必须满足以下条件:
1.sw支持3层转发,并且开启了IP routing(能产生routing table的条件)
2.sw上存在3层接口(SVI,routing port)
二层交换机
路由器转发数据包查找路由表和ARP表,2层交换机转发数据帧是查找C AM表,ARP表中存放IP地址和MAC地址的映射信息.