我正在为服务器端实现基于Twisted的客户端 - 服务器解决方案,例如和客户端的Android手机。 因为Andoird仿真器不占用大于1500b(或更少?)的TCP数据包,所以我需要能够在服务器端分组数据包。在每个“transport.write”之后没有刷新套接字,Twisted缓冲输出数据,因此如果没有某些手动或自动刷新/ maxpacketsize功能,分块将毫无用处。我如何在Twisted中执行此操作? 我熟悉“reactor.doSelect(1)”函数,但由于我使用EPoll反应器(出于可伸缩性和性能原因),我不能使用doSelect。是否可以更改Twisted中某些连接的maxPacketValue?
希望有人能告诉我光明......
答案 0 :(得分:2)
TCP是面向流的协议,而不是面向数据包的协议。当您调用transport.write
时,该数据会附加到TCP流中,并且可以以任意数量的数据包发送出去;它可能会被打破,或者与下一个或上一个write
的呼叫粘在一起。这是一个相当frequently asked question about Twisted,但是每个问过它的人都会略有不同。
您希望使用类似AMP的协议构造工具包,或者更基本的是LineReceiver来划分协议中的消息,而不是依赖于数据包边界的随机性。
答案 1 :(得分:1)
操作系统会自动对TCP数据包进行分块,所有应用程序都可以在刷新时给出提示。除此之外,应用程序可以只读取和写入流。
两个通信对等体的操作系统将根据Path MTU discovery链路上的MTU自动配置最大数据包大小。确保不要阻止ICMP数据包以使其正常工作。
由于错误的MTU极不可能出现问题(并且通常会设置1500或更低的MTU),因此您应该重新诊断问题,例如使用wireshark等数据包跟踪器