首先解释一下这个题目, "报文"指的是业务层自定义的报文, TCP是流式协议, 不像UDP那样是报文协议.
SYS-ATM开发的RMS系统, 需要和SYS-SIM开发的某个系统进行交互, 进行自动重启服务器和其它操作. 双方使用了TCP, 并自定义了一个简单的应用层协议, 请求报文的格式为:
&sig=xxx
SYS-ATM作为请求方, 用PHP的stream_socket_sendto()进行发送. SYS-SIM开发服务器端, 使用Python的twisted框架. 上线后, 出现问题, 服务器端接收到的报文不完整. 例如, json串只读了一半, 或者缺少"&sig=xxx", 缺少的数据是随机的, 但只缺少尾部, 已经接收到数据没有差错.
发送方代码:
$str = sprintf('json=%s&sig=%s', $json, $sig);
stream_socket_sendto($fp, $str);
接收方代码:
class XServer(Protocol):
def dataReceived(self, data):
#处理一个报文
factory = Factory()
factory.protocol = XServer
reactor.listenTCP(19009, factory)
reactor.run()
我们通过PHP和Python的API文档, 以及我们对网络协议和套接口的理解来分析.
问题1: 发送缓冲太小了吗?(发送方分包了吗?)
我们首先想到的原因会不会是, 发送方的发送缓冲比一个报文小, 所以"分包"了? 不过仔细一想, 这个问题出发点本身就是错误的. 因为TCP协议是流式协议, 不存在"分包"