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

标签 linux sockets tcp network-programming posix

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

我很想在测试时,与其在不同的主机上运行客户端和服务器,不如在一台主机上运行它们。

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

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

数据会以物理方式呈现给 NIC 接口(interface),然后路由到目标套接字吗?或者内核会在这种情况下绕过网卡接口(interface)? (这里把OS限制为Linux来讨论)

似乎没有关于这种情况的规范。

==== 编辑 ====

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

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

我查了下源码,唯一的区别就是发送方是否和​​接收方在同一个主机内,其他没有区别。

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

最佳答案

Will the data be physically present to the NIC interface and then routed to the target socket?

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

Or the kernel will bypass the NIC interface under such scenarios?

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

关于linux - 在同一主机内通信时的 Internet 套接字行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44536556/

相关文章:

java - 数组变量的错误

Perl IO::Socket/IO::Select - 从 "ready-to-read"套接字读取

http - HTTP 下载到底是什么意思?

android - 一旦客户端 2 连接,Kryonet 就会断开客户端 1

c - 带轮询的非阻塞套接字

Python:通过从不同类/线程内建立的 TCP session 发送

linux - 具有安装前和安装后操作的 Bitbake 配方

python - Upstart python脚本

ruby-on-rails - Metasploit 更新 : Error In Bundle Install ( nokogiri 1. 6.8 )

delphi - 在 Indy 中的 2 个连接之间直接传输数据 (TIdContext)