linux 应用层用udp发送数据时有大小限制吗?

我想如果应用层发送的数据过大,到了udp层不得不分片,比如说分成了3个包,接收的一方可能收不全这三个包,或者这三个包乱序了,而且这种乱序由于应用层数据被迫在udp层分片,... 我想如果应用层发送的数据过大,到了udp层不得不分片,比如说分成了3个包,接收的一方可能收不全这三个包,或者这三个包乱序了,而且这种乱序由于应用层数据被迫在udp层分片,也就意味着无法通过在应用层数据前添加信息头解决,这是否意味着应用层使用udp发送数据最好不要超过一定的大小? 展开
 我来答
qiliang_1987
2012-12-28 · TA获得超过308个赞
知道小有建树答主
回答量:94
采纳率:0%
帮助的人:110万
展开全部
从理论上来说,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数据包丢失。
更多追问追答
追问
TCP就会自己分片,UDP不会吗?
我刚才试了一下在局域网内用udp传送大文件,我的网络MTU是1500,我分别试了应用程数据每次发送1024字节和32K字节,发现32K字节发送的速度是1K字节的3倍多,而且两个传送结果都正确。

如果担心IP层和链路层丢包的话,似乎每次发送1K应该会更快一些,因为不容易丢包,而且每次发送32K,到了IP层照样会分片,也没有一次多发的优势,那怎么会32K的传送更快呢?
追答
你现在做的实验室在局域网环境下,丢包率会很低。
你每次发送1024和32K,对于IP层来说区别不大,一个是1024+UDP包头+TCP包头,一个是1500左右,当在应用层有区别,比如读写文件的次数,这个很耗时间的,还有用户态和内核态切换也需要耗时。

如果你把实验放在Internet环境下,结果会大不相同,32k肯定会大量丢包,不得不在应用层重传,速度你就能想象了。
来自:求助得到的回答
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式