USB网络控制通讯NCM
+ -

NDP 数据报文(Datagram)格式详解

2025-07-07 0 0

以下是关于 NDP16/NDP32 中封装的以太网数据报格式 的完整解析,重点说明其结构、CRC-32处理规则以及格式化代码的含义:


1. 数据报基本结构

所有由NDP描述的数据报(Datagram)均遵循以下通用格式:

[14-byte IEEE 802.3 Header] + [Payload] + [Optional CRC-32]
  • IEEE 802.3 头部(14字节)
    包含源/目的MAC地址(各6字节)和以太网类型/长度字段(2字节)。
  • 载荷(Payload)
    上层协议数据(如IP包、ARP帧等),长度可变。
  • 可选的CRC-32(4字节)
    由NDP签名中的格式代码(0x300x31)决定是否附加。

2. 数据报格式化代码(Table 3-5)

NDP的dwSignature字段低字节(0x300x31)决定数据报的CRC处理方式:

代码值 字符表示 含义 处理规则
0x30 0 标准IEEE 802.3帧,不包含CRC-32 - 数据报仅包含14字节头部和载荷。
- 接收方需自行计算CRC(如需校验)。
0x31 1 IEEE 802.3帧,包含CRC-32
(发送方负责填充和计算)
- 若头部+载荷总长度 < 802.3最小帧长(64字节),发送方必须填充(Padding)至64字节,再计算CRC-32并附加。
- 接收方需验证CRC-32,若校验失败可丢弃帧。

3. CRC-32 处理规则(代码 0x31 时适用)

  1. 填充(Padding)要求

    • 14字节头部 + Payload长度 < 64字节,需填充至64字节(填充内容通常为0)。
    • 示例
      • 原始帧:14字节头部 + 20字节Payload = 34字节(需填充30字节至64字节)。
      • 填充后:34字节数据 + 30字节填充 → 计算CRC-32 → 附加4字节CRC。
      • 最终帧长度:64 + 4 = 68字节。
  2. CRC计算范围

    • 覆盖 填充后的完整帧(即14字节头部 + 填充后的Payload)。
    • :CRC不覆盖自身(CRC附加在最后)。
  3. 接收方行为

    • 根据dwSignature检测是否包含CRC-32。
    • 若为0x31,需提取并校验CRC-32,失败时可丢弃帧或记录错误。

4. 与NDP结构的关联

  • NDP签名决定格式
    • dwSignature = 0x304D434E(NDP16)或 0x306D636E(NDP32)→ 数据报无CRC(代码0x30)。
    • dwSignature = 0x314D434E(NDP16)或 0x316D636E(NDP32)→ 数据报含CRC(代码0x31)。
  • 长度字段一致性
    • wDatagramLength(NDP16)或 dwDatagramLength(NDP32)必须包含CRC-32的长度(如代码0x31时,长度=14+Payload+填充+4)。

5. 示例场景

  • 场景1(无CRC)

    • NDP签名:0x304D434E(”NCM0”)。
    • 数据报:14字节头部 + 100字节Payload → 总长度114字节(wDatagramLength=114)。
  • 场景2(含CRC)

    • NDP签名:0x316D636E(”ncm1”)。
    • 数据报:14字节头部 + 20字节Payload → 填充至64字节 → 计算CRC-32 → 附加4字节。
    • 总长度:64 + 4 = 68字节(dwDatagramLength=68)。

6. 关键注意事项

  1. 填充责任
    • 仅当代码为0x31且帧长不足64字节时,发送方必须填充(接收方不负责补全)。
  2. 兼容性
    • 传统以太网设备可能默认忽略CRC(由物理层处理),但NCM规范明确要求发送方处理(若代码为0x31)。
  3. 性能权衡
    • 附加CRC-32增加4字节开销,但提升可靠性(尤其适用于无线USB等易出错环境)。

总结

  • 代码 0x30:简单封装,不修改原始帧,适合高吞吐场景(如USB 3.0有线连接)。
  • 代码 0x31:强制填充+CRC校验,确保帧完整性,适合可靠性要求高的场景(如无线USB)。
  • NDP角色:通过签名字段隐式声明数据报格式,接收方需按约定解析。

此设计平衡了效率与可靠性,同时保持与IEEE 802.3标准的兼容性。

0 篇笔记 写笔记

USB键盘在Linux环境下一直返回NAK的输入端点和一直OUT数据的输出端点
群里有同学反馈,自己做的USB键盘在Windows下正常,但在Linux下就失败,想让帮忙分析一下原因。一个比较好的消息是他那边有USB总线分析仪,所以只需要抓包就可以进行分析了。最好开他给的抓包截图是样子的:从它的截图可以看到,USB键盘在获取了该键盘的HID报告描述符后,紧跟着一下发Report......
USB设备的端点停止(ENDPOINT_HALT)
USB设备在与主机进行通讯时,有时会出现端点停止问题,这时当主机与设备进行数据通讯时,设备会给主机返回STALL握手包,表示该端点已经停止即不能发或者接收数据。STALL握手包表示了该设备端点的当前状态,停止了的端点不能自行恢复,需要由主机发送CLEAR_FEATURE标准请求来恢复。USB端点的......
UVC摄像头USB批量传输BULK数据传输方式的打开与关闭StreamOn StreamOff
USB的批量传输和中断传输是一样的简单,但经常发现有人在问批量传输的UVC摄像头的打开与半闭问题的边界问题,特别是摄像头关闭的判断。BULK摄像头的打开我们通过BUSHOUND抓包的内容如下:Device Length Phase Data ......
USB驱动数据结构usb_device/usb_host_config/usb_interface/usb_host_interface/usb_host_endpoint
相对于USB规范中的USB相关描述符,Linux定义了几个相关的结构体。这几个结构体可在以下位置查看:https://elixir.bootlin.com/linux/v5.5-rc2/source/include/linux/usb.h以下介绍的USB结构体关系如下:struct usb_de......
NCM数据报文指针-NDP16
NCM数据报指针(NDP)描述了嵌入在NDP中的以太网数据报。与NTH结构一样,定义了两种形式。一种形式(NDP16)用于16位NTB;一种用于32位NTB。这些形式在架构上是等效的,但不同之处在于,许多字段在NDP16中是16位宽,但在NDP32中是32位宽。1. NDP16 核心结构NDP16......
NCM数据报文指针-NDP32
以下是 NDP32 的完整技术规范解析,重点说明其与 NDP16 的差异和设计意图:1. NDP32 核心结构NDP32 由三部分组成,总长度至少为 32字节(且为8的倍数):16字节头部:包含签名、长度和保留字段。 1个或多个数据报指针条目(每条目8字节):记录每个以太网帧的位置和长度(......
NDP 数据报文(Datagram)格式详解
以下是关于 NDP16/NDP32 中封装的以太网数据报格式 的完整解析,重点说明其结构、CRC-32处理规则以及格式化代码的含义:1. 数据报基本结构所有由NDP描述的数据报(Datagram)均遵循以下通用格式:[14-byte IEEE 802.3 Header] + [Payload]......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB网络控制通讯NCM
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!