7. Router State Diagram (路由器状态图)
7. 路由器状态图 (Router State Diagram)
路由器行为由下面的状态转换图更正式地规定.
对于任何单个连接的网络, 路由器可能处于两种状态之一:
-
"Querier": 当此路由器被指定在此网络上传输 IGMP Membership Query 时.
-
"Non-Querier": 当有另一个路由器被指定在此网络上传输 IGMP Membership Query 时.
以下三个事件可以导致路由器改变状态:
-
"query timer expired": 当为查询传输设置的计时器到期时发生.
-
"query received from a router with a lower IP address": 当从同一网络上 IP 地址较低的路由器收到 IGMP Membership Query 时发生.
-
"other querier present timer expired": 当为记录网络上存在另一个 IP 地址较低的 Querier 而设置的计时器到期时发生.
针对上述事件, 可以采取三种动作:
-
"start general query timer": 针对连接的网络启动 general query timer.
-
"start other querier present timer": 针对连接的网络启动 other querier present timer [Other Querier Present Interval].
-
"send general query": 在连接的网络上发送 general query. General Query 发送到 all-systems 组 (224.0.0.1), 其 Max Response Time 为 [Query Response Interval].
--------------------------------
_______|________ gen. query timer |
--------- | | expired |
| Initial |---------------->| | (send general query, |
--------- (send gen. q., | | set gen. q. timer) |
set initial gen. q. | |<----------------------
timer) | Querier |
| |
-----| |<---
| | | |
| |________________| |
query received from a | | other querier
router with a lower | | present timer
IP address | | expired
(set other querier | ________________ | (send general
present timer) | | | | query,set gen.
| | | | q. timer)
| | | |
---->| Non |----
| Querier |
| |
| |
---->| |----
| |________________| |
| query received from a |
| router with a lower IP |
| address |
| (set other querier |
| present timer) |
---------------------------
路由器应该在所有连接的网络上从 Initial 状态开始, 并立即转入 Querier 状态.
此外, 为了跟踪哪些组有成员, 对于任何单个连接网络上的任何单个 IP 组播组, 路由器可能处于四种状态之一:
-
"No Members Present" 状态: 网络上没有主机曾为此组播组发送报告时. 这是路由器上所有组的初始状态; 它不要求路由器保存任何存储状态.
-
"Members Present" 状态: 网络上有主机曾为此组播组发送 Membership Report 时.
-
"Version 1 Members Present" 状态: 网络上有 IGMPv1 主机曾为此组播组发送 Version 1 Membership Report 时.
-
"Checking Membership" 状态: 路由器已经收到 Leave Group 消息, 但尚未听到该组播组的 Membership Report 时.
有六个重要事件可以导致路由器状态转换:
-
"v2 report received": 路由器在接口上收到该组的 Version 2 Membership Report 时发生. 为了有效, Report 消息必须至少为 8 个八位字节长, 并且必须具有正确的 IGMP 校验和.
-
"v1 report received": 路由器在接口上收到该组的 Version 1 Membership Report 时发生. 同样的有效性要求适用.
-
"leave received": 路由器在接口上收到该组的 IGMP Group Leave 消息时发生. 为了有效, Leave 消息必须至少为 8 个八位字节长, 并且必须具有正确的 IGMP 校验和.
-
"timer expired": 为组成员资格设置的计时器到期时发生.
-
"retransmit timer expired": 为重传组特定 Membership Query 而设置的计时器到期时发生.
-
"v1 host timer expired": 为记录存在作为组成员的 version 1 主机而设置的计时器到期时发生.
针对上述事件, 可以采取六种动作:
-
"start timer": 针对接口上的组成员资格启动计时器. 如果该计时器当前正在运行, 也会将其重置为初始值 [Group Membership Interval].
-
"start timer*": 针对接口上的组成员资格执行此替代动作. 如果此路由器是 Querier, 此动作将计时器设置为 [Last Member Query Interval] * [Last Member Query Count]; 如果此路由器是 Non-Querier, 则设置为数据包中的 [Max Response Time] * [Last Member Query Count].
-
"start retransmit timer": 针对接口上的组成员资格启动 retransmit timer [Last Member Query Interval].
-
"start v1 host timer": 针对接口上的组成员资格启动 v1 host timer. 如果该计时器当前正在运行, 也会将其重置为初始值 [Group Membership Interval].
-
"send group-specific query": 针对连接网络上的该组发送 group-specific query. Group-Specific Query 发送到被查询的组, 其 Max Response Time 为 [Last Member Query Interval].
-
"notify routing +": 通知路由协议, 此连接网络上存在该组的成员.
-
"notify routing -": 通知路由协议, 此连接网络上不再存在该组的任何成员.
处于 Querier 状态的路由器的状态图如下:
________________
----------------------------| |<-----------------------
| | |timer expired |
| timer expired| |(notify routing -, |
| (notify routing -)| No Members |clear rxmt tmr) |
| ------->| Present |<------- |
| | | | | |
|v1 report rec'd | | | | ------------ |
|(notify routing +, | |________________| | | rexmt timer| |
| start timer, | | | | expired | |
| start v1 host | v2 report received| | | (send g-s | |
| timer) | (notify routing +,| | | query, | |
| | start timer)| | | st rxmt | |
| __________|______ | _____|_|______ tmr)| |
| | |<------------ | | | |
| | | | |<----- |
| | | v2 report received | | |
| | | (start timer) | | |
| | Members Present |<-------------------| Checking | |
| ----->| | leave received | Membership | |
| | | | (start timer*, | | |
| | | | start rexmt timer,| | |
| | | | send g-s query) | | |
| | --->| |------------------->| | |
| | | |_________________| |______________| |
| | |v2 report rec'd | | | |
| | |(start timer) | |v1 report rec'd |v1 report rec'd |
| | ---------------- |(start timer, |(start timer, |
| |v1 host | start v1 host timer) | start v1 host |
| |tmr ______________V__ | timer) |
| |exp'd | |<---------------------- |
| ------| | |
| | Version 1 |timer expired |
| | Members Present |(notify routing -) |
| | |-------------------------------------------
| | |<--------------------
------->|_________________| v1 report rec'd |
| v2 report rec'd | | (start timer, |
| (start timer) | | start v1 host timer) |
----------------- --------------------------
处于 Non-Querier 状态的路由器的状态图类似, 但 Non-Querier 不发送任何消息, 只由消息接收驱动. 注意, Non-Querier 不关心 Membership Report 消息是 Version 1 还是 Version 2.
________________
| |
| |
timer expired| |timer expired
(notify routing -)| No Members |(notify routing -)
--------->| Present |<---------
| | | |
| | | |
| | | |
| |________________| |
| | |
| |report received |
| |(notify routing +,|
| | start timer) |
________|________ | ________|________
| |<--------- | |
| | report received | |
| | (start timer) | |
| Members Present |<-------------------| Checking |
| | g-s query rec'd | Membership |
| | (start timer*) | |
---->| |------------------->| |
| |_________________| |_________________|
| report received |
| (start timer) |
-----------------