Twisted中TCP协议的数据丢失问题

4 投票
1 回答
559 浏览
提问于 2025-04-17 00:36

我用twisted.internet模块写了一个基于TCP的服务器,这个服务器可以同时处理很多连接。

我通常通过protocol.Protocol的实例来发送数据,但我遇到了一个问题。

有些TCP连接可能因为超时而关闭,而我似乎没有收到任何通知,这样我在关闭的连接上写的数据就可能会丢失。

而且,数据丢失的问题可能还会通过其他方式发生。

有没有什么好的方法来控制这个问题?(socket.send可以返回状态,但transport.write似乎没有返回值)

1 个回答

4

这个问题并不是Twisted特有的。如果你想知道数据是否被接收,你的协议必须有某种确认机制。

send()的结果来看,它并不能告诉你数据是否被对方确实接收了;它只是说明数据已经被放入了内核的传输队列。从你应用的角度来看,数据是由Twisted放入队列的,还是由你的C运行时、内核、下游的交换机,或者对方的内核放入的,这些其实都不重要。也许数据已经发送,也许没有。换句话说,transport.write()会处理一些send()不处理的额外缓冲,确保它总是能缓冲你所有的字节,而send()可能只会缓冲一部分。

如果你在意网络对端是否看到了你的数据,你绝对需要有一个应用层的确认消息。

撰写回答