通过UDP数据包大小限制了解TCP数据包大小限制&它在boost :: asio编程水平

时间:2017-05-12 06:59:26

标签: c++ sockets tcp udp boost-asio

我在我的客户端应用&部门中使用boost::asioUDP以及TCP communication服务器应用。我发现我只能使用65535 bytes传输大小为UDP的数据,因为它似乎是UDP中的最大数据包大小。

最大数据包大小限制也在TCP 65535 bytes?但我可以使用boost::asio::write中的TCP发送大于最大数据包大小的数据块。在客户端应用程序上完全阅读它。我看到我不必担心TCP中的最大数据包大小,但在UDP中我确保每个socket.send_to都使用小于max packet size

的缓冲区来完成

这是如何工作的? 这是因为基于流的TCP负责在较低层创建数据包吗? 我可以通过某种方式增加max packet size中的UDP吗?

当我在客户端读取时,从服务器端发送的UDP packet的某些字节是否可能丢失?如果是,那么只能检测UDP客户端的丢失吗?

1 个答案:

答案 0 :(得分:3)

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

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

您无法增加UDP数据包的最大大小,并且通常不希望这样做,因为可以在不通知的情况下丢弃大型UDP数据包。关于SO的其他答案建议在互联网上使用512-8K数据包进行数据报。

可以接收具有损坏字节的UDP数据报(但不是“丢失”)。但是每个数据包都被checksum覆盖,因此客户端将知道数据报是否在转换中被损坏。