我已经开发了类似于UnetStack1.3(/samples/ping
中可用的ping示例的ping实用程序,用于通过多跳链接ping远程节点,但是当出现以下情况时无法计算往返时间(RTT):我使用路由代理传输ping数据包,并使用RouteDiscoveryNtf
将静态路由信息添加到路由表中,因为上层通知(DatagramNtf
或DatagramDeliveryNtf
或DatagramFailureNtf
中没有可用的定时信息)。
往返时间的计算是rxtime
和txtime
与TxFrameNtf
和RxFrameNtf
可用的差值,如ping中的Clousure(fshrc.groovy
)所实现的例子。
我还尝试分析了UnetStack3中实现的ping实用程序,但无法进行显示。请让我知道RTT的计算方式。
答案 0 :(得分:1)
这是UnetStack3中ping
命令实现的简化版本:
def ping(int n, int m = 3, long timeout = 30000) {
println "PING $n"
AgentID router = agentForService(Services.ROUTING)
int p = 0
m.times { count ->
def t0 = currentTimeMillis()
router << new DatagramReq(to: n, reliability: true)
def ntf = receive({
it instanceof DatagramDeliveryNtf || it instanceof DatagramFailureNtf
}, timeout)
def t = currentTimeMillis()-t0
if (ntf == null || ntf instanceof DatagramFailureNtf) {
println "Request timeout for seq $count"
} else {
p++
println "Response from $n: seq=$count rthops=2 time=$t ms"
}
delay(5000)
}
println "$m packets transmitted, $p packets received, ${Math.round(100*(m-p)/m)}% packet loss"
}