gpt4 book ai didi

c++ - 了解 TCP 数据包大小限制和 UDP 数据包大小限制及其在 boost::asio 编程级别的含义

转载 作者:可可西里 更新时间:2023-11-01 02:33:27 38 4
gpt4 key购买 nike

我正在使用 boost::asio 在我的客户端应用程序和服务器应用程序中执行 UDP 以及 TCP 通信。我发现我只能使用 UDP 传输大小为 65535 字节 的数据,因为它似乎是 UDP 中的最大数据包大小。

TCP 中也有最大数据包大小限制,即 65535 字节?但是我可以在 TCP 中使用 boost::asio::write 发送大于最大数据包大小的 block ,并在客户端应用程序上读取它。我看到我不必担心 TCP 中的最大数据包大小,但在 UDP 中我确保每个 socket.send_to 都使用小于 max packet size 的缓冲区完成>

这是如何工作的?这是因为 TCP 是基于流的,负责在较低层创建数据包吗?有什么方法可以增加 UDP 中的最大数据包大小

我从服务器端发送的 UDP 数据包 的某些字节在客户端读取时是否可能丢失?如果是,那么是否有办法只检测 UDP 客户端的丢失

最佳答案

TCP 负责传输控制(这实际上是 T 和 C 在 TCP 中所代表的意思)。您通常不必担心发送到 TCP 套接字的数据量,因为它自己管理每个数据包中要发送的数据量。每个 TCP 数据包最多可以有 65536 字节的有效负载,但您通常不会考虑它,因为 TCP 相当复杂并且可以做很多事情。

然而,UDP 缺乏任何控制机制并尽可能简单,因此您需要决定每个数据包发送多少数据。最大大小再次为 65536 字节,因为 UDP header 中只有两个字节来指定消息的长度。决定 UDP 数据包大小时要考虑的另一件事是,较低级别的协议(protocol)也有其自身的限制(IP 为 65K,以太网为 ~1500 字节)。

您不能增加 UDP 数据包的最大大小,而且您通常也不想这样做,因为大的 UDP 数据包可能会在没有任何通知的情况下被丢弃。 SO 上的其他答案建议对互联网上的数据报使用 512-8K 数据包。

有可能接收到带有损坏字节的 UDP 数据报(尽管不是“丢失”)。但是每个数据包都包含一个 checksum因此客户端将知道数据报是否在传输过程中被损坏。

关于c++ - 了解 TCP 数据包大小限制和 UDP 数据包大小限制及其在 boost::asio 编程级别的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43931288/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com