当使用回环地址进行基于TCP/IP套接字的IPC时,常见的网络堆栈是否会跳过在较低级别的PDU中对消息进行分帧?

14
在一些环境中,比如Java,使用TCP/IP套接字在同一主机上的进程之间传递消息时自然而然地使用“localhost”地址(IPv4中的127.0.0.1或IPv6中的::1)(因为Java倾向于不在其API中公开其他IPC机制)。
显然,这可能比通过管道进行消息传递或使用共享内存进行IPC要慢得多。
另一方面,如果TCP/IP网络堆栈意识到连接的两端都在回环接口上,它可能能够做出相当多的优化,以使效率与使用管道没有太大区别。
但是常见的操作系统(Windows,Linux)是否在其TCP/IP堆栈中实现这样的优化呢?

1
答案似乎是“是的”,假设https://dev59.com/NHI-5IYBdhLWcg3w18Z3是正确的。 - David Bullock
2
仅供参考,根据这篇文章,在Windows Server 2012中有一个新的环回接口实现,它应该会更快。http://blogs.technet.com/b/wincat/archive/2012/12/05/fast-tcp-loopback-performance-and-low-latency-with-windows-server-2012-tcp-loopback-fast-path.aspx - Juan Campa
3个回答

8
是的。当接收到一个发送给Loopback地址(127.x.x.x)的数据包/数据时,TCP/IP的IP层使用Loopback路由将数据包路由到自己。
“Loopback Route”: 网络目标 || 子网掩码 || 网关 || 接口 || 度量 127.0.0.0 |||||||||||||||||||||| 255.0.0.0 || 127.0.0.1|| 127.0.0.1 || 1
在将其路由到自身后,在TCP/UDP层中,借助协议控制块(每个连接的数据结构),将识别相应的套接字及其所有者进程以传递数据包/数据。
总之,所有OSI模型的数据链路层和物理层的任务都将被避免。

5
这是个好消息。只是想知道你是怎么知道这个不太为人知的细节的 - 有参考资料吗? - David Bullock

4
依赖于操作系统和使用的配置。如果您询问默认行为,则答案是肯定的。
这就是为什么您无法使用诸如wireshark之类的工具来嗅探本地回环场景的原因。
[另一个用户的编辑]: 实际上,这是可能的,您必须选择Loopback接口(在Wireshark 3.4中进行测试)。

谢谢。这很有道理,Wireshark无法嗅探。 - David Bullock

0

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

我想内核代码路径可以进行优化。例如,我们可以直接从环回接口的传输代码路径调用接收代码路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接