深入理解BPDU Filtering 过滤BPDU报文

理解 BPDU Filtering 的意义( BPDU Filtering 在全局配置 与接口配置上的区别)

理解BPDU Filtering的意义(BPDU Filtering在全局配置与接口配置上的区别)

本文截自于博主CCNP交换技术稿件内容

BPDU Filtering 也叫 BPDU 过滤,它的意义是在某个端口上过滤 BPDU 的发送和接收,在这里需先要来理解一个前提:任何一个加入到生成树的交换机端口,都会发送并接收到相应的 BPDU报文,其中包括被规划为 portfast 的端口,它也会连续的( 秒间隔)向交换网络中发送 BPDU报文。但是在 Portfast 端口上发送 BPDU 有必要吗?没有,为什么呢?因为 portfast 连接都是主机,主机是不可能与交换机形成环路的,所以 portfast 是没必要向主机去发送 BPDU 报文。反过来讲 portfast 端口也没必要接收 BPDU 报文,为什么呢?桌面主机发送 BPDU 报文是没有意义的,但是 BPDU Filtering 对 portfast 端口收到 BPDU 报文时的处理方式就没有 BPDU Guard 那么极端, BPDUGurad 是直接关闭端口。而 BPDU filtering 将由于不同位置的配置,产生不同的处理行为, BPDU Filtering 的配置也分为全局配置和在接口上的配置,不同位置的配置将产生不同的效果。

BPDU Filtering 在全局配置

在全局模式下使用 spanning-tree portfast bpdufilter default 指令来启动 BPDU Filtering ,通过指令可以看出, BPDU Filtering 在全局模式下是需要依赖于 portfast 端口为基础来实现的,这一点和 BPDU Gruad 在全局模式下的配置前提是相同的。但如果用户在全局模式下启动的是 BPDU Filtering ,在这个时候 portfast 端口就不会发送 BPDU 报文了。如果此时当 portfast 端口收到 BPDU 报文时该端口会立即回退到常规的生成树端口,并参与生成树的选举及计算过程。关于这一点请参看演示: BPDU Filtering 在全局与接口上的配置。

BPDU Filtering 在接口上的配置:

用户可以在接口模式下使用 spanning-tree bpdufilter enable 指令来启动 BPDUFiltering ,注意在接口模式下启动 BPDU Filtering 功能时可以不依赖于 portfast 端口,然后在该接口上将不再发送和接收 BPDU 。 这里的这个“该接口上将不再发送和接收 BPDU ”说明,就一般而言,不发送 BPDU ,一般都比较好理解,而这里所谓的不接收 BPDU ( not receive BPDUs ),不如说成是忽略( ignore ) ,又或者表达为不处理接收到的 BPDU ,将更为精确的表达接口级 BPDU Filtering的功能,为什么这样讲?

如 图 所示,交换机 S1 的 E1/0 接口,可能正收到交换机 S3 的 E1/0 接口所发送的 BPDU 报文,该报文也能成功的到达 S1 的 E1/0 接口,为什么能到达?因为交换机 S3 发送 BPDU 报文时目标的 MAC 地址是一个众所周知的组播 MAC ( 0180.c200.0000 ) 就是众所周知的组播 MAC表示所有开启 STP 功能的设备都能接收到相关的 BPDU 报文,因为该目标 MAC 也叫生成树的多播 MAC 。只是说当 S3 发来的 BPDU 报文到达 S1 的 E1/0 接口时, S1 由于在接口上启动了 BPDU 的 filtering 功能,它( S1 )将忽略 S3 发来的 BPDU 。或者叫接收而不处理。关于这一点请参看演示: BPDU Filtering 在全局与接口上的配置。

注意: 在接口上配置 BPDU Filtering 与在全局配置 BPDU Filtering 的意义是有很大区别的,在全局配置的 BPDU Filtering 首先要依赖于 portfast 端口,当收到 BPDU 时,全局的 BPDU Filtering 是采取回退为正常生成树端口的处理方式;而接口上的 BPDU 不需要依赖于 portfast 端口,并忽略( ignore )收到的 BPDU 报文,此时相当于在具体的某个接口上禁用了生成树功能,如果管理员没有对二层网络进行合理的设计,可能就会存在潜在的环路,所以思科强烈建议并推荐用户在全局模式上启动 BPDU Filtering 功能。

演示: BPDU Filtering 在全局与接口上的配置

演示目标:

ü   测试 BPDU Filtering 在全局模式下的配置效果

ü   测试 BPDU Filtering 在接口模式下的配置效果

ü   一个有趣的现象:全局启动 BPUD 过滤,有某个时候会有少量的 BPDU 报文被发送。

演示环境: 如 图 所示

演示背景: 首先还是在 S2 和 S3 的交换机接口上将相应接口的交换机功能关闭( no switchport ),这样就可以暂时禁止 S2 和 S3 向交换机 S1 发送 BPDU ,为测试 BPDU Filtering 功能做好准备工作,然后将交换机 S1 的 E0/0-3 的接口范围配置为接入模式,并在这些端口上全局的启动Portfast 功能,然后通过协议分析器来取证 portfast 是否会发送 BPDU 报文,然后再在 portfast 端口之上启动 BPDU Filtering ,再来取证 portfast 端口是否会继续发送 BPDU 报文,然后在交换机S2 的 E0/0 端口上开启交换功能( switchport ),使其发送 BPDU 报文给 S1 ,再观察 S1 的 E0/0 在启动 BPDUFiltering 的情况下,是否会将 portfast 端口回退到常规的生成树端口状态。最后来测试接口 BPDU Filtering 的配置效果,确定它是否需要依赖于 portfast 端口而存在,并确定接口上的 BPDU 过滤与全局的 BPDU 过滤的差异。

演示步骤:

第一步: 首先将交换机 S1 的 e0/0-3 和 e1/0-3 的接口全部配置为交换机的接入模式端口,然后将交换机 S1 的所有接入模式的端口规划为 portfast 端口,具体配置如下,为了测试方便,建议现在就将 S2 和 S3 连接交换机 S1 的端口交换功能关闭( no switchport ),相当于暂时禁止 S2 和S3 向 S1 发送 BPDU 报文。

配置交换机 S1 的所有端口到接入模式端:

S1(config)#interfacerange e0/0-3

S1(config-if-range)#switchportmode access

S1(config-if-range)#noshutdown

S1(config-if-range)#exit

S1(config)#interfacerange e1/0-3

S1(config-if-range)#switchportmode access

S1(config-if-range)#noshutdown

S1(config-if-range)#exit

配置交换机 S1 的所有接入端口为 portfast 端口:

S1(config)#spanning-treeportfast default    规划所有接入模式端口为 portfast 端口

%Warning: this command enables portfast by default onall interfaces. You   交换机系统提示一些配置 portfast 后的注意事项

should nowdisable portfast explicitly on switched ports leading to hubs,

switches andbridges as they may create temporary bridging loops.

完成上述配置后,可以通过在交换机 S1 上执行 show spanning-tree 来查看当前所有的接入模式端口是否成为 portfast 端口(也叫边缘端口),如 图 所示,所有接入模式的端口已经成为边缘端口。

此时,用户可以通过协议分析器,去捕获分析 S1 任意一个被启动了 portfast 端口上的数据帧,如 图 所示,可以清晰的看出在 Portfast 端口上,仍然不断的以 秒为一个间隔发送 BPDU 报文,这将为测试 BPDU Filitering 功能做好准备。

接下来在全局模式下,启动 BPDUFiltering 功能,具体配置如下,当完成 BPDU 过滤功能后,可以通过 showspanning-tree summary 来查看 BPDU 的过滤功能是否被启动,如 图 所示,明显可看出 BPDU 过滤功能已经被启动。

在全局模式下启动 BPDU Filtering 功能:

S1(config)#spanning-treeportfast bpdufilter default

在完成上面的配置后,再次使有协议分析器软件捕获交换机 S1 的 E0/0 所产生的数据帧,可发现 S1 的 E0/0 接口不再发送任何 BPDU 报文,证明 BPDU Filtering 生效,至少证明了 BPDU 过滤功能将禁止 portfast 端口再发送 BPDU 报文。

接下来,需要来取证 BPDU 过滤功能在收到 BPDU 报文时的处理行为,现在到交换机 S2 上的E0/0 接口启动交换机功能( switchport ),相当于是让 S2 的 E0/0 向 S1 的 E0/0 发送 BPDU 报文。然后使用协议分析器去捕获 S1 的 E0/0 接口的数据帧。会如 图 所示,可以看到 S1 收到 S2( aa:bb:cc:00:02:00 )发来的 BDPU 报文,并开始发送自己( S1 )的 BPDU 报文。

然后可以在 S1 上通过执行 show spanning-tree 指令来查看当前生成树几个端口的状态,如 图所示,交换机 S1 的 E0/0 由于收到了 BPDU 报文, BPDU 过滤功能将其边缘端口( portfast )的角色回退到常规的生成树端口角色。但是它并不会像 BPDU Gruad 那样极端的半闭端口,如 图所示, S1 的 E0/0 端口仍然处于 Up 状态。

第二步: 现在来检测 BPDUFiltering 在接口模式下的效果,首先请将 S1 的 E1/0 从 portfast 端口的配置中脱离出来,然后再到该端口下启动接口级别的 BPDU 过滤功能,这两项具体的配置任务如下所示:

将交换机 S1 的 E1/0 接口从 portfast 中脱离:

S1(config)#interfacee1/0

S1(config-if)#spanning-treeportfast disable  禁用该端口的 portfast 功能

S1(config-if)#noshutdown

S1(config-if)#exit

在交换机 S1 的 E1/0 接口上启动 BPDU 的过滤功能:

S1(config)#interfacee1/0

S1(config-if)#spanning-treebpdufilter enable 启动 BPDU 的过滤功能

S1(config-if)#exit

如果此时使用协议分析器捕获交换机 S1 的 E1/0 的数据帧,不难发现,在 S1 的 E1/0 上不会有任何 BPDU 数据帧被发送。其实这一点在接口级别的配置和在全局模式的配置的最终效果是一样的,只是说接口级别可以不再依赖于 portfast 端口而存在。要反在接口级别的 BPDU 过滤与全局模式的 BPDU 过滤在收到 BPDU 报文时的处理方式则完全不一样了,全局模式采取的是回退端口到常规生成树端口,而接口级别则是完全忽略收到的 BPDU ,将不做任何处理。具体取证过程如下:

在交换机 S3 的 E1/0 端口上启动交换功能( switchport ),相当于使其向 S1 的 E1/0 接口发送BPDU 报文,此时会发现如 图 所示的情况, S1 的 E1/0 接口上会不断的收到 S3 发来的 BPDU报文,但是 S1 不会对这些报文做任何理采,也就是忽略( ignore )收到的 BPDU 报文,而且是无声无息的将其 ignore 掉。由于这种悄无声息的 ignore ,这个时候在网络可能会出现“一国两公”的局面,也就是一个整体的生成树网络可能存在多个根桥。

第三步: 一个有趣的现象:就是用户在全局模式下已经启动了 BPDU 过滤功能后,就即便是此时某个具体的接口没有收到任何 BPDU 的报文,然后当这个端口在正式连接进入网络并且 BPDU出站过滤开始之前,会有少量的 BPDU 被发送( Theinterfaces still send a few BPDUs at link-up before the switch begins to filteroutbound BPDUs )。但几秒中后就将进入 BPDU 过滤状态。

网络工程工作注意细节

speed nonegotiate:

在cisco的交换机中,千兆光接口是需要协商才能确定传输速度的,当两边的端口速度、频率不一致时,将导致交换机光口无法正常使用。因此,需要使用speed nonegotiate来取消协商。
可能有的认为,我两边是auto还不行吗?答案是对于千兆网卡这样不行。这是因为千兆的通信标准与以前习惯的100M自适应有差别,简单而言:
100M端口:auto—-10M,FULL,auto一方会变成10M,half,可以正常通讯,但是会丢包,流量大的时候性能会极大下降。
1000M端口:auto—-100M,FULL,则auto会down,这是1000M的标准定义的

中兴清配置:

我们都知道cisco的交换机清除配置是erase startconfig !然后reload就可以了。
但是ZXR10系列的交换机没有这个命令,ZXR10保存配置是write ,有就是把配置信息write到flash中,在flash下有个cfg文件夹,里面保存的就是我们write进去的配置文件,只要把这个文件删除,重启交换机就可以了。
具体命令为:
ZXR10#CD   CFG   //切换到保存配置文件的文件夹
ZXR10#DIR     //查看文件
Directory  of flash:/cfg
ZXR10#delete  startrun.cfg
Are you sure to delete files?[yes/no]:y
ZXR10#reboot
ZXR10#Confirm to reboot?yes/no]:y
等交换机重启完成后,配置就清除了!

【BGP】BGP最优路径的选择

在默认情况下,到达同一目的地,BGP只走单条路径,并不希望在多条路径之间执行负载均衡。当BGP路由表中有多条路径可以到达同一目的地时,需要靠比较路由条目中的路径属性,只有在比较多条路由的属性之后,才能决定选择哪条为最优路径。BGP的每条路由都带有路径属性,对于通过比较路径属性来选择最优路径,BGP需要在多条路径之间按照一定的顺序比较属性,当多条路由的同一属性完全相同时,需要继续比较顺序中的下一条属性。BGP在选择最优路径时,需要按照以下顺序来做比较:

1.最高Weight值

  (选择最高Weight值的路由,Weight值为Cisco路由器特有,并且只在本地路由器有效,默认Weight值为0,本地发起路由为32768。)

2.最高LOCAL_PREF值

(如果Weight值相同,则选择拥有最高LOCAL_PREF值的路由,默认为100。)

3.本地发起路由

 (如果LOCAL_PREF值相同,则选择BGP本地发起的路由,换句话说,也就是下一跳为0.0.0.0的路由,本地发起的路由有多种方式,如通过在BGP进程下命令network命令从IGP路由表导入,将其它路由协议重分布进BGP路由表,最后是汇总路由表。而通过命令network和重分布的路由优先于手工汇总的路由。)

4.最短AS_PATH

(如果本地发起路由无法比出最优路径,则选择拥有最短AS_PATH的路由,但是可以跳过这一步,输入命令bgp bestpath as−path ignore后,就会忽略对AS_PATH的比较,而直接比较下一属性。需要更加注意的是,AS_SET被认为是1个AS,而无论AS_SET中包含多少个AS,并且BGP联邦内部AS不被计算。)

5.最低Origin类型

(如果AS_PATH无法比出最优路径,则选择拥有最低Origin类型的路由,Origin表示路由最初是如何进入BGP路由表的,目前有三种进行BGP路由表的方法,从IGP导入,从EGP学习,以及重分布,它们的优先级为IGP优于EGP,EGP优于Incomplete,即IGP>EGP>Incomplete。

6.最小MED值

(如果Origin类型无法比出最优路径,则选择拥有最小MED值的路由,并且只有当多个下一跳邻居在同一AS时才比较MED值。如果要在多个不同AS的下一跳中比较MED,可在BGP进程中输入命令bgp always-compare-med,注意须保证此命令在整个AS的路由器上输入,否则可能产生路由环路。默认的MED值为0,如果收到一条没有MED的路由,也认为是0。)

7.eBGP优于iBGP

(如果MED值无法比出最优路径,则选择下一跳为eBGP的邻居而不选择iBGP邻居。都知道eBGP的路由AD值为20,而iBGP的路由AD值为200,但BGP并不在eBGP与iBGP之间比较AD值,并且在比到此步时,邻居类型才影响了最优路径的选择,这种影响是受邻居类型的影响,而不是受AD值的影响。注意:BGP联邦内部没有此规则。)

8.最小IGP metric到达下一跳的路由

(如果多条路径的下一跳邻居同为eBGP或iBGP,则选择拥有最小IGP metric到达下一跳的路由。)

9.负载均衡(如果开启的话)

(BGP并不是不能负载均衡的,如果之前的属性都无法选出最优路径,则执行负载均衡,但必须是之前的所有属性均完全相同,缺一不可。需要注意:只有负载均衡功能开启了,BGP才会执行负载均衡,否则,继续比较下一属性。)

在开启负载均衡功能时,在BGP进程下输入以下命令:

maximum-paths n (多条路径的下一跳邻居都为eBGP时,输入此命令)

maximum-paths ibgp n(多条路径的下一跳邻居都为iBGP时,输入此命令)

其中n为执行负载均衡的路径数量,最大值为6,默认为1,也就是不执行负载均衡。

如果在eBGP和iBGP邻居之间同时执行负载均衡,输入命令maximum-paths eibgp n,此命令只支持在Ipv4 VRF模式下输入,就是只能支持MPLS VPN下的eBGP和iBGP邻居之间负载均衡。

10.如果下一跳都为eBGP,则选择最早学习到的路由(即时间最长的路由)

(为了避免路由翻动,所以选择最早学习到的路由,如果要忽略比较路由学习到的时间长短,可在BGP进程下输入命令bgp best path compare−routerid,某些IOS已经自动加入此命令,并且不能删除。如果多条路由拥有相同的Router-ID,比如路由是从同一个邻居学习到的,同样也会忽略比较路由学习到的时间长短。)

11.最低Router-ID下一跳

(BGP的Router-ID选举如同OSPF,在此步,拥有最低Router-ID的下一跳路由将被选为最优路径。)

12.最短cluster list(如同AS_PATH)

[cluster list只在BGP reflector (RR)的环境下才有,功能如同AS_PATH]

13.最小下一跳的邻居地址

(如果比较之前的所有属性都无法选出最优路径,最终选择下一跳的邻居地址最小的路由,这个地址就是在建立邻居时所指的地址,也是邻居和自己建立TCP连接所使用的源地址,建立不同邻居,不可能使用相同地址,所以不可能两个不同路径的邻居地址是相同的,在这一步一定能够选出最优路径。)

TCP三次握手四次挥手

转载申明-http://blog.csdn.net/whuslei/article/details/6667471

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

先来看看如何建立连接的。

【更新于2017.01.04 】该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删了,大家可以比较下,对比理解效果更好。这么久才来更新,抱歉!!

错误配图如下:

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

那如何断开连接呢?简单的过程如下:

【注意】中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说”我Client端没有数据要发给你了“,但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,”告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息“。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,”告诉Client端,好了,我这边数据发完了,准备好关闭连接了“。Client端收到FIN报文后,”就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,”就知道可以断开连接了“。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

整个过程Client端所经历的状态如下:

而Server端所经历的过程如下:转载请注明:blog.csdn.net/whuslei

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

转载-http://blog.csdn.net/renzhenhuai/article/details/12105457

一、TCP报文格式

       TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图:


图1 TCP报文格式

       上图中有几个字段需要重点介绍下:
       (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
      (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
       (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
               (A)URG:紧急指针(urgent pointer)有效。
               (B)ACK:确认序号有效。
               (C)PSH:接收方应该尽快将这个报文交给应用层。
               (D)RST:重置连接。
               (E)SYN:发起一个新连接。
               (F)FIN:释放一个连接。

       需要注意的是:
               (A)不要将确认序号Ack与标志位中的ACK搞混了。
               (B)确认方Ack=发起方Req+1,两端配对。 

二、三次握手
       所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:


图2 TCP三次握手

       (1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
       (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
       (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
       SYN攻击:
               在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
               #netstat -nap | grep SYN_RECV

三、四次挥手
       三次握手耳熟能详,四次挥手估计就,所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程如下图所示:


图3 TCP四次挥手

       由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
       (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
       (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
       (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
       (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
       上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:


图4 同时挥手

        流程和状态在上图中已经很明了了,在此不再赘述,可以参考前面的四次挥手解析步骤。

四、附注
       关于三次握手与四次挥手通常都会有典型的面试题,在此提出供有需求的XDJM们参考:
       (1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
       (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
       这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

抓包:
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。

但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。

RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。

一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。

PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。

TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。

概念补充-TCP三次握手:

TCP(Transmission Control Protocol)传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。  第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;  第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.

07-OSPF区域类型–NSSA区域/完全NSSA区域

特别感谢许名川同学的大力帮助,介绍好的资料给我复习这些相关知识

NSSA区域:

NSSA区域允许一些外部路由通告到OSPF自治系统内部,顾名思义,NSSA,是stub的一个升级网络结果,全称为:Not-So-Stub-Area.不是那么末节的区域。

NSSA同时也保留自治系统区域部分的stub区域的特征。假设一个stub区域中的路由器连接了一个运行其他路由器进程的自治系统,现在这个路由器就变成了ASBR.因为有了ASBR,所以这个区域也就不能再叫stub了,而改名叫NSSA区域。但是如果把这个区域配置为NSSA区域,那么ASBR会产生NSSA外部lsa(type=7),然后泛洪到整个NSSA区域内,这些7类的lsa在NSSA的ABR上面最后会转换成type=5的lsa进行泛红到整个ospf域中。

通过读这里的描述,我自己先做总结,后续再用实验进行验证。

我觉得NSSA区域中,只会存在1/2/3/7类的lsa.绝对不会存在5类的lsa

下面还是用实验来验证一下上面的原理:

现在area0是骨干,R2+R3+R4是NSSA area 10.R4将外部EIGRP路由冲分发到OSPF中产生外部路由注入OSPF区域。

然后再R2/R3/R4的ospf进程下面都配置为:

area 10 nssa

这样area 10的所有路由器就共同组成了一个NSSA区域。

这个时候再来验证一下原理:

在R2/R3/R4上面分别配置area 10 nssa.

那么我们来验证一下在R4/R3上面有哪些lsa在ospf的lsdb中。

在R4上面,其实最后就是NSSA type-7的lsdb.宣告路由器是40.40.40.40,宣告的是外部路由172.16.1/2/3.0,lsa类型是7类的.

下面再看看R3.

实际上就是R4, 40.40.40.40在NSSA区域内泛洪了引入的外部路由,所以R3除了1类,2类,3类的lsa,就只有7类从40.40.40.40传递过来的.

然后最后在R2上面,这个ABR,可以看到相关的lsdb.

R2这个ABR也收到了R4这个ASBR发送过来的type-7的NSSA 外部lsa,但是也同时向非nssa区域扩散5类的lsa,可以注意到,到5类的时候,实际上宣告路由器已经发生了变化。变成了20.20.20.20.

根据原理,R2这个ABR要将7类lsa转换成5类的lsa然后在非NSSA区域内进行泛洪。

所以最终在R1上面,应该只有1/2/3/5类的lsa

我们来确认一下:

这里可以看到R1上面,确实符合原理上面,除了1/2/3类的lsa,还有5类的lsa,通过R2这个ABR传递过来的。

最后总结一下就是:

完全NSSA区域:

和NSSA区域类似,完全NSSA区域允许一些外部路由通告到ospf自制系统内部,而同时保留自治系统区域部分的完全stub区域的特征。该区域的ASBR会产生NSSA 外部LSA(type=7),然后再区域内泛洪并通过该区域的的ABR将7类lsa转换成5类lsa然后在其他所有区域进行泛洪.

同时,该区域的ABR也会产生一条默认的缺省路由0.0.0.0传播到区域内,所有区域见的路由都必须通过ABR才能到达.

通过读这里的描述,我自己先做总结,后续再用实验进行验证。

我觉得完全NSSA区域中,只会存在1/2/7类的lsa.绝对不会存在5类和3类的lsa,最后ABR再向该区域的所有路由器通告一个默认路由,下一跳是ABR自己,要到区域间的路由都要通过ABR进行转发。

这里实际上也就是no-summary的作用,和totally stub区域功能一样。只是3类的lsa由一条0.0.0.0,然后目的ID是ABR的id来替代。

在学习完全nssa区域,需要和NSSA的数据库进行对比。

配置方面,我们在R2 ABR上面配置:

这里已经看到了区别。

这就是totally NSSA和NSSA的区别,少了3类的lsa.

NSSA区域和第七类LSA:

NSSA区域是ospf协议中定义的一类特殊的区域,NSSA区域是stub区域概念的延伸,它保留了stub区域的特性,ABR不会将5类的lsa引入到nssa区域内部进行传播,同时NSSA区域允许少量的外部路由通过本区域的ASBR通告进来,ASBR将会为这些外部路由生成第七类的LSA在区域内进行传播,第七类lsa的传播区域仅仅限于在NSSA区域内,ABR会把接收到的type7lsa转换为5类在其他所有ospf区域进行泛洪。

这里还有一个问题比较有意思,就是在一些特定的场合因为配置错误可以形成环路.

呵呵,这个实验比较好验证。

首先,在R2的ospf部分配置为:

R4的相关路由配置为:

注意,这里设置默认路由,但是一定要让默认路由注入到你的路由表中,否则是不会产生环路的,当然我这里是实验环境,所以从新在R4上面起了一个loopback4,ip address 5.5.5.5.6,这样接口up,自然show ip route就可以看到一个默认路由出口是5.5.5.5了。

现在我们根据图中的注释来进行验证,在R3上面,应该是会受到3类的缺省lsa和7类的缺省lsa。

所以在R3上面如果查看ip route路由表,可以看到只有一个默认路由,出口是ABR R2:

而在R2上面,会受到R4发送过来的7类缺省lsa:

然后再看看路由表:

最后形成的环路就会在R2和R3之间不停得循环…..直到TTL耗尽.对于对于网络实际上都可以理解为一种攻击了。

现在在R3上面随便ping一个不存在的地址:

实际上这里环路已经产生了….

当然还有很多细小的知识点,我这里只是复习大体框架。

又找到了一些很有意思的题目可以让我们开展大脑风暴:

================================================================================

问题一:

在一个NSSA区域,如果有两个ABR,它们都会将type-7lsa转换成type 5 LSA吗?为什么?

关于问题一,答案肯定是否,如果两个ABR都产生默认路由给NSSA区域内的路由器,那到时候如果不能找到明细路由,该走哪条默认路由呢?还是负载均衡?显然都是不合理的。

所以当一个NSSA区域中有2ABR,那么按照RFC3101 OSPF NSSA option的规定,只有最大的router-IDABR会负责将type-7lsa转换为type5lsa.

06-OSPF区域类型–stub区域/完全stub区域(转载)

STUB区域:

出自—http://361531.blog.51cto.com/351531/696993

stub区域是一个不允许AS 外部LSA在其内部泛红的区域。stub区域只可以携带区域内路由和区域间的路由。这些区域中路由器ospf数据库和路由表以及路由信息传递量都会大大减少,为了保证到自治系统外部路由依旧可达,由该区域的ABR生成一条默认路由0.0.0.0传递到区域内,所有到自治系统外的外部路由都必须通过ABR才能达到。

通过读这里的描述,我自己先做总结,后续再用实验进行验证。

我觉得stub区域中,只会存在1/2/3类的lsa.绝对不会存在5类的lsa。然后生成一条默认路由指向ABR.

默认路由只会泛洪到本stub区域,不会传递到其他的区域去。

下面用实验来说明关于Stub区域的特性:

拓扑图还是这张。

要验证的是stub的原理和定义:

由于stub区域不允许外部的LSA在其内部泛洪,所以该区域内的路由器除了ABRi没有自制系统的外部路由,如果他们想到自治系统外部的时候,在stub区域内会将ABR作为出口,ABR会产生一条0.0.0.0的默认路由通告给整个stub区域内的路由器。这样ABR将是这些 stub区域到AS外部路由的唯一的出口。

配置了stub区域后,ABR会自动神产生一个link ID0.0.0.0,网络掩码为0.0.0.0summary lsa (type=3),并通告给整个stub区域。

当R1和R2将area10配置成了stub区域以后,在R1上面可以看到ospf数据库有1类,2类和3类。并且ABR 20.20.20.20向R1宣告了一条默认的lsa,告诉R1,R2这个ABR才是他想到自制系统外部的唯一的出口。

在R1上面也会生成一条默认路由:

这里可以看到,其实对于R1来说,他知道所有区域的路由,但是唯独不知道AS外部的路由172.16.1/2/3.0的路由,所以默认就甩给R2进行处理。按照原理应该知道,其实R2的area 0中是一定会有OE2的路由的,并且是由ASBR R4通告过来的type-5的,所以当数据到了R2的时候,R2会按照现有的路由表进行查找的。最终将数据通告出去。

那么最后R1到172.16.1/2/3.0的网络仍然是可达的走默认路由:

完全stub区域:

完全stub区域是所有区域中最受限制的区域。它不仅不能携带外部路由(AS external type5),甚至区域间的路由也不能携带(type=3 lsa),只可以携带区域内路由。在这些区域中路由器的ospf数据库和路由表规模以及路由信息的传递量比stub区域又会有大大的降低,对设备的性能更低,为了保证到区域外的路由(注意这里不是AS外部)依旧可达,由该区域的ABR生成一条缺省路由0.0.0.0传递到区域内,所有到该区域外部的路由都必须通过ABR才能达到。

通过读这里的描述,我自己先做总结,后续再用实验进行验证。

相比stub区域,这里在完全stub区域中的路由器只会存在1/2类的lsa,不会有35类的lsa,然后生成一条默认路由指向ABR.

默认路由只会泛洪到本stub区域,不会传递到其他的区域去。

最后说一点,无论在stub或者说是完全stub区域,都不会有ASBR的存在。

前面我们已经验证了stub区域,那么后者我们来验证一下关于完全stub区域的情况。

还是这张拓扑图,其实我们可以更加优化对于R1的负载。当我们作为网络设计者的时候,因为R1的性能很低,我觉得他完全也没有必要知道除了area10以外的区域路由的时候,那么我们还可以把第三类lsa(区域汇总lsa给省略掉),这样,不管R1是到AS外部的路由,还是区域外的路由,都是通过R2这个ABR走,这样对R1的压力就更加小了,以前或许一个2811才能满足的性能,现在可能一个1841就搞定了。网络优化的精髓就是在省钱,但是能达到同样的效果。

配置命令是在R1上面的ospf进程下面:

area 10 stub

在R2的ospf进程下面配置:

area 10 stub no-summary

这样最后R2就会只通告一条0.0.0.0的lsa给R1.对比stub区域,R2还将arae 0的2.1.1.0/3.1.1.0/30.30.30.30/40.40.40.40的lsa通告过来,现在直接就变成一条0.0.0.0 ID的lsa给R1.

路由表随之而来也会大大减少。

再和stub进行一下对比,看看现在是否少了area 0 的那四条lsa。

还有路由表也和stub区域进行对比一下:

现在没有OIA的路由了。对于出口只有一条默认路由了。

关于这两种区域类型,再用比较的方式进行加深一下记忆:

最后找到2个特别有意思的思考题,每一个答案后面都有他产生的背景:

1,在什么样的情况下,stub区域的路由器和ABRospf邻居full了,但是ABR却没有产生默认路由发给stub的路由器?或者换句话说,为什么邻居full了,stub区域的路由器没有获得abr传递给他的默认路由?

2,在一个stub区域,有2abr,他们产生的缺省路由,不会让他们相互指向,形成路由环路吗?

===================================================================================

关于问题一,正确的注解是这样的:

我也照着答案进行了实验的验证,当把ABRarea0的接口shutdown掉,或者是让ABR把骨干区域area0的邻居只要down掉,那么ABR都不会将默认路由传递给stub area 的路由器。为什么呢?

主要是因为解决这样的极端情况,如果一个stub区域 2ABR,那么其中一个一旦和骨干区域area0失去连接,那么这个ABR就不会再发送默认路由给stub的路由器,让另外一个abr可以顺利的发默认路由给stub路由器,这样的话始终都可以保证stub区域的数据得到正确的转发。

那么解决了问题一,问题二就来了,如果两个ABR都是和骨干区域连接没有问题,那么会产生一个怎么样的效果?难道还发两个80的默认路由给同一个stub区域的路由器吗?那个时候数据如何转发呢?

问题二的答案是不会有环路或者是产生转发问题。

这里就是LSA和路由的区别了。当一个stub区域中的ABR接收到同一个区域另外一个ABR发出的默认0.0.0.0LSA,它只会将其存放在OSPF LSA的数据库中,而不会计算出路由来。这样就避免环路的产生。

CIDR(无类别域间路由)地址块及其子网划分

CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)

1. 原始的IP地址表示方法及其分类(近几年慢慢淘汰)

转载-http://blog.csdn.net/dan15188387481/article/details/49873923
    IP地址是由4字节,32位表示的,为了表示方便,通常用点分十进制表示法,例如大家常见的:192.168.0.52,四个字节,通过点进行分隔,看起来十分清晰。IP地址的32位是由网络号+主机号组成的,也就是说这32位中,左边的某些连续位表示网络号,右边的某些连续位表示主机号,那么我们平常在讨论这一系列问题的时候,会有一个“网络地址”的概念,一般来说网络地址并不等于IP地址,网络地址就是IP地址中的网络号,然后主机号全部取0。IP地址可以表示为:
    IP地址 ::= {<网络号>, <主机号>},将主机号置0,就可以得到网络地址。
    最初的IP地址是被划分为5类,不过大家经常见到和谈到的只有3类,即A类、B类、C类,如图1所示:
图1 IP地址的分类
    从图1中可以看到基本的划分,由于本篇文章主要讲CIDR,所以对于IP地址最初的分类表示法就不过多讲述,在CIDR中已经废弃了IP地址的分类,无分类编址的命名也是由此得来的,所以目前基本已经不再采用所谓的A类、B类、C类的IP地址分类表示法,不过作为比较经典的过去使用的方法,大家了解一下即可。图1中表示得十分清楚,大家从左边看起,搞明白每一类地址的前缀、网络地址、主机地址的位数即可,通过这个位数,大家可以计算出每类网络的可支配网络数以及可连接主机数,对相应的位数求2的幂即可。
图2 IP地址的指派范围和一般不使用的IP地址
    从图2中,我们可以清晰地看出来每类网络所指派的网络数和主机数,以及哪些地址一般不使用,这里需要注意一点,就是最大可指派网络数中会减掉2或者1,其实后面的最大主机数大家计算一下会发现都减去了2,这是为什么呢?这是因为A类的前缀是0,所以网络号加上前缀的8位可以出现全0的情况,而且127(01111111)作为环回地址用来测试,所以不指派,故而需要减去2,B类和C类的前缀分别是10和110,所以网络号加上前缀不可能出现全0的情况,不过B类的128.0.0.0和C类的192.0.0.0也是不指派的,所以B类和C类只需要减去这一个不指派的网络地址即可。那么主机数为什么都减去2呢?这是因为主机号分别为全0和全1的情况一般是不分配的,这两个特殊的地址有特殊的用途,所以要减去2。
    关于分类的IP地址就介绍到这里,还要强调一下,目前已经不采用分类表示法,所以大家重点关注CIDR表示法。

2. 基本的子网划分方法

    在讲述CIDR之前我们先来简单介绍一下基本的子网划分方法。
    上面所述的IP地址表示方法可以称之为两级IP地址,即网络号和主机号组成的IP地址。但是由于IP地址空间的利用率有时很低、给每一个物理网络分配一个网络号会使路由表变得太大以及两级IP地址不够灵活等原因,就出现了所谓的子网划分。子网划分实际上就是将原来的两级IP地址转变为三级IP地址,表示如下:
    IP地址 ::= {<网络号>, <子网号>, <主机号>}
    从上面的表示可以看出,子网划分就是在32位中借了几位用来表示子网号,注意,这里的网络号的位数是不变的,子网号是从主机号中借走的,所以大家想一想就可以明白,子网划分实际上就是减少了主机数,分配到不同的子网,每个子网包含一定的主机数。子网的概念也就可以理解为,将一个大的网络在其内部划分成几个小的子网,但是需要注意的是,对于该网络的外层来看,还是一个大的网络,只有该网络内部才可以看到其进行了子网划分。例如:某个机构给某高校分配了一个大的网络,而该高校内部又进行了子网划分,将不同的子网分配给不同的学院,此时对于该机构来说,该高校还是一个大的网络,在其看来并没有变化,只有该高校自己才知道自己内部又进行了子网划分。
    子网划分中有一个十分重要的概念就是子网掩码。  那么什么是子网掩码呢?大家想一想,在传输的过程中,路由器是怎么识别子网划分后的IP地址中的网络地址的?如果不提供任何信息,路由器肯定还是傻傻分不清楚,所以就出现了子网掩码。子网掩码其实很简单,就是将网络号和子网号对应的位全部置1,将主机号对应的位置0,就得到了子网掩码。例如:一个IP地址是145.13.3.10,其是B类地址,假如我们用8位来表示子网号,那么网络号加上子网号一共24位,所以将这24位置1,其余置0,那么子网掩码就是255.255.255.0。紧接着,我们可以看出来,用子网掩码和IP地址逐位进行“与”运算,就可以得到网络地址,所以该IP地址的网络地址就是145.13.3.0,下面我从《计算机网络第5版》谢希仁编著的书中摘取了两个例子,帮助大家理解。
图3 子网划分的例题
    从上面的例子中可以看出子网掩码的使用和计算,这两个例子也说明了同样的IP地址和不同的子网掩码可以得出相同的网络地址。但是不同的掩码效果是不同的,因为它们的子网号和主机号的位数是不一样的,从而可划分的子网数和每个子网中的最大主机数都是不一样的。
    最后,我们需要注意的是,在之前基本的子网划分中,借走主机号两位,只能划分4-2=2个子网,这是因为全0和全1不使用,一般至少借走两位,其他位数的划分是一样的,都需要减去2,但是CIDR表示法中的子网划分就不用减2,因为其也使用全0和全1。

3. CIDR概述及其地址块计算

  CIDR中文全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,在平常,大家多称之为无分类编址,它也是构成超网的一种技术实现。CIDR在一定程度上解决了路由表项目过多过大的问题。CIDR之所以称为无分类编址,就是因为CIDR完全放弃了之前的分类IP地址表示法,它真正消除了传统的A类、B类、C类地址以及划分子网的概念,它使用如下的IP地址表示法:

    IP地址 ::= {<网络前缀>, <主机号>} / 网络前缀所占位数
    CIDR仅将IP地址划分为网络前缀和主机号两个部分,可以说又回到了二级IP地址的表示,不过大家要注意,最后面用“/”斜线分隔,在其后写上了网络前缀所占的位数,这样就不需要告知路由器地址掩码,仅需要通过网络前缀所占的位数就可以得到地址掩码,为了统一,CIDR中的地址掩码依然称为子网掩码。
    CIDR表示法给出任何一个IP地址,就相当于给出了一个CIDR地址块,这是由连续的IP地址组成的,所以CIDR表示法构成了超网,实现了路由聚合,即从一个IP地址就可以得知一个CIDR地址块。例如:已知一个IP地址是:128.14.35.7/20,那么这个已知条件告诉大家的并不仅仅是一个IP地址这么简单,我们来分析一下。
    128.14.35.7/20 = 10000000  00001110  00100011  00000111
    即前20位是网络前缀,后12位是主机号,那么我们通过令主机号分别为全0和全1就可以得到一个CIDR地址块的最小地址和最大地址,即
    最小地址是:128.14.32.0      10000000  00001110  00100000  00000000 
    最大地址是:128.14.47.255  10000000  00001110  00101111 11111111     
    子网掩码是:255.255.240.0  11111111  11111111  11110000  00000000 
    因此就可以看出来,这个CIDR地址块可以指派(47-32+1)*256=4096个地址,这里没有把全0和全1除外。

4. CIDR子网划分

    在CIDR表示法中也可以进行进一步的子网划分,和前面的子网划分类似,我们只需要从主机号中借走一定的位数即可,这里与前面的基本子网划分不同,借走2位时可以划分成4个子网,不用减2,其他位数类似。下面通过一个例子来讲解CIDR中的子网划分。
    例:某个机构拥有一个大的CIDR地址块,即206.0.64.0/18,现在某个高校需要申请一个较大的CIDR地址块以供学校使用,学校内部又分为4个系,由于每个系的人数不一样,所以要给人数较多的系分配较多的IP地址,人数较少的系分配较少的IP地址,现在采用以下的分配方案:
    机构分配给该高校一个CIDR地址块:206.0.68.0/22,然后该高校内部的分配方案如下:
    一系:206.0.68.0/23,一系内部又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网。
    二系:206.0.70.0/24,二系内部又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网。
    三系:206.0.71.0/25,三系内部又分为206.0.71.0/26和206.0.71.64/26两个子网。
    四系:206.0.71.128/25,四系内部又分为206.0.71.128/26和206.0.71.192/26两个子网。
    请分析以上方案划分的具体细节。
   答:这是一个CIDR子网划分中比较复杂的例子,如果大家能分析透彻这个例子,那么对于CIDR的子网划分的计算就基本不在话下了。
    我们一步一步来讨论:
    第一,这个机构拥有的地址块是206.0.64.0/18 =206.0.0100 0000.0000 0000/18,网络前缀是18位,所以其
    最小地址是:206.0.64.0/18      206.0.0100 0000.0000 0000/18
    最大地址是:206.0.127.255/18 = 206.0.0111 1111.1111 1111/18
    子网掩码是:255.255.192.0/18 = 1111 1111.1111 1111.1100 0000.0000 0000/18
    拥有的地址数:(127-64+1)*(255-0+1)=16384
    然后,我们来看一下这个机构给该高校分配的CIDR地址块,即206.0.68.0/22,由此可以看出来网络前缀由18增加到了22,所以该机构相当于将其CIDR地址块划分成了16个子块即子网,然后给该高校了第二个子网,即206.0.0100 0100.0/22,黑色加粗的部分是原来的网络前缀,后面红色部分类似于前面介绍的子网号,由于是4位,所以可以从0000~1111,共16个子网,0001自然就是第二个子网。
    第二,既然高校拥有了机构的第二个子网的CIDR地址块206.0.68.0/22 = 206.0.0100 0100.0/22,其网络前缀是22位,所以其
    最小地址是:206.0.68.0/22      206.0.0100 0100.0000 0000/22
    最大地址是:206.0.71.255/22  206.0.0100 0111.1111 1111/22
    子网掩码是:255.255.252.0/22 = 1111 1111.1111 1111.1111 1100.0000 0000/22
    拥有的地址数:(71-68+1)*(255-0+1)=1024
    然后该高校内部又对这个CIDR地址块进行了划分,进一步得到了高校内部的子网,紧接着我们来看看一系的CIDR地址块是怎么得到的。
    第三,一系的CIDR地址块是206.0.68.0/23,可以看出来其网络前缀相对于高校的CIDR地址块来说增加了1位,说明高校首先将其CIDR地址块划分成了2个子网,其中一个给了一系。那么这两个子网分别是:一系的:206.0.68.0/23 = 206.0.0100 0100.0/23剩余的(记为余1):206.0.70.0/23 =206.0.0100 0110.0/23,注意其中的红色部分就是新增的这一位,用来标志两个子网。
    那么,一系的
    最小地址是:206.0.68.0/23      206.0.0100 0100.0000 0000/23
    最大地址是:206.0.69.255/23  206.0.0100 0101.1111 1111/23
    子网掩码是:255.255.254.0/23 = 1111 1111.1111 1111.1111 1110.0000 0000/23
    拥有的地址数:(69-68+1)*(255-0+1)=512
    余1的
    最小地址是:206.0.70.0/23      206.0.0100 0110.0000 0000/23
    最大地址是:206.0.71.255/23  206.0.0100 0111.1111 1111/23
    子网掩码是:255.255.254.0/23 = 1111 1111.1111 1111.1111 1110.0000 0000/23
    拥有的地址数:(71-70+1)*(255-0+1)=512
    现在,一系的CIDR地址块已经很明确,然后一系内部又进行了划分,即又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网,网络前缀从23位变成了25位,相当于占用了主机号两位,所以可以划分为4个子网,分别对应00、01、10、11这四个子网,这四个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这四个子网的细节。
    第四,一系明确以后,就要考虑其他系的划分,可以看到二系分配到的CIDR地址块是206.0.70.0/24,可以看出来其网络前缀相对于余1的CIDR地址块来说增加了1位,说明余1的CIDR地址块被划分成了2个子网,其中一个给了二系。那么这两个子网分别是:二系的:206.0.70.0/24 = 206.0.0100 0110.0/24剩余的(记为余2):206.0.71.0/24 =206.0.0100 0111.0/24,注意其中的红色部分就是新增的这一位,用来标志两个子网。
    那么,二系的
    最小地址是:206.0.70.0/24      206.0.0100 0100.0000 0000/24
    最大地址是:206.0.70.255/24  206.0.0100 0100.1111 1111/24
    子网掩码是:255.255.255.0/24 = 1111 1111.1111 1111.1111 1111.0000 0000/24
    拥有的地址数:(70-70+1)*(255-0+1)=256
    余2的
    最小地址是:206.0.71.0/24      206.0.0100 0111.0000 0000/24
    最大地址是:206.0.71.255/24  206.0.0100 0111.1111 1111/24
    子网掩码是:255.255.255.0/24 = 1111 1111.1111 1111.1111 1111.0000 0000/24
    拥有的地址数:(70-70+1)*(255-0+1)=256
    现在,二系的CIDR地址块已经很明确,然后二系内部又进行了划分,即又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网,网络前缀从24位变成了26位,相当于占用了主机号两位,所以可以划分为4个子网,分别对应00、01、10、11这四个子网,这四个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这四个子网的细节。
    第五,二系明确以后,就要考虑其他系的划分,可以看到三系分配到的CIDR地址块是206.0.71.0/25,而四系分配到的CIDR地址块是206.0.71.128/25,可以看出来其网络前缀相对于余2的CIDR地址块来说增加了1位,说明余2的CIDR地址块被划分成了2个子网,其中一个给了三系,另外一个给了四系。那么这两个子网分别是:三系的:206.0.71.0/25 = 206.0.71.0000 0000/25四系的:206.0.71.128/25 = 206.0.71.1000 0000/25,注意其中的红色部分就是新增的这一位,用来标志两个子网。

    那么,三系的
    最小地址是:206.0.71.0/25      206.0.0100 0100.0000 0000/25
    最大地址是:206.0.71.127/25  206.0.0100 0100.0111 1111/25
    子网掩码是:255.255.255.128/25 = 1111 1111.1111 1111.1111 1111.1000 0000/25
    拥有的地址数:(71-71+1)*(127-0+1)=128
   
    四系的
    最小地址是:206.0.71.128/25  206.0.0100 0100.1000 0000/25
    最大地址是:206.0.71.255/25  206.0.0100 0100.1111 1111/25
    子网掩码是:255.255.255.128/25 = 1111 1111.1111 1111.1111 1111.1000 0000/25
    拥有的地址数:(71-71+1)*(255-128+1)=128
    现在,三系和四系的CIDR地址块已经很明确,到目前为止,该高校已经将所有的CIDR地址块分配给了四个系,一系有512个地址,二系有256个地址,三系和四系各有128个地址。然后三系内部又进行了划分,即又分为206.0.71.0/26和206.0.71.64/26两个子网,网络前缀从25位变成了26位,相当于占用了主机号一位,所以可以划分为2个子网,分别对应0、1这两个子网,同时,四系内部也又进行了划分,即又分为206.0.71.128/26和206.0.71.192/26两个子网,网络前缀从25位变成了26位,相当于占用了主机号一位,所以可以划分为2个子网,分别对应0、1这两个子网,三系和四系各自的两个子网的最小地址、最大地址以及子网掩码和拥有的地址数按照上述的方法就可以得到,这个比较简单,建议大家可以自己手动计算一下,正好看看自己掌握了多少,这里就不再给出这些子网的细节。
    至此,我们已经分析完了本题,上面都是我一位位自己敲上去的,所以大家看完后想要稳固掌握的话建议自己也计算一遍,如果发现我有错误,欢迎大家指正。
    最后,我用一副图来展示下这个划分过程。
图4 上述例题的图解

5. 总结

    总之,目前已经广泛使用CIDR表示法,之前的分类方法和子网划分已经很少使用,所以大家要重点掌握CIDR表示法及其子网划分,了解以前的基本分类和划分方法即可。    
    上述内容都是本人一个字一个字敲上去的,那些粗体和红色的标注也是我细心注释的,图4是我按照分析的流程一步步画的,转载请注明出处,欢迎大家指正,谢谢。

【OSPF】防环机制详解

红茶三杯 原创技术文档,转载请注明出处。
我们在提到OSPF的时候,时常喜欢说的一句话就是,OSPF能够计算出无环的路由,那么OSPF究竟是如何规避路由环路的呢?OSPF与距离矢量路由协议不同,运行OSPF的路由器之间交互并不是路由信息,而是LSA,而路由器的计算正是基于网络中所泛洪的各种LSA,所以实际上OSPF路由的环路规避机制还得依赖LSA在环路避免上的设计,接下来我们就来分别探讨各种类型的LSA在防环上的考虑。
1.  Type-1 LSA及Type-2 LSA的防环
我们都知道,每台运行OSPF的路由器都会产生Type-1 LSA,Type-1 LSA用于描述路由器的直连接口状态(接口IP信息或所连接的邻居,另外还有接口的Cost值),而且只在接口所属的区域内泛洪。Type-1 LSA使用各种类型的Link来描述路由器直连接口。Type-2 LSA则只出现在MA网络,由DR产生,用于描述接入该MA网络的所有路由器(的Router-ID),以及该MA网络的掩码信息。
得益于区域内泛洪的Type-1 LSA及Type-2 LSA,OSPF路由器能够“在自己的脑海中”还原区域内的网络拓扑及网段信息。路由器为每个区域维护一个独立的LSDB,并且运行一套独立的SPF算法,同一个区域内的路由器,拥有针对该区域的相同LSDB,大家都基于这个LSDB计算出一颗以自己为根的、无环的最短路径树。之所以能做到无环,是因为路由器能够通过LSA描绘出区域的完整拓扑(包括所有接口的Cost)及网段信息。以下图所示的网络为例:
 
R1、R2、R3及R4的接口均在Area0中,四台路由器都会产生Type-1 LSA并且在Area内泛洪。另外以太网链路由于缺省是广播型多路访问网络,因此会进行DR/BDR的选举,DR会产生Type-2 LSA并在区域内泛洪。在LSDB同步完成之后,每台路由器都拥有了整个区域的拓扑及网段信息,这些都是通过网络中泛洪的Type-1 LSA及Type-2 LSA拼凑出来的,请看下图:
 
接下来,每台路由器都以自己为根,计算一颗无环的最短路径数,以R3为例,它的最短路径树可能像下面这个样子:
 
所以,依赖Type-1 LSA及Type-2 LSA,路由器能够描绘出区域内的拓扑及网段信息,从而运行SPF算法,计算出到达每个网段的最优路径,并将这些路径安装到路由表中,因此区域内的路由(Intra-Area Route)可以实现无环路。
2.  Type-3 LSA及Type-4 LSA的防环
1) OSPF要求所有的非0区域必须与骨干区域直接相连,区域间路由需经由骨干区域中转。
OSPF要求所有的非0区域必须与骨干区域直接相连,区域间(Inter-Area Route)路由需经由骨干区域中转。这个要求使得区域间的路由传递不能发生在两个非0的区域之间,这在很大程度上规避了区域间路由环路的发生,也使得OSPF的区域架构在逻辑上形成了一个类似星型的拓扑,如下图所示。
 
2) ABR只能够将其所连接的区域的区域内部路由注入到Area0,但是可以将区域内部路由及区域间的路由注入到非0常规区域。ABR从非骨干区域收到的Type-3 LSA不能用于区域间路由的计算。
 
OSPF对ABR有着严苛的要求,区域间的路由传递的关键点在于ABR对Summary LSA的处理。
 
在上图中,如果R3是一台普通的OSPF路由器(不是ABR),例如当它与R2没有OSPF邻居关系时,它会根据R4在Area2中泛洪的Type-3 LSA计算出1.1.1.0/24路由并将路由加载进路由表中。但是当R3与R2建立起OSPF邻接关系后,R3在Area0中就有了一个活跃的全毗邻连接,此时如果它把描述1.1.1.0/24路由的Type-3 LSA再注入回Area0,那么就会带来潜在环路的风险,如下图所示:
 
因此当一台ABR在非Area0的区域中收到Type-3 LSA时,虽然它会将其装载进LSDB,但是该路由器不会使用这些Type-3 LSA进行路由计算,当然它更不会将这些Type-3 LSA再注入回Area0中。因此在本段落的小标题中的这么一句话:“ABR只能够将其所连接的区域的区域内部路由注入到Area0,但是可以将区域内部路由及区域间的路由注入到非0常规区域”这句话,对应到上面的拓扑中,就是R3作为ABR,只能将其所连接的Area2内的区域内部路由注入到Area0(而不能将其在Area2内收到的3类LSA,也就是区域间路由注入Area0),但是可以将Area0的区域内部路由,以及R2注入到Area0的、用于描述Area1的区域间路由注入到非0常规区域Area2。
这里有一个有意思的细节,就是如果R3连接R2的接口虽然激活了OSPF(而且属于Area0),但是不与R2形成邻接关系(例如R2连接R3的接口不激活OSPF),那么此时R3其实并不算是严格意义上的ABR(虽然它产生的Type-1 LSA中B-bit会被置位,但是它在Area0中并没有全毗邻的邻居),因此它会将Area2内收到的Type-3 LSA用于区域间路由的计算,所以在R3的路由表中能看到1.1.1.0/24的区域间路由,但是一旦R2-R3之间的邻接关系建立起来,R3便不能再使用R4下发的Type-3 LSA计算区域间的路由,而只能使用在Area0中收到的、R2下发的Type-3 LSA进行路由计算,所以R3的路由表中,1.1.1.0/24的路由的下一跳将变为R2,即使从R2到1.1.1.0/24网络的Cost大于从R4走的路径,也不会切到R4上来。
PS,关于本段落标题中的内容,RFC2328相应的描述是:“Note that only intra-area routes are advertised into the backbone, while both intra-area and inter-area routes are advertised into the other areas.”,RFC3509则描述得更为精细:“Note that while only intra-area routes are advertised into the backbone, if the router has an Active Backbone Connection, both intra-area and inter-area routes are advertised into the other areas; otherwise,the router only advertises intra-area routes into non-backbone areas.”
 
3) ABR不会将描述一个Area内部的路由信息的Type-3 LSA再注入回该区域中。
实际上,OSPF区域间路由的传递行为,很有点距离矢量路由协议的味道。以下图为例,在Area1中,R1及R2都会泛洪Type-1 LSA、Type-2 LSA,两台路由器都能够根据这些LSA计算区域内路由,而R2作为ABR还担负着另一个责任,就是向Area0通告区域间的路由,实际上它是向Area0中注入用于描述Area1内路由的Type-3 LSA,而这些Type-3 LSA是不会发回Area1的——是的,类似水平分割行为对吧?接下来R3利用这些Type-3 LSA计算出了区域间的路由,并且为Area2注入新的Type-3 LSA用于描述区域间的路由,而这些Type-3 LSA同样的不会被注入回Area0。
R2在向Area0通告Type-3 LSA,为每条区域间路由携带上Cost值,这个值就是它自己到达各个目标网段的Cost,而R3收到这些Type-3 LSA并计算路由时,路由的Cost就是在R2所通告的Cost值的基础上,加上R3自己到R2的Cost值,然后,R3向R4通告这些区域间的路由时也携带者自己到达目标网段的Cost,而R4到达目标网段的Cost则是在R3的通告值基础上累加自己到R3的Cost——典型的距离矢量行为。
 
综上,我们发现OSPF为了区域间的路由防环是操碎了心的。Type-4 LSA实际上与Type-3 LSA都是Summary LSA,只不过一个是Network Summary LSA——用于描述网段路由,另一个则是ASBR Summary LSA——用于描述ASBR,他们使用的防环机制是一致的,因此这里不在赘述。 
 
4)  Type-3 LSA还涉及了DN比特位,用于在MPLS VPN环境下的环路规避
3.  Type-5 LSA的防环
 
当一台OSPF路由器将外部路由引入OSPF域后,它就成为了一台ASBR,被引入的外部路由以Type-5 LSA在整个OSPF域内泛洪。一台路由器使用Type-5 LSA计算出路由的前提是两个,其一是要收到Type-5 LSA,其二是要知道产生这个Type-5 LSA的ASBR在哪里。与ASBR接入同一个区域的路由器能够根据该区域内泛洪的Type-1 LSA及Type-2 LSA计算出到达该ASBR的最短路径,从而计算出外部路由。而其他区域的路由器就没有这么幸运了,因为ASBR产生的Type-1 LSA只能在其所在的区域内泛洪,所以才需要Type-4 LSA。因此其他区域的路由器在获取Type-4 LSA后便能计算出到达ASBR的最短路径,进而利用该ASBR产生的Type-5 LSA计算出外部路由。Type-5 LSA将会被泛洪到整个OSPF域,表面上看,它本身并不具有什么防环的能力,但是实际上,它并不需要,因为它可以依赖Type-1 LSA及Type-4 LSA来实现防环。
另外,Type-5 LSA中的External Route Tag字段被用于在MPLS VPN环境下外部路由的防环,这里就不做深入探讨了。

【OSPF】OSPF进程号的意义及多进程OSPF

1. OSPF进程号的概念
在配置OSPF时,我们采用的是router ospf命令,在该命令后面需要加上这个OSPF进程的进程号(Process-Id),进程号用于在一台路由器上区分不同的OSPF进程。这就有点像人格分裂的感觉 —— 一个自然人有多种不同人格,每种人格之间相互独立,互不影响。进程号的取值范围是1-65535。
 
上图所示的拓扑中,R1使用进程号10创建了一个OSPF进程,同时激活了自己的直连接口FE0/0,而R2使用进程号20创建了一个OSPF进程,同时也在自己的直连接口上激活了OSPF。虽然这两个进程号不一样,但是R1-R2之间的邻居关系建立是完全没有问题的。因为OSPF进程号只具有本地意义,路由器之间交互的所有OSPF报文中,都不会体现任何关于进程号的信息。进程号只在一台路由器上用于区分多个OSPF进程,因此对于R1而言,它并不关心它的直连OSPF邻居R2使用的是什么OSPF进程号,10也号,20也罢,这就有点像“自己的事自己知道就行“ — 本地意义。
当然,在实际的网络部署中,除非有特定的需求,我们还是建议全网使用统一的进程号,虽然每台设备使用不同的进程号对OSPF的运行没什么影响,但是却给网络的管理和维护带来了多余的成本,你不会这么干的,对吧?
2. 多个OSPF进程
上面的拓扑很有意思,在R2上,常规的做法是用一个进程号创建一个OSPF进程,同时将自己的两个直连接口都宣告进这个OSPF进程,但是为了讲解OSPF进程ID的本地意义,我这里在R2上使用两个进程号分别创建了两个OSPF进程,并且分别宣告了R2的两个直连接口,换句话说,R2使用OSPF进程12与R1建立邻居关系,使用OSPF进程23与R3建立OSPF邻居关系。如此一来,R2在本地就有了两个OSPF进程,使用进程号12及23进行区分。整个网络中也就出现了两个OSPF域(OSPF Domain)。这两个OSPF进程,都会各自从其邻居R1和R3学习到OSPF路由,但是值得强调的是:
  • 这两个OSPF进程相互独立和隔离(两个OSPF Domain),两个进程独立维护各自的LSDB。换而言之R2通过OSPF进程12从R1学习到的OSPF路由(严格的说,应该是LSA),例如描述1.1.1.0/24的LSA,缺省时不会传递到进程23的(这是因为在R2,这两个OSPF进程互相独立互相隔离),当然,从R3学习过来的OSPF路由,R2虽然自己能学习到,但是照样不会传递给R1,这就好像,这两个进程虽然都在R2上,但是彼此之间有着一道鸿沟,世界上最遥远的距离,莫过于此啊。
  • 再者,R2这两个OSPF进程虽然说彼此隔离,但是都可以为R2自身贡献路由,例如如果R1更新过来一条路由1.1.1.0/24,R3更新过来一条3.3.3.0/24,那么在R2的全局路由表里都是能看到这两条路由的。但这两条路由不会互相灌进对方的OSPF进程(造成的直接结果是R1没有R3的路由,R3没有R1的路由),除非 — 对了,路由重发布,你懂的。
3. OSPF进程之间的路由重发布
 
同一台路由器上的不同OSPF进程相互独立,各自维护自己的LSDB。如果要把一个OSPF进程内的路由注入到另一个进程中,就需要部署路由重发布,例如上图所示,R2作为一台ASBR,要把进程12中的路由注入到进程23中,配置如上。当然,如果要实现全网路由互通,则还需要在OSPF进程12中,将进程23的路由重发布进来。
4. 什么时候会使用不同的OSPF进程
我们知道一台路由器可以创建多个OSPF进程,而且进程之间相互隔离。一般情况下,当我们在做网络建设时,整个网络就是一个统一的路由选择域,如果选用OSPF作为路由协议,则所有的OSPF路由器使用一个OSPF进程即可。
 
上图展示了一个大型企业的网络拓扑,R1、R2、R3及R4是省公司的设备,SW1、SW2及往下是市公司的设备,R5是区县站点设备(实际上有多个区县站点,此处只显示了一个)。为了实现市公司与各区县站点的网络互通,我们在市公司所有设备,以及区县站点的所有路由器上都配置了OSPF并且进行了多区域的规划。由于整个企业数据网络的规模较大,要想打通整个网络的路由,使用一个OSPF域直接从区县站点往上拉到省公司,显然是不靠谱的,一来整个域太大,路由前缀数量太多,二来OSPF的多区域设计在面对这么大规模网络的时候显得还是有点力不从心,三来总公司并不希望看到分公司以及下面的子站点的路由明细,路由汇总势必是要考虑的,加之对流量的走向还有严格的要求,策略部署上如何考虑?因此为省公司网络规划了另外一个OSPF域,在省公司的边界设备R3、R4上创建两个OSPF进程,进程1面向总公司,进程2面向下面的市公司及区县站点。两个进程相互独立不互相干扰,而R3及R4又能够学习到省公司、分公司及各个区县站点的路由,两个OSPF域可以独立规划,域内Area的设计又变得更加宽松和灵活。
当然,省公司、总干以及地市公司是需要相互通信的,这时候由于省公司的网络属于OSPF进程1,而市分公司及区县站点的网络属于OSPF进程2,相互独立,为了把路由打通,就需要在R3和R4上执行OSPF进程之间的路由相互重发布。一旦把R3、R4设计为路由重发布的执行点,他俩瞬间就变得非常重要和牛逼了,因为在重发布的过程中,可以执行路由策略、可以做路由过滤,更可以做路由汇总,网络的设计和规划就变得非常有弹性了。
下面再来看多进程OSPF的另一个例子:
 
在上图所示的网络中,存在两个不同的业务。生产及办公,两个业务各有自己的服务器网络,两台Router分别连接着这两个业务的服务器网络。而终端用户则连接在SW上,现在终端用户需要访问各自业务的服务器,那么SW当然是需要有相应的路由的。我们希望将生产及办公的业务进行隔离,但是这两个业务的终端用户又都是连接在SW上,如何隔离?很简单,在SW上创建两个OSPF进程,其中进程1用于生产业务,进程2用于办公业务。在OSPF进程1中,激活VLAN10及VLAN20对应的SVI,并激活与SC-Router对接的三层接口;在OSPF进程2中,激活VLAN30、40对应的SCI,并激活与BG-Router对接的三层接口,如此一来办公及生产服务器网段的路由通过这两个OSPF进程在SW上进行了隔离。
这的确是一种好方法,但是虽然OSPF进程是隔离的,SW的全局路由表中却拥有者生产及办公两个业务的路由,也就是说两个业务的路由实际上在SW这个点上是打通的,显然不够安全,如果有人从办公网络登到办公终端,然后再从办公终端跳转,去访问生产服务器就麻烦了。所以,我们又引入了另一个概念——VRF(Virtual Routing Forwarding,虚拟路由转发),所谓的VRF你可以理解为虚拟设备,通过在SW上创建VRF实例,并且将生产的OSPF进程关联到一个VRF实例中,从而彻底将生产路由与办公路由进行隔离(办公路由及业务跑在根设备上,生产路由及业务跑在VRF实例上,两者完全隔离,可以想象为两台SW)。关于VRF的进一步内容,请查阅相关文档,这里篇幅所限,不做详细探讨。

【OSPF】链路类型 LinkType

OSPF除了定义网络类型(Network Type),还定义了链路类型(Link Type),这是两个不同的概念。链路类型主要用于描述OSPF路由器的接口或邻居。在1类LSA中,可以看到产生该LSA的路由器所连接的所有链路(Link)、链路的类型以及相关的内容。通过每个1类LSA中描述的各种链路(Link),OSPF得以描绘出网络的拓扑和子网信息。
  LS age: 1355
  Options: (No TOS-capability, DC)
  LS Type: Router Links
  Link State ID: 1.1.1.1
  Advertising Router: 1.1.1.1
  LS Seq Number: 8000001F
  Checksum: 0xFF44
  Length: 48
  Area Border Router
  AS Boundary Router
  Number of Links: 2
    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 2.2.2.2
     (Link Data) Router Interface address: 10.1.12.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 64
    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 10.1.12.0
     (Link Data) Network Mask: 255.255.255.0
      Number of TOS metrics: 0
       TOS 0 Metrics: 64
1类LSA中,用于描述Link的LINKID、Link Date的取值根据OSPF link类型不同而不同:
下面分别来看一看这些个Link:
1.Stub Network Link
 
如果路由器的一个接口被激活OSPF,并且该接口上没有任何OSPF邻居,则该接口使用Stub Network Link来描述。一个接口被通告进OSPF,无论其二层封装是什么(以太网、PPP、HDLC等),只要在该接口上没有OSPF邻居,那么就是Stub Network Link。例如上图所示,R2产生的1类LSA中用于描述接口FE0/0的Link数据就是:
    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 10.1.23.0
     (Link Data) Network Mask: 255.255.255.0
      Number of TOS metrics: 0
       TOS 0 Metrics: 1
Loopback接口永远被定义为Stub Network Link,默认使用32位掩码表示,这就是为什么在OSPF实验过程中,Loopback接口IP地址无论配置什么掩码,路由学习过来都是/32的主机路由。不管将Loopback接口改为哪种OSPF网络类型(Network Type),始终改变不了它的OSPF链路类型(Link Type),但可以改变它在LSA中的掩码长度。
2.Transit Link
 
拥有两台或两台以上OSPF路由器的链路,简单理解为有邻居的OSPF接口,使用Transit Link来描述。但网络类型为Point-To-Point和点到多点(Point-To-Multipoint)的接口除外,因为它们被定义为Point-To-Point Link。
 
例如上图所示,R1的FE0/0接口激活了OSPF并且有一个OSPF邻居R2,因此R1在LSA1中描述这个接口时,使用Transit Link来描述,如下:
    Link connected to: a Transit Network
     (Link ID) Designated Router address: 10.1.23.2
     (Link Data) Router Interface address: 10.1.23.1
      Number of TOS metrics: 0
       TOS 0 Metrics: 1
3.Point-To-Point Link
 
OSPF网络类型为Point-To-Point的接口,使用“Point-To-Point Link”来描述,但Loopback接口除外;
网络类型为点到多点(Point-To-Multipoint)的接口,同样使用为Point-To-Point Link这种链路类型来描述。
例如上图,R1的S0/0口的OSPF网络类型是P2P,因此R1产生的LSA1中用于描述该接口的链路类型就是P2P LINK,输出如下:
    Link connected to: another Router (point-to-point)
     (Link ID) Neighboring Router ID: 1.1.1.1
     (Link Data) Router Interface address: 10.1.12.2
      Number of TOS metrics: 0
       TOS 0 Metrics: 64
    Link connected to: a Stub Network
     (Link ID) Network/subnet number: 10.1.12.0
     (Link Data) Network Mask: 255.255.255.0
      Number of TOS metrics: 0
       TOS 0 Metrics: 64
值得注意的是,对于P2P的网络类型接口,OSPF使用了两个LINK来描述,一个是P2P Link用于描述链路对端连接的路由器ID及自己本地的接口IP地址,另外还使用了一个Sub Network Link来描述该条链路的子网。
综上所述,OSPF的集中链路类型中,P2P以及Transit Link是用于描述网络拓扑结构的,而Stub Network是用于描述子网号的。
4.Virtual link
这种链路类型用于描述OSPF虚链路(Virtual Link)。
 
在上图中R1、R3建立了一条虚链路,则R1产生的LSA1中描述该虚链路的数据如下:
    Link connected to: a Virtual Link
     (Link ID) Neighboring Router ID: 3.3.3.3                    #虚链路对端设备的RouterID
     (Link Data) Router Interface address: 10.1.12.1         #本地接口IP地址
      Number of TOS metrics: 0
       TOS 0 Metrics: 128
上面输出中的Metric: 128,指的是从本地到虚链路对端,沿途所有出接口的cost累加。例如R1产生的描述虚链路的Link数据中包含的metric值就是如图所示绿色标记的接口cost累加。