【问题标题】:How does USB take care of retransmissions?USB 如何处理重传?
【发布时间】:2018-06-12 14:27:39
【问题描述】:

我正在尝试了解数据包级别的 USB 协议。特别是,我对 USB 在发生错误时如何处理批量传输的重传感兴趣。供参考:

https://www.beyondlogic.org/usbnutshell/usb3.shtml https://www.beyondlogic.org/usbnutshell/usb4.shtml#Bulk

让我们先讨论从外围设备到主机的正常传输:主机向外围设备发送一个 IN 令牌。外设以数据包响应。然后主机发送一个ACK。由于 ACK,外设知道主机正确接收了数据,并且下一个 IN 令牌将由外设以新的数据包进行应答。

现在考虑出问题了。假设数据包已损坏。所以主机丢弃数据包,不发送ACK。当外设收到下一个 IN 令牌时,它只是再次发送之前的数据包。对吗?

现在考虑更棘手的情况,即数据包正确到达主机,但主机发送的 ACK 已损坏。所以主机正确接收到数据,但外设不知道,因为没有正确接收到 ACK。据我所知,主机永远不会重新发送 ACK。

我相信主机发送的下一个 IN 令牌会以数据包的重传来回答。但是,宿主如何判断是同一个数据包呢?我在任何地方都找不到解释。

是否与数据包有两个PID值(DATA0和DATA1)有关?

【问题讨论】:

    标签: usb


    【解决方案1】:

    第一个问题的答案是肯定的;设备只有收到ACK包才认为批量IN包发送成功。

    对于第二个问题,你猜对了:数据切换位在 0 和 1 之间切换,所以如果主机连续两次收到相同的数据包,它可以说第二个应该被忽略,因为它将具有与之前相同的数据切换值。

    有关详细信息,请参阅 USB 2.0 规范中的第 8.6 节“数据切换同步和重试”。

    【讨论】:

      猜你喜欢
      • 2019-10-02
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多