首先是一点背景:
我目前有一个通过TCP与服务器通信的客户端。客户端和服务器都运行Windows并使用WinSocks。我向服务器发送各种消息,每秒至少发送一条消息。几乎就是每10分钟,我看到一个问题,我的服务器似乎停止回复我的客户端。然后我看到来自客户端的5次重传,每次使用超时加倍,然后最终从服务器在客户端上接收RST包。这将重置我的客户端套接字,分配一个新的端口号,然后通信继续正常,再持续10分钟。
现在有点数据:
我正在使用wireshark来分析这个问题。所有数据都在连接的客户端(192.168.110.1)侧捕获,因为服务器不易访问。下面是相关数据(抱歉可怕的格式化。这是我在这里得到数据的唯一方法):
RefNum|Source|Destination|Length|Packet Info
1 | 192.168.110.1 | 192.168.110.22 | 61 | 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=7
2 | 192.168.110.1 | 192.168.110.22 | 75 | [TCP Retransmission] 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=21
3 | 192.168.110.1 | 192.168.110.22 | 75 | [TCP Retransmission] 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=21
4 | 192.168.110.1 | 192.168.110.22 | 89 | [TCP Retransmission] 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=35
5 | 192.168.110.1 | 192.168.110.22 | 113 | [TCP Retransmission] 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=59
6 | 192.168.110.1 | 192.168.110.22 | 135 | [TCP Retransmission] 62314 > 7074 [PSH, ACK] Seq=693 Ack=8483 Win=63303 Len=81
7 | 192.168.110.22 | 192.168.110.1 | 64 | 7074 > 62314 [RST] Seq=8483 Win=0 Len=0 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]
8 | 192.168.110.1 | 192.168.110.22 | 66 | 62348 > 7074 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
9 | 192.168.110.22 | 192.168.110.1 | 64 | 7074 > 62348 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]
10 | 192.168.110.1 | 192.168.110.22 | 54 | 62348 > 7074 [ACK] Seq=1 Ack=1 Win=64240 Len=0
11 | 192.168.110.1 | 192.168.110.22 | 56 | 62348 > 7074 [PSH, ACK] Seq=1 Ack=1 Win=64240 Len=2
12 | 192.168.110.22 | 192.168.110.1 | 72 | 7074 > 62348 [PSH, ACK] Seq=1 Ack=3 Win=5838 Len=18
1 - 6 - 原始和重新传输的数据包
7 - 从服务器收到重置
8 - 10 - 客户端和服务器之间的新握手,具有新的客户端端口号
11 - 12 - 第一个新消息和具有新客户端端口号的响应
最后,提出几个问题:
因为现在最明显的是,我不是TCP大师(甚至是关闭)。我认为谷歌对我很强,但我似乎无法追查以下问题的答案:
提前感谢您的时间。
答案 0 :(得分:0)
您的问题的答案:
有两件事让我想知道RST不是来自服务器,而是来自中间设备或主机防火墙:
如果是服务器应用程序问题(进程出现问题并停止从套接字读取数据),服务器上的TCP仍会确认接收数据,但其接收窗口将填满。在这种情况下,由于没有ACK,似乎客户端的数据包被丢弃或被阻塞在其间的某个地方。