在同一主机内通信时的Internet套接字行为

时间:2017-06-14 05:57:59

标签: linux sockets tcp network-programming posix

我最近正在编写一些工具来测试运行在不同主机上的一些网络进程。

我很想知道在测试时,我可以在一台主机上运行它们,而不是在不同主机中运行客户端和服务器。

由于客户端和服务器正在使用TCP进行通信,所以我认为这应该没问题,除了以下一点:

在与主机间的情况下在同一主机内传送数据时,TCP套接字行为是否相同?

数据是否物理存在于NIC接口,然后路由到目标套接字?或者内核会在这种情况下绕过NIC接口? (让我们将操作系统限制为仅限Linux用于讨论)

对于这种情况似乎没有什么规范。

====编辑====

我实际上注意到主机内和主机间通信之间存在一些差异。

在进行主机间通信时,我的程序可以成功获得硬件时间戳。但是使用完全相同的代码在同一主机中运行,硬件时间戳消失。支持和启用时,TCP数据包的硬件时间戳可用,并作为recvmsg的辅助数据与接收的TCP数据一起返回。 Linux kernel timestamp doc包含所有相关信息。

我检查了源代码,唯一的区别是发送者是否在接收者的同一主机内,没有其他区别。

所以我想知道Linux内核是否会绕过NIC并在进行主机内部通信时将数据直接呈现给接收器,从而导致问题。

1 个答案:

答案 0 :(得分:0)

  

数据是否物理存在于NIC接口,然后路由到目标套接字?

没有。通常没有设备提供此功能,也没有任何设备需要。

  

或者内核会在这种情况下绕过NIC接口?

除非需要在网络上发送或接收数据包,否则内核不会使用NIC。通常情况下,如果处于测试或环回模式,NIC只能返回本地数据包,这将要求他们停止收听网络。