【发布时间】:2023-03-17 05:26:01
【问题描述】:
作为网络项目的一部分,我编写了一个网络程序。该程序生成一堆数据包(TCP 用于使用 berkely 套接字 API 进行通信)并将其发送到特定端口并测量它返回的响应。该程序运行良好,但我想做一些后端计算,例如我的程序实际生成的数据速率。我试图做的是我测量了发送数据包的代码例程之前和之后的时间,并将总数据除以那个时间,即: 一次共发送了 799 个数据包,其中每个数据包为 82 字节,因此:
799 x 82 x 8 = 524144 位。测量的时间为 = 0.0001s 所以数据速率 524144 / 0.0001 = 5.24 Gbps
这是我尝试过的一段代码:
struct timeval start,end;
double diffTime (struct timeval* start, struct timeval* end)
{
double start_sec = ((double) start->tv_sec) + (double) start->tv_usec / 1000000.00;
double end_sec = ((double) end->tv_sec) + (double) end->tv_usec / 1000000.00;
return (end_sec - start_sec);
}
while(1){
gettimeofday(&start, NULL); // getting start time
*/ Call packet sending routine */
gettimeofday(&end, NULL);
printf("Time taken for sending out a batch is %f secs\n", diffTime(&start,&end));
}
我想确认我是否正确地解决了这个问题。此外,如果这是正确的方法,是否有办法找出数据包从线路中出来的实际速率,即来自以太网接口的数据包的实际物理速率?我们能否估计一下我在程序中计算的数据包速率(在用户模式下,我希望它在系统调用中遍历用户/内核屏障时会慢很多)和实际数据包速率之间的差异?非常感谢所有帮助。
谢谢。
【问题讨论】:
-
我不确定 65K 数据包大小是否有理由从您获得的时间中得出任何结论。数据量非常小,基本上只测量连接的延迟,而不是带宽。
-
这是有道理的。还有什么我可以尝试获得更现实的结果吗?
-
是的,发送更多包含更多数据的数据包。还可以尝试首先测量创建数据包所需的实际时间,这也可能很有趣。
-
好的,我可以做到。其他计算确实有意义吗?我的意思是计算费率的方法?
-
每个 TCP/IP 数据包都会添加标头数据,具体取决于版本和选项。以太网添加了另一个标头和校验和,因此您的值仅包括 netto 数据。您可以为每个数据包使用 IP 选项时间戳,并让发送方和接收方在系统时间上有所同步,以便接收方知道速率。
标签: c linux network-programming packet timeval