如果消息被 TCP 分段,接收方会做什么

What the receiver do if the message is segmented by TCP

本文关键字:方会做 什么 分段 消息 TCP 如果      更新时间:2023-10-16

我在阅读muduo(C++网络库(的源代码时提出了这个问题。

如果客户端发送一条大尺寸的消息,该消息将由TCP分段,那么服务器端会发生什么?(服务器是否知道此消息已分段?

网络库是否有必要等待整个消息而不中断上层?

在处理像TCP这样的流协议时,您已经必须将接收到的数据重新组合成自己选择的块。这要么是每个块的固定字节数,要么是通过根据应用程序的协议(例如 HTTP(解析数据来动态决定的。

您不知道何时从网络层收到数据包是否已分段:您只知道您收到了一些数据。您可能知道(因为您了解自己的协议(您希望有更多的数据来完成块,但在收到数据块之前,您不知道是否还有更多数据。如果您确实收到它。

相反,单个TCP数据包可能包含多个应用层数据块!同样,您需要注意这两件事之间没有直接关系。

但是,您可以依赖 TCP 数据包以发送它们的相同顺序传递,这很好。

简单的类比:一艘大船,载货。它可能携带40辆汽车,或者它可能只携带制造飞机所需零件数量的一半。或者它可能同时携带两者!在您阅读运输清单并查阅您自己的交货记录之前,您不知道。然后,您有责任解开您收到的东西并做您需要做的事情。

网络库是否有必要等待整个消息而不中断上层?

如果库想要将完整的"消息"传递给上层,那么通常是的。有些方法只会阻止等待完整的消息,但这在当今并不常见。异步 I/O 是您的朋友。

(这是一个笼统的答案,写得不知道穆多具体做什么。