通过 USB 连接两个 Ubuntu 系统

通过 USB 连接两个 Ubuntu 系统

有没有办法通过将 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)模块

Ethernet_over_USB 维基百科

有许多用于通过 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 转串行适配器,并使用空调制解调器电缆连接它们。

相关内容