Tcp 为什么两台测试主机之间的往返时间不同?
我已经编写了一个http put客户端(使用libcurl libarary)将文件放入apache webdav服务器,并使用tcpdump在服务器端捕获数据包,然后使用tcptrace(www.tcptrace.org)分析转储文件,结果如下: 主机a是客户端,主机b是服务器端:Tcp 为什么两台测试主机之间的往返时间不同?,tcp,roundtrip,Tcp,Roundtrip,我已经编写了一个http put客户端(使用libcurl libarary)将文件放入apache webdav服务器,并使用tcpdump在服务器端捕获数据包,然后使用tcptrace(www.tcptrace.org)分析转储文件,结果如下: 主机a是客户端,主机b是服务器端: a->b: b->a: total packets: 152120 total packets:
a->b: b->a:
total packets: 152120 total packets: 151974
ack pkts sent: 152120 ack pkts sent: 151974
pure acks sent: 120 pure acks sent: 151854
sack pkts sent: 0 sack pkts sent: 0
dsack pkts sent: 0 dsack pkts sent: 0
max sack blks/ack: 0 max sack blks/ack: 0
unique bytes sent: 3532149672 unique bytes sent: 30420
actual data pkts: 152000 actual data pkts: 120
actual data bytes: 3532149672 actual data bytes: 30420
rexmt data pkts: 0 rexmt data pkts: 0
rexmt data bytes: 0 rexmt data bytes: 0
zwnd probe pkts: 0 zwnd probe pkts: 0
zwnd probe bytes: 0 zwnd probe bytes: 0
outoforder pkts: 0 outoforder pkts: 0
pushed data pkts: 3341 pushed data pkts: 120
SYN/FIN pkts sent: 0/0 SYN/FIN pkts sent: 0/0
req 1323 ws/ts: N/Y req 1323 ws/ts: N/Y
urgent data pkts: 0 pkts urgent data pkts: 0 pkts
urgent data bytes: 0 bytes urgent data bytes: 0 bytes
mss requested: 0 bytes mss requested: 0 bytes
max segm size: 31856 bytes max segm size: 482 bytes
min segm size: 216 bytes min segm size: 25 bytes
avg segm size: 23237 bytes avg segm size: 253 bytes
max win adv: 125 bytes max win adv: 5402 bytes
min win adv: 125 bytes min win adv: 5402 bytes
zero win adv: 0 times zero win adv: 0 times
avg win adv: 125 bytes avg win adv: 5402 bytes
initial window: 15928 bytes initial window: 0 bytes
initial window: 1 pkts initial window: 0 pkts
ttl stream length: NA ttl stream length: NA
missed data: NA missed data: NA
truncated data: 0 bytes truncated data: 0 bytes
truncated packets: 0 pkts truncated packets: 0 pkts
data xmit time: 151.297 secs data xmit time: 150.696 secs
idletime max: 44571.3 ms idletime max: 44571.3 ms
throughput: 23345867 Bps throughput: 201 Bps
RTT samples: 151915 RTT samples: 120
RTT min: 0.0 ms RTT min: 0.1 ms
RTT max: 0.3 ms RTT max: 40.1 ms
RTT avg: 0.0 ms RTT avg: 19.9 ms
RTT stdev: 0.0 ms RTT stdev: 19.8 ms
RTT from 3WHS: 0.0 ms RTT from 3WHS: 0.0 ms
RTT full_sz smpls: 74427 RTT full_sz smpls: 60
RTT full_sz min: 0.0 ms RTT full_sz min: 39.1 ms
RTT full_sz max: 0.3 ms RTT full_sz max: 40.1 ms
RTT full_sz avg: 0.0 ms RTT full_sz avg: 39.6 ms
RTT full_sz stdev: 0.0 ms RTT full_sz stdev: 0.3 ms
post-loss acks: 0 post-loss acks: 0
segs cum acked: 89 segs cum acked: 0
duplicate acks: 0 duplicate acks: 0
triple dupacks: 0 triple dupacks: 0
max # retrans: 0 max # retrans: 0
min retr time: 0.0 ms min retr time: 0.0 ms
max retr time: 0.0 ms max retr time: 0.0 ms
avg retr time: 0.0 ms avg retr time: 0.0 ms
sdv retr time: 0.0 ms sdv retr time: 0.0 ms
根据上述结果,客户端到服务器的RTT较小,但服务器端到客户端的RTT较大。谁能帮我解释一下吗?首先
主机b
发送的数据很少(样本量很小)。其次,我怀疑主机a
具有不对称的Internet连接(例如10MB/1MB) 因为
unique bytes sent: 3532149672 unique bytes sent: 30420
actual data pkts: 152000 actual data pkts: 120
actual data bytes: 3532149672 actual data bytes: 30420
a->b发送稳定的数据流,确保缓冲区被填满,东西被推送
b->a只发送了几个ACK等,几乎什么也不做,所以结果东西会在缓冲区中保留一段时间(几毫秒)
除此之外,RTT是往返时间。它是从应用程序排队发送数据包到接收到相应响应的时间。由于a上的主机正忙于推送数据,并且可能正在填充其自身的缓冲区,因此b的某些内容要得到确认将有少量额外的开销。是否有任何工具可以测试并找出哪一方导致延迟?对于长时间运行,apache dav有时会阻止从socket读取数据(在apache核心模块中添加日志),但很难转储数据包进行分析。您列出的输出中没有任何内容表明长的网络延迟-40ms不是很长的时间。听起来好像是什么原因导致服务器暂停。可能正在重新生成身份验证密钥,您必须查看日志。根据您提供的有限信息,它似乎与网络无关。感谢您提供的信息,从套接字读取数据时,长延迟可能大于1秒,但每天仅发生一次。对解决类似问题有什么建议吗?我分析了一个转储,发现从客户端发送的两个数据包之间有100ms的间隔,我能断定是客户端造成了延迟吗?主机a和主机b具有相同的带宽