我有一个程序,该程序需要在通过机器路由后测量总损耗。
本质上,我在机器A上使用iperf
生成了发往机器C的UDP流量。但是,我首先将此流量通过机器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上收到 header 时,我将它们打印出来,但看不到任何奇怪的地方。 最佳答案
有趣的。事实证明,通过将机器A上的TUN设备分配给eth0
的IP地址已解决了该问题。之前,我为TUN设备分配了自己的IP地址(我曾尝试从TUN设备中删除IP地址,但默认情况下为eth1
。这也不起作用。)
我猜是因为这个原因发生了一些修改,或者iperf
没有建立某种隧道/连接,因为以前没有从eth0
发出数据包。
如果有人对它的工作方式/原因有任何进一步的了解,我将非常感兴趣。