I have a simple topology to check how eigrp works.
Below is information from debug eigrp packet
*Mar 1 02:20:32.135: EIGRP: Received Sequence TLV from 192.168.123.2
*Mar 1 02:20:32.135: 192.168.123.1
*Mar 1 02:20:32.139: address matched
*Mar 1 02:20:32.139: clearing CR-mode
*Mar 1 02:20:32.139: EIGRP: Received CR sequence TLV from 192.168.123.2, sequence 5
*Mar 1 02:20:32.139: EIGRP: Received UPDATE on FastEthernet0/0 nbr 192.168.123.2
*Mar 1 02:20:32.139: AS 1, Flags 0xA, Seq 5/0 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1, not in CR-mode, packet discarded
*Mar 1 02:20:34.123: EIGRP: FastEthernet0/0 multicast flow blocking cleared
I am so confused with those for a long time and I could find little detail documents about those.
Thanks a lot.
What you are seeing is the EIGRP implementation of reliable routing information delivery over both multicast and unicast kicking into action. Explaining it will take some time
On multiaccess segments, EIGRP uses multicasts for effective delivery of routing information to all directly connected neighbors. A basic, although naive principle for reliability in this setup would be to send a multicast packet, then expect an explicit (unicast) acknowledgement from each neighbor, and then proceed to send the next multicast packet. However, the major drawback in this setup is that if a single neighbor is delayed, overloaded or with a lossy connection, it may take considerable time till we receive an acknowledgement from it. Until then, no further multicast messages may be sent, delaying the convergence - just because of this single "laggard" neighbor.
A more sophisticated approach would be to wait for acknowledgements only for a certain time period. If some neighbors do not respond within this timeframe, we will consider them "laggard" and requiring special treatment. Other neighbors that have acknowledged the multicast packet can continue receiving next multicast packet in sequence. This way, we split the directly connected neighbors into two groups - the "good" group that is capable of receiving multicast packets normally, and the "laggard" group that has obvious problems with responding in a timely fashion and which needs to be treated differently. Note that the "laggard" group is still on the same segment as the "good" group, and if we continue talking to the "good" group using multicasts, these multicast may also be received by the "laggard" group of routers. However, routers in the "laggard" group may have missed the previous multicast packet (and therefore have not responded to it), and if they received the subsequent multicast packet, they would be processing it out of sequence. Therefore, this approach requires that the "laggard" group does not process the possibly out-of-sequence multicast communication with the "good" group even if it is on the same segment, until it is able to catch up again.
EIGRP does this using its so-called Conditional Receive mode (CR-mode). When a multicast packet is sent by our EIGRP router to its neighbors on a particular interface, a timer is started called the multicast flow timer. This timer is computed from the SRTT values of all neighbors on that interface. If a neighbor does not respond until the multicast flow timer expires, this neighbor is considered laggard. EIGRP will try to resend the message to this laggard neighbor via unicast. However, it must make sure that this laggard neighbor does not erroneously process the parallel multicast communication with "good" routers on the segment that simply continue the message exchange.
This is accomplished in EIGRP by our router multicasting a special sequenced Hello message that contains a list of laggard routers - the Sequence TLV. If a router is listed in this list of laggard routers, it is informed that it should ignore the subsequent multicast communication. Other routers that receive this special Hello packet and do not see themselves listed in the Sequence TLV know they are "good" receivers and automatically enter the Conditional Receive mode (they may receive the subsequent multicast communication under the condition they have not been identified as laggard in the Sequence TLV). Routers that do not receive this Hello packet at all (because of lossy link, for example) also do not enter the CR-mode. In other words, only those routers that received this sequenced Hello and did not find themselves in the Sequence TLV will enter the CR-mode. Routers that have found themselves in the Sequence TLV, or routers that have not received this sequenced Hello at all, will not enter the CR-mode.
After this splitting of all neighbors into "good" routers and putting them into CR-mode, and "laggard" routers, our router will continue the communication as follows:
Eventually, after the network stabilizes, the laggard routers will catch up with the good routers, even though it takes more time and more concentrated effort of our router. The CR-mode then can be cancelled by our router sending a normal unsequenced Hello message, and the entire communication reverts back to fully multicast. The entire process may repeat in the future as necessary.
An example is probably called for Consider three routers on the same segment, A, B and C:
More detailed information can be found in the U.S. patents 5519704 and 7512106 freely available via patents.google.com.
The basic principle is very simple, the explanation however may be quite confusing so please feel more than welcome to ask further! I've had my own share of troubles when trying to understand this
Thank you very much for your vivid reply and I understand the process you describe clearly now.
But I can not certify how this process works with real environment. A simple topology likes that
I use debug eigrp packets to check the startup process and below is information from R1
*Mar 1 00:39:08.603: EIGRP: Sending HELLO on Loopback0
*Mar 1 00:39:08.603: AS 1, Flags 0x0, Seq 0/0 idbQ 0/0 iidbQ un/rely 0/0
*Mar 1 00:39:08.607: EIGRP: Received HELLO on Loopback0 nbr 192.168.10.1
*Mar 1 00:39:08.611: AS 1, Flags 0x0, Seq 0/0 idbQ 0/0
*Mar 1 00:39:08.611: EIGRP: Packet from ourselves ignored
*Mar 1 00:39:08.647: EIGRP: Sending HELLO on FastEthernet0/0
*Mar 1 00:39:08.651: AS 1, Flags 0x0, Seq 0/0 idbQ 0/0 iidbQ un/rely 0/0
*Mar 1 00:39:08.667: EIGRP: Received HELLO on FastEthernet0/0 nbr 192.168.12.2
*Mar 1 00:39:08.667: AS 1, Flags 0x0, Seq 0/0 idbQ 2/0
*Mar 1 00:39:08.671: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 1: Neighbor 192.168.12.2 (FastEthernet0/0) is up: new adjacency
*Mar 1 00:39:08.671: EIGRP: Enqueueing UPDATE on FastEthernet0/0 nbr 192.168.12.2 iidbQ un/rely 0/1 peerQ un/rely 0/0
*Mar 1 00:39:08.671: EIGRP: Received UPDATE on FastEthernet0/0 nbr 192.168.12.2
*Mar 1 00:39:08.675: AS 1, Flags 0x1, Seq 1/0 idbQ 2/0 iidbQ un/rely 0/1 peerQ un/rely 0/0
### first update received from R2######
*Mar 1 00:39:08.675: EIGRP: Requeued unicast on FastEthernet0/0
*Mar 1 00:39:08.679: EIGRP: Sending HELLO on FastEthernet0/0
*Mar 1 00:39:08.683: AS 1, Flags 0x0, Seq 0/0 idbQ 2/0 iidbQ un/rely 0/0
*Mar 1 00:39:08.683: EIGRP: Received HELLO on FastEthernet0/0 nbr 192.168.12.2
*Mar 1 00:39:08.683: AS 1, Flags 0x0, Seq 0/0 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1
*Mar 1 00:39:08.687: EIGRP: Received Sequence TLV from 192.168.12.2
*Mar 1 00:39:08.687: 192.168.12.1
*Mar 1 00:39:08.687: address matched
*Mar 1 00:39:08.687: clearing CR-mode
*Mar 1 00:39:08.687: EIGRP: Received CR sequence TLV from 192.168.12.2, sequence 2
### Receive Sequence TLV from R2######
*Mar 1 00:39:08.691: EIGRP: Received UPDATE on FastEthernet0/0 nbr 192.168.12.2
*Mar 1 00:39:08.691: AS 1, Flags 0xA, Seq 2/0 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1, not in CR-mode, packet discarded
*Mar 1 00:39:08.695: EIGRP: Sending UPDATE on FastEthernet0/0 nbr 192.168.12.2
*Mar 1 00:39:08.695: AS 1, Flags 0x1, Seq 1/1 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1
*Mar 1 00:39:08.695: EIGRP: Enqueueing UPDATE on FastEthernet0/0 iidbQ un/rely 0/1 serno 1-2
*Mar 1 00:39:08.699: EIGRP: Building Sequence TLV
####Only 4ms later####
*Mar 1 00:39:08.699: EIGRP: Enqueueing UPDATE on FastEthernet0/0 nbr 192.168.12.2 iidbQ un/rely 0/0 peerQ un/rely 0/1 serno 1-2
*Mar 1 00:39:08.703: EIGRP: Sending HELLO with Sequence TLV on FastEthernet0/0, seq 2
*Mar 1 00:39:08.703: EIGRP: Sending HELLO on FastEthernet0/0
*Mar 1 00:39:08.703: AS 1, Flags 0x0, Seq 0/0 idbQ 0/0 iidbQ un/rely 0/0
Note the bold words:
R1 receives update from R2 for the first time. And only 16ms(00:39:08.671--00:39:08.687) later R1 receives the sequence TLV listing R1 and is identified as laggard router.But the output of show ip eigrp interface from R2 show that multicast flow timer is 224ms。R2 should identify R1 as a laggard router after multicast flow timer is expired. Why R2 only waits 16ms before sending the sequence TLV. R1 has the same process
R2#sh ip eigrp int
IP-EIGRP interfaces for process 1
Xmit Queue Mean Pacing Time Multicast Pending
Interface Peers Un/Reliable SRTT Un/Reliable Flow Timer Routes
Lo0 0 0/0 0 0/1 0 0
Fa0/0 1 0/0 52 0/1 224 0
Ah, I did not know that you were speaking about the initial EIGRP synchronization.
During the initial EIGRP sync, a newly discovered neighbor is always considered laggard, as it is assumed that the synchronization with it will take some time, during which possibly new (multicast) messages have to be sent to already synchronized neighbors. Therefore, if our router detects a new neighbor, it automatically places it in the "laggard" group and performs separate unicast synchronization with it. This allows the sync with the neighbor to occur in parallel with normal multicast communication on the segment. After the newly discovered neighbor is brought on par with other already synchronized routers, it will stop being considered a laggard router. Hence, seeing a new neighbor being treated as a laggard router is actually intentional.
I would also like to correct a previous inaccuracy. I have stated that the CR-mode is cancelled by our router transmitting a normal unsequenced Hello. There is little information about it but it seems that I was not correct about this statement. To what I was able to understand further, the CR-mode is always relative to a multicast segment with a particular sequence number. This sequence number is included in the sequenced Hello along with the Sequence TLV. After this multicast packet with a CR flag is received and accepted by a router in CR-mode, its arrival should also represent the end of the CR-mode. If another multicast message is to be conditionally received, it must first be preceded with another Hello message containing the Sequence TLV and the sequence number of this next multicast message in question. In other words, the CR-mode always lasts only for a single multicast message whose sequence number was indicated in the preceding sequenced Hello.
My previous example should therefore be reworked as follows:
There is a gentleman here on CSC named Donald Slice who is intimately familiar with EIGRP internals - Don, if you are reading this, can you please provide a definitive confirmation or correction of what has been described here? Thank you!
According to your last two replies I make a further experiment with network topology below
I use both debug information and a network protocol analyzer to check the process.
I set three routers’ hold interval as 100s. After three routers complete initial sync, I shut down F0/0 of R3. Bacause R3 connects R1 with a switch, R1 can not know neighbor R3 is down until hold timer is expired.
In that due I change delay value of loopback0 of R1 to trigger a update packet. R2 receives the update and send ACK to R1. R1 can not receive ACK from R3 and send unicast update continuously. I could not find hello packet originating from R1 that contains sequence TLV and next multicast sequence TLV.
I change relay value of loopback0 of R1 again. Before sending multicast update packet, R1 first send a hello packet including sequence TLV listing R3 and next multicast sequence TLV. R2 receives this hello packet and does not find itself in sequence TLV. So R2 enters CR-Mode.
*Mar 1 00:15:32.263: EIGRP: Received Sequence TLV from 192.168.12.1
*Mar 1 00:15:32.267: 192.168.12.3
*Mar 1 00:15:32.267: setting CR-mode
*Mar 1 00:15:32.267: EIGRP: Received CR sequence TLV from 192.168.12.1, sequence 9
You can see that when R1 does not receive ACK from R3 for the first time R1 does not send hello message that contains sequence TLV and next multicast TLV. When next update should be sent for R1, R1 would send hello message that contains sequence TLV and next multicast TLV before sends multicast update to the segment.
So the process you describe in your example is in keep with my process. But I could not certify the process about when CR-Mode was cancelled(the step 5 of your example) because I could only find key words, “setting CR-Mode” or “clearing CR-Mode”, in the output of debug eigrp packets command when router receives the hello message that contains sequence TLV. Could I see more output about CR-Mode from other debug command?
I could find information about multicast flow timer from output of debug eigrp packets like, FastEthernet0/0 multicast flow blocking cleared when router receives ACK. But I want to see more, such as multicast flow timer is starting or multicast flow timer is expired. I think those information may help learner understand eigrp process deeply.
What you described here is actually a very nice demonstration that the CR-mode kicks into action if our EIGRP router is waiting for an acknowledgement of a multicasted message, and at the same time, it already has a new multicast message ready to be sent. The sequenced Hello always contains the sequence number of the next multicast segment to be conditionally received by the "good" routers. If you do not have any further multicast message to send, there is no need to put the other "good" routers into CR-mode - note that the CR-mode is to prevent the laggard routers from mistakenly processing an out-of-sequence multicast message. However, if you do not intend to send another multicast message, you don't need to invoke the CR-mode.
But I could not certify the process about when CR-Mode was cancelled(the step 5 of your example) because I could only find key words, “setting CR-Mode” or “clearing CR-Mode”, in the output of debug eigrp packets command when router receives the hello message that contains sequence TLV. Could I see more output about CR-Mode from other debug command?
I wish I knew, Martin. I am not sure. Trying to run every EIGRP debug command is tedious but it may help... but I can not guarantee that.
Beautifully explained. And you're right that we preceed each multicast packet that is to be ignored by the "laggard" group with a sequence TLV identifying the sequence number to ignore. We clear CR mode on a receiver when he receives an update without the CR bit set (which should only happen after he has been caught up with any unicasted packets to make him catch up with the other routers on the segment.)
One other point that you nicely pointed out (but gave us a bit more credit than we're due). At startup, we use CR-mode to bring up a new peer but many of us in development believe that this could be drastically improved in the single-peer environment. Due to how we do the re-use of the peer and interface queues, we "pretend" a peer is laggard when he's the only other one on the subnet. Seems a bit stupid to me.