当前位置: 首页 > 知识库问答 >
问题:

了解TCP数据包大小限制和UDP数据包大小限制

督阿苏
2023-03-14

我正在使用boost::asio在我的客户端应用程序中执行UDP以及TCP通信

最大数据包大小限制也存在于TCP中,即65535字节?但是我可以使用TCP中的boost::asio::write发送大于最大数据包大小的数据块

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

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

共有2个答案

裴经义
2023-03-14

问题与其说与UDPTCP有关,不如说与IP有关UDPTCP是传输协议,它们没有定义最大数据包(或数据段)大小IP是一种网络协议。一个IP数据包最多可以包含65536(2^16)个字节,因为有两个字节用于定义数据包大小。大型IP数据包被分成若干段。如果其中一个段丢失或损坏,则整个IP数据包将丢失。段的大小取决于链路层协议,通常是以太网。对于以太网,通常最大大小最多为1500字节,如果允许巨型帧,则更大。

所以,如果传输UDP大于1500字节的数据包,它可以被分成几个段。如果网络上没有损失,这通常是好的。然而,如果有损失,当有更多的依赖细分市场时,影响只会更大。例如,考虑一个具有1%损失的网络,如果您传输一个65536字节的UDP分组,那么它很可能被分成44个段。这个数据包被接收的概率是:(1-0.01)^44 = 64%...

这也是为什么许多TCP实现和基于UDP的应用程序最多使用1500字节的数据包。

提取损坏的数据包是一项非常重要的任务,请查找像libpcap这样的库。

澹台举
2023-03-14

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

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

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

可以接收带有损坏字节的UDP数据报(但不是“丢失”)。但每个数据包都包含一个校验和,这样客户机就可以知道数据报在转换过程中是否被损坏。

 类似资料:
  • 我一直在写一个程序,它使用UDP上的停止和等待协议通过局域网和广域网发送数据包。我最近一直在测试我的程序,并注意到较大的数据包(接近64k字节)的丢包率更高。直觉上这是有道理的,但实际原因是什么?

  • 在实验运行在esp32上的UDP服务器时,我发现接收到的数据包的大小限制在1500字节: 20(IP头)8(UDP头)1472(数据),(尽管理论上UDP好像可以支持数据包64K)。这意味着,为了传输更大量的数据,客户端必须将其拆分成若干块并依次发送,而在服务器端,这些数据将需要恢复。我认为这种解决方案的管理费用将相当高。我还知道TOIT提供TCP/IP连接。自然,分组大小在TCP/IP的情况下也

  • 问题内容: 在HighChart中,我需要针对x和y轴绘制一系列数据。HighChart希望数据为json格式。即[[x,y],[x,y]……[x,y]]。其中x和y是时间(1392345000-Unix纪元格式)和值(49.322)。因此,我正在进行ajax调用以获取数据,并成功将json返回的数据渲染为highchart。在大多数情况下,即,如果data([x,y])的计数低于87500行,则

  • 问题内容: “数据:” URL方案值是否有大小限制?我对流行的Web浏览器中的限制感兴趣。换句话说,多久可以成为或? 问题答案: 简短答案:数据URI限制有所不同。 有很多答案。正如5年前提出的问题一样,大多数问题由于过时而现在不正确,但是这个问题排在Google结果“数据URI限制”的顶部。数据URI现在得到广泛支持,并且IE 7/8不再是相关的浏览器。下面有许多参考文献,因为今天的答案是微妙的

  • 通过UDP发送大量的小数据包会占用更多的资源(cpu、zlib压缩等)。我在这里读到,通过UDP发送一个大的~65kBYTEs数据包可能会失败,所以我认为发送许多较小的数据包会更频繁地成功,但是随之而来的是使用更多处理能力的计算开销(或者至少这是我假设的)。问题基本上是这样的:发送最大成功数据包并将计算保持在最低限度的最佳方案是什么?有没有一个特定的尺寸在大部分时间都有效?我使用Erlang作为服

  • 我总共有96个视频。我已经使用ffmpeg转换了大部分视频,但对于某些视频,它会给我带来一些错误。作为第一步,我使用以下命令将视频逐行扫描: 我得到以下错误: [rawvideo@0x7fa144008c00]缓冲区大小无效,数据包大小2073600 当我试图获取有关视频的信息()时,我得到以下信息: [IMGUTILS@0x7fff5bac8140]图片大小0x0无效 [IMGUTILS@0x7