Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在同一主机内通信时的Internet套接字行为_Linux_Sockets_Tcp_Network Programming_Posix - Fatal编程技术网

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

Linux 在同一主机内通信时的Internet套接字行为,linux,sockets,tcp,network-programming,posix,Linux,Sockets,Tcp,Network Programming,Posix,我最近正在编写一些工具,用于测试跨不同主机运行的一些网络进程 我很想在测试时,不用在不同的主机上运行客户机和服务器,而是可以在一台主机上运行它们 由于客户机和服务器使用TCP进行通信,所以我认为这应该可以,除了下面的一点: 在同一主机内与跨主机进行数据通信时,TCP套接字行为是否相同? 数据是否会物理上存在于NIC接口,然后路由到目标套接字?或者内核会在这种情况下绕过NIC接口?(让我们在此将操作系统限制为仅限Linux以供讨论) 关于这种情况,似乎没有什么具体说明 ==编辑==== 我实际上注

我最近正在编写一些工具,用于测试跨不同主机运行的一些网络进程

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

由于客户机和服务器使用TCP进行通信,所以我认为这应该可以,除了下面的一点:

在同一主机内与跨主机进行数据通信时,TCP套接字行为是否相同?

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

关于这种情况,似乎没有什么具体说明

==编辑====

我实际上注意到了主机内和主机间通信之间的一些差异

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

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

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

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

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

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


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

很难回答您的问题,因为不清楚“相同”是什么意思。以什么方式相同?任何两件事在某种程度上都是不同的,或者它们只是一件事。问题是这些差异对你是否重要。@DavidSchwartz检查粗体下面的那一行,这是我想知道的关于这种行为的要点。ThanksA socket是套接字,TCP/IP是TCP/IP是TCP/IP。这两个对等体在世界上的哪个地方并不重要,如果一个对等体在瑞典,另一个在菲律宾,它的工作原理应该是一样的,就像两个对等体在同一台物理计算机上本地运行一样。@Someprogrammerdude“应该”这个词是我最关心的部分。它的工作方式应该与套接字驻留在另一台主机上的工作方式完全相同,但我不能100%确定这一点。让我在问题中添加更多信息。好的,将“应该”改为“将”。如果它不起同样的作用,那么网络堆栈中就有一个bug。我已经添加了更多的细节,有什么想法吗?根据你的帖子,这不应该发生!如果没有使用硬件,为什么会有硬件时间戳呢?这里的要点是我指定了相同的接口进行通信。所以这里有区别吗?无论您指定什么接口,如果是本地流量,它都将使用环回接口。当你指定接口时,它被用于很多事情,但它不能确定数据包将用什么接口传输——这将是接口将数据包传输到目的地的任何接口。啊,是的,你的话让我想起了Linux的弱端模型。有没有办法指定一些套接字来使用强端模型?我认为这是不可能的,因为这是一个全系统的模型。只是想知道。