第3章 物理层与MCTP传输 - 页码44
NVMe-MI 1 min read

第3章 物理层与MCTP传输 - 页码44

Blog Author

深入分析:NVMe-MI 消息如何跨多个 MCTP 包传输(续)


📦 MCTP 包的结构和组装

如图 25 所示,NVMe-MI 消息(如请求消息或响应消息)可以跨多个 MCTP 包(每个包含一定大小的数据负载)进行传输。以下是关键的传输要求和步骤:


🧩 MCTP 包拆分过程

  1. MCTP 包的结构: 每个 MCTP 包由以下几个部分组成:
  2. 物理介质特定的头部:根据传输媒介的要求,比如 PCIe、I2C、MCTP over SMBus。
  3. MCTP 包头:包含目标和源端点 ID、消息标签、序列号等标识信息。
  4. MCTP 包负载:消息的实际数据部分,是拆分成多个包的核心数据。
  5. 物理介质特定的尾部:如 CRC 校验、结束标志等,用于保证数据的完整性。

📊 消息拆分的规则

在一个完整的 NVMe-MI 消息(如请求消息或异步事件消息)中,当其数据量超过一个单独的 MCTP 包能够承载的最大值时,该消息就会被拆分成多个 MCTP 包。每个 MCTP 包负载的大小必须符合以下规则:

  • 每个包的负载大小一致:除了最后一个包之外,所有包的负载大小应与 协商的 MCTP 传输单元大小 相同。最后一个包的负载大小应该是 足够小,以适应剩余的消息数据,而不会有额外的填充。

  • 完整性校验:拆分后的每个包都会包含相应的数据段,接收端在收到所有包后,必须对消息进行 完整性校验,确保没有错误。如果完整性校验通过,那么这个请求消息将会被处理。


🔍 关键要求

  1. EOM 和 SOM 标志位
  2. SOM (Start of Message):标志消息的开始,指示第一个 MCTP 包。
  3. EOM (End of Message):标志消息的结束,指示最后一个 MCTP 包。

  4. MCTP 传输单元大小
    每个 MCTP 包的负载应根据预先商定的 MCTP 传输单元大小,但最后一个包的大小可以根据需要更小。


💡 如何确保消息的完整性与准确传输?

  • 消息拆分与重组
  • 每个 MCTP 包的序号(Pkt Seq #)和标记(Msg Tag)使得接收端能够将各个包按正确顺序重新组装成完整的消息。
  • 所有的包都携带 起始/结束标志,确保没有丢失数据。

  • 数据完整性校验

  • 在每个 MCTP 包的最后,Message Integrity Check (MIC) 字段将通过 CRC-32C 校验和进行计算和验证。这一校验和会根据 Message Body(消息正文内容)计算出,并验证消息在传输过程中没有被篡改或丢失。

🔄 MCTP 消息的传输流程:

  1. 发送端:在发送端,完整的 NVMe-MI 消息将根据需要被拆分成多个 MCTP 包,每个包被逐个发送。
  2. 接收端:接收端收到这些包后,会根据 序列号EOM 标志 将所有包重组为完整的消息。
  3. 完整性验证:一旦接收端将完整消息拼接好,接下来会计算 CRC 校验,并与接收到的 MIC 值 进行比对,以确认消息的完整性。
  4. 消息处理:如果 CRC 校验 通过,消息会被进一步处理;否则,会返回 错误响应

📘 后续阅读建议

  1. MCTP 基础规范:提供了更多关于数据包格式、传输细节和可靠性机制的详细说明。
  2. NVM Express 基础规范:深入了解 NVMe 存储设备和控制器如何与 MCTP 协同工作,支持消息传输。
  3. CRC 校验和应用:进一步阅读 CRC-32C 算法和其在消息传输中的重要性,如何通过校验码保障数据的可靠性。

如果你有任何具体问题,或需要对某部分进一步解释,欢迎随时询问!