我有一个程序需要测量通过机器路由后的总损耗。
本质上,我在机器 A 上生成带有 iperf
的 UDP 流量,该流量发往机器 C。但是,我首先通过机器 B** 路由此流量,然后通过原始套接字将其发送到机器 C 到端口 5001(iperf
侦听的默认端口),并带有 sendto()
。当运行tcpdump
显示正在计算机 C 上接收数据包时,iperf
服务器看不到这些连接或数据包。
iperf
源代码中搜索了一些,看看它是如何工作的,我看到该函数接受了数据包
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0,
(struct sockaddr*) &server->peer, &server->size_peer );.
基本上,因为它只是一个recvfrom
,如果我非常确定我没有在任何时候修改数据包,并且使用功能sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)
和socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
发送它们,我不明白为什么会有问题。
有人有什么想法吗?为什么iperf
没有注意到这种联系?
**我实际上将数据包路由到机器 A 上的 TUN 设备,然后从 A 上的用户空间程序读取它们,使用 UDP 套接字将它们发送到 B,在 B 上的用户空间程序上读取它们,然后通过禁用IP_HDRINCL
的原始套接字发送它们。我在机器 A 和 B 上收到时打印出标题,我没有看到任何奇怪的东西。
有趣。事实证明,通过将机器A上的TUN设备分配给eth0
的IP地址,该问题已得到解决。之前,我将 TUN 设备分配给它自己的 IP 地址(我确实尝试从 TUN 设备中删除 IP 地址,但后来它默认为 eth1
.那也没用。
我想由于这个原因发生了一些修改,或者iperf
没有建立某种隧道/连接,因为数据包之前没有从eth0
发送出去。
如果有人对如何/为什么工作有任何进一步的见解,我会非常感兴趣。