获取数据包延迟(TCP \ UDP)

时间:2015-06-30 12:55:19

标签: networking tcp network-programming udp

我有一些服务器,它们必须以不同的方式响应,具体取决于数据包的延迟。

是否有可能在服务器端获得单独数据包的延迟("旅行时间")(优选使用Python(但不是必需)或以某种方式配置服务器)?

清楚理解的例子:

# Pseudo-code
def handle_packet(packet):
    if packet.latency > X:
        # Declare war on the latency gods
    else:
        # Make peace with the latency gods

3 个答案:

答案 0 :(得分:0)

假设我理解你的问题是正确的,你将不得不修改客户端以进行“ping”操作。服务器必须ping客户端,然后客户端将立即响应pong,服务器将不得不计算从发送ping到获取pong所花费的时间。最好使用UDP或TCP带外,因为使用普通TCP,您的数据包可能会卡在其他数据后面的队列中,这些数据仍会被人为地增加ping。

要回答更多我认为你问的问题。从计算机a到计算机b并返回到a的往返时间不是TCP或UDP中的标准操作,它由ICMP(ping)处理。你可以自由地用TCP或UDP实现你自己的ping操作,它只是不标准。

P.S。在你问之前,有几个原因不使用ICMP ping。一,它可能是防火墙的可能性很小。第二,一般来说,非特权进程不起作用。大多数操作系统不支持ICMP协议,因此您必须获得对特权操作的网络接口的原始访问。

回复您的评论:

看来你要求的是在没有乒乓球的情况下花时间将数据包从客户端传送到服务器。唯一可行的方法是,如果时钟已同步,并且您将客户端上的时间放入数据包中。答:您的客户很可能不会有同步时钟。 B.即使客户端确实有同步时钟,您也必须在应用程序级别更改协议以添加此时间戳,听起来您的问题陈述不允许这样做。

答案 1 :(得分:0)

这是不可能的。众所周知,在分布式系统中,您不能相信在所有节点上拥有相同的时钟。只有你有像NTP这样的机制你可以有类似的时钟,但仍有时钟漂移(这取决于你可以忍受的错误)。即使您有相同的时钟,您还需要一种方法来确定数据包何时离开PC并且您没有。它是受控环境还是您可能拥有未知客户?你能容忍测量中的任何误差吗?我们在谈论100毫秒或小于10毫秒的时间吗?这些是解决问题的关键。

根据@progerz评论向我的回复添加信息 如果NTP和几毫秒的时钟漂移对你有用,那么你可能有一个机制来做你需要的。记住你对环境的控制越少,它就越不实用。例如,这可以在同一数据中心内很好地工作,而在具有Wifi的餐馆中连接的客户端与数据中心中的服务器之间也不是很好。

关于UDP ot TCP的修改,如果你需要修改UDP头基本上你正在实现一个新的协议,这是一种可能性,你需要为它分配一个新的协议号。您将无法使用数据报AF_INET套接字(或在TCP情况下流式传输社交网络),您必须考虑使用较低级别的套接字,如原始套接字(或数据包套接字,但这不是必需的)。

#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, your_new_protocol_number);

另一种方法是通过UDP或TCP创建应用层协议。在这种情况下,您将能够使用数据报/流套接字。

答案 2 :(得分:0)

如果度量的准确性不重要,您可以从某些应用程序行为中猜测该值。例如,使用TCP,您可以假设客户端在执行“连接”后立即发送请求,并且客户端上的处理时间相对于网络时间可忽略不计。 也许你可以在应用程序中找到其他地方,客户端在服务器的某些响应之后会向你发送一些东西 - 然后你可以再次使用时间差来估计RTT。

原因是,如果需要更高的准确度,这些方法将无法正常工作。