总体分为:
VLAN通信流程 → 二层转发 → 路由转发 → 出口转发→总结

二层转发
首先当PC1访问PC2或者访问PC3的时候,这里以访问PC2说明。首先数据链路层需要封装源MAC地址和目的MAC地址,源MAC地址是PC1自己的MAC地址,目的MAC地址是分两种情况:第一种,当目的主机和自己处在相同网段的时候MAC地址就是目的主机的MAC地址。第二种,当目的主机和自己处在不同网段的时候,这个时候目的MAC地址封装网关的MAC地址

PC1访问不同网段的PC2时,因为是不同网段,PC1把网关的MAC地址封装到数据帧里,在进行ARP请求的时候,目的IP地址是网关的IP地址,交换机从接口收到这个数据帧后,首先为这个数据帧添加VLAN TAG,TAG为端口的PVID,这里交换机连接PC1的端口PVID设置为了10,那么这个数据帧会被添加VLAN 10的TAG,然后根据交换机的MAC地址表把数据帧转发到放行了VLAN 10的接口(这里忽略了交换机学习MAC地址表的细节),sw2收到之后会把数据帧的源IP地址和源MAC地址写入自己的ARP缓存表里,sw2单播回应ARP应答报文给PC1,这样PC1就学习到了网关的MAC地址,PC2到网关的流程同理。

路由转发
在学习到了对方的MAC地址之后,就可以发送数据了。
PC1访问PC2:
PC1先发送数据给PC2,因为PC2的IP地址是192.168.20.1/24,PC1的IP地址是,192.168.10.1/24,两者之间是不同网段,这个时候先发送数据给网关,网关收到数据,看到目的IP地址是不同网段的,而且目的MAC地址是自己后,直接查找路由表。

这里可以看到192.168.20.0/24可以匹配中sw2的路由表,出接口为VLANIF20
注意了:sw2收到PC1访问PC2的数据时,网关为sw2的VLANIF10的IP地址,所以携带的VLAN标签为VLAN10,sw2收到之后,先由交换模块进行处理,这里是trunk模式的接口,查看是否允许了VLAN10通过。交换模块处理完了之后会把VLAN标签剥离,然后交换路由模块处理,也就是查找路由表,路由表查找完之后,这里是匹配中出接口为VLANIF20,发送数据的时候会重新封装源MAC和目的MAC,而且发送数据之前会添加VLANIF20所属VLAN作为数据的VLAN ID
上面这种情况是两个网段属于直连,匹配中的路由表的下一跳是自己接口的IP地址,当也会有匹配中路由为非直连的情况

PC1访问PC3:
假设PC3的IP地址为100.1.1.1,数据由sw2处理后,查找路由表,这里是匹配中这一条缺省路由,出接口为VLANIF30,下一跳为192.168.30.1。这里为了让sw2和路由器进行对接,单独给他们划分了一个VLAN30,在这一个场景里面,交换机连接路由器的接口是划分了access模式,数据从G0/0/2接口出去是不会携带VLAN的,这个是access的工作原理。从VLANIF30接口出去,这个时候源MAC地址重新封装为sw2和路由器连接的MAC地址,目的MAC地址为相关路由条目的下一跳IP地址所对应的MAC地址。那么可以思考一下 下一跳所对应的MAC地址是怎么知道的?


出口转发
最后一部分就是出口转发了
数据到NAT网关的时候,这里R1是作为NAT网关。配置NAT类型的不同,处理机制会有所差异,静态NAT是看静态配置的一对一的内部地址,如果用的是动态的NAT(NO-PAT、NAPT和easy-IP)看的是ACL,本篇重点是在VLAN间的通信,这个ACL这块本篇暂不做详细介绍
数据匹配中NAT网关上配置的ACL之后,会把源IP地址转换为NAT地址池里的地址或者出接口的地址,如果配置的是NAT server,那么转换的就是目的IP地址,也会有源/目IP地址都转换的情况,当然那种是双向NAT
R2作为ISP的路由器,收到之后直接转发给PC3

总结
可以发现
MAC地址在每经过一个三层网络都会重新封装
IP地址在不经过NAT网关是不会重新封装