【发布时间】:2010-06-29 22:24:17
【问题描述】:
我有一个 .NET 3.5 C# 应用程序,它向运行 sles 10 的 linux 机器发送 2000-6000 字节的数据包。这些机器在同一个子网上。
大约 90% 的时间,一切正常。 linux机器处理我的请求并在5-15ms内响应。但大约 10% 的时间,会有大约 200ms-800ms 的延迟。
查看linux机器上的日志,看来延迟到我头了。也就是说,如果我对 socket.Send(...) 的调用在 1:15:00.000 返回并且我在 1:15:00.210 收到响应,则 linux 机器上的日志说它在 1:15 收到了请求:00.200 然后在 10ms 内处理它。 (我正在使用 System.Diagnostics.Stopwatch 在我的机器上计时。)
为了调试,我使用wireshark 捕获了流量。这里是交通。在 8 号和 9 号之间发生 600 毫秒的延迟。 (137.34.210.108 是我的机器,137.34.210.95 是 linux 机器)。
"1","11:56:27.380318","137.34.210.95","137.34.210.108","TCP","20700 > 17479 [PSH, ACK] Seq=1 Ack=1 Win=32767 Len=76"
"2","11:56:27.380393","HewlettP_29:37:0f","Broadcast","ARP","Who has 137.34.210.95? Tell 137.34.210.108"
"3","11:56:27.380558","HewlettP_29:39:93","HewlettP_29:37:0f","ARP","137.34.210.95 is at 00:1b:78:29:39:93"
"4","11:56:27.380564","137.34.210.108","137.34.210.95","TCP","17479 > 20700 [ACK] Seq=1 Ack=77 Win=65459 [TCP CHECKSUM INCORRECT] Len=0"
"5","12:04:48.096892","HewlettP_29:37:0f","Broadcast","ARP","Who has 137.34.210.95? Tell 137.34.210.108"
"6","12:04:48.097216","HewlettP_29:39:93","HewlettP_29:37:0f","ARP","137.34.210.95 is at 00:1b:78:29:39:93"
"7","12:04:48.097229","137.34.210.108","137.34.210.95","TCP","17480 > 20600 [PSH, ACK] Seq=1 Ack=1 Win=64198 [TCP CHECKSUM INCORRECT] Len=458"
"8","12:04:48.097457","137.34.210.95","137.34.210.108","TCP","20600 > 17480 [ACK] Seq=1 Ack=4294964377 Win=32767 Len=0 SLE=1 SRE=459"
"9","12:04:49.700966","137.34.210.108","137.34.210.95","TCP","17479 > 20700 [ACK] Seq=1 Ack=77 Win=65459 [TCP CHECKSUM INCORRECT] Len=1460"
"10","12:04:49.701190","137.34.210.108","137.34.210.95","TCP","[TCP Retransmission] 17480 > 20600 [ACK] Seq=4294964377 Ack=1 Win=64198 [TCP CHECKSUM INCORRECT] Len=1460"
"11","12:04:49.703970","137.34.210.95","137.34.210.108","TCP","20600 > 17480 [ACK] Seq=1 Ack=4294965837 Win=32767 Len=0 SLE=1 SRE=459"
"12","12:04:49.703993","137.34.210.108","137.34.210.95","TCP","[TCP Retransmission] 17480 > 20600 [ACK] Seq=4294965837 Ack=1 Win=64198 [TCP CHECKSUM INCORRECT] Len=1460"
"13","12:04:49.704002","137.34.210.108","137.34.210.95","TCP","[TCP Retransmission] 17480 > 20600 [PSH, ACK] Seq=1 Ack=1 Win=64198 [TCP CHECKSUM INCORRECT] Len=458"
"14","12:04:49.704211","137.34.210.95","137.34.210.108","TCP","20600 > 17480 [ACK] Seq=1 Ack=459 Win=32767 Len=0"
"15","12:04:49.704215","137.34.210.95","137.34.210.108","TCP","[TCP Dup ACK 14#1] 20600 > 17480 [ACK] Seq=1 Ack=459 Win=32767 Len=0 SLE=1 SRE=459"
"16","12:04:49.705425","137.34.210.95","137.34.210.108","TCP","20700 > 17479 [PSH, ACK] Seq=77 Ack=1461 Win=32767 Len=44"
有人可以帮我解释一下吗?我看到正在发生重新传输。但我不确定为什么。交换机显示没有丢弃的数据包。而且就算丢包,为什么重传还要600ms?
我认为这 (http://support.microsoft.com/kb/328890) 可能与 200 毫秒的延迟有关,但我尝试更改 TcpAckFrequency 并没有帮助。
谢谢, 迈克
【问题讨论】:
标签: c# networking sockets tcp