Explainer

OSPF Neighbor States Explained (Down to Full)

OSPF routers do not exchange routes the moment they hear each other. Every neighbor climbs a fixed sequence of states, and show ip ospf neighbor prints the one it has reached. That single word says whether the neighbor is healthy, still converging, or stuck at a named step.

The output here comes from a four-router lab on Cisco IOL running IOS XE 17.16 in Cisco Modeling Labs. R1 to R4 share the Ethernet segment 10.1.1.0/24 with router IDs 1.1.1.1 to 4.4.4.4, R4 elected DR and R3 BDR; R1 and R2 also have a point-to-point link, 10.0.12.0/30. If OSPF itself is new, start with how OSPF works.

The eight neighbor states

RFC 2328 defines eight neighbor states. The first four run on Hello packets; the last four synchronize the two link-state databases. IOS prints the names in capitals and writes 2-Way as 2WAY.

  1. Down: no Hello heard within the dead interval. It is the starting state; when a dead timer expires IOS deletes the entry rather than printing Down.
  2. Attempt: NBMA networks only, where neighbors are configured by hand.
  3. Init: a Hello has arrived, but it does not list this router's ID. Communication is one-way.
  4. 2-Way: the neighbor's Hello lists this router's ID. The DR and BDR are elected from neighbors at this state or better.
  5. ExStart: the two routers pick a master and a starting sequence number.
  6. Exchange: each router describes its database as a list of LSA headers.
  7. Loading: each router requests the LSAs it lacks, or holds an older copy of.
  8. Full: the databases match, the adjacency appears in both routers' LSAs, and SPF can use the link.

Down, Init and 2-Way: the Hello handshake

An OSPF interface sends a Hello to 224.0.0.5 every 10 seconds on broadcast and point-to-point links, and each Hello lists every neighbor the sender has heard from within the dead interval. The first accepted Hello creates an entry in Init; one that lists the receiving router's own ID moves it to 2-Way.

A router accepts a Hello only if the area, the hello and dead intervals, the authentication and the stub-area flag match — plus the subnet mask on a broadcast segment. A failed check drops the Hello before any entry exists, so a mismatch shows up as a missing neighbor, not a neighbor stuck in Init.

Init therefore needs an asymmetry — Hellos that get through one way only. Here an inbound ACL on R2's point-to-point interface drops OSPF and passes everything else.

One side sees Init, the other sees nothing

R1 still receives R2's Hellos, so its Dead Time keeps restarting, but those Hellos no longer list 1.1.1.1 and the entry drops to INIT. R2 hears nothing on that link: its dead timer expires, the entry is deleted, and its neighbor count on Ethernet0/1 reads 0 while the shared segment is untouched.

The router showing INIT is the one still receiving; the loss is in the other direction, so follow the path its own hellos take — an inbound filter at the far end, or a link or switch that passes traffic one way only.

R1# show ip ospf neighbor
Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2           0   INIT/  -        00:00:35    10.0.12.2       Ethernet0/1
2.2.2.2           1   2WAY/DROTHER    00:00:32    10.1.1.2        Ethernet0/0
3.3.3.3           1   FULL/BDR        00:00:36    10.1.1.3        Ethernet0/0
4.4.4.4           1   FULL/DR         00:00:33    10.1.1.4        Ethernet0/0

R2# show ip ospf interface Ethernet0/1 | include Neighbor Count
  Neighbor Count is 0, Adjacent neighbor count is 0 

R2# show ip ospf neighbor
Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1           1   2WAY/DROTHER    00:00:31    10.1.1.1        Ethernet0/0
3.3.3.3           1   FULL/BDR        00:00:37    10.1.1.3        Ethernet0/0
4.4.4.4           1   FULL/DR         00:00:34    10.1.1.4        Ethernet0/0

The same fault from both ends: R1 holds an INIT entry, R2 has none. Output captured on Cisco IOL (IOS XE 17.16) in Cisco Modeling Labs.

Why some neighbors stop at 2-Way

On a point-to-point link, 2-Way always leads on to an adjacency. On a broadcast segment it does so only if one of the pair is the DR or the BDR, so two DROTHERs stay in 2-Way for good — which is how OSPF caps the flooding. OSPF DR and BDR election has the rules.

R1 is a DROTHER, so its table shows every case at once: FULL with the DR (R4) and the BDR (R3), 2WAY with the other DROTHER (R2), and FULL with that same R2 over the point-to-point link. The interface view counts the two things apart: three neighbors, two adjacencies.

R1# show ip ospf neighbor
Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2           0   FULL/  -        00:00:36    10.0.12.2       Ethernet0/1
2.2.2.2           1   2WAY/DROTHER    00:00:36    10.1.1.2        Ethernet0/0
3.3.3.3           1   FULL/BDR        00:00:30    10.1.1.3        Ethernet0/0
4.4.4.4           1   FULL/DR         00:00:32    10.1.1.4        Ethernet0/0

R1# show ip ospf interface Ethernet0/0 | include Neighbor Count|Adjacent with
  Neighbor Count is 3, Adjacent neighbor count is 2
    Adjacent with neighbor 3.3.3.3  (Backup Designated Router)
    Adjacent with neighbor 4.4.4.4  (Designated Router)

Output captured on Cisco IOL (IOS XE 17.16) in Cisco Modeling Labs.

The same neighbor, a different state

A state belongs to a pair of routers, not to a router. R2 is 2WAY seen from R1 and FULL seen from R3, because R3 is the BDR and synchronizes with everyone on the segment. Ask the DR or the BDR to tell a normal 2-Way from a broken one.

R3# show ip ospf neighbor
Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1           1   FULL/DROTHER    00:00:35    10.1.1.1        Ethernet0/0
2.2.2.2           1   FULL/DROTHER    00:00:38    10.1.1.2        Ethernet0/0
4.4.4.4           1   FULL/DR         00:00:35    10.1.1.4        Ethernet0/0

R3, the BDR, is FULL with all three neighbors — including the R2 that R1 sees as 2WAY. Output captured on Cisco IOL (IOS XE 17.16) in Cisco Modeling Labs.

ExStart, Exchange and Loading: synchronizing the databases

In ExStart the two routers trade empty Database Description (DBD) packets. The higher router ID becomes master and sets the sequence numbers, which the slave echoes back. Each DBD also carries the sender's interface MTU, and a router drops any DBD advertising an MTU larger than its own interface, so an MTU mismatch holds the pair short of Full while the Hellos keep flowing — in this lab it left both ends in EXSTART.

In Exchange the DBDs carry LSA headers, enough to identify each LSA and its version, and each router asks for what it lacks with a Link State Request. In Loading the neighbor answers with Link State Updates, each LSA is acknowledged, and an unanswered request is repeated every retransmit interval — 5 seconds by default. When nothing is left to request, the neighbor is Full; a router missing nothing skips Loading entirely.

Reading show ip ospf neighbor

  • Neighbor ID is the neighbor's router ID; Address is its interface IP on that link. One router ID appears twice when two links join the same pair.
  • After the slash comes the neighbor's role on that segment — DR, BDR or DROTHER — not the local router's.
  • FULL/ - means the network type holds no election, as on a point-to-point link. The Pri column reads 0 there; priority only matters in an election.
  • Dead Time counts down from the dead interval, 40 seconds by default, and restarts at every Hello, so with 10-second Hellos it sits between about 30 and 40. At zero the line disappears.

The detail view

show ip ospf neighbor detail spells the state out, counts the state changes and names the DR and BDR the neighbor sees. Six changes is one clean climb from Down to Full; the 2WAY entry has made two. What matters is whether the count rises between two runs — that means the adjacency keeps resetting. The point-to-point neighbor reports 0.0.0.0 for both roles, the dash of the summary view.

R1# show ip ospf neighbor detail | include interface address|State is|DR is
 Neighbor 2.2.2.2, interface address 10.0.12.2, interface-id 3
    Neighbor priority is 0, State is FULL, 6 state changes
    DR is 0.0.0.0 BDR is 0.0.0.0
 Neighbor 2.2.2.2, interface address 10.1.1.2, interface-id 2
    Neighbor priority is 1, State is 2WAY, 2 state changes
    DR is 10.1.1.4 BDR is 10.1.1.3
 Neighbor 3.3.3.3, interface address 10.1.1.3, interface-id 2
    Neighbor priority is 1, State is FULL, 6 state changes
    DR is 10.1.1.4 BDR is 10.1.1.3
 Neighbor 4.4.4.4, interface address 10.1.1.4, interface-id 2
    Neighbor priority is 1, State is FULL, 6 state changes
    DR is 10.1.1.4 BDR is 10.1.1.3

Output captured on Cisco IOL (IOS XE 17.16) in Cisco Modeling Labs.

What a stuck state tells you

Once a fault has outlived a dead interval, the state names the step that is failing — 2-Way between two DROTHERs aside. OSPF neighbor not forming has the checks for each; the single-area OSPF guide has the base configuration.

  • No entry at all: no Hello was accepted — a parameter mismatch, a passive interface, or OSPF not enabled on one side.
  • Init: Hellos arrive one way only, through a filter on the neighbor or a one-way path.
  • 2-Way where Full is expected: neither router is the DR or the BDR — with priority 0 on every router none is elected, and every pair stops here.
  • ExStart, Exchange or Loading: the databases are not synchronizing, most often on an MTU mismatch.

Frequently asked questions

What does EXSTART mean in show ip ospf neighbor?

ExStart is the first step of the database exchange: the two routers send empty Database Description packets to settle which of them is master and what sequence number to start from, and the higher router ID wins. A neighbor parked in EXSTART usually means an MTU mismatch, because a router drops a Database Description packet that advertises an MTU larger than its own interface. Lowering the MTU on one end of the point-to-point link in this lab left both ends showing EXSTART.

What does FULL with a dash mean in show ip ospf neighbor?

The adjacency is complete on a network type that holds no DR or BDR election: a serial or point-to-multipoint link, or an Ethernet interface set to the point-to-point network type, as the link in this lab is. The dash sits where a DR, BDR or DROTHER role would print, and on that point-to-point link the priority column reads 0 beside it.

What is the difference between an OSPF neighbor and an adjacency?

A neighbor is any router whose Hellos this one accepts; it appears in the neighbor table from Init onward, and at 2-Way the two have confirmed they hear each other. An adjacency is a neighbor whose link-state database this router also synchronizes with, from ExStart through to Full. Two DROTHERs on a shared segment stay neighbors without ever becoming adjacent, which is why the interface counts them separately.

Why do I never see the Attempt state?

Attempt exists only on NBMA networks, where neighbors are configured by hand with the neighbor command. Ethernet and point-to-point links find their neighbors with multicast Hellos, so a neighbor goes from Down straight to Init.

How long should an OSPF neighbor take to reach FULL?

On a point-to-point link, well under a minute, because no election has to be waited out: the routers in this lab were Full across that link about 27 seconds after boot. On the broadcast segment it took 60 to 70 seconds, since a broadcast interface first runs a wait timer equal to the dead interval, 40 seconds by default. Anything still short of FULL after a few minutes is stuck, not slow.

Now build it

Labs that drill this on real Cisco IOS — configure it yourself, then grade your config against the answer key.

All OSPF labs →

Now configure it on real Cisco IOS

Concepts stick when you configure them. Build one on real Cisco IOS and have your config graded.