我有一些服务器,它们必须根据数据包的延迟做出不同的响应。
是否有可能在服务器端获得单独数据包的延迟(“传输时间”)?(最好使用Python (但不是必需的)或以某种方式配置的服务器)?
理解清晰的示例:
# Pseudo-code
def handle_packet(packet):
if packet.latency > X:
# Declare war on the latency gods
else:
# Make peace with the latency gods发布于 2015-06-30 20:59:14
假设我对您的问题的理解是正确的,那么您将不得不修改客户端以进行"ping“操作。服务器将不得不ping客户端,然后客户端将立即使用pong进行响应,并且服务器将必须对从发送ping到获得pong所需的时间进行计时。这最好是使用UDP或TCP带外,因为使用正常的TCP,您的数据包可能会卡在队列中,在其他仍在传输的数据后面,人为地增加您的ping。
来回答更多我认为你在问的问题。获取从计算机a到计算机b再返回a的往返时间不是TCP或UDP中的标准操作,它是由ICMP (ping)处理的。你可以自由地用TCP或UDP实现你自己的ping操作,只是它不是标准的。
附注:在你问之前,有几个不使用ICMP ping的理由。其一,它有可能被防火墙保护了。第二,它一般不会在非特权进程中工作。大多数OSes不支持ICMP协议,因此您必须获得对网络接口的原始访问权限,这是一个特权操作。
对您的评论的回应:
看起来,您所要求的是在不执行乒乓操作的情况下,获得数据包从客户端到达服务器所需的时间。要做到这一点,唯一可能的方法是同步时钟,并将客户端上的时间放入数据包中。答:你的客户端很可能不会有一个同步的时钟。B.即使客户端有一个同步的时钟,你也必须在应用程序级别更改协议来添加这个时间戳,这听起来像是你的问题陈述不允许你这么做。
发布于 2015-07-01 01:06:46
这是不可能的。众所周知,在分布式系统中,您不能相信所有节点上都有相同的时钟。只有当你有像NTP这样的机制时,你才能有类似的时钟,但是仍然会有时钟漂移(这取决于你能忍受的误差)。即使您有相同的时钟,您也需要一种方法来确定数据包何时离开PC,而您没有这种方法。它是一个受控的环境,还是你可能有未知的客户端?你能容忍测量中的任何误差吗?我们谈论的是100ms还是小于10ms的时间?这些是解决你的问题的关键。
如果NTP和时钟漂移几毫秒对你有效,那么你可能有一种机制来做你需要的事情。只需记住,你所处的环境越不受控制,这可能就越不有用。例如,这可以在同一个数据中心内很好地工作,但在使用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上创建应用层协议。在这种情况下,您将能够使用数据报/流套接字。
发布于 2015-07-01 21:55:54
如果度量的准确性并不重要,您可以从一些应用程序行为中猜测此值。例如,对于TCP,您可以假设客户端在执行"connect“之后立即发送请求,并且客户端上的处理时间相对于网络时间可以忽略不计。也许你可以在应用程序中找到其他地方,在那里客户端应该在来自服务器的特定响应之后向你发送一些东西-然后你可以再次使用时间差来估计RTT。
当然,如果需要更高的精度,这些方法将不会很好地工作。
https://stackoverflow.com/questions/31138905
复制相似问题