我在我的客户端应用&部门中使用boost::asio
来UDP
以及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客户端的丢失吗?
答案 0 :(得分:3)
TCP负责传输控制(这实际上是T和C在TCP中所代表的含义)。您通常不会为发送到TCP套接字的数据量而烦恼,因为它自己管理每个数据包中要发送的数据量。每个TCP数据包最多可以有65536个字节的有效负载,但是你通常不会考虑它,因为TCP相当复杂并且可以做很多事情。
然而,UDP缺乏任何控制机制并且尽可能简单,因此您需要决定每个数据包要发送多少数据。最大大小再次为65536字节,因为UDP标头中只有两个字节用于指定消息的长度。在决定UDP数据包大小时要考虑的另一件事是低级协议也有自己的限制(IP为65K,以太网为1500字节)。您无法增加UDP数据包的最大大小,并且通常不希望这样做,因为可以在不通知的情况下丢弃大型UDP数据包。关于SO的其他答案建议在互联网上使用512-8K数据包进行数据报。
可以接收具有损坏字节的UDP数据报(但不是“丢失”)。但是每个数据包都被checksum覆盖,因此客户端将知道数据报是否在转换中被损坏。