我有一个程序,该程序需要在通过机器路由后测量总损耗。

本质上,我在机器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发出数据包。

如果有人对它的工作方式/原因有任何进一步的了解,我将非常感兴趣。

10-08 01:34