2015-06-30 159 views
1

我有一些服务器,必须根据数据包的延迟情况做出不同的响应。获取数据包的延迟(TCP 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 

回答

0

假设我理解你的问题正确,你将不得不修改客户端有一个“平”的操作。服务器将不得不ping通客户端,然后客户端立即用乒乓球回应,并且服务器将不得不花时间从发送乒乓球到获得乒乓球。这最好用UDP​​或TCP带外完成,因为使用普通TCP时,您的数据包可能会滞留在其他数据的队列中,这些数据仍然是人为增加ping的传输数据。

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

P.S.在你问之前,有几个原因不要使用ICMP ping。其中一个可能会被防火墙挡住的可能性很小。二,它通常不会从无特权的过程中工作。大多数操作系统不支持ICMP协议,因此您必须对具有特权操作的网络接口进行原始访问。

回应您的评论:

看来什么你问的是得到它把数据包从客户端去服务器没有做乒乓球的时间。做到这一点的唯一可能的方法是,如果时钟已同步,并且您将客户端的时间放入数据包中。答:您的客户很可能没有同步时钟。 B.即使客户端确实拥有同步时钟,您也必须在应用程序级别更改协议以添加此时间戳,这听起来像您的问题声明中不允许您这样做。

+0

是的,但我必须得到服务器上的延迟,对于单独的数据包,无需发送响应!那是主要特征(和问题)。 – progerz

+0

@progerz根据我的猜测编辑 – CrazyCasta

+0

我不会低估,但推荐UDP或真正的任何“带外”计时机制都有一些问题。更明显的一点是,主流TCP流量和带外测量很可能分开进行。或者将通过插入的开关元件进行不同的处理。使用“流失(out-of-flow)”机制来说明特定流量的内容是很难说的。 – cnicutar

0

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

根据@progerz的评论添加信息到我的回复 如果NTP和几ms的时钟漂移适合你,那么你可能有一个机制去做你需要的。请记住,您拥有的环境越不受控制,这可能就不那么有用。例如,这可以在同一个数据中心内正常工作,而且在Wifi餐厅的连接客户端和数据中心的服务器之间的连接不太好。

关于修改UDP或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创建应用层协议。在这种情况下,你将能够使用数据报/流套接字。

+0

现在,我正试图让这个计划为我工作,它真的很有趣。据我所知,NTP允许有类似的时钟,差异可达几毫秒。 所以我需要以某种方式修改UDP数据包,插入时间戳... – progerz

+0

@progerz在阅读您的评论后,我修改了我的回复以添加信息 – rodolk

+0

@progerz,这里是解释NTP如何用于Cassandra的另一个链接:https:// blog.logentries.com/2014/03/synchronizing-clocks-in-a-cassandra-cluster-pt-1-the-problem/。告诉我这个回复是否有用。 – rodolk

0

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

因为,如果需要更高的准确度,这些方法将无法很好地工作。