有没有办法通过将 USB 电缆插入两个 Ubuntu 系统来通过 USB 在两个 Ubuntu 系统之间建立连接?
在一个简单的测试环境中,我想从一个系统向另一个系统发送几个字符,基本上是一些聊天。
在更高级的测试中,我想创建一个 TCP 连接并将 USB 连接视为任何其他 LAN 连接。
答案1
您无法用电缆连接两个普通 USB 端口(例如大多数计算机上的端口)。USB 连接的两端并不对称。除非您恰好有一台带有 USB-OTG(谷歌搜索)接口的机器以及相应的驱动程序,否则您无法直接连接两个 USB 端口。
如果一台或两台计算机都有 USB-C 端口,则可以使用通用的 USB-C 转 USB-C 或 USB-A 转 USB-C 电缆连接两台计算机。USB 3.x 规范于 2011 年为此目的定义了 USB-A 转 USB-A 电缆,其中 Vbus 和 D+/D- 线未连接,以避免任何端口短路问题。这些符合 USB 3.x 标准的电缆很少见,而出于某种原因,不符合标准的电缆随处可见,如果不小心,这可能会很危险。
对于 USB-C 来说,这是安全的,因为所有 USB-C 端口(至少是符合规范的端口,因为显然这个问题已经超出了 USB-C 电缆的范围)都像微型端口一样实现了 USB-OTG。除非看到 ID 引脚接地,否则不会向 USB-OTG 兼容端口上的 Vbus 施加电源。这意味着在默认状态下,它充当“B”端口,如果插入电缆的“A”端,则切换到“A”端口。
将一台计算机上的 USB-C 端口连接到另一台计算机上的 USB-C 端口是安全的,因为每台计算机都会使用 USB-OTG 协议来确定哪台计算机应该为电缆供电。每当智能手机通过两端带有 USB-C 连接器的电缆插入计算机时,就会发生这种情况。这可能会产生不良后果,例如笔记本电脑会从手机中获取电量,而不是像大多数人希望和期望的那样为手机充电。通常只需拔下并重新插入即可纠正此问题。
我知道至少有些电脑上的普通 USB 端口允许通过 USB-A 到 USB-C 端口进行通信,因为我能够将 MacBook Pro 放入“目标磁盘模式",然后通过 USB-A 转 USB-C 线缆将其插入另一台 MacBook Pro,并将我的 MacBook Pro 的内置驱动器安装在另一台 MacBook Pro 上。
硬件是存在的,但在 Apple 电脑上的用途有限,因为显然没有用于创建网络的软件。目标磁盘模式工作正常,但我记得一旦离开目标磁盘模式,我就无法使用同一根电缆在计算机之间建立网络连接。我现在没有硬件在身边,无法刷新我的记忆,看看什么能行,什么不能行。
有些人对此感到困惑的是,一些电脑上的 USB-C 端口将支持 Thunderbolt 协议,将两个 Thunderbolt 端口连接在一起将创建网络链接。这是我用 MacBook Pro 和另一台 MacBook Pro 做的另一件事,我使用了Thunderbolt 3 转 Thunderbolt 2 适配器将这些计算机连接在一起。两台带有 USB-C/Thunderbolt 端口的计算机可以通过通用的无源 USB-C 转 USB-C 电缆连接以组成网络。如果 USB 的操作和 Thunderbolt 一样简单,那将非常方便,尤其是因为 Thunderbolt 已经能够做到这一点近十年了,而 USB 3.x 规范也同样定义了如何做到这一点。
我希望找到某种 USB 到 USB 通信,如 Thunderbolt 提供的通信,不仅在 Linux 上,而且在操作系统上,这样我就可以通过 USB 电缆将 Linux 连接到 macOS 和 Windows。我一直在寻找答案,但结果却发现更多问题。
答案2
下面介绍 USB 以太网
远程网络驱动程序接口规范 (RNDIS) 是 Microsoft 专有协议,主要用于 USB。它为大多数版本的 Windows、Linux 和 FreeBSD 操作系统提供虚拟以太网链路。Microsoft 提供了部分 RNDIS 规范,但据观察,Windows 实现会发出该规范中未包含的请求,并且存在未记录的限制。1
该协议与 Microsoft 的编程接口和模型紧密耦合,最显著的是网络驱动程序接口规范 (NDIS),而这些接口和模型对于 Windows 以外的操作系统来说都是陌生的。这使得在非 Microsoft 操作系统上实现 RNDIS 变得复杂,但 Linux2FreeBSD,3网络BSD4OpenBSD[5] 原生实现了 RNDIS。
USB 实施者论坛 (USB-IF) 定义了至少三种具有类似“虚拟以太网”功能的非专有 USB 通信设备类 (CDC) 协议;其中之一 (CDC-ECM) 早于 RNDIS,广泛用于与非 Microsoft 操作系统的互操作性,但不适用于 Windows。
[补丁] USB:RNDIS 设备的 usbnet(8/9)模块
有许多用于通过 USB 进行以太网式联网的协议。这些协议的主要目的是允许与 USB 设备进行独立于应用程序的数据交换,而不是视频或 MTP 等专用协议。尽管 USB 不是物理以太网,但所有主要操作系统的网络堆栈都设置为传输 IEEE 802.3 帧,而不太关心底层传输到底是什么。
主要的行业协议包括(按时间顺序):远程 NDIS(RNDIS,Microsoft 供应商协议)、以太网控制模型 (ECM)、以太网仿真模型 (EEM) 和网络控制模型 (NCM)。后三个是 USB 实施者论坛 (USB-IF) 的大型通信设备类 (CDC) 协议组的一部分。它们可从 USB-IF 下载(见下文)。RNDIS 规范可从 Microsoft 网站获取。关于事实上的标准,某些标准(例如 ECM)指定了早期系统没有的 USB 资源的使用。但是,对标准进行微小修改(即所谓的子集)使得在这些平台上实现实际实现成为可能。值得注意的是,即使是一些最现代的平台也需要进行微小的调整,因此仍然需要支持这些子集。
在这些协议中,ECM 是迄今为止最简单的协议 — 每次只发送和接收一个帧,无需修改。对于使用 64 字节数据包的 USB 1.1 系统(协议发布时为最新版本),这是一种很好的策略,但对于使用 512 字节数据包的 USB 2.0 系统则不然。
问题在于以太网帧的大小约为 1500 字节——大约是 3 个 USB 2.0 数据包和 23 个 USB 1.1 数据包。根据 USB 系统的工作方式,每个数据包都作为一次传输发送,即一系列最大长度的数据包,以一个短数据包或一个特殊的 ZLP(零长度数据包)结束。此后,会出现总线延迟,在此期间不会发送任何内容,直到可以启动另一次传输。这降低了总线占用率,这意味着在总线时间的相当一部分时间内不会发送任何内容。每 23 帧出现一次间隙并不明显,但每 3 帧出现一次间隙可能会严重影响吞吐量。
已回答以下内容超级用户
Linux 中包含了 USB 以太网驱动程序。相关的主机大小驱动程序是 CDC_ETHER 和 RNDIS。它们的从属大小对应驱动程序(本质上是在软件中模拟 USB 以太网桥)是 USB_ETH、USB_ETH_RNDIS。USB_G_ANDROID 还支持 RNDIS 协议,这对我来说非常好,因为相关设备使用 Android 内核,因此默认情况下启用该驱动程序。
使用 USB_G_ANDROID 驱动程序测量的 USB 桥接器的带宽从主机到从机约为 130Mbps,反之约为 90Mbps。
答案3
您无法用电缆连接两个普通 USB 端口(例如大多数计算机上的端口)。USB 连接的两端并不对称。除非您恰好有一台带有 USB-OTG(谷歌搜索)接口的机器以及相应的驱动程序,否则您无法直接连接两个 USB 端口。
你能要做的就是得到一对 USB 转以太网适配器,插入那些现在您就可以简单地通过该连接运行 TCP。
如果您确实只想交换字符而不想运行网络堆栈,您可以获得一对 USB 转串行适配器,并使用空调制解调器电缆连接它们。