计算两个主机之间的网络距离

5
我想计算网络应用程序中两个主机之间"距离"的一些指标。我提出了以下受到 "ping" 启发的天真解决方案。
  1. 发送不同大小的UDP数据包。
  2. 等待另一个节点的响应。
  3. 计算发送和接收之间的时间。
  4. 对这些数据进行归一化处理,并计算我的指标。
我希望避免管理原始套接字,但如果这是更好的选择,请告诉我。
你能推荐另一个解决方案吗?
编辑:
我认为我没有表达清楚。我知道什么是TTL和traceroute,但这不是我要寻找的东西。
我正在寻找的是将延迟、带宽和主机之间传统距离结合起来的更好指标(因为我认为单独使用traceroute对于管理协议并不那么有用)。这就是使用类似ping的度量的动机。

网络距离并不等于网络延迟,而你正试图测量的却是网络延迟。 - sanmai
5个回答

3
你所寻找的指标定义取决于其目的——有多种方法可以实现,哪种方法最好始终取决于其目的。
一般来说,你正在寻找某些函数distance(A, B)。通常这将是A和B之间带宽和延迟的函数:
distance(A, B) = f(bandwidth(A, B), latency(A, B))

函数f()的形状取决于其目的和应用,即您需要优化的内容。最简单的方法是使用线性函数:

distance(A, B) = alpha * bandwidth + beta * latency

而且,系数alpha和beta将取决于您想要优化什么。 如果您已经测量了一些衡量系统性能的变量,则可以进行统计分析(回归)以找到最佳参数:

performance(A, B) ~ alpha * bandwidth(A, B) + beta * latency(A, B)

请在讲述指标时小心。每个指标都必须满足以下条件:
distance(A, B) + distance(B, C) >= distance(A, C)

在计算机网络中,这并不总是正确的,因为它取决于路由器的决策。

3
问题是,您是否可以不修改现有协议,或更加勤奋地从现有的请求-响应消息中捕获 RTT细节?如果您修改现有协议,比如添加传输时间戳,您可以在服务器端执行其他分析。如果有来自服务器到客户端的请求-响应,则仍然可以推断出时间。主要思想是,显式添加用于路径延迟测量的附加消息通常高度冗余,只会增加网络交互和复杂性。

是的,这正是我想的那样。感谢您提出在协议交换消息时包含度量标准的想法。由于该协议基于UDP,我需要一些可靠的方法来计算超时和服务质量的一般需求。 - Pedro Montoto García

2
在网络中,"距离"通常是用跳数来衡量的。时间并不能准确地表示距离,因为它容易受到短期拥塞和其他网络问题的影响。查看traceroute以了解如何通过发送具有递增TTL的数据包来按跳数测量距离。

编辑:现在您的问题有了额外的细节 - 延迟和带宽永远无法被有意义地结合成一种通用指标。您可能需要根据应用程序的偏好(延迟 vs 带宽)制定权重。

对我来说,平滑RTT会更好。类似于TCP维护的东西,即RTT的长时间平均值,具有平滑因子以解决异常情况。没有一种好的方法来做到这一点,所以您可能需要搜索“RTT平滑”并尝试其中的几种方法。


2
在我看来,这高度取决于您的应用程序的具体细节。
  • 一些应用程序对“延迟”更加敏感,而丢失一些数据包是可以接受的,例如VOIP。那么你需要测量响应时间,忽略丢失的数据包。
  • 其他应用程序需要快速响应(因此对“延迟”敏感),并且需要重新传输丢失的数据包,但数据量较小 - 那么您需要进行测量,就像您所做的那样
    • 取决于重新传输对您的应用程序的影响,您必须计算:平均值,方差或其他 - 让它成为d
    • 根据可接受的冗余性,您可以将每个数据包发送n次以减少重传。然后制作函数d = f(n),并比较函数。
  • 有些应用程序需要速度优先,而延迟可能非常长(如数小时)。那么您可能会对给定时间段内的“最近t分钟”传输了多少数据进行“滑动窗口”统计,并不断更新该值。
可能还有许多其他指标,包括在可靠性优先时主机之间的冗余连接。因此,这高度取决于应用程序。

1

我认为你想要使用数据包的生存时间字段:

生存时间(TTL)

一个八位生存时间字段有助于防止数据报在互联网上持续存在(例如,循环传输)。该字段限制了数据报的生命周期。它以秒为单位指定,但小于1秒的时间间隔会向上舍入为1秒。在实践中典型的延迟中,它已成为跳数字段。每个路由器都会将数据报穿过并将TTL字段减少一。当TTL字段降至零时,数据包将不再被数据包交换机转发并被丢弃。通常,ICMP消息(特别是超时消息)会被发送回发送方,以通知其数据包已被丢弃。接收这些ICMP消息是traceroute工作的核心。

简而言之,您可以发送连续的IP数据包,每次发送时将生存时间减少。一旦您停止收到响应,您就大致知道源主机和目标主机之间必须存在多少跳。

如果您不想自己处理套接字,可以简单地使用ping命令,该命令提供了一个选项,允许您指定ping数据包的生存时间值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接