NCM以太网帧最大尺寸动态调整规则
2025-07-07
0
0
1. 最大尺寸的动态控制
主机控制权:
主机可通过SetMaxDatagramSize
控制请求 动态调整设备支持的最大以太网帧尺寸(不含CRC-32)。- 典型值:标准以太网帧为1514字节(14字节头 + 1500字节载荷)。
- 扩展场景:支持VLAN标签(1522字节)、巨型帧(Jumbo Frame,如9014字节)等。
设备能力发现:
主机需从设备的 以太网网络功能描述符(Ethernet Networking Functional Descriptor) 中读取wMaxSegmentSize
字段,获取设备原生支持的最大帧尺寸,并 禁止 设置超出该值的尺寸。
2. 尺寸计算规则
组件 | 是否计入wMaxSegmentSize |
是否计入NDP的wDatagramLength |
示例(1514字节标准帧) |
---|---|---|---|
以太网帧头(14字节) | ✔️ | ✔️ | 头 + 载荷 = 1514字节 |
载荷(如IP包) | ✔️ | ✔️ | |
可选填充(Padding) | ✔️ | ✔️ | 需满足最小帧长(64字节) |
CRC-32(4字节) | ❌ | ✔️ | 含CRC时总长度 = 1518字节 |
- 关键约束:
- 主机设置的
SetMaxDatagramSize
仅限制帧头+载荷,CRC-32额外附加。 - 若NDP签名指示附加CRC(
0x31
),则wDatagramLength
需包含CRC长度(如1514→1518字节)。
- 主机设置的
3. 工作流程示例
初始化阶段:
- 主机读取设备的
wMaxSegmentSize
(如发现支持9014字节巨型帧)。 - 通过
SetMaxDatagramSize
设置实际使用的最大值(如设置为8000字节)。
- 主机读取设备的
数据传输阶段:
- 无CRC场景(NDP签名
0x30
):- 最大
wDatagramLength
= 8000字节(14头 + 7986载荷)。
- 最大
- 含CRC场景(NDP签名
0x31
):- 最大
wDatagramLength
= 8004字节(8000帧 + 4字节CRC)。
- 最大
- 无CRC场景(NDP签名
错误处理:
- 若主机尝试发送超过设定值的帧(如
wDatagramLength=9000
),设备应拒绝并返回错误。
- 若主机尝试发送超过设定值的帧(如
4. 与对齐机制的协同
- 填充(Padding)的影响:
对齐操作可能增加帧长度(在头与载荷间插入填充字节),但总长仍须满足:
14(头) + 填充 + 载荷 + CRC ≤ wDatagramLength ≤ 当前MaxDatagramSize + CRC
5. 典型应用场景
- VLAN扩展帧:
设置SetMaxDatagramSize=1522
,以容纳额外的4字节VLAN标签。 - 巨型帧传输:
设备声明wMaxSegmentSize=9014
,主机设置SetMaxDatagramSize=9000
预留冗余。 - 低功耗设备:
主动限制最大尺寸(如1024字节),减少单次传输内存占用。
6. 开发者注意事项
- CRC处理一致性:
- 若设备要求CRC(
0x31
),主机必须在计算填充后附加CRC,并更新wDatagramLength
。
- 若设备要求CRC(
- 动态调整的时机:
- 在连接建立或网络配置变更(如MTU调整)时调用
SetMaxDatagramSize
。
- 在连接建立或网络配置变更(如MTU调整)时调用
- 安全边界:
- 设备应验证所有输入的
wDatagramLength
,防止缓冲区溢出攻击。
- 设备应验证所有输入的
总结
NCM通过 SetMaxDatagramSize
和 wMaxSegmentSize
的协同机制,实现了:
- 灵活适配:支持从标准帧到巨型帧的多种以太网规格。
- 安全控制:严格约束尺寸上限,避免设备过载。
- 透明扩展:CRC-32独立于尺寸限制,确保兼容性。
此设计显著提升了USB网络设备在复杂场景(如数据中心、工业以太网)下的适应能力。