跳到主要内容

6. Host State Diagram (主机状态图)

6. 主机状态图 (Host State Diagram)

主机行为由下面的状态转换图更正式地规定. 对于任何单个网络接口上的任何单个 IP 组播组, 主机可能处于以下三种状态之一:

  • "非成员 (Non-Member)"状态, 表示主机不属于该接口上的该组. 这是所有网络接口上所有成员资格的初始状态; 它不要求主机保存任何存储状态.

  • "延迟成员 (Delaying Member)"状态, 表示主机属于该接口上的该组, 并且该成员资格有一个正在运行的报告延迟计时器.

  • "空闲成员 (Idle Member)"状态, 表示主机属于该接口上的该组, 并且该成员资格没有正在运行的报告延迟计时器.

有五个重要事件可能导致 IGMP 状态转换:

  • "加入组 (join group)"在主机决定加入该接口上的该组时发生. 它只能在 Non-Member 状态下发生.

  • "离开组 (leave group)"在主机决定离开该接口上的该组时发生. 它只能在 Delaying Member 和 Idle Member 状态下发生.

  • "收到查询 (query received)"在主机收到有效的通用成员资格查询 (General Membership Query) 消息, 或有效的组特定成员资格查询 (Group-Specific Membership Query) 消息时发生. 要成为有效查询, Query 消息必须至少为 8 个八位组长, 并具有正确的 IGMP 校验和. IGMP 头部中的组地址必须为零 (表示 General Query), 或者是一个有效的组播组地址 (表示 Group-Specific Query). General Query 适用于接收该 Query 的接口上的所有成员资格. Group-Specific Query 适用于接收该 Query 的接口上单个组中的成员资格. 对于处于 Non-Member 状态的成员资格, 查询会被忽略.

  • "收到报告 (report received)"在主机收到有效的 IGMP 成员资格报告 (Membership Report) 消息 (Version 1 或 Version 2) 时发生. 要成为有效报告, Report 消息必须至少为 8 个八位组长, 并具有正确的 IGMP 校验和. Membership Report 只适用于接收该 Membership Report 的接口上, 由该 Membership Report 标识的组中的成员资格. 对于处于 Non-Member 或 Idle Member 状态的成员资格, 它会被忽略.

  • "计时器到期 (timer expired)"在该接口上该组的报告延迟计时器到期时发生. 它只能在 Delaying Member 状态下发生.

所有其他事件, 例如收到无效 IGMP 消息, 或收到 Query 与 Report 以外的 IGMP 消息, 在所有状态下都会被忽略.

响应上述事件时, 可能采取七种动作:

  • "发送报告 (send report)"用于该接口上的该组. 报告类型由接口状态决定. Report Message 会发送到正在报告的组.

  • "发送离开 (send leave)"用于该接口上的该组. 如果接口状态表明 Querier 正在运行 IGMPv1, 则应当跳过此动作. 如果表示本主机是最后一个发送报告的主机的标志已被清除, 则可以跳过此动作. Leave Message 会发送到 ALL-ROUTERS 组 (224.0.0.2).

  • "设置标志 (set flag)", 表示本主机是最后一个为该组发送报告的主机.

  • "清除标志 (clear flag)", 因为本主机不是最后一个为该组发送报告的主机.

  • "启动计时器 (start timer)"用于该接口上的该组, 延迟值从区间 (0, Max Response Time] 中均匀选择, 其中 Max Response Time 在 Query 中指定. 如果这是一个非请求 Report, 则计时器设置为从区间 (0, [Unsolicited Report Interval] ] 中均匀选择的延迟值.

  • "重置计时器 (reset timer)"用于该接口上的该组, 将其设为新值, 延迟值从区间 (0, Max Response Time] 中均匀选择, 如 "start timer" 中所述.

  • "停止计时器 (stop timer)"用于该接口上的该组.

在以下所有状态图中, 每个状态转换弧都标有导致转换的事件, 并在括号中标出转换期间采取的任何动作. 注意, 转换始终由事件触发; 即使动作是有条件的, 转换仍然会发生.

                              ________________
| |
| |
| |
| |
--------->| Non-Member |<---------
| | | |
| | | |
| | | |
| |________________| |
| | |
| leave group | join group | leave group
| (stop timer, |(send report, | (send leave
| send leave if | set flag, | if flag set)
| flag set) | start timer) |
________|________ | ________|________
| |<--------- | |
| | | |
| |<-------------------| |
| | query received | |
| Delaying Member | (start timer) | Idle Member |
---->| |------------------->| |
| | | report received | |
| | | (stop timer, | |
| | | clear flag) | |
| |_________________|------------------->|_________________|
| query received | timer expired
| (reset timer if | (send report,
| Max Resp Time | set flag)
| < current timer) |
-------------------

全系统组 (all-systems group, 地址 224.0.0.1) 作为特殊情况处理. 主机在每个接口上都从该组的 Idle Member 状态开始, 从不转换到其他状态, 并且从不为该组发送报告.

此外, 对于任何单个网络接口, 主机可能处于以下两种状态之一:

  • "无 IGMPv1 路由器存在 (No IGMPv1 Router Present)", 表示主机在 [Version 1 Router Present Timeout] 时间内没有听到 IGMPv1 风格查询. 这是初始状态.

  • "IGMPv1 路由器存在 (IGMPv1 Router Present)", 表示主机在 [Version 1 Router Present Timeout] 时间内听到了 IGMPv1 风格查询.

有两个事件可能导致状态转换:

  • "收到 IGMPv1 查询 (IGMPv1 query received)", 表示主机收到 Max Response Time 字段设置为 0 的查询.

  • "计时器到期 (timer expires)", 表示用于记录 IGMPv1 路由器存在性的计时器到期.

并且有一个动作可以由事件触发:

  • "设置计时器 (set timer)", 将计时器设置为其最大值 [Version 1 Router Present Timeout], 并启动或重新启动该计时器.
                              ________________
| |
| |
| No IGMPv1 |
| Router |
| Present |
| |
---->| |----
| | | |
| |________________| |
timer expires | | IGMPv1 query
| ________________ | received
| | | | (set timer)
| | | |
| | | |
-----| IGMPv1 |<---
| Router |
| Present |
| |
---->| |----
| |________________| |
| |
| IGMPv1 query received |
| (set timer) |
---------------------------