当前位置:  开发笔记 > 编程语言 > 正文

Python/Twisted - TCP数据包碎片?

如何解决《Python/Twisted-TCP数据包碎片?》经验,为你挑选了2个好方法。

在实现dataReceived方法时,在Twisted中,似乎没有任何示例涉及被分段的数据包.在其他所有语言中,这是你手动实现的东西,所以我只是想知道这是否已经为你做了扭曲或者什么?如果是这样,我是否需要在数据包前加上长度标题?或者我必须手动执行此操作吗?如果是这样,那将是什么方式?



1> 小智..:

在dataReceived方法中,您将数据作为一个不确定长度的字符串返回,这意味着它可能是您协议中的整个消息,或者它可能只是某个"客户端"发送给您的消息的一部分.您必须检查数据以查看它是否包含协议中的整个消息.

我目前正在我的一个项目中使用Twisted来实现协议,并决定使用struct模块来打包/解压缩我的数据.我正在实现的协议具有固定的头大小,所以在我读取至少HEADER_SIZE字节数之前,我不构造任何消息.总消息大小在此标头数据部分中声明.

我猜你真的不需要将消息长度定义为协议的一部分,但它有所帮助.如果您没有定义一个,则必须有一个特殊的分隔符来确定消息的开始/结束时间.排序FIX协议如何使用SOH字节来分隔字段.虽然它确实有一个必填字段,告诉你消息有多长(而不是消息中有多少个字段).


这种方法要非常小心.信任客户端告诉您它将发送多少数据是引入缓冲区溢出或类似攻击的经典方法.
杰西,我认为你没有理解这个答案.首先,Twisted是在Python中,因此你不可能有缓冲区溢出.其次,分隔输入比长度前缀输入更容易导致缓冲区溢出; 例如,请参阅http://cr.yp.to/proto/netstrings.txt的安全部分或任何有关C网络编程的书籍.这里的想法不是你"信任"客户端告诉你它将发送多少数据 - 它是客户端告诉你多少字节(它发送的任意数字)构成一条消息.

2> Kylotan..:

在处理TCP时,你应该忘记所有"数据包"的概念.TCP是一种流协议 - 您将数据流传输到另一端的数据流.一旦数据被发送,只要数据全部以正确的顺序到达,就允许它根据需要到达尽可能多的块.您必须像使用其他语言一样手动进行分隔,使用长度字段,消息类型字段或特殊分隔符等.

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有