如果消息被 TCP 分段,接收方会做什么
What the receiver do if the message is segmented by TCP
我在阅读muduo(C++网络库(的源代码时提出了这个问题。
如果客户端发送一条大尺寸的消息,该消息将由TCP分段,那么服务器端会发生什么?(服务器是否知道此消息已分段?
网络库是否有必要等待整个消息而不中断上层?
在处理像TCP这样的流协议时,您已经必须将接收到的数据重新组合成自己选择的块。这要么是每个块的固定字节数,要么是通过根据应用程序的协议(例如 HTTP(解析数据来动态决定的。
您不知道何时从网络层收到数据包是否已分段:您只知道您收到了一些数据。您可能知道(因为您了解自己的协议(您希望有更多的数据来完成块,但在收到数据块之前,您不知道是否还有更多数据。如果您确实收到它。
相反,单个TCP数据包可能包含多个应用层数据块!同样,您需要注意这两件事之间没有直接关系。
但是,您可以依赖 TCP 数据包以发送它们的相同顺序传递,这很好。
简单的类比:一艘大船,载货。它可能携带40辆汽车,或者它可能只携带制造飞机所需零件数量的一半。或者它可能同时携带两者!在您阅读运输清单并查阅您自己的交货记录之前,您不知道。然后,您有责任解开您收到的东西并做您需要做的事情。
网络库是否有必要等待整个消息而不中断上层?
如果库想要将完整的"消息"传递给上层,那么通常是的。有些方法只会阻止等待完整的消息,但这在当今并不常见。异步 I/O 是您的朋友。
(这是一个笼统的答案,写得不知道穆多具体做什么。
相关文章:
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 标志 |= f == s[i],这个语句会做什么?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 当一行中只有一个"#"而没有其他内容时,C++预处理器会做什么?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 如果消息被 TCP 分段,接收方会做什么
- 如果将两个相同的指针作为输入传递,memcmp 会做什么?
- 我不知道这个C 一线会做什么
- 这些会做什么(映射[x] [y] = 2;,map [x] [y] = 3;,以及map [x] [y] = 4;在下面
- 如果语句检查会做什么?
- 当调用类内联函数时,编译器会真正做什么
- 当我们在两个结构上使用它时,= 运算符会做什么
- 当在导入函数之前添加__declspec(dllexport)时,它会做什么
- 编译器在这种情况下会做什么
- 如果您创建模板函数但没有使用它的确定性实例,C++编译器会做什么
- 当我做 std::vector = std::vector 时,旧的 std::vector 值会发生什么
- 当编译器将浮点变量转换为整数变量时,它会做什么?
- 从union中的long类型强制转换为char*类型,然后再返回,会做什么?
- 如果给定一个指向数组中间的指针,delete[]会做什么?
- 当我包含一个类,例如<vector>并且只使用它的 1 或 2 个成员函数时,编译器会做什么?