第3章 物理层与MCTP传输 - 页码44
深入分析:NVMe-MI 消息如何跨多个 MCTP 包传输(续)
📦 MCTP 包的结构和组装
如图 25 所示,NVMe-MI 消息(如请求消息或响应消息)可以跨多个 MCTP 包(每个包含一定大小的数据负载)进行传输。以下是关键的传输要求和步骤:
🧩 MCTP 包拆分过程
- MCTP 包的结构: 每个 MCTP 包由以下几个部分组成:
- 物理介质特定的头部:根据传输媒介的要求,比如 PCIe、I2C、MCTP over SMBus。
- MCTP 包头:包含目标和源端点 ID、消息标签、序列号等标识信息。
- MCTP 包负载:消息的实际数据部分,是拆分成多个包的核心数据。
- 物理介质特定的尾部:如 CRC 校验、结束标志等,用于保证数据的完整性。
📊 消息拆分的规则
在一个完整的 NVMe-MI 消息(如请求消息或异步事件消息)中,当其数据量超过一个单独的 MCTP 包能够承载的最大值时,该消息就会被拆分成多个 MCTP 包。每个 MCTP 包负载的大小必须符合以下规则:
-
每个包的负载大小一致:除了最后一个包之外,所有包的负载大小应与 协商的 MCTP 传输单元大小 相同。最后一个包的负载大小应该是 足够小,以适应剩余的消息数据,而不会有额外的填充。
-
完整性校验:拆分后的每个包都会包含相应的数据段,接收端在收到所有包后,必须对消息进行 完整性校验,确保没有错误。如果完整性校验通过,那么这个请求消息将会被处理。
🔍 关键要求
- EOM 和 SOM 标志位:
- SOM (Start of Message):标志消息的开始,指示第一个 MCTP 包。
-
EOM (End of Message):标志消息的结束,指示最后一个 MCTP 包。
-
MCTP 传输单元大小:
每个 MCTP 包的负载应根据预先商定的 MCTP 传输单元大小,但最后一个包的大小可以根据需要更小。
💡 如何确保消息的完整性与准确传输?
- 消息拆分与重组:
- 每个 MCTP 包的序号(Pkt Seq #)和标记(Msg Tag)使得接收端能够将各个包按正确顺序重新组装成完整的消息。
-
所有的包都携带 起始/结束标志,确保没有丢失数据。
-
数据完整性校验:
- 在每个 MCTP 包的最后,Message Integrity Check (MIC) 字段将通过 CRC-32C 校验和进行计算和验证。这一校验和会根据 Message Body(消息正文内容)计算出,并验证消息在传输过程中没有被篡改或丢失。
🔄 MCTP 消息的传输流程:
- 发送端:在发送端,完整的 NVMe-MI 消息将根据需要被拆分成多个 MCTP 包,每个包被逐个发送。
- 接收端:接收端收到这些包后,会根据 序列号 和 EOM 标志 将所有包重组为完整的消息。
- 完整性验证:一旦接收端将完整消息拼接好,接下来会计算 CRC 校验,并与接收到的 MIC 值 进行比对,以确认消息的完整性。
- 消息处理:如果 CRC 校验 通过,消息会被进一步处理;否则,会返回 错误响应。
📘 后续阅读建议
- MCTP 基础规范:提供了更多关于数据包格式、传输细节和可靠性机制的详细说明。
- NVM Express 基础规范:深入了解 NVMe 存储设备和控制器如何与 MCTP 协同工作,支持消息传输。
- CRC 校验和应用:进一步阅读 CRC-32C 算法和其在消息传输中的重要性,如何通过校验码保障数据的可靠性。
如果你有任何具体问题,或需要对某部分进一步解释,欢迎随时询问!