同一桌面上的 2 个程序之间的 tcp/ip 连接是否会使用网卡?

Will a tcp/ip connection between 2 programs on the same desktop use the network card?

我意识到这个问题可能 OS 具体。我正在使用 Ubuntu 18.04,但我对与任何 OS 相关的答案感兴趣。我正在使用 ROS 流式传输图像,并且想知道我旋转的每个图像流给系统带来了多少负担。

我想知道在同一系统上的进程之间通过 tcp 连接流式传输图像的瓶颈是什么。最重要的是,我想阅读描述通过 tcp 连接的数据流的文档。

编辑:我特别询问有关 ROS 1 的问题,但也欢迎有关 ROS 2 的回答。

我假设你在谈论 ROS Version 1 (as apposed to ROS2, which uses a whole different communication model). A good overview on how the communication works is given in the ROS wiki

当两个 ROS 节点分别作为消息主题的发布者和订阅者连接时,它们的通信将使用您操作系统的网络堆栈。这意味着订阅者设置了一个在特定端口上侦听的网络套接字。每条传入消息都会触发处理该消息的回调函数。 ROS 主机通知发布者应该发送消息的 IP 地址或主机名和端口。 即使两个节点 运行 在同一台机器上,消息传递仍将通过网络套接字进行。 但是,由于目标 IP 将是您计算机的 IP 地址 (localhost),这些包裹永远不会离开您的计算机,因此不会对您的网卡造成压力。

但是,您用例中的主要瓶颈很可能是消息的序列化。如果您在同一系统上 运行ning 发布者和订阅者,则这种序列化(在发布者端)和反序列化(由订阅者进行)是不必要的计算。对于这种情况,引入了 nodelets。实际上,它们允许 运行 在单个进程中安装多个 ros 模块。优点是同一进程的nodelets(称为nodelet master)之间的消息可以通过共享内存交换ROS消息,从而避免序列化的成本。

最后,ROS 有更智能的方法来传输图像流,而不是单独序列化每个图像。 These protocols 利用视频压缩。