1

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

iperf本质上,我在机器 A 上生成发往机器 C 的UDP 流量。但是,我首先通过机器 B** 路由此流量,然后通过原始套接字将其发送到机器 C 到端口 5001(iperf侦听的默认端口) ) 与sendto(). 运行 atcpdump显示机器 C 上正在接收数据包时,iperf服务器看不到这些连接或数据包。

我已经在iperf源代码中搜索了一下以了解它是如何工作的,并且我看到该函数接受了数据包

rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0, 
                       (struct sockaddr*) &server->peer, &server->size_peer );. 

基本上,因为它只是 a recvfrom,如果我非常确定我不会随时修改数据包,并且使用函数sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)和 a发送它们,我不明白为什么会有问题socket(AF_INET, SOCK_RAW, IPPROTO_UDP)

有人有想法么?为什么没有iperf注意到这种联系?

**我实际上将数据包路由到机器 A 上的 TUN 设备,然后从 A 上的用户空间程序中读取它们,使用 UDP 套接字将它们发送到 B,在 B 上的用户空间程序上读取它们,然后通过原始套接字发送它们带IP_HDRINCL残疾人。我在机器 A 和 B 上收到标题时打印出标题,我没有看到任何奇怪的东西。

4

1 回答 1

1

有趣的。原来问题是通过将机器 A 上的 TUN 设备分配给eth0的 IP 地址来解决的。之前,我将 TUN 设备分配给它自己的 IP 地址(我确实尝试从 TUN 设备中删除一个 IP 地址,但后来它默认为eth1。这也不起作用。)。

iperf我猜想因为这个而发生了一些修改,或者由于之前没有发送数据包而没有建立某种隧道/连接eth0

如果有人对它的工作原理/原因有任何进一步的见解,我会非常感兴趣。

于 2015-06-15T20:28:34.590 回答