上回提到,令狐冲在思过崖见到一位仙风道骨的老者,提点令狐冲半夜去思过崖后的山洞受教。
老者名叫风清扬,是华山派元老,由于长期加班过度,身体不适,隐居思过崖以种菜度日。
老者问:
少侠,每次你如果想和一个人通话,需要做什么?
令狐冲答:
查电话簿,找到这个人电话号码,打他电话。
老者问:
那么,下次再想和他通话,需要做什么?
令狐冲答:
在手机通话记录里面找到直接拨打。
老者又问:
那,如果将路由表缓存到交换机ASIC,是不是可以在交换机的ASIC直接查找路由表进行转发?
令狐冲翻了翻白眼,在思索着——
交换机内部的MAC表项存储在CAM存储器中,CAM可以根据查找内容精确匹配,如精确匹配MAC地址并查找出接口。这种存储器存储的表项又被称为LEM (Large Exact Match),如下图所示:
而路由器查找路由表的方式并非如此。路由器执行的是最长匹配查找,查找的表项被称为LPM(Longest Perfix Match)。如下图所示:
由于路由器执行的是三层转发,转发数据包时,原来的以太网头部将被剥离,替换为新的以太网头部,其源地址为路由器出接口MAC地址,目的地址为对端MAC地址,因此,路由表项还需要关联到ARP表项:
令狐冲在苦苦思索应当如何让交换机具有查找这些表项的能力。
老者拍拍令狐冲肩膀:
少侠,你想想,若在路由表中存储的不是Destination IP Section/Mask这种网段/掩码的方式,而是将IP地址直接存在LEM表中……
令狐冲一拍大腿。就这么干!
三层交换机的转发流程为:
- 根据数据包的MAC地址,在CAM中查询LEM表。如果查询到的出接口为二层port,则直接二层转发,如果查询不到,则在VLAN内泛洪。如果出接口为VLAN Interface,则进入三层转发流程。;
- 三层转发流程中,根据数据包的IP地址查询FIB(Forwarding Information Base)表,如果查询到,则根据目的IP地址,在出接口上查询ARP。
- 若没有ARP表项,触发ARP学习;若有,则将数据包的目的MAC改为ARP表项中的目的MAC,源MAC改为出方向VLAN Interface的MAC并发送;
- 如果在FIB表中查询不到目的IP,则将数据包送到CPU,让CPU查找路由表,并根据路由表查询结果,将FIB表下发到交换机ASIC内部的CAM中。这样,后续指向该IP地址的数据包均可以匹配CAM中这条FIB表,进行快速交换了。
这叫做“一次路由,多次交换”,基于这种机制的交换机叫做三层交换机,能够实现跨VLAN网段的交换,在局域网中可以部分替代路由器的功能。
令狐冲一头扎进实验室,造出了中国第一台三层交换机——S3526,从此,令狐冲又可以和小师妹愉快地线速转发情书了。
好景不长。
由于华山派弟子的扩张,核心三层交换机的CAM表中,需要存储每一个弟子的信息,很快,出现了CAM表存储不下FIB表的情况。大量找不到FIB表的数据包被上送到CPU,CPU疲于奔命,网络大量丢包。
令狐冲临危受命,改进三层交换机。
欲知后事如何,请看下回分解——
上次遗留的思考题:
VLAN ID=0的数据包代表什么?它是在什么协议中用到?
答案:VLAN ID=0的数据包在Profinet RT中使用,代表高优先级实时信令。只有支持Profinet的交换机才能够正确处理这样的数据包,否则会丢弃或修改为默认的VLAN ID(PVID)。
今天的思考题:
在“一次路由,多次交换”的转发流程中,有一个隐藏的小错误,请指出。