C++ 如何增加UDP的最大数据包大小?

C++ 如何增加UDP的最大数据包大小?,c++,udp,C++,Udp,我通常发送3到15KB的数据包,但有时我需要发送大约0.8-0.9MB的大数据包。在这种情况下,UDP套接字将停止,因为可能对单个数据包大小有一些限制 如何增加此限制以发送大数据包?UDP数据包头中的长度字段的宽度仅为16位;你不能有一个大于65535字节的UDP数据包(也包括报头,所以实际上限制是65527字节;由于IP有其他限制,它甚至可能更低)。请注意,大于MTU的UDP数据包(主机之间希望如此)将被IP拆分。如果其中一个部分丢失,整个UDP数据包将被丢弃。没有重传 在本地局域网上,由于通

我通常发送3到15KB的数据包,但有时我需要发送大约0.8-0.9MB的大数据包。在这种情况下,UDP套接字将停止,因为可能对单个数据包大小有一些限制


如何增加此限制以发送大数据包?

UDP数据包头中的
长度
字段的宽度仅为16位;你不能有一个大于65535字节的UDP数据包(也包括报头,所以实际上限制是65527字节;由于IP有其他限制,它甚至可能更低)。

请注意,大于MTU的UDP数据包(主机之间希望如此)将被IP拆分。如果其中一个部分丢失,整个UDP数据包将被丢弃。没有重传

在本地局域网上,由于通信量较低,您可能不会注意到这一差异,但在任何不太理想的情况下,这可能会对性能造成巨大影响

我认为最好是:

  • 对大于几KB的任何内容使用TCP
  • 拆分您的消息(您很快就会发现您正在重新发明TCP)
  • 在UDP之上使用其他经过良好测试的协议。一个例子是

尽管第4层标头中的字段大小有限制,但可以使用大于64K的数据包。请参见IPv6巨型程序

底层IPv4协议对数据长度的实际限制为65507字节(65535− 8字节UDP报头− 20字节IP报头)。发送大帧时应小心。大多数exhcange协议从不在单个帧中发送大于1000字节的数据,因为如果帧大于MTU,那么它可能会在线路上被切碎。如果它被切碎,重新组装它们的成本会更高,并且会在链条中引入一个薄弱环节。这很奇怪。我对一些大约有30-35KB的数据包没有问题。他们都通过了,我知道。但是你提到实际的限制非常接近16527字节。所以我想我必须把那个大数据包分成许多小数据包。@Richard:16527是一个打字错误。正如James所指出的(但没有给出具体的数字),真正的限制是65507,因为有20字节的IP头。@Michael:噢<代码>/facepalm。多谢各位@理查德:我道歉。