为什么linux UDP包只能发送4096

超过4096就会被截断,已经设置发送缓冲了啊... 超过4096就会被截断,已经设置发送缓冲了啊 展开
 我来答
a7848170
推荐于2016-05-25 · TA获得超过300个赞
知道小有建树答主
回答量:320
采纳率:100%
帮助的人:264万
展开全部
有没有问过接收端那边的设置呢。从理论上来说,UDP数据的总长度为 65535(IP最大长度)-20(IP头)-8(UDP头) = 65507个字节,但大多数系统都达不到这个长度。这一般是受到两个方面的因素限制:
1) 应用程序编程接口限制。一般socket的缓冲区大小是8K,但都提供API来设置缓冲区的大小(SetSockOpt)。一般发送UDP最好不要超过512字节,这样基本可以保证不丢包(因为大部分网络和主机的MTU都大于512).
2) TCP/IP内核的限制。可能存在一些实现特性使得IP长度不能达到65535。

由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据;SVR4下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作;TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。

UDP不会分片,分片是IP层做的事,而且分片重组也是IP层负责的。
如果用UDP发送数据,数据量最好不要太大,应该避免IP层和链路层分包,防止分片丢失,导致整个UDP数据包丢失
迪凯特科技(北京)有限公司
2023-07-28 广告
RS232串行通讯的数据格式包括以下组成部分:1. 起始位:一位,用于表示数据的开始。2. 数据位:通常为8位,但也可以是7位或9位。3. 校验位:可以选择奇偶校验或无校验。4. 停止位:一位,用于表示数据的结束,也可以选择使用1.5个或2... 点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式