【问题标题】:data loss problem of tcp protocol in twistedtcp协议在twisted中的数据丢失问题
【发布时间】:2011-08-30 02:10:54
【问题描述】:

我用twisted.internet 模块编写了一个基于tcp 的服务器。这是一个高并发环境。

我通常通过protocol.Protocol的实例发送数据,但我遇到了问题。 部分tcp连接可能会因为超时而关闭,而且我似乎收不到任何通知,所以我在关闭的连接中写入的数据可能会丢失。

并且数据丢失问题可能是由其他方式引起的。

有什么好办法控制吗? (socket.send 可以返回一个状态,transport.write 好像没有返回)

【问题讨论】:

    标签: python tcp twisted


    【解决方案1】:

    这个问题不是 Twisted 特有的。如果您想知道数据已收到,您的协议必须有一些数据已收到的确认。

    send() 的结果告诉你数据是由对等方权威接收的;它只是说它已被内核排队等待传输。从您的应用程序的角度来看,数据是由 Twisted,还是您的 C 运行时,或者您的内核,或者中间下游交换机,或者对等的内核或其他任何东西排队,这实际上并不重要。也许它已发送,也许它没有。换句话说,transport.write() 负责额外的缓冲,send() 没有,保证它总是缓冲你的所有字节,而send() 只会缓冲一些。

    如果您关心网络对等方是否看到您的数据,则绝对需要有一个应用程序级别的确认消息。

    【讨论】:

    • 真的吗?这让我很震惊,它会使我的应用程序更加复杂!有没有一些简单的方法可以做到这一点!
    • 我刚刚注意到你是扭曲项目的创始人。感谢提供这么好的项目。
    • @ifocus 这就是笨重的中间件的用途。应用程序开发人员可以选择他们需要的可靠性和保证级别。
    • @ifocus:您可能想要使用像 AMP amp-protocol.net 这样的协议构建工具包,而不是自己编写字节级协议。 Twisted 中的几个这样的东西提供了自动请求/响应匹配。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多