14

在某些环境(例如 Java)中,使用 TCP/IP 套接字在使用“localhost”地址(IPv4 中的 127.0.0.1 或 IPv6 中的 ::1)的同一主机上的进程之间传递消息是很自然的。(因为 Java 往往不会在其 API 中公开其他 IPC 机制)。

显然,这有可能比通过管道传递消息的 IPC 或使用共享内存的 IPC 慢很多。

另一方面,如果 TCP/IP 网络堆栈意识到连接的两端都在环回接口上,它可能能够进行一些优化,以便效率可能与使用管道相差不大。

但是常见的操作系统(Windows、Linux)是否在其 TCP/IP 堆栈中实现了此类优化?

4

3 回答 3

8

是的。当接收到环回地址(127.xxx)的数据包/数据时,TCP/IP 的 IP 层使用环回路由将数据包路由到自身。

环回路线

网络目的地 || 网络掩码 || 网关 || 接口 || 公制

127.0.0.0 |||||||||||||||||||||| 255.0.0.0 || 127.0.0.1|| 127.0.0.1 || 1

将其路由到其自身后,在 TCP/UDP 层借助协议控制块(每个连接数据结构),将识别相应的套接字及其所有者进程以传递数据包/数据。

底线,数据链路层和物理层(OSI 模型)的所有任务都将被避免。

于 2011-04-30T15:01:36.073 回答
4

取决于操作系统和正在使用的配置。如果您要求默认行为,答案是肯定的。

这就是为什么你不能使用像 wireshark 这样的工具来嗅探本地环回场景的原因。

于 2011-04-29T12:29:34.933 回答
0

特别是在linux中,当数据包在环回接口上传输时,内核会为每个数据包引发一个“软件”中断。从那时起,数据包接收与物理设备的数据包接收流程相同。因此,您的假设是正确的,即通过环回接口进行的通信将比其他 IPC 机制(如 unix 套接字)慢得多。

我猜内核代码路径可以优化。例如,我们可以直接从环回接口的发送代码路径调用接收代码路径。

于 2015-02-23T19:12:19.580 回答