最想说的
1.Vlan可以认为是2.5层的概念,它对二层端口的划分,类似于在IGP上部署BGP,同为基础架构上的管理型技术。
2.二层SW对Vlan的控制是个“半残”,能分隔却不能跨越。在园区网中二层SW就是单纯的查看转发,不行就给Trunk,执行力很高,但没什么创造力,跨Vlan的数据传输它做不来,它在行的是“跨越地理位置的同一Vlan内的数据传输”。
3.之所以用到SVI,是因为IP子网和Vlan之间需要纽带。园区网多为速度至上的交换式网络,往往核心层的设备才有简单的路由功能。跨越Vlan必然是不同IP子网间的数据传输,二层SW对此无能为力,需要上报到三层SW那里去查看路由表,路由表中IP子网和SVI接口对应的条目,所以能更改标签,实现跨Vlan的数据传输,二层设备对这些动作一无所知,还是查看转发,它并不知道Vlan标签是否被更改过,它只在乎现在这个标签是什么。
4.Trunk只是因为有分属不同Vlan的数据要从这一条线路走,得加上标签来区分一下。
5.对网络连通性进行验证的时候,自顶向下比较省事,因为上层IP通,下层一定OK;而发现不通了,对网络进行排错的时候,顺序反过来比较好,步骤如下:
基础知识
1.广播的目的Mac是全F,泛洪不是广播,目的Mac是具体的Mac地址,实质上泛洪是单播的多重帧复制,之所以容易搞混,是因为现象是相同的,广播和泛洪都会将数据帧发往同属Vlan的所有端口以及Trunk链路,Trunk链路不属于任何Vlan,转发时会打上Vlan ID。
2.Switch广播的触发点是收到一个数据帧,发现目的Mac是全F,ARP请求就是一个广播;泛洪的触发点是收到一个单播数据帧,发现目的Mac在CAM表中没有匹配的条目。
3.数据包在节点间的移动都是通过ARP负责将IP映射到Mac来完成的,Mac地址具有“一跳效应”,每经过一个三层设备,都会将目的Mac改为下一跳接口的Mac地址,并将源Mac改为自己出口的Mac地址,而二层设备只能进行识别。
4.所谓交换,就是在链路层上进行查找和转发的一系列行为。现在路由和交换的概念已经很模糊,功能交叉,不能因为产品名称叫交换机就认定是二层设备。
5.路由器能划分广播域和冲突域,二层交换机只能划分冲突域,但可以通过Vlan技术在二层实现广播域的分隔。
6.多层交换就是交换机带路由功能,逻辑上都是vlan间路由。目前交换机和路由器的界定已经十分模糊,交换机+3层交换=路由器 & 路由器+交换模块=交换机,这种模块化的设计,目的是为了全面的提供网络解决方案。
Vlan 技术
1.端到端Vlan 根据用户的职能来划分Vlan,不Care地理位置,这样每台SW的端口可能会分属不同的Vlan,这样虽然充分体现了Vlan的功能和优势,但是会根据用户的地理位置改变而调整,管理成本高。
2.本地Vlan 根据地理位置来划分,与三层IP子网信息相对应,这样管理成本较低,试想一台SW有n个端口划到vlan 10,和n台SW都有1个端口划到vlan 10,如果要控制vlan 10的流量,前者更容易实现,因为下行都是vlan 10端口,可以根据上行链路的流量来进行分析vlan 10的用户对网络的利用率,进而采取一些动作。就扩展性而言,本地vlan也更好一些。
3.普通vlan号为1~1005,其中1002~1005为FDDI,Token Ring保留,相当于废了,vlan1是缺省vlan,不可改变和删除。所以自己可以配置的就是2~1001,普通vlan可通过VTP v1或v2通告,事实上在Catalyst 交换机上可以删除的Vlan是2~1000。
4.扩展vlan为1006~4094,要配置这些vlan,SW必须在透明模式(Transparent)下,且不能应用database,也不能通过VTP同步。而且CatOS因为兼容性的问题,不能使用1006~1024。就工程而言不会去用扩展Vlan,园区网规划也要在1000个Vlan以内。
5.本征vlan 即Native vlan,记得要翻译成本征vlan,以免和本地vlan概念混,Native vlan在SW中默认为vlan 1(可以修改),在没有划分vlan前所有端口都属于vlan1。如果数据帧没有打标签,SW默认发往本征vlan,如果打的标签的vlan ID是本征vlan ID,会先去掉标签再转发。
这种机制导致一个安全隐患:如果相连的两台SW设定的本征vlan不一样,就能实现vlan间的互访,所以在实际工程中,永远不要使用本征vlan,将其设置为一个不用的vlan,比如vlan 999。
6.私有vlan 可以实现同属一个Vlan内的主机间不能进行通信,在ISP中应用较多,因为这样分配IP地址,即使只给一个子网也可以实现Vlan划分,而不必每个子网对应一个Vlan,从而节约了IP地址。
私有vlan 在具体实现上是基于端口角色的权限划分,具体分为主vlan(primary),团体vlan(community)和隔离vlan(isolated)三种,其中团体vlan和隔离vlan同属辅助vlan。
属于主vlan的端口称为混杂端口,可以访问vlan内所有端口;属于团体vlan的端口可以访问混杂端口以及想同团体内的端口;属于隔离vlan的端口只能访问混杂端口。
Vlan间路由技术
1.在一开始vlan间路由的实现基于路由器的物理端口,即每一个以太口下连一个Vlan,有多少物理端口就可以实现多少vlan间的路由,但遗憾的是路由器的端口造价很高,而且所有的流量都通过路由器,处理能力也受到挑战。
2.子接口的应用使得经典的单臂路由模型出现,这样端口成本降了下来,但由于所有流量都通过一条物理链路来走,使得带宽成为瓶颈。
3.后来在高端的Switch上实现了一种叫做“虚Trunk”的技术,是在这个Switch上加一个没有接口的模块,这个模块专门用来在底板上虚拟出路由和交换模块之间的Trunk链路,可以实现4G的带宽,但是随着千兆以太网时代的到来,带宽又一次形成瓶颈。
4.SVI技术是目前正在应用的主流技术,逻辑上还是第一代的设计,用独立的接口,但是通过虚拟化实现,SVI接口在背板里生成(可以认为是在路由引擎和交换引擎的衔接处生成),可以虚拟出N个,这样没有物理端口的成本开销,且带宽可以由背板性能保证。
每个SVI接口对应一个Vlan,而一般一个Vlan对应一个IP子网,所以SVI接口可以认为是对应子网的网关,虽然是在Switch这个黑盒子里实现,但是模型上还是vlan间路由。
多层交换
1.老的多层交换技术叫做MLS,事实上实现MLS的Switch并没有路由功能,也不支持SVI,就是一个三层的识别和硬件缓存技术,将源IP,目的IP,源Mac,目的Mac映射成条目记录在缓存中,称之为一个“流”,这样再有相同的数据包来不必再到路由器那里,根据缓存信息进行三层条目匹配,二层改写和转发。
二层的Mac重写用ASIC实现,具体操作是把源Mac改写为自己出口的Mac地址,目的Mac改写为下一跳三层设备直连接口的Mac地址,如果是二层设备或者直连主机,目的Mac就是目的主机的Mac地址。其实关键点就是三层设备才有改写Mac地址的能力,二层的只能识别,无法应答上游三层设备的ARP请求。
2.支持SVI的Switch真正实现了路由功能,真正知道IP地址是什么东西,对应的技术叫做CEF,已经在交换领域取代了MLS,CEF分为控制层面和数据转发层面,将软件进程中的路由表和ARP表在硬件的TCAM和DRAM中实现,分别形成FIB表和ADJ表,一次路由,由控制层面转发,多次交换,随后的转发都在数据层面完成。
FIB(Forwarding Information Base)在TCAM中得以实现,是因为TCAM 提高了匹配数据的灵活性。在CAM中只知道0和1,匹配或不匹配,所以像Mac地址这样需要48个比特位一一对应的用CAM可以搞定,但是路由表存在“前缀”的概念,也就意味着有些后面的位是不用匹配的,但CAM所无法理解什么叫做不用匹配,它没有这种逻辑,所以在TCAM提出了X位的概念,用0,1和X代表匹配,不匹配和不检查这三种动作,这样就可以在硬件上存储路由表相应的信息了。
Trunk 链路
1.DTP(动态中继协议)要手动关闭,注意Cisco默认的DTP模式为Desiable Mode,优先ISL封装,而最好的方式是: 手动配置Trunk + Nonegotiate + 封装802.1Q
2.Trunk链路可以封装ISL或者802.1Q,ISL为cisco专有,802.1Q由IEEE定义,只有802.1Q支持Native Vlan。
3.ISL 独立于二层,封装一个26 bytes的报头在以太帧上,并重设FCS,完成封装,在这26 bytes的报头中,用封装该帧的设备的Mac地址作为源地址,而不是用原始帧的SA,目的Mac为一组播地址,0100.0c00.0000 or 0300.0c00.0000。
4.802.1Q 依赖于二层,在原始帧中插入一个4 bytes的Tag标记,前2 bytes固定标记为0x8100,指明该帧含802.1q Tag,后2 bytes标志的是Vlan ID,FCS也要重新设置。
5.Trunk 链路承载所有vlan的信息,不属于任何一个vlan,VTP通告信息和BPDU都在Trunk链路上传递。
VTP协议
1.VTP依据版本号来同步vlan信息,版本号越高视为越新,Cisco SW默认是Server模式,但直到有VTP 域名后才开始发送VTP更新,Cliect不一定要配域名,没有的话会以第一个收到的VTP更新中的域名为准。
2.新添进来的Client也发通告,只是不能配置而已,所以有可能改变域中原有的Vlan信息,只要满足以下3个条件:1) 新添的链路为Trunk 2. 新SW要有同样的VTP域名,如果配了Password,也必须一致 3. 新SW要有更高的版本号。
3.VTP并不将vlan信息保存在NVRAM中,而是保存在Flash中的vlan.dat中。.要删除vlan & vtp信息,重启清空配置文件(erase startup-config file)是没有用的,要用命令:delete flash:vlan.dat。如果SW重启后Vlan.dat和Stratup-config中的Vlan信息不同,以Vlan.dat的为准。
5.定义好VTP的边界,不同Domain 间的VTP更新会立刻被对方丢弃。一个VTP域最好配两个Server,一个是出于高可用性的考虑,一个是为了安全,Password配一个就够了。
7.若是多个MLS作为VTP Server,其中一台删除vlan.dat然后重启,启动后会接收旧的Vlan信息进行同步,而不是让其他MLS清空配置。
8.没有实现VTP同步的原因一般有3种:
1)Domain name 和Password 不一致
2)VTP域内交换机的Vlan 信息不一致,但是Configuration Revision 却相同
3)处于Trasparent 模式的交换机不会与其他交换机同步
PS:部分cisco的交换机只支持有限的vlan数量,如2950只支持64个vlan,如果在vtp server端配置了超过64个的vlan,在这种情况下,IOS会自动把2950的vtp mode改为trasparent,在这种情况下,vtp 信息也不能同步。
Cisco交换技术
1.Cisco的一些SW能够检测到线序错误,应用的技术为Auto-MDIX,检测到能够调整首发的针脚,但不是所有的SW都支持。
2.SW间缺省会自动协商速率和双工机制,也可以手动配置,应用FLP技术(Fast Link Pulses)来感知速率,如果一边关闭自动协商,只能通过电信号来感知,如果手工强制链路两边速率不匹配,这条链路不会工作。
3.链路一端关闭自动协商,SW会按缺省值计算,Cisco默认10/100M为半双工,1000M启用全双工,建议手动进行静态配置。
4.如果链路两端双工不匹配会有很多麻烦,甚至是失去连接。在不匹配的情况下show 相应的接口会发现大量的Aligument Errors,Collison以及FCS错误。
4.透明桥接 三层设备之间通过SW进行通信而不能感知到SW的存在,SW就是透明桥接。
5.一台新的SW在启用前最好先将所有端口shutdown,再去将端口划归Vlan或者设置为Trunk,以免形成错误的ARP条目。
交换技术疑难解析
一台二层SW的典型动作:
1)Mac地址学习,SW将端口与设备Mac对应形成Mac地址表
2)依据Mac地址表转发数据帧,查的帧字段是目的Mac
3)对数据帧的过滤有两种情形,一是在有相应Mac表项的时候不会盲目的将数据转发到所有端口(即泛洪),二是从一个端口收到的数据帧,目的Mac=源Mac,SW会将其丢弃而不会再从这个接口发回去。
4)避免环路,当多台SW互联的时候之间需用Trunk链路进行连接,破环机制为STP
当一台SW支持Vlan功能的时候,动作会有一些更新:
1)SW的接口模式如果是Access Mode,将被划分到某一Vlan,默认属于Vlan1
2)泛洪的范围,当SW从属于Vlan 10的接口收到一个数据帧的时候,会用目的Mac去匹配所有从属Vlan 10的接口对应的Mac表项,如果没有,会发起泛洪,注意泛洪的范围:所有从属Vlan 10的端口,以及所有的Trunk链路
3)Vlan ID即所谓的标签,是Trunk链路的产物。Trunk链路因为要承载多个Vlan的数据所以用VIan ID加以区分,一旦交换机查找对应Vlan接口未果,就会打上这个Vlan的标签从Trunk发出去。
打上Vlan ID的数据帧不管终点是二层还是三层设备的二层端口,一旦Trunk链路到达终点,进行识别以后就会拆掉,拆掉之后的命运再分情况讨论。
三层设备的端口可以分为两种,二层和三层的。一旦说是端口起Access 或者Trunk,必然是二层端口,而且是以太口,二层端口默认开启,不能设IP地址,更不用说起路由协议。路由器上插入的以太网模块都是二层端口,虽然在三层的设备上。
三层端口可以设IP地址,起路由协议,一般路由器接口(交换模块除外)都是三层的,默认关闭,需手动开启。
三层端口通过命令switchport 可以降为二层,二层端口通过命令 no switchport可以变为三层的。
4)SW是二层的机器,对于Mac地址,SW只能进行识别,对于Vlan标签,“SW只会“识别标签”和“重新打上这个标签”,SW应用Trunk链路只能实现“Vlan内的流量转发”。
SW1把数据帧打上Vlan 10的标签发出去的时候,他寄希望于别的SW下属Vlan 10的端口能对应上这个目的Mac,所以说是vlan内的,但是三层的东西,他一无所知,目的IP所属网段是不是对应的本Vlan,他更是不会晓得 (可怜的孩子)
三层SW是三层的机器,对于Mac地址,它能识别和改写,对于Vlan标签,它会“识别标签”,“重新打上该标签”以及“重新更换标签”,三层SW应用Trunk可以完成Vlan间路由,不过需要起SVI虚接口。
其实我觉得对于三层设备而言,查标签这个动作的意义不是很大,因为即使实现的是vlan内的转发,还是会撕掉标签,进行三层的查找,再重新打上标签发出去,查标签也就是单臂路由的时候明确用哪个子接口去接收。
Anyway,Trunk就是承载多个Vlan的流量,不同的设备使用可以完成不同的转发任务。不过记住,Trunk始终是二层链路的概念。
最后来说一说SVI:
1)以前Vlan间路由用单臂路由模型来分析最好不过。
模型:路由器和交换机之间用一条Trunk链路相连(所以叫单臂),交换机下联两台PC为PC1和PC2,PC1属于Vlan 10,PC2属于Vlan 20,目的是实现PC1到PC2的通信。
在这个模型中,路由器对应Trunk链路的端口要划分子接口并封装Dot1q分别对应Vlan 10和Vlan 20,当SW发现目的Mac在从属Vlan 10的端口查询未果,就会泛洪开发,发送到从属Vlan 10的所有端口以及打上Vlan 10标签发送到Trunk链路上。路由器查看标签用对应子接口进行接收,这时标签已经撕掉了,然后进行三层的路由表查找,之后打上Vlan 20的标签,从对应Vlan 20的子接口发出去。
PS:其间还涉及PC和路由器之间的ARP查询和响应,以及Mac的改写,在此不作讨论,不过要知道二层SW没有改写Mac的能力。
2)到了SVI时代,模型还是路由加交换,不过都做到了三层SW这个黑盒子里面,单臂Trunk变成了背板支持,接口都是“虚”出来的,看起来有些陌生,不过还是那个原理,SVI依然对应一个Vlan,作为其网关地址存在(一般一个Vlan对应三层是一个IP子网)。
要起一个SVI接口,使其Line Protocol UP,条件有两个:
1)该SVI对应的Vlan必须在本设备中的Vlan Database中存在。
2)在本设备中至少要有一个Trunk接口,或至少有一个Access Mode 的接口属于该Vlan
之所以要满足第二条,可以从三层交换可能碰到的拓扑中来考虑:
如果一台SW直接连接分属不同Vlan的PC,那么连接PC的接口必然要为Access Mode,通过设置各Vlan对应的SVI,就可以实现Vlan间的通信。
如果是一个很大的园区网,有很多三层SW互联,位于核心层的三层SW的链路都是Trunk链路,那么在起SVI实现Vlan间路由的时候,不同vlan的流量都是通过Trunk传过来的,所以对应的动作就是:
查标签--拆Vlan ID--三层查找--打上目的网段对应的Vlan ID--从Trunk发出去
这样,如果下一跳也是个三层SW,就要再来一次这个过程,如果是个二层SW,就依据Vlan ID查找和转发了。关键就是要记住,为了后续的转发,三层SW查完路由表会换成目的IP网段对应的Vlan ID。