1. 为什么邻居和邻接这两个词值得单独拎出来讲刚接触OSPF的人,十有八九会在“邻居”和“邻接”这两个词上栽跟头。书上看一遍,觉得懂了;抓包一看,Hello包满天飞,状态机从Down一路跳到Full,又觉得好像没那么简单。我见过不少做了几年网络的同行,排障时依然会把“邻居卡在ExStart”和“邻接建立失败”混为一谈,结果方向跑偏,浪费大半天。这篇内容就是冲着这个痛点来的。OSPF里的邻居(Neighbor)和邻接(Adjacency)不是同义词,它们描述的是两个不同阶段、不同深度的关系。邻居是“能聊上话”,邻接是“聊透了、能交换完整路由信息”。搞不清这个区别,你就没法理解为什么广播网络里非DR/BDR之间只停在2-Way,也没法解释为什么点对点链路一上来就奔着Full去。适合谁看?正在备考网络认证的、刚上手配置OSPF的、以及排障时被状态机卡住的老手,都能从这篇里拿到能直接用的东西。我会把状态机逐层拆开,把邻居到邻接的跃迁条件讲透,再配上实际环境里的抓包现象和排障思路。不堆术语,讲人话,重点放在“为什么这么设计”和“出问题了怎么查”。2. 邻居与邻接的核心概念拆解2.1 邻居关系的本质:能收到对方的Hello邻居关系是OSPF里最基础的一层关系。两台路由器接口启用了OSPF,并且接口处于同一网段、Area ID一致、Hello/Dead计时器匹配、认证通过、MTU(在特定阶段检查)没问题,它们就能互相收到对方的Hello包,从而进入邻居关系。这个阶段的核心动作只有一个:周期性发送Hello包,确认对方还活着。Hello包默认在广播网络里每10秒发一次,Dead时间是40秒;在NBMA和点对多点网络里,Hello是30秒,Dead是120秒。只要在Dead时间内收到对方的Hello,邻居关系就维持着。但注意,邻居关系建立起来,不代表能交换路由。你可以把邻居理解成“点头之交”——知道有这么个人,见面打个招呼,但还没到交换核心信息的程度。在广播网络中,非DR/BDR路由器之间就停在这个阶段,状态显示为2-Way。这不是故障,是正常设计。2.2 邻接关系的本质:能交换LSA邻接关系是在邻居关系基础上更进一步。两台路由器不仅要能收Hello,还要完成数据库描述(DBD)交换、链路状态请求(LSR)、链路状态更新(LSU)、链路状态确认(LSAck)这一整套流程,最终达到链路状态数据库同步,状态机走到Full。只有建立了邻接关系的路由器之间,才会互相泛洪LSA,才会把对方通告的路由算进SPF树。换句话说,邻接是“能一起算路”的关系。那为什么不让所有邻居都变成邻接?因为广播网络里路由器多了,如果两两都建邻接,LSA泛洪会变成N的平方级别,开销爆炸。所以OSPF在广播和NBMA网络里引入DR/BDR机制,让所有路由器只和DR/BDR建邻接,DR/BDR之间也建邻接,非DR/BDR之间只保持2-Way邻居关系。这样邻接数量从N*(N-1)/2降到2N-3左右,泛洪效率大幅提升。2.3 一张表看清邻居和邻接的区别对比维度邻居关系邻接关系核心标志能互相收到Hello链路状态数据库同步完成状态机终点2-WayFull是否交换LSA否是是否参与SPF计算否是广播网络中的范围所有同网段OSPF路由器仅DR/BDR与其他路由器之间点对点网络中的范围两端路由器两端路由器(邻居即邻接)建立前提Hello参数匹配邻居关系 + 主从协商 + DBD/LSR/LSU/LSAck完成这张表建议存下来,排障时对着看,能快速判断问题出在哪一层。3. OSPF状态机逐层拆解:从Down到Full到底发生了什么3.1 Down与Attempt:还没聊上的阶段Down状态是状态机的起点,表示还没从对方收到任何Hello。在NBMA网络里,如果配置了邻居但还没收到Hello,会进入Attempt状态,这个状态只在NBMA里出现,表示主动尝试联系对方但还没成功。广播和点对点网络里没有Attempt,直接从Down跳到Init。这里有个实操细节:如果你在广播网络里看到邻居一直卡在Down,先查物理层和二层——接口up没up、VLAN通不通、ACL有没有挡掉组播。OSPF的Hello包目的地址是224.0.0.5(AllSPFRouters),如果ACL把组播挡了,Hello根本到不了对方,状态机永远起不来。3.2 Init:单向通信的尴尬Init状态表示从对方收到了Hello,但对方的Hello里没有列出自己的Router ID。这说明什么?说明你能听到对方说话,但对方没听到你说话,或者对方听到了但还没把你加进邻居列表。单向通信是Init状态的典型特征。常见原因有几个:一是单向链路,比如光纤收发对调了;二是ACL只放行了一个方向;三是组播问题,一边能发组播一边收不到;四是认证配置一边有一边没有,对方收到你的Hello但因为认证失败丢弃了,自然不会把你列进邻居列表。我踩过的一个坑:某次在交换机上配了端口镜像,结果镜像口把OSPF的Hello包也镜像走了,导致一边收不到Hello,状态卡在Init。这种问题抓包一看就明白——一边有Hello发出,另一边没有回应。3.3 2-Way:邻居关系达成的标志当双方互相在Hello包里看到自己的Router ID,状态机进入2-Way。这是邻居关系正式建立的标志。在广播网络里,2-Way之后会进行DR/BDR选举。如果路由器不是DR也不是BDR,且它和另一个非DR/BDR路由器之间的状态就停在2-Way,不会继续往下走。这是正常的,不是故障。但如果你发现两台路由器应该建邻接却卡在2-Way,就要查DR/BDR选举。常见原因:接口优先级都是0,导致没有DR/BDR;或者DR/BDR选举被干预了,比如优先级配置不一致导致预期外的路由器当了DR。提示:在广播网络里排障时,先看DR/BDR是谁,再看谁和谁应该建邻接。非DR/BDR之间卡2-Way是正常的,别浪费时间。3.4 ExStart:主从协商的暗战ExStart状态是邻接关系建立的第一个阶段,核心任务是协商主从关系。双方通过交换DBD包,比较Router ID,Router ID大的成为Master,小的成为Slave。Master负责控制DBD交换的序列号,Slave只能回应。为什么要有主从?因为DBD交换需要可靠的传输机制,需要一个序列号来保证顺序和确认。如果没有主从,双方都发DBD,序列号冲突,数据库描述就乱了。ExStart卡住是排障中的高频问题。最常见的原因是MTU不匹配。OSPF在DBD包里会携带接口MTU,如果两端MTU不一致,DBD交换会失败,状态机卡在ExStart或ExChange。华为设备默认会检查MTU,思科设备默认不检查但可以开启。我遇到过好几次因为一端是1500一端是9000导致卡ExStart的案例,改一致后立马跳到Full。另一个原因是Router ID冲突。如果两台路由器Router ID一样,主从协商会出问题。Router ID冲突在OSPF里是严重问题,必须改掉。3.5 Exchange:数据库描述包的互换ExStart协商完主从后进入Exchange状态,双方开始互相发送DBD包,描述自己的链路状态数据库摘要。DBD包里包含LSA的头部信息——类型、Link State ID、Advertising Router、序列号,但不包含完整LSA内容。这个阶段的核心是比对数据库。双方通过DBD交换,知道对方有哪些LSA、自己有哪些LSA,然后决定需要请求哪些缺失的LSA。Exchange卡住的常见原因:MTU不匹配(和ExStart一样)、DBD包被丢弃、序列号异常。抓包时如果看到DBD包重传,基本就是MTU或序列号问题。3.6 Loading:请求缺失的LSAExchange完成后进入Loading状态,路由器根据DBD比对结果,向对方发送LSR(链路状态请求),请求自己缺失的LSA。对方收到LSR后,用LSU(链路状态更新)回应,把完整LSA发过来。收到LSU的一方要发LSAck确认。Loading状态卡住,通常是LSR/LSU/LSAck交互出了问题。常见原因:LSA被过滤、MTU问题导致LSU分片丢弃、单向通信。如果看到LSR反复重传但收不到LSU,查ACL和MTU。3.7 Full:邻接关系建立的终点当所有缺失的LSA都请求到、数据库同步完成,状态机进入Full。此时两台路由器建立了完整的邻接关系,可以互相泛洪LSA,参与SPF计算。Full是OSPF邻接关系的最终状态,也是我们最希望看到的状态。但要注意,Full不代表路由一定正确——如果LSA内容有问题、区域配置错误、SPF计算出问题,即使邻居是Full,路由也可能不对。所以排障时不能只看邻居状态,还要看路由表和LSDB。4. 不同网络类型下的邻居与邻接行为差异4.1 广播网络:DR/BDR机制下的邻接关系广播网络(如以太网)是OSPF最常见的场景。在这种网络里,所有路由器通过组播Hello发现邻居,然后进行DR/BDR选举。DR(指定路由器)和BDR(备份指定路由器)负责与所有其他路由器建立邻接关系,非DR/BDR之间只保持2-Way邻居关系。DR/BDR选举规则:先比接口优先级,优先级高的当DR;优先级相同比Router ID,大的当DR。优先级范围0-255,默认1,优先级0表示不参与选举。BDR是优先级第二高的,DR挂了BDR顶上。这里有个容易混淆的点:DR/BDR选举是非抢占的。也就是说,如果DR已经选出来了,后来了一台优先级更高的路由器,它不会抢走DR角色,除非DR失效或重启OSPF进程。这个设计是为了避免网络震荡。实操中,如果你想让某台路由器当DR,除了配高优先级,还要确保它在其他路由器之前启动OSPF,或者重启OSPF进程触发重新选举。4.2 点对点网络:邻居即邻接点对点网络(如PPP、HDLC、点对点以太网)里没有DR/BDR选举,两端路由器直接建立邻接关系。邻居关系建立后,状态机一路走到Full,没有2-Way停留。点对点网络的好处是简单、收敛快。但要注意,如果接口类型配置错误,比如把广播网络配成了点对点,或者反过来,会导致邻居关系异常。我见过把以太网接口配成点对点但两端配置不一致的情况,一端发组播Hello一端发单播,邻居根本建不起来。4.3 NBMA与点对多点:手动指定邻居的坑NBMA(非广播多路访问)网络如帧中继、ATM,不支持组播和广播,需要手动指定邻居。在NBMA里,DR/BDR选举是必须的,但邻居需要手动配置。点对多点网络可以看作多个点对点链路的集合,不需要DR/BDR,但需要手动指定邻居或使用组播(如果底层支持)。这两种网络类型在现代网络里越来越少见了,但在一些传统行业网络里还能碰到。配置时最容易踩的坑是邻居指定不全或网络类型不匹配。比如一端配了NBMA一端配了广播,Hello发送方式不同,邻居建不起来。5. 实操排障:邻居卡在某个状态怎么办5.1 排障前的信息收集清单遇到OSPF邻居问题,别急着改配置,先把信息收集全。我习惯按这个顺序查:show ip ospf neighbor看邻居状态和状态持续时间show ip ospf interface看接口的OSPF参数——区域、网络类型、Hello/Dead计时器、认证、MTUshow ip ospf看Router ID、进程信息show run interface看接口配置抓包看Hello/DBD/LSR/LSU交互这五步走完,基本能定位到问题在哪一层。5.2 常见卡状态原因速查表卡住状态最可能原因排查方法解决方式Down物理层/二层不通、ACL挡组播查接口状态、VLAN、ACL修复链路、放行224.0.0.5Init单向通信、认证不一致抓包看双向Hello、查认证配置修复单向链路、统一认证2-WayDR/BDR选举问题、优先级全0查DR/BDR、查接口优先级调整优先级、确保有DRExStartMTU不匹配、Router ID冲突查接口MTU、查Router ID统一MTU、改Router IDExchangeMTU不匹配、DBD丢弃抓包看DBD重传统一MTU、查ACLLoadingLSA过滤、LSU分片丢弃抓包看LSR/LSU查ACL、统一MTU5.3 三个真实排障案例复盘案例一:MTU不匹配导致卡ExStart。某次割接后,两台核心交换机OSPF邻居卡在ExStart。查配置发现一端接口MTU是1500,另一端是9000。改一致后邻居立马跳到Full。这个问题的隐蔽性在于,ping大包可能通,但OSPF的DBD包因为携带MTU字段被对方拒绝。案例二:认证不一致导致卡Init。一端配了MD5认证,另一端没配。没配的一端能收到Hello但认证失败丢弃,所以不会把对方列进邻居列表。配认证的一端收不到有效Hello,状态卡Init。统一认证后解决。案例三:DR优先级全0导致卡2-Way。广播网络里所有路由器接口优先级都配了0,导致没有DR/BDR,所有路由器都停在2-Way。把其中两台优先级改成1后,DR/BDR选出来,邻接建立。5.4 抓包分析的关键看点抓包是排障的终极手段。看OSPF抓包时,重点看这几个:Hello包的Neighbor List字段:如果对方Hello里没有你的Router ID,说明对方没收到你的Hello或认证失败DBD包的MTU字段:两端MTU是否一致DBD包的Master/Slave字段:主从协商是否正常LSR/LSU的交互:是否有请求没回应Wireshark里过滤ospf就能看到所有OSPF包。如果看到Hello包正常但DBD包重传,基本就是MTU或序列号问题。6. 邻居与邻接关系的优化与设计建议6.1 广播网络里如何控制DR/BDR控制DR/BDR是广播网络OSPF设计的关键。我的建议是:明确指定DR和BDR,不要让选举随机发生。具体做法是给期望当DR的路由器配高优先级(比如100),期望当BDR的配次高(比如50),其他路由器配0不参与选举。这样设计的好处是DR/BDR稳定,不会因为某台路由器重启导致角色切换。角色切换会引起LSA重新泛洪,网络震荡。另外,DR/BDR应该选性能好、稳定性高的设备。DR要负责与所有路由器建邻接、泛洪LSA,负担比普通路由器重。6.2 点对点网络里的邻接优化点对点网络里没有DR/BDR,邻居即邻接,相对简单。但有几个优化点:如果链路稳定,可以适当调大Hello/Dead计时器,减少Hello包开销如果链路质量差,调小Hello/Dead计时器加快收敛确保两端网络类型一致,避免一端点对点一端广播点对点网络里还可以启用OSPF的快速收敛特性,比如BFD联动,链路故障时毫秒级切换。6.3 大规模网络里的邻接数量控制大规模广播网络里,邻接数量是设计重点。假设一个广播域有N台路由器,DR/BDR机制下邻接数量是2N-3。如果N=50,邻接数量约97,每台路由器要维护97个邻接,LSDB同步开销很大。控制方法:划分更小的广播域,用VLAN隔离;或者把网络类型改成点对点(如果拓扑允许);或者用OSPF的区域划分,把大网络拆成多个区域。我个人的经验是,单个广播域里的OSPF路由器不要超过20台,超过就考虑拆分。邻接数量太多会导致SPF计算频繁、LSDB过大、收敛变慢。6.4 邻居关系监控与告警生产环境里,OSPF邻居关系要监控。重点监控:邻居状态是否Full(非DR/BDR之间的2-Way是正常的)邻居状态变化频率(频繁翻转说明链路或配置有问题)LSDB大小和LSA数量(突增说明网络异常)可以用SNMP采集OSPF邻居状态,或者用脚本定期执行show ip ospf neighbor解析结果。告警阈值建议:邻居非Full持续超过1分钟就告警,邻居翻转超过3次/小时就告警。7. 几个容易被忽略的细节和我的实操心得7.1 Router ID冲突的隐蔽性Router ID冲突在OSPF里是严重问题,但表现可能很隐蔽。两台Router ID相同的路由器不会建立邻接,状态可能卡在ExStart或Exchange。更麻烦的是,如果冲突发生在不同区域,可能只影响部分路由。排查Router ID冲突的方法:show ip ospf看自己的Router ID,show ip ospf neighbor看邻居的Router ID,如果发现邻居Router ID和自己一样,就是冲突了。解决方法是改Router ID,然后重启OSPF进程。建议在规划阶段就统一分配Router ID,用Loopback接口地址作为Router ID,确保唯一性。7.2 认证配置的坑OSPF认证有三种:空认证、明文认证、MD5认证。配置时最容易踩的坑是两端认证类型或密钥不一致。一端MD5一端明文,或者密钥一个字母大小写不同,都会导致Hello被丢弃,邻居建不起来。我的习惯是:配置认证时先在一端配好,抓包确认Hello里带了认证字段,再在另一端配相同的认证。配完立即show ip ospf neighbor确认状态。另外,认证是在接口下配置的,不是进程下。ip ospf authentication message-digest和ip ospf message-digest-key 1 md5 password要配对使用。7.3 网络类型不匹配的排查网络类型不匹配是邻居建立失败的常见原因。一端广播一端点对点,Hello发送方式不同(组播vs单播),邻居根本建不起来。排查时用show ip ospf interface看两端的网络类型,确保一致。如果拓扑允许,我倾向于把以太网接口配成点对点(ip ospf network point-to-point),这样可以跳过DR/BDR选举,收敛更快,邻接关系更简单。但要注意,点对点网络里两端必须在同一网段,且不能有第三台路由器。7.4 我的实操心得汇总最后分享几条我踩坑总结的经验:改OSPF配置前先备份,尤其是Router ID和网络类型,改错了影响面很大排障时先看邻居状态,再看LSDB,最后看路由表,从下往上查效率高抓包是最可靠的排障手段,别猜,直接看包MTU问题在OSPF里很常见,统一MTU能避免很多莫名其妙的卡状态DR/BDR选举非抢占,想让某台设备当DR,要么重启OSPF进程,要么等DR失效邻居Full不代表路由正确,还要查LSDB和SPF计算结果这些经验在书本上不一定能看到,但实际工作中非常有用。OSPF的邻居和邻接关系是理解OSPF运行机制的基础,把这块搞透了,排障时就能快速定位问题,不会在错误的方向上浪费时间。
1. 为什么邻居和邻接这两个词值得单独拎出来讲刚接触OSPF的人,十有八九会在“邻居”和“邻接”这两个词上栽跟头。书上看一遍,觉得懂了;抓包一看,Hello包满天飞,状态机从Down一路跳到Full,又觉得好像没那么简单。我见过不少做了几年网络的同行,排障时依然会把“邻居卡在ExStart”和“邻接建立失败”混为一谈,结果方向跑偏,浪费大半天。这篇内容就是冲着这个痛点来的。OSPF里的邻居(Neighbor)和邻接(Adjacency)不是同义词,它们描述的是两个不同阶段、不同深度的关系。邻居是“能聊上话”,邻接是“聊透了、能交换完整路由信息”。搞不清这个区别,你就没法理解为什么广播网络里非DR/BDR之间只停在2-Way,也没法解释为什么点对点链路一上来就奔着Full去。适合谁看?正在备考网络认证的、刚上手配置OSPF的、以及排障时被状态机卡住的老手,都能从这篇里拿到能直接用的东西。我会把状态机逐层拆开,把邻居到邻接的跃迁条件讲透,再配上实际环境里的抓包现象和排障思路。不堆术语,讲人话,重点放在“为什么这么设计”和“出问题了怎么查”。2. 邻居与邻接的核心概念拆解2.1 邻居关系的本质:能收到对方的Hello邻居关系是OSPF里最基础的一层关系。两台路由器接口启用了OSPF,并且接口处于同一网段、Area ID一致、Hello/Dead计时器匹配、认证通过、MTU(在特定阶段检查)没问题,它们就能互相收到对方的Hello包,从而进入邻居关系。这个阶段的核心动作只有一个:周期性发送Hello包,确认对方还活着。Hello包默认在广播网络里每10秒发一次,Dead时间是40秒;在NBMA和点对多点网络里,Hello是30秒,Dead是120秒。只要在Dead时间内收到对方的Hello,邻居关系就维持着。但注意,邻居关系建立起来,不代表能交换路由。你可以把邻居理解成“点头之交”——知道有这么个人,见面打个招呼,但还没到交换核心信息的程度。在广播网络中,非DR/BDR路由器之间就停在这个阶段,状态显示为2-Way。这不是故障,是正常设计。2.2 邻接关系的本质:能交换LSA邻接关系是在邻居关系基础上更进一步。两台路由器不仅要能收Hello,还要完成数据库描述(DBD)交换、链路状态请求(LSR)、链路状态更新(LSU)、链路状态确认(LSAck)这一整套流程,最终达到链路状态数据库同步,状态机走到Full。只有建立了邻接关系的路由器之间,才会互相泛洪LSA,才会把对方通告的路由算进SPF树。换句话说,邻接是“能一起算路”的关系。那为什么不让所有邻居都变成邻接?因为广播网络里路由器多了,如果两两都建邻接,LSA泛洪会变成N的平方级别,开销爆炸。所以OSPF在广播和NBMA网络里引入DR/BDR机制,让所有路由器只和DR/BDR建邻接,DR/BDR之间也建邻接,非DR/BDR之间只保持2-Way邻居关系。这样邻接数量从N*(N-1)/2降到2N-3左右,泛洪效率大幅提升。2.3 一张表看清邻居和邻接的区别对比维度邻居关系邻接关系核心标志能互相收到Hello链路状态数据库同步完成状态机终点2-WayFull是否交换LSA否是是否参与SPF计算否是广播网络中的范围所有同网段OSPF路由器仅DR/BDR与其他路由器之间点对点网络中的范围两端路由器两端路由器(邻居即邻接)建立前提Hello参数匹配邻居关系 + 主从协商 + DBD/LSR/LSU/LSAck完成这张表建议存下来,排障时对着看,能快速判断问题出在哪一层。3. OSPF状态机逐层拆解:从Down到Full到底发生了什么3.1 Down与Attempt:还没聊上的阶段Down状态是状态机的起点,表示还没从对方收到任何Hello。在NBMA网络里,如果配置了邻居但还没收到Hello,会进入Attempt状态,这个状态只在NBMA里出现,表示主动尝试联系对方但还没成功。广播和点对点网络里没有Attempt,直接从Down跳到Init。这里有个实操细节:如果你在广播网络里看到邻居一直卡在Down,先查物理层和二层——接口up没up、VLAN通不通、ACL有没有挡掉组播。OSPF的Hello包目的地址是224.0.0.5(AllSPFRouters),如果ACL把组播挡了,Hello根本到不了对方,状态机永远起不来。3.2 Init:单向通信的尴尬Init状态表示从对方收到了Hello,但对方的Hello里没有列出自己的Router ID。这说明什么?说明你能听到对方说话,但对方没听到你说话,或者对方听到了但还没把你加进邻居列表。单向通信是Init状态的典型特征。常见原因有几个:一是单向链路,比如光纤收发对调了;二是ACL只放行了一个方向;三是组播问题,一边能发组播一边收不到;四是认证配置一边有一边没有,对方收到你的Hello但因为认证失败丢弃了,自然不会把你列进邻居列表。我踩过的一个坑:某次在交换机上配了端口镜像,结果镜像口把OSPF的Hello包也镜像走了,导致一边收不到Hello,状态卡在Init。这种问题抓包一看就明白——一边有Hello发出,另一边没有回应。3.3 2-Way:邻居关系达成的标志当双方互相在Hello包里看到自己的Router ID,状态机进入2-Way。这是邻居关系正式建立的标志。在广播网络里,2-Way之后会进行DR/BDR选举。如果路由器不是DR也不是BDR,且它和另一个非DR/BDR路由器之间的状态就停在2-Way,不会继续往下走。这是正常的,不是故障。但如果你发现两台路由器应该建邻接却卡在2-Way,就要查DR/BDR选举。常见原因:接口优先级都是0,导致没有DR/BDR;或者DR/BDR选举被干预了,比如优先级配置不一致导致预期外的路由器当了DR。提示:在广播网络里排障时,先看DR/BDR是谁,再看谁和谁应该建邻接。非DR/BDR之间卡2-Way是正常的,别浪费时间。3.4 ExStart:主从协商的暗战ExStart状态是邻接关系建立的第一个阶段,核心任务是协商主从关系。双方通过交换DBD包,比较Router ID,Router ID大的成为Master,小的成为Slave。Master负责控制DBD交换的序列号,Slave只能回应。为什么要有主从?因为DBD交换需要可靠的传输机制,需要一个序列号来保证顺序和确认。如果没有主从,双方都发DBD,序列号冲突,数据库描述就乱了。ExStart卡住是排障中的高频问题。最常见的原因是MTU不匹配。OSPF在DBD包里会携带接口MTU,如果两端MTU不一致,DBD交换会失败,状态机卡在ExStart或ExChange。华为设备默认会检查MTU,思科设备默认不检查但可以开启。我遇到过好几次因为一端是1500一端是9000导致卡ExStart的案例,改一致后立马跳到Full。另一个原因是Router ID冲突。如果两台路由器Router ID一样,主从协商会出问题。Router ID冲突在OSPF里是严重问题,必须改掉。3.5 Exchange:数据库描述包的互换ExStart协商完主从后进入Exchange状态,双方开始互相发送DBD包,描述自己的链路状态数据库摘要。DBD包里包含LSA的头部信息——类型、Link State ID、Advertising Router、序列号,但不包含完整LSA内容。这个阶段的核心是比对数据库。双方通过DBD交换,知道对方有哪些LSA、自己有哪些LSA,然后决定需要请求哪些缺失的LSA。Exchange卡住的常见原因:MTU不匹配(和ExStart一样)、DBD包被丢弃、序列号异常。抓包时如果看到DBD包重传,基本就是MTU或序列号问题。3.6 Loading:请求缺失的LSAExchange完成后进入Loading状态,路由器根据DBD比对结果,向对方发送LSR(链路状态请求),请求自己缺失的LSA。对方收到LSR后,用LSU(链路状态更新)回应,把完整LSA发过来。收到LSU的一方要发LSAck确认。Loading状态卡住,通常是LSR/LSU/LSAck交互出了问题。常见原因:LSA被过滤、MTU问题导致LSU分片丢弃、单向通信。如果看到LSR反复重传但收不到LSU,查ACL和MTU。3.7 Full:邻接关系建立的终点当所有缺失的LSA都请求到、数据库同步完成,状态机进入Full。此时两台路由器建立了完整的邻接关系,可以互相泛洪LSA,参与SPF计算。Full是OSPF邻接关系的最终状态,也是我们最希望看到的状态。但要注意,Full不代表路由一定正确——如果LSA内容有问题、区域配置错误、SPF计算出问题,即使邻居是Full,路由也可能不对。所以排障时不能只看邻居状态,还要看路由表和LSDB。4. 不同网络类型下的邻居与邻接行为差异4.1 广播网络:DR/BDR机制下的邻接关系广播网络(如以太网)是OSPF最常见的场景。在这种网络里,所有路由器通过组播Hello发现邻居,然后进行DR/BDR选举。DR(指定路由器)和BDR(备份指定路由器)负责与所有其他路由器建立邻接关系,非DR/BDR之间只保持2-Way邻居关系。DR/BDR选举规则:先比接口优先级,优先级高的当DR;优先级相同比Router ID,大的当DR。优先级范围0-255,默认1,优先级0表示不参与选举。BDR是优先级第二高的,DR挂了BDR顶上。这里有个容易混淆的点:DR/BDR选举是非抢占的。也就是说,如果DR已经选出来了,后来了一台优先级更高的路由器,它不会抢走DR角色,除非DR失效或重启OSPF进程。这个设计是为了避免网络震荡。实操中,如果你想让某台路由器当DR,除了配高优先级,还要确保它在其他路由器之前启动OSPF,或者重启OSPF进程触发重新选举。4.2 点对点网络:邻居即邻接点对点网络(如PPP、HDLC、点对点以太网)里没有DR/BDR选举,两端路由器直接建立邻接关系。邻居关系建立后,状态机一路走到Full,没有2-Way停留。点对点网络的好处是简单、收敛快。但要注意,如果接口类型配置错误,比如把广播网络配成了点对点,或者反过来,会导致邻居关系异常。我见过把以太网接口配成点对点但两端配置不一致的情况,一端发组播Hello一端发单播,邻居根本建不起来。4.3 NBMA与点对多点:手动指定邻居的坑NBMA(非广播多路访问)网络如帧中继、ATM,不支持组播和广播,需要手动指定邻居。在NBMA里,DR/BDR选举是必须的,但邻居需要手动配置。点对多点网络可以看作多个点对点链路的集合,不需要DR/BDR,但需要手动指定邻居或使用组播(如果底层支持)。这两种网络类型在现代网络里越来越少见了,但在一些传统行业网络里还能碰到。配置时最容易踩的坑是邻居指定不全或网络类型不匹配。比如一端配了NBMA一端配了广播,Hello发送方式不同,邻居建不起来。5. 实操排障:邻居卡在某个状态怎么办5.1 排障前的信息收集清单遇到OSPF邻居问题,别急着改配置,先把信息收集全。我习惯按这个顺序查:show ip ospf neighbor看邻居状态和状态持续时间show ip ospf interface看接口的OSPF参数——区域、网络类型、Hello/Dead计时器、认证、MTUshow ip ospf看Router ID、进程信息show run interface看接口配置抓包看Hello/DBD/LSR/LSU交互这五步走完,基本能定位到问题在哪一层。5.2 常见卡状态原因速查表卡住状态最可能原因排查方法解决方式Down物理层/二层不通、ACL挡组播查接口状态、VLAN、ACL修复链路、放行224.0.0.5Init单向通信、认证不一致抓包看双向Hello、查认证配置修复单向链路、统一认证2-WayDR/BDR选举问题、优先级全0查DR/BDR、查接口优先级调整优先级、确保有DRExStartMTU不匹配、Router ID冲突查接口MTU、查Router ID统一MTU、改Router IDExchangeMTU不匹配、DBD丢弃抓包看DBD重传统一MTU、查ACLLoadingLSA过滤、LSU分片丢弃抓包看LSR/LSU查ACL、统一MTU5.3 三个真实排障案例复盘案例一:MTU不匹配导致卡ExStart。某次割接后,两台核心交换机OSPF邻居卡在ExStart。查配置发现一端接口MTU是1500,另一端是9000。改一致后邻居立马跳到Full。这个问题的隐蔽性在于,ping大包可能通,但OSPF的DBD包因为携带MTU字段被对方拒绝。案例二:认证不一致导致卡Init。一端配了MD5认证,另一端没配。没配的一端能收到Hello但认证失败丢弃,所以不会把对方列进邻居列表。配认证的一端收不到有效Hello,状态卡Init。统一认证后解决。案例三:DR优先级全0导致卡2-Way。广播网络里所有路由器接口优先级都配了0,导致没有DR/BDR,所有路由器都停在2-Way。把其中两台优先级改成1后,DR/BDR选出来,邻接建立。5.4 抓包分析的关键看点抓包是排障的终极手段。看OSPF抓包时,重点看这几个:Hello包的Neighbor List字段:如果对方Hello里没有你的Router ID,说明对方没收到你的Hello或认证失败DBD包的MTU字段:两端MTU是否一致DBD包的Master/Slave字段:主从协商是否正常LSR/LSU的交互:是否有请求没回应Wireshark里过滤ospf就能看到所有OSPF包。如果看到Hello包正常但DBD包重传,基本就是MTU或序列号问题。6. 邻居与邻接关系的优化与设计建议6.1 广播网络里如何控制DR/BDR控制DR/BDR是广播网络OSPF设计的关键。我的建议是:明确指定DR和BDR,不要让选举随机发生。具体做法是给期望当DR的路由器配高优先级(比如100),期望当BDR的配次高(比如50),其他路由器配0不参与选举。这样设计的好处是DR/BDR稳定,不会因为某台路由器重启导致角色切换。角色切换会引起LSA重新泛洪,网络震荡。另外,DR/BDR应该选性能好、稳定性高的设备。DR要负责与所有路由器建邻接、泛洪LSA,负担比普通路由器重。6.2 点对点网络里的邻接优化点对点网络里没有DR/BDR,邻居即邻接,相对简单。但有几个优化点:如果链路稳定,可以适当调大Hello/Dead计时器,减少Hello包开销如果链路质量差,调小Hello/Dead计时器加快收敛确保两端网络类型一致,避免一端点对点一端广播点对点网络里还可以启用OSPF的快速收敛特性,比如BFD联动,链路故障时毫秒级切换。6.3 大规模网络里的邻接数量控制大规模广播网络里,邻接数量是设计重点。假设一个广播域有N台路由器,DR/BDR机制下邻接数量是2N-3。如果N=50,邻接数量约97,每台路由器要维护97个邻接,LSDB同步开销很大。控制方法:划分更小的广播域,用VLAN隔离;或者把网络类型改成点对点(如果拓扑允许);或者用OSPF的区域划分,把大网络拆成多个区域。我个人的经验是,单个广播域里的OSPF路由器不要超过20台,超过就考虑拆分。邻接数量太多会导致SPF计算频繁、LSDB过大、收敛变慢。6.4 邻居关系监控与告警生产环境里,OSPF邻居关系要监控。重点监控:邻居状态是否Full(非DR/BDR之间的2-Way是正常的)邻居状态变化频率(频繁翻转说明链路或配置有问题)LSDB大小和LSA数量(突增说明网络异常)可以用SNMP采集OSPF邻居状态,或者用脚本定期执行show ip ospf neighbor解析结果。告警阈值建议:邻居非Full持续超过1分钟就告警,邻居翻转超过3次/小时就告警。7. 几个容易被忽略的细节和我的实操心得7.1 Router ID冲突的隐蔽性Router ID冲突在OSPF里是严重问题,但表现可能很隐蔽。两台Router ID相同的路由器不会建立邻接,状态可能卡在ExStart或Exchange。更麻烦的是,如果冲突发生在不同区域,可能只影响部分路由。排查Router ID冲突的方法:show ip ospf看自己的Router ID,show ip ospf neighbor看邻居的Router ID,如果发现邻居Router ID和自己一样,就是冲突了。解决方法是改Router ID,然后重启OSPF进程。建议在规划阶段就统一分配Router ID,用Loopback接口地址作为Router ID,确保唯一性。7.2 认证配置的坑OSPF认证有三种:空认证、明文认证、MD5认证。配置时最容易踩的坑是两端认证类型或密钥不一致。一端MD5一端明文,或者密钥一个字母大小写不同,都会导致Hello被丢弃,邻居建不起来。我的习惯是:配置认证时先在一端配好,抓包确认Hello里带了认证字段,再在另一端配相同的认证。配完立即show ip ospf neighbor确认状态。另外,认证是在接口下配置的,不是进程下。ip ospf authentication message-digest和ip ospf message-digest-key 1 md5 password要配对使用。7.3 网络类型不匹配的排查网络类型不匹配是邻居建立失败的常见原因。一端广播一端点对点,Hello发送方式不同(组播vs单播),邻居根本建不起来。排查时用show ip ospf interface看两端的网络类型,确保一致。如果拓扑允许,我倾向于把以太网接口配成点对点(ip ospf network point-to-point),这样可以跳过DR/BDR选举,收敛更快,邻接关系更简单。但要注意,点对点网络里两端必须在同一网段,且不能有第三台路由器。7.4 我的实操心得汇总最后分享几条我踩坑总结的经验:改OSPF配置前先备份,尤其是Router ID和网络类型,改错了影响面很大排障时先看邻居状态,再看LSDB,最后看路由表,从下往上查效率高抓包是最可靠的排障手段,别猜,直接看包MTU问题在OSPF里很常见,统一MTU能避免很多莫名其妙的卡状态DR/BDR选举非抢占,想让某台设备当DR,要么重启OSPF进程,要么等DR失效邻居Full不代表路由正确,还要查LSDB和SPF计算结果这些经验在书本上不一定能看到,但实际工作中非常有用。OSPF的邻居和邻接关系是理解OSPF运行机制的基础,把这块搞透了,排障时就能快速定位问题,不会在错误的方向上浪费时间。