TPC连接的“酷”之处在于数据不会丢失。当数据没有被ACK确认时,TCP理论上会重新发送数据。
我有一个用c++编写的经典游戏服务器,客户端是用Flash AS3编写的。
在客户端中,我添加了一个检查工具,每X秒尝试使用5秒的超时时间连接到YouTube和Twitter。问题在于当客户端的Internet连接断开几秒钟(Internet检查器接收1或2个超时),之后开始从服务器接收数据,但服务器停止从客户端接收数据。
这是TCPDUMP收到的流程:
正如您所读到的,当服务器发送带有不正确的ACK的数据时,客户端不是重新发送数据,而是发送了一个RST数据包(强制服务器关闭连接)。在客户端日志中,我可以看到它接收并处理服务器发送的数据(因此,当服务器发送错误的ACK时,连接不会关闭)。
当TCP决定在收到不正确的ACK后发送RST数据包而不是重新发送数据时?
客户端套接字是以以下方式定义的AS3
我有一个用c++编写的经典游戏服务器,客户端是用Flash AS3编写的。
在客户端中,我添加了一个检查工具,每X秒尝试使用5秒的超时时间连接到YouTube和Twitter。问题在于当客户端的Internet连接断开几秒钟(Internet检查器接收1或2个超时),之后开始从服务器接收数据,但服务器停止从客户端接收数据。
这是TCPDUMP收到的流程:
1. server > client: Flags [P.], seq 2374:2378, ack 119, win 14600, length 4
2. client > server: Flags [.], ack 2374, win 15524, length 0
3. client > server: Flags [.], ack 2378, win 15520, length 0
. [Here the client sends data to the server, but the server never receives it...]
4. server > client: Flags [P.], seq 2378:2383, ack 119, win 14600, length 5
5. server > client: Flags [P.], seq 2386:2389, ack 119, win 14600, length 3
6. client > server: Flags [.], ack 2386, win 15512, length 0
7. client > server: Flags [.], ack 2389, win 15509, length 0
8. client > server: Flags [R.], seq 127, ack 2389, win 0, length 0
正如您所读到的,当服务器发送带有不正确的ACK的数据时,客户端不是重新发送数据,而是发送了一个RST数据包(强制服务器关闭连接)。在客户端日志中,我可以看到它接收并处理服务器发送的数据(因此,当服务器发送错误的ACK时,连接不会关闭)。
当TCP决定在收到不正确的ACK后发送RST数据包而不是重新发送数据时?
客户端套接字是以以下方式定义的AS3
Socket
:var socket:Socket = new Socket();
服务器套接字使用 fcntl()
设置为非阻塞。还有以下选项:
setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char *)&dummyint, sizeof(int));
setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&dummyint, sizeof(int));