USBIP介绍-程序员宅基地

技术标签: 网络  后端  USBIP  

USB/IP

我这段时间正在学习USBIP方面的知识, 这篇文章是我学习国外的论文之后自己做出的总结

1. 介绍

​ 在资源管理的机制之中, 使用的关键的技术就是网络透明的设备共享机制, 通过该机制, 可以和其他计算机的设备进行无缝交互

​ 在之前的技术之中, 已经提出了很多的设备的共享技术, 但是设备访问接口的网络透明性并没有得到充分的解决

注:

网络的透明性:指的是不关注内部的具体的传输的细节, 只关注两端

​ 这篇文章介绍的透明的设备共享机制是USB/IP, 这个机制的主要的组件是虚拟主机控制器接口驱动器, 它是作为外围总线的驱动器, 由于大多数应用程序或者是设备驱动程序在访问这些外部设备的时候, 也都是通过接口来访问的, 而且接口一般都是位于操作系统的最底层。

​ USB/IP的设备共享技术相比于传统的方法, 具有如下的一些的优点:

  1. 计算机可以访问共享设备的全部的功能

  2. 只需要几个额外的驱动程序即可

  3. 不同操作系统的设备也可以相互共享设备

    在usb2.0规范之中, 主机以3种传输速度 —— 分别是1.5Mb/s, 12Mb/s, 480Mb/s和4种传输的类型 —— 控制, 批量, 中断和同步, 这些传输都是由一个硬件 —— usb host controller进行控制。

2. 架构

下图是大多数操作系统的usb驱动模型:
在这里插入图片描述

注:

​ 在设备驱动栈的最底层是usb hcd, 负责将主机控制器的I/O接口抽象到适用于所有的usb驱动的通用API

usb pdd负责控制每个usb设备

​ 关键的设计是:usb主机控制器和usb hcd(usb 主机控制器驱动)将为usb pdd提供输入输出数据,尽管一个usb和usb pdd是使用buffer去传输一些数据以及一些回复的数据, 但是usb hcd并不会去区分这2种数据。

​ 在usb设备驱动之中, usb request block(即URB)是以一种独立于控制器的形式去提供usb的输入和输出, 这些输入和输出包括:

  1. 缓冲区
  2. 方向
  3. 速度
  4. 类型
  5. 目标的地址
  6. 完成处理器

​一个设备驱动或者说应用去控制一个usb设备的时候, 是按照如下的方式:

  • 一个usb pdd将来自另外一个驱动器的I/O请求转化成URB, 并且将这些URB提交给usb hcd

  • usb hcd传输的数据的形式就是URB

  • 在URB的I/O传输完成之后, URB的完成处理程序将会在一个中断的上下文中进行

  • usb pdd负责在I/O完成之后, 通知上层的驱动器

之前说过usb具有4种传输的类型 —— control, bulk, interrupt, isochronous, 接下来将说明他们的区别:

  • 控制和批量传输类型是在完成定期传输之后会以异步的形式将剩下的带宽分配出去, 对于控制类型, 这种类型是最为基础的一种形式,也是设备初始时候的必须的, 在480Mb/s的速度的时候, 20%的带宽是需要用来传输控制的数据的, 批量数据的传输则没有什么限制, 在总线可用的时候, 这种传输的形式是最为快速的

  • 同步的形式传输的速率是恒定的, 适用于如下的情况:从摄像头获取数据,或者向扬声器 输出数据

  • 中断的形式的好处是可以确定最大的延迟的时间, 这是用于鼠标或者是键盘 —— 传输少量的数据

    为了可以在不同的主机之中实现usb的共享, 我们使用的是VHCI —— virtual host controller interface, VHCI将会作为我们使用的一种usb hcd, 这种VHCI可以为不同的usb提供相同的接口, 它需要将USB的请求转换成ip包, 并且发送给远端的机器, 将USB的I/O数据转换成ip包的技术的关键点是:USB/IP将URB转换成ip包, 在每个操作花费更多的时间之后, 如果数据量小和时间短, 那么就会降低总的输入输出性能。原本的usb粒度太小, 无法通过IP网络去控制USB, 同步的类型的传输在每个microframe —— 125us 可以传输3KB, 而批量的数据传输就可以在一个microframe传输6.5KB。

    在一个microframe种的输入输出叫做事务 —— 由事务描述符定义, USB/IP将这事务换成了URB, 就可以缓解对于小容量的I/O的限制

3. 设计

USB/IP的设计理念图如下:

在这里插入图片描述

在客户端, 使用VHCI驱动器作为usb hcd, 在服务端使用stub dirver作为usb pdd, VHCI负责模拟usb根集线器的行为, 当一个远端的usb(位于server端)通过网络连接到客户端的时候,客户端的VHCI负责通知上层的core driver状态的变化, 而服务端的stub driver负责导出共享设备, 当一个usb插入的时候, 这个会自动的加载

​ 在Linux下面, 无论是客户端还是服务端都是使用同一个API, 首先usb pdd通过usb_submit_urb提交一个URB, usb_submit_urb内部实现是在进行完整性检查之后调用VHCI中的urb_enqueue, urb_enqueue这个函数将一个URB转换成submit PDU(protocol data unit), 然后将其发送给远端的stub dirver, 之后, 当远端的stub driver接收到了这个PDU, 就会从中恢复成一个URB, 并且将其发送给USB 主机控制器, 在这些流程完成之后, 也就是I/O的请求完成之后, stub driver会生成一个一个return PDU —— 包括了I/O的状态, 还有输入的数据, 之后,将其发送给远端的VHCI, 最后, VHCI会告知stub driver消息有没有成功的收到, 需要注意的是, usb pdd允许一次发送多个URB以此来提高I/O的性能。论文中提到, 定义一个URB足以实现一个USB/IP。

​ submit PDU以及return PDU的数据如下:

在这里插入图片描述

​ 所有的虚拟USB设备都是通过TCP/IP来传输所有的PDU, 具体的实现是:TCP/IP是通过userland这款软件来建立的, 并且套接字描述符通过/proc来传递给VHCI和stub, 为了更快的传输数据, 不适用Nagle算法, 也不使用UDP/IP。

​ 之所以使用TCP/IP, 是因为主机控制器不会重复提交事务, 并且关键它还是预计大部分传输会成功, 虽然这些传输失败的情况只会在出现坏的设备或者电缆才会发生, 但是还是需要注意,所以URB数据的传输层必须要确保数据的有序到达和重传丢失的数据包

注:

/proc是位于内存之中 , 不存在在磁盘 ,负责进程和内核的交互, /proc将自己也注册到VFS, 只有当实际请求inode的时候, 才会根据内核的信息建立对应的文件或者说是目录

Nagel算法是在网络传输过程之中的, 主要的思想是:为了防止网络传输过程的网络拥塞, 将几个小包一起等到一个大包的长度之后才允许发送。

​ 为了做到必要的网络传输的错误恢复, USB/IP提供的策略就是如果TCP/IP的连接突然断开,VHCI会分离设备, 而stub会重置设备, 这种策略适用于LAN。

​ 目前的USB/IP的缺陷是不允许多个机器同一时刻访问同一个共享设备, 如果一台计算机已经访问了这个共享设备, 那么在这台机器断开这个设备之前, 其他的机器是无法访问这个共享设备的, 这也是符合USB/IP的设计理念 —— 为一台计算机提供外围设备访问。

​ 为了连接远程的设备, USB/IP的设计是:一个userland程序 —— devconfig负责初始化TCP/IP的连接, 然后通过/proc传递给VHCI

4. USB/IP评估

​ 原文评估的实验环境是如下:

在这里插入图片描述

​ 客户端和服务端是通过NIST Net连接的, Linux内核版本是2.4.18, 客户端和服务端的Linux内核版本是2.6.8, 并且搭载了USB/IP的内核模块。

注:

NIST Net:

NIST Net是一个网络仿真软件, 内部是一个Linux可以加载的内核module, 可以嵌入Linux内核的网络和时钟模块,内部还有一个用户API界面。

NIST Net的工作流程:网卡负责接收数据data到内核SK_buff中,NIST Net负责分析数据,如果是不需要的数据,那么直接返回, 如果是需要的数据, 那么有如下的三个函数:

  1. Packet_drop: 直接丢弃
  2. Packet_duplicate: 复制一份后直接发给系统设备
  3. Packet_delay: 设置一个定时时间后然后发送

NIST Net的配置:先给这些主机配置IP, 再将这个装有NIST Net的Linux主机配置成路由器

4.1 对于数据发送和接受的表现的评估

​ 原文实验用的是带有EZ-USB FX2芯片的USB外设开发板, 发送的数据是批量或者是同步的数据, 如果作为发送源, 那么这个开发板向我们的计算机发送数据, 如果是作为接收方的话, 计算机向开发板发送数据

在这里插入图片描述

​ 实验采取的方法是重复提交批量的URB, 测量的方法是奔腾处理器的TSC寄存器测量时间, 实验的结果说明增加数据量, 以及调整TCP/IP的滑动窗口大小, 会增加吞吐量, 并且这个结果和TCP内核协议栈的buffer大小无关, 因为实验设置的属性是TCP_NODELAY, 所以数据不会堆积, 会立即发送

​ 对于同步的数据如下:

在这里插入图片描述

​ 因为一个事务在一个125us传输512B, 一个URB是8个事务, 所以1ms的时间可以刚好完成1个URB的传输, 实验结果可以发现, 仅仅提交1个URB, 完成的间隔是11.1ms, 但是提交多个之后,完成的间隔是1ms, 平均的误差是20ns, 所以在发送同步的数据的时候, 尽可能多提交数据

4.2 对于USB设备表现的评估

​ 作者测试的所有的USB设备都是可以作为USB/IP设备进行使用的, 当客户端连接到远端USB摄像头的时候, 除了控制器是VHCI其他没有什么不同 —— 通过usbview查看所有连接的USB接口, 值得注意的是, 在局域网环境之中, USB/IP对于性能基本上没有什么影响, 但是在拥塞的网络之中, 会产生影响, 为了解决这个问题,可以使用预留机制。

​ 对于批量设备:USB存储设备 —— 例如硬盘等等, 打印机, 扫描器, 以太网设备, 大多数都是用批量传输。 我们使用Bonnie++1.03作为测试的装备, 主要是进行文件输入输出的测试 —— 包括字, 块, 随机寻址, 和文件创建删除的测试 —— create, stat, unlink

注:

Bonnie++是一款专门用来测试硬盘和文件系统的性能的软件

​ 经过测试后发现, 对于服务器上的SCSI磁盘, 我们可以增加SCSI请求队列以此来增加性能。

​ 对于USB多媒体设备, 包括摄像头和播放器, 这些都是使用同步传输的。Linux USB音频播放设备同时只能发送2个URB, 在网络延迟很大的情况下, 为了增加I/O的性能, 一种可以采取的方法是扩大完成时间的间隔。

​ 对于和人交互的设备, 像键盘和鼠标,大多数USB HID(USB human interface device)驱动程序都是10ms读取一次中断的数据, 在网络延迟大的时候, 有可能会使得缓冲器溢出, 这个可以用放入多个队列来解决。

5. 相关

​ iSCSI是用作传输不同计算机之间的SCSI命令的,通过IP网络来传输SCSI包, 又称为IP-SAN, SAN —— storage LAN, 但是SCSI只适用于存储型设备。

​ NFS作为实现文件共享的一个方法, 和samba一样,NFS最初只可以用于Linux - Linux, 现在也可以用于Linux - Windows, 由于NFS使用底层是VFS, 所有一些块设备的API无法使用, 并且无法使用ATA, SCSI磁盘的一些接口, 比方说, NFS无法格式化远程的USB, 也无法弹出远程的设备, 但是USB/IP可以, 因为他是在操作系统的底层实现的。

​ USB/IP的设计理念, 为了更好的在网络中进行传输, 有如下的三个标准:

  1. 对于异步设备, 应该设计队列以提升吞吐量
  2. 对于同步设备, 要考虑输入输出的平滑性, 如果队列size过于大, 也会使得远程设备的响应会变差
  3. 要考虑响应时间的限制, 不同的设备对于响应时间的要求不尽相同, 所以在确保设备工作正常的情况下, 要尽量做到buffer size小和时间短

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43891775/article/details/111680304

智能推荐

在ubuntu 8.04下安装Oracle 11g二-程序员宅基地

文章浏览阅读408次。 在ubuntu 8.04下安装Oracle 11g2008年05月22日 星期四 11:02oracle 11g 数据库虽然提供了linux x86的版本,但是支持的linux版本只有Red Hat,Novell and Solaris 这几个,debian 和 ubuntu 不在支持之列,所以在ubuntu下安装就相对麻烦一些,请照着下文的方法一步一步的安装,不

初一计算机知识点下册,初一英语下册语法知识点全汇总-程序员宅基地

文章浏览阅读166次。新东方在线中考网整理了《初一英语下册语法知识点全汇总》,供同学们参考。一. 情态动词can的用法can+动词原形,它不随主语的人称和数而变化。1. 含有can的肯定句:主语+can+谓语动词的原形+其他。2. 含有can的否定句:主语+can't+动词的原形+其他。3. 变一般疑问句时,把can提前:Can+主语+动词原形+其他? 肯定回答:Yes,主语+can。否定回答:No,主语+can't...._七年级下册计算机知识点

NX/UG二次开发—其他—UFUN函数调用Grip程序_uf调用grip-程序员宅基地

文章浏览阅读3k次。在平时开发中,可能会遇到UFUN函数没有的功能,比如创建PTP的加工程序(我目前没找到,哪位大神可以指点一下),可以使用Grip创建PTP,然后用UFUN函数UF_call_grip调用Grip程序。具体如下截图(左侧UFUN,右侧Grip程序):..._uf调用grip

Android RatingBar的基本使用和自定义样式,kotlin中文教程_ratingbar样式修改-程序员宅基地

文章浏览阅读156次。第一个:原生普通样式(随着主题不同,样式会变)第二个:原生普通样式-小icon第三个:自定义RatingBar 颜色第四个:自定义RatingBar DrawableRatingBar 各样式实现===============原生样式原生样式其实没什么好说的,使用系统提供的style 即可<RatingBarstyle="?android:attr/ratingBarStyleIndicator"android:layout_width=“wrap_cont.._ratingbar样式修改

OpenGL环境搭建:vs2017+glfw3.2.1+glad4.5_vs2017的opengl环境搭建(完整篇)-程序员宅基地

文章浏览阅读4.6k次,点赞6次,收藏11次。安装vs2017:参考vs2017下载和安装。安装cmake3.12.3:cmake是一个工程文件生成工具。用户可以使用预定义好的cmake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。可以从它官方网站的下载页上获取。这里我选择的是Win32安装程序,如图所示:然后就是运行安装程序进行安装就行。配置glfw3...._vs2017的opengl环境搭建(完整篇)

在linux-4.19.78中使用UBIFS_ubifs warning-程序员宅基地

文章浏览阅读976次。MLC NAND,UBIFS_ubifs warning

随便推点

计算机系统内存储器介绍,计算机系统的两种存储器形式介绍-程序员宅基地

文章浏览阅读2.2k次。计算机系统的两种存储器形式介绍时间:2016-1-6计算机系统的存储器一般应包括两个部分;一个是包含在计算机主机中的主存储器,简称内存,它直接和运算器,控制器及输入输出设备联系,容量小,但存取速度快,一般只存放那些急需要处理的数据或正在运行的程序;另一个是包含在外设中的外存储器,简称外存,它间接和运算器,控制器联系,存取速度虽然慢,但存储容量大,是用来存放大量暂时还不用的数据和程序,一旦要用时,就..._计算机存储器系统采用的是主辅结构,主存速度快、容量相对较小,用于 1 分 程序,外

西门子PLC的编程工具是什么?_西门子plc编程软件-程序员宅基地

文章浏览阅读5.6k次。1. STEP 7(Simatic Manager):STEP 7或者Simatic Manager是西门子PLC编程最常用的软件开发环境。4. STEP 7 MicroWin:STEP 7 MicroWn是一款专门针对微型PLC(S7-200系列PLC)的编程软件,是Simatic Manager的简化版。如果需要与PLC系统配合使用,则需要与PLC编程工具进行配合使用。除了上述软件之外,西门子还提供了一些配套软件和工具,如PLC模拟器、硬件调试工具等,以帮助PLC编程人员快速地进行调试和测试。_西门子plc编程软件

HashMap扩容_hashma扩容-程序员宅基地

文章浏览阅读36次。【代码】HashMap扩容。_hashma扩容

Eclipse maven项目中依赖包不全,如何重新加载?_maven资源加载不全,怎么重新加载-程序员宅基地

文章浏览阅读2.9k次。1mvn dependency:copy-dependencies2 项目右键 -> Maven -> Disable Maven Nature3 项目右键 -> Configure -> Convert to Maven Project_maven资源加载不全,怎么重新加载

mysql dml全称中文_MySQL语言分类——DML-程序员宅基地

文章浏览阅读527次。DMLDML的全称是Database management Language,数据库管理语言。主要包括以下操作:insert、delete、update、optimize。本篇对其逐一介绍INSERT数据库表插入数据的方式:1、insert的完整语法:(做项目的过程中将字段名全写上,这样比较容易看懂)单条记录插入语法:insert into table_name (column_name1,......_dml的全称是

【小工匠聊Modbus】04-调试工具-程序员宅基地

文章浏览阅读136次。可以参考: http://git.oschina.net/jrain-group/ 组织下的Java Modbus支持库Modbus-系列文章1、虚拟成对串口(1)下载虚拟串口软件VSPD(可在百度中搜索)image.png(2)打开软件,添加虚拟串口。在设备管理中,看到如下表示添加成功。..._最好用的 modebus调试工具

推荐文章

热门文章

相关标签