TCP - 发送和接收TCP/IP数据

4
我有一个客户端和一个服务器通过标准的TCP连接彼此通信。
服务器被配置为以恒定大小的x字节块发送数据。客户端也被配置为以x字节块接收数据(即,该客户端期望调用TCP栈以接收x字节将成功,除非与远程端的连接已失败)。
基于以上假设,我可以在TCP协议上构建我的通信协议吗?
2个回答

3

不是的。TCP是一种基于流的协议。除非您在应用程序级别处理分块,否则无法保证“块”。TCP作为协议不会为您提供这种保证。


3

我不确定对于那个问题的回答是否完整,不考虑“正确形式”。TCP对于可靠性和流量控制有着严格的规则。如果发送方在一个发送中发送了20个字节,那么接收方不应该在没有全部接收并以正确顺序重建所有20个字节之前读取其中任何字节,这是吗?因此,基于预先协商的块大小的协议合同应该是可以假定的,这样说可以吗? - S73417H
2
这意味着如果一条消息的大小总是X,那么当接收方拥有X时,它就知道这是一条完整的消息。但这并不意味着接收方可以一次读取到X。接收方可能需要进行X次1字节的读取来获取整个消息。明白了吗?基本上,如果大小是固定的,接收方就能凭直觉地知道何时接收到了一条完整的消息,而无需在消息中包含消息长度或在流中使用特殊的数据标记来指示消息的结束。 - ribram
我没有看到任何迹象表明你所说的是真的。如果A发送了20个字节,B在它们被放入B的TCP缓冲区之前就接收到了全部20个字节,那么调用recv(20个字节)应该不会失败,除非发生了通信问题。很抱歉,我对这个问题有些固执,同时我正在试图找到规范中明确回答这个问题的部分。 - S73417H
我不确定还能说些什么。列表中的#20?我曾经支持过一个TCP/IP开发工具包,您正在做出的假设是导致有缺陷的TCP应用程序的头号原因。更糟糕的是,您可能会在没有问题的情况下交换成千上万甚至数百万条消息,但这只意味着您到目前为止是幸运的。在某个时候,网络将会出现问题,如果您认为TCP不仅仅是一个字节流,那么事情将会出错。 - ribram
感谢您的回复,ribram。其他几篇文章也让我相信了您答案的正确性。 - S73417H
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接