感谢您关注我的问题!
我正在尝试使用clock_gettime 获取发送数据报和接收数据报之间的时间。
for(optval = 0; optval < 10; optval++){
clock_gettime(CLOCK_MONOTONIC, &ts_1);
sendto(sd, packet, sizeof(struct icmphdr), 0, (struct sockaddr*)&addr_req, sizeof(struct sockaddr_in));
recvfrom(sd, bufer, sz_buf, 0, (struct sockaddr*)&from_req, &tolen);
clock_gettime(CLOCK_MONOTONIC, &ts_2);
t_eq = (ts_2.tv_nsec - ts_1.tv_nsec) / 1000000.0;
total = (ts_2.tv_sec -ts_1.tv_sec) * 1000.0 + t_eq;
printf("\tt_total = %Lf ms\n", total);
sleep(1);
}
结论
t_total = 69.268422 ms
t_total = 72.526032 ms
t_total = 69.225890 ms
t_total = 70.945620 ms
t_total = 69.188274 ms
t_total = 69.181105 ms
t_total = 69.295679 ms
t_total = 72.721442 ms
t_total = 69.633848 ms
t_total = 69.522615 ms
如果我在新的终端仿真器会话中运行到另一台主机的标准ping程序,那么我的程序的输出将如下所示
t_total = 69.686600 ms
t_total = 0.044133 ms
t_total = 0.053209 ms
t_total = 0.043486 ms
t_total = 0.038839 ms
t_total = 0.042971 ms
t_total = 0.042133 ms
t_total = 0.043499 ms
t_total = 0.045853 ms
t_total = 0.018189 ms
这和什么有关系呢?
除了 icmp 数据包因这种设计方式而被拦截之外,它们的到达顺序也可能与发送时不同。这就是它们被编号的原因。在数据包字段中添加一个计数器,并将发送时间记录在数组中。按数量比较接收时间。
在我的办公室网络中,我也有不同的 ping 响应:一台服务器响应延迟为 3 毫秒,第二台服务器响应延迟为 0.0377 毫秒。云中的水是暗的。我唯一能说的是,第一台服务器与其他几台机器位于集线器上,第二台服务器直接连接到路由器。而且,令人惊讶的是,路由器本身的响应延迟约为0.1ms。
因此,如果不查看网络布局,就无法明确回答您的问题。