我有一个应用程序,它使用TCP套接字将数据发送到第二个应用程序(消费者应用程序)。如何计算从第一个应用程序发送数据到第二个应用程序收到数据所需的总时间?两个应用程序都使用C / C ++编码。 我目前的方法如下(伪代码):
struct packet{
long sent_time;
char* data;
}
第一个应用程序(EMITTER):
packet p = new packet();
p.data = initialize data (either from file or hard coded)
p.sent_time = get current time (using gettimeofday function)
//send the packet struct (containing sent time and packet data)
send (sockfd, p, ...);
第二个APP(消费者)
packet p = new packet();
nbytes = recv (sockfd, p, .....); // get the packet struct (which contains the sent time and data)
receive_time = get current time
data transfer time = receive time - p.senttime (assume I have converted this to second)
data transfer rate = nbytes / data transfer time; // in bytes per second
然而,问题是2个应用程序(发射器和消费者)之间的本地时钟时间不同,因为它们都在不同的计算机上运行,导致这个结果完全无用。 是否有其他更好的方法以正确的方式(以编程方式)执行此操作,并获得尽可能准确的数据传输速率?
答案 0 :(得分:0)
如果您的协议允许,您可以从服务器发回一个确认收到的数据包。如果您想确保服务器接收/处理数据,这也是必须的。
如果你有,你可以简单地计算客户端的费率。只需从发送+ ACK间隔的长度中减去RTT,您就可以获得非常准确的测量结果。
或者,您可以使用NTP等时间同步工具来同步两台服务器上的时钟。
答案 1 :(得分:0)
首先:即使你的时间是同步的,你也会计算延迟,而不是吞吐量。在每个网络连接上,在给定时间点存在多个数据包,使得单数据包方法无法用于吞吐量测量。
E.g。使用最大下载速度比较从移动设备到HTTP服务器的ping时间 - ping时间将为几十ms,数据包大小将为ca. 1.5KByte,这将导致比下载时观察到的最大吞吐量低得多。
如果要测量实际吞吐量,请在发送方使用阻塞套接字并发送,例如100万个数据包与系统允许的速度一样快,在接收端测量第一个数据包到达和最后一个数据包到达之间的时间。
如果要使用OTOH准确测量延迟,请使用
struct packet{
long sent_time;
long reflect_time;
char* data;
}
让服务器反映数据包。在客户端检查所有三个时间戳,然后反转角色以掌握不对称延迟。
编辑:我的意思是:反射时间将是“其他”时钟,因此当来回运行测试时,您将能够过滤掉偏移。