重传期间RDMA Read行为的困惑:为何不返回原始数据?
RDMA READ重传与主动重复请求的区别
你混淆了两类“重复请求”
规范中提到的“重传RDMA READ请求”,是RDMA协议栈自动发起的超时重传——用于处理原始请求或响应报文丢失的场景,而非你手动发起的第二个相同地址范围的READ请求。你测试中发送的“重传版READ”本质是一个全新的独立请求,不属于规范描述的重传范畴。
规范要求的真实含义
规范里的“重传请求必须是原始请求的子集,且响应的负载和PSN需与原始响应一致”,核心是为了解决丢包场景下的重复响应去重问题:
- 若目标端尚未处理过原始请求,重传请求会正常读取内存并返回与原始请求响应一致的内容(相同负载、PSN);
- 若目标端已经处理过原始请求,会直接复用之前缓存的响应内容返回,避免接收端收到重复的不同响应而引发数据乱序或重复处理。
但这个要求的前提是:原始请求到重传期间,目标内存区域未被其他操作修改。如果用户主动通过WRITE修改了内存,这种场景已经超出协议重传机制的设计范围,规范并不保证响应一致性。
你的测试结果为何符合预期
你先发起READ,再WRITE修改内存,最后发起的第二个READ是独立的新请求,不是原始请求的超时重传。RDMA的每个READ请求都是独立的,会读取请求到达目标端时的内存当前状态,所以返回最新值是完全符合RDMA语义的。
内容的提问来源于stack exchange,提问作者abjoshi - Reinstate Monica
相关产品推荐
相关产品推荐

