access口和trunk口收数据和发送数据的条件不一样, 如下图所示, vid表示vlan id, pvid(port vlan id)表示的该物理口的所属的vlan id, AF上用native号表示. 二层接口转发原理 1) 如何决定当前数据包所属vlan id的? a. 若MAC头的type字段为0x8100, 则表示此数据帧带有vlan tag, 自然当前数据包所属vlan id为vlan tag中的vlan id, 并且打上has_vlan_tag标记表示当前数据帧带vlan tag; b. 若MAC头的type字段不等于0x8100, 则表示此数据帧不带vlan tag, 则当前数据包所属vlan id为当前入接口的vlan id, 并且has_vlan_tag标记赋值为0, 表示当前数据帧不带vlan tag; 2) 何谓虚拟网线口? 顾名思义, 就是将一对网口虚拟成一根网线, 虚拟网线口必须配对, 从一个口进来的数据必定要从配对的另外一个口出去, 类似一根网线; 这是软件意义上的. 3) 如何判断收到的数据是否合法? a. 在vdb(vlan数据库)中必须存在当前数据包所属vlan的信息; vlan数据库是用来记录该vlan id所包含的trunk口和非trunk接口的列表; 也就是记录有哪些接口属于该vlan id; 若无此vlan id的记录, 则收到的数据是非法的, 直接丢弃; b. 若数据包的入接口为trunk口, 但是接受到的数据不带vlan tag, 则需把该数据所属的vlan更改成trunk口的native id, 然后查看该native id是否在vlan数据库中存在相应信息; 没有的话也丢弃数据包; c. 若数据包的入接口为access口, 但是接受到的数据带有vlan tag, 而数据包的vlan id和当前access口的vlan id不相等, 则必须丢弃该数据包, 若相等的话还是会接收的; d. 若数据包的入接口为trunk口, 则还需要检查该数据的vlan id是否在trunk范围内, 若不在范围内则不接受该数据包; 代表vlan范围的forbiden_vlans是一张位图, 置1表示该vlan id在允许范围内. 如图所示: 4) 源MAC全0要么就网卡异常, 要么就收到ARP攻击了, 直接丢弃该数据; 5) 源MAC全F的为广播包, 也不处理, 直接丢弃; 6) fdb为二层转发表, 将当前数据包的源MAC, 入接口, vlan id记录起来供转发查找出接口用; 有则更新时间戳, 无则新增; fdb为hash表, 以源MAC地址做hash; 7) 数据转发。
协议剥离 何谓协议剥离? 就是计算出ipv4数据在数据包中的偏移. 目前支持以下几种协议剥离: a. eth + ip b. eth + vlan + ip c. eth + vlan + pppoe + ip d. eth + vlan + vlan + ip e. eth + vlan + vlan + pppoe + ip f. eth + pppoe + ip 这里所做的剥离, 不是把协议头去掉而是将网络层(ip)头部偏移和运输层(tcp,udp,icmp…)头部偏移加上ip头部的偏移; |