udp网络传输数据的最大长度问题?

kitty1982 2007-08-23 10:26:25
请问,udp传输的发送和接收的缓冲区的最大长度是怎么限制的,可以设置吗,最大长度一般是一次可以传多少个字节啊,谢谢,请指点一下.
...全文
1978 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanb99 2008-01-28
  • 打赏
  • 举报
回复
消息的尺寸有限制:理论上UDP数据报的最大尺寸略小于64KB,但实际上许多UNIX主机只提供32KB的最大尺寸,有的甚至只有8KB,最终套接口接收程序还会把这个最大尺寸限制为接收缓冲区的大小,许多程序UDP消息尺寸只有512B或更小.

以上摘自<实战linux socket编程>
穆伦 2008-01-27
  • 打赏
  • 举报
回复
BSD相关系统上UDP默认最大发送8k,应用程序也可以通过设置选项放大。
其他系统不清楚
bigbee 2008-01-27
  • 打赏
  • 举报
回复
1500字节的长度限制来自于以太网物理层的规范,传输层如果想要发送超过1500字节的单包,只能依赖IP层分包,到目的地组装。但这会额外增加TCP/IP协议栈的开销。并且这种不加控制的发送加剧网络拥塞的可能,在不面向连接的UDP这里,当然也就增加了丢包的可能。
cceczjxy 2008-01-25
  • 打赏
  • 举报
回复

实际上,你发128k也好,32k也好,linux内核都会根据网络协议给拆分成1500个字节左右发送出去,内核不负责重发.就因为如此,你数据包很大的情况下,拆分后的数据包如果有丢失的,那你接收端接收的数据就会不正确的.即是只有一个包失败,所要的数据你都要重发,因为那些分包对于你的程序来说是不可控的.因此在linux下,尽量不要把数据包的大小设置的
超过1500个字节


ght21 2008-01-25
  • 打赏
  • 举报
回复
问题按goodyun82 的方法,先ping一下地方,等ping通了再发送,就能发送完了,呵呵....
ght21 2008-01-25
  • 打赏
  • 举报
回复 1
我也遇到了这样的问题,在linux的下,用udp发送数据的时候超过1500后对方就根本收不到..
hzcpig 2007-08-26
  • 打赏
  • 举报
回复
同问,sendto返回值正确(发送长度1500字节)但recvfrom收不到,发送1200字节时就可以收到。感觉超过了1500字节不是丢包的问题,而是根本就收不到。以上send和recv还是在一台机器上。

--------------------------

我曾经在XP上测试过发128K的UDP包,测试通过,虽然是在局域网上,但至少说明UDP上没有长度限制,Linux上没试过,但相信32K以下是没问题的。
goodyun82 2007-08-26
  • 打赏
  • 举报
回复
此问题很有可能是跟你的协议实现有关
你可以做个简单的实验,同样的发送1500字节的程序,一个在你先ping一下目的地址后运行,一个在命令行里面运行arp -d后运行,看看结果是不是不一样??如果是的话,那就是这样的原因:发送1500的数据肯定是分片了,而协议栈里面发送之前如果不知道目的地址的ARP影射,则会发一个arp请求包,在等这个包的应答之前会把需要发送的IP包保存起来,但是只保存一个(注意他只保存一个发送请求),这时如果在arp应答到来之前第二片UDP分片要求发送,这时就会出现第二片IP包覆盖第一片的情况,导致只发出了后面的之带IP的包(令人奇怪的是协议栈确实还会厚颜无耻的返回说发了1500个字节,因为上层协议看不到下层协议),目的方自然不认识该包,因为没有连接能与之匹配。
以上是我在做TCPIP协议栈的时候测试并且找到的一个问题,应该和你的原因一样的。为了证实你也可以将你发出去的包抓下来看下就清楚了。
另外,书上推荐的是UDP不要超过500字节,因为如果跨网络的话,他们的MTU是不一样的,比如ethernet到ATM???
ideawu 2007-08-25
  • 打赏
  • 举报
回复
UDP的缓冲和包的最大长度没有直接的联系.

UDP包的最大长度理论上是 64K, 但是实现上一般是 8K.
you3700 2007-08-25
  • 打赏
  • 举报
回复
同问,sendto返回值正确(发送长度1500字节)但recvfrom收不到,发送1200字节时就可以收到。感觉超过了1500字节不是丢包的问题,而是根本就收不到。以上send和recv还是在一台机器上。
lirui_sky 2007-08-24
  • 打赏
  • 举报
回复
我现在写的代码一般都是1500以内,丢包是免不了的,有重发机制就行了
hzcpig 2007-08-23
  • 打赏
  • 举报
回复
win98时代有最大限制,32K还是64K忘记了,反正就是记事本的最大长度限制。

到了XP年代,已经没有最大限制了,你完全可以自己定义数据包的大小,不过通常建议不要超过32K
cceczjxy 2007-08-23
  • 打赏
  • 举报
回复
大概是1500个字节
可以设置,具体忘了.
happy_flying 2007-08-23
  • 打赏
  • 举报
回复
可以使用setsockopt的SO_RCVBUF和SO_SNDBUF来设置.
建议看一下UNIX网络编程第一卷的相关章节.
jwwu 2007-08-23
  • 打赏
  • 举报
回复
最好不要超过1500,否则容易丢包

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧