3

我正在为服务器端实现一个基于 Twisted 的客户端-服务器解决方案,例如客户端的 Android 手机。因为 Andoird 模拟器不接受大于 1500b(或更小?)的 TCP 数据包,我需要能够在服务器端对数据包进行分块。如果没有在每次“transport.write”之后刷新套接字,Twisted 会缓冲传出数据,因此如果没有某种手动或自动刷新/maxpacketsize 功能,分块将毫无用处。我如何在 Twisted 中做到这一点?我熟悉“reactor.doSelect(1)”函数,但由于我使用的是 EPoll 反应器(出于可伸缩性和性能原因),我不能使用 doSelect。是否可以更改 Twisted 中某些连接的 maxPacketValue?

希望有人能给我指点灯...

4

2 回答 2

2

TCP 数据包由操作系统自动分块,应用程序所能做的就是提示何时刷新。除此之外,应用程序只能读取和写入流。

两个通信对等方的操作系统将根据具有路径 MTU 发现的链路上的 MTU 自动配置最大数据包大小。确保您没有阻止 ICMP 数据包以使其正常工作。

由于错误的 MTU 极不可能是问题(并且通常设置为 1500 或更低的 MTU),您应该重新诊断您的问题,例如使用诸如wireshark的数据包跟踪器。

于 2011-10-21T09:59:12.417 回答
2

TCP 是面向流的协议,而不是面向数据包的协议。当您调用 时transport.write,该数据会附加到 TCP 流中,并且可以以任意数量的数据包发送出去;它可能会被分解,或者与下一次或上一次调用write. 这是关于 Twisted 的一个相当常见的问题,但每个提出这个问题的人的问法都略有不同。

您想使用AMP之类的协议构建工具包,或者更基本的LineReceiver来界定协议中的消息,而不是依赖于数据包边界的随机性。

于 2011-10-21T18:24:33.963 回答