USB2.0理论传输速度和实际传输速度

我是专门负责USB模块这部分的,有时候需要连接各种USB设备,比如说USB NET、USB Audio、USB Storage等。比如说最近碰到的一个通过USB NET将手机的地图画面传递给车机,车机上滑动地图的体验非常的差。然后客户就说测出来实际上USB的传输速度只有十几M,High-speed的理论速度有480M,肯定是我们车机的USB控制器有问题,有可能是我们的车机将手机识别成全速设备了。
很明显,要说服客户,必须给出强有力的数据,也需要解释关于USB的传输速度是怎么一回事,要怎么来衡量。USB2.0包括Full-speed和Low-speed。这里为了描述方便,将USB2.0与High-speed等价起来。
本文只是简单的解释了一下为什么USB的实际传输速度比USB Spec中说的理论传输速度差异那么大,具体等知道得更多的话再做补充。


USB理论传输速度

  • Low-speed:1.5 Mb/s = 1.5Mbps = 0.1875MB/s = 0.1875MBps
  • Full-speed:12 Mb/s = 12Mbps = 1.5MB/s = 1.5MBps
  • High-speed:480 Mb/s = 480Mbps = 60MB/s = 60MBps

速度单位有小b和大B的区分,小b为bits,大B为Bytes。如果没有将小b和大B区分清楚,就去谈论传输速度都是瞎扯。红色部分是USB Spec宣传的理论速度。
我们使用ipref工具测试了USB NET的TCP的传输速度UDP的丢包率。得到TCP传输速度平均为112Mbits/s = 14Mbytes/s,这个速度是符合苹果的CarPlay认证要求。


为什么USB2.0的实际传输速度远低于理论速度

Linux测试U盘读写速度文章中,测试了USB2.0 U盘的读写速度,平均约为13MB/s。同样的,在Windwos上,我们拷贝USB2.0 U盘的内容,传输速度也才十几MB/s。这明显与USB2.0上写的480Mb/s = 60MB/s 有着很大的差距。关于为什么差距那么大,在 https://www.zhihu.com/question/20186057 的文章已经写得很清楚了,在此进行了整理学习。

对于USB2.0,480Mbps是指总线的频率,也就说,总线信号每秒最多能传输这么多bit,这些信号包括控制信号和数据信号。USB2.0规范里给了一个公式,算传输时间的(算法解释就太复杂了,见USB SpecUSB2.0 5.11.3 Calculating Bus Transaction Times的章节):

1
High-speed (Input):Non-Isochronous Transfer (Handshake Included) = (55 * 8 * 2.083) + (2.083 * Floor(3.167 + BitStuffTime(Data_bc))) + Host_DelayBitStuffTime(Data_bc)

这部分就是数据传输需要的时间,算起来麻烦,但是看到前面有一个2.083就能看出来,传输一个bit基本上需要2.083倍的时间,所以,简单的把480Mbps除以2.083,再转换成字节大概是:28.8MB/s,也就是说,最多就这么快,再刨除bulk-only模式里的那一堆堆的多余指令:一个包需要16个字节左右,Windows一次请求是4KB(可能是为了页对齐),再浪费掉1%左右的时间,以及host delay,也就是主机的校验延迟,那么实际速度就20多MB/s,不管是读还是写。

https://superuser.com/questions/317217/whats-the-maximum-typical-speed-possible-with-a-usb2-0-drive 中也解释了为啥USB的实际传输速度慢。

Full-speed每1ms会传输一个SOF,也就是微帧;
High-speed每125us会传输一个SOF,相当于1ms传输8个微帧;
Bulk传输最大的包是512Bytes,理论上每个SOF可以传输13个包,那么理论上最大的传输速率为:
512Bytes 13微帧8微帧/ms * 1000ms/s= 53248000Bytes/s = 53MB/s
USB控制器每个微帧仅允许8个或10个数据包,相当常见,分别产生41MB/s或33MB/s的峰值。

Title:USB2.0理论传输速度和实际传输速度

Author:Victor Huang

Time:2019-03-17 / 16:03

Link:http://wowothink.com/69b1c932/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)