在公网上一个UDP包多少个字节以下比较合适?

acdbxzyw 2011-07-10 10:50:41
请问,要较好的保证UDP数据的到达,在公网上一个UDP包多少个字节以下比较合适?
常说QQ聊天是采用UDP,而其在一次发送很多聊天内容时,基本上也能正确到达,请问其中是否有什么较好的处理方式?
...全文
1082 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuzhoulh 2011-07-11
  • 打赏
  • 举报
回复
网络上传输的数据最大是1514个字节,超过了的话就会分包了!你的接收处理函数就会变得复杂了
kyotrue 2011-07-11
  • 打赏
  • 举报
回复
Below is a list of Default MTU size for different media.


Network MTU(Bytes)
-----------------------------------
16 Mbit/Sec Token Ring 17914
4 Mbits/Sec Token Ring 4464
FDDI 4352
Ethernet 1500
IEEE 802.3/802.2 1492
X.25 576


如果要保证完全兼容任何网络的话,受瓶颈效应,最大就只能576-20-8=548了
kyotrue 2011-07-11
  • 打赏
  • 举报
回复
MTU是链路层的限制,现在一般1500字节,这个包括了IP头(20字节)和TCP(20字节)、UDP头(8字节),所以TCP/IP的话一般最大包就是1460字节,UDP一般就是1472字节。

多于这个数,IP层就会进行IP分片,以便能够适应链路层的限制,这样的话效率低得多,因为可能你为了多传1字节结果分片了,多传了一个包就是20字节的IP头还有链路层的开销。

不过实际上,如果采用了某些隧道协议,会进一步挤占可用空间,所以1400字节是比较保险的。
Eleven 2011-07-11
  • 打赏
  • 举报
回复
以太网的MTU是1500字节,IP包头占20个字节,UDP首部占8个字节,也就是说实际数据应该小于1472字节.
ndy_w 2011-07-11
  • 打赏
  • 举报
回复
主要因为PPP有个限制,1500多点。所以一般都小于1500。
数据包太大也不好,传输出错概率变大,重传成本也变高。
向立天 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 joanlynnlove 的回复:]

引用 13 楼 xianglitian 的回复:
小于说明没有全部读入缓冲,当然也不能自动将剩下的发过去,所以剩下的需要再发一次,对于底层协议是几个UDP包无所谓,但是对于上层协议这两次发的是一个包,在接受端要进行重组,所以一般建议每个数据包封的封的小一点,可控性比较强
哦,了解。。。
对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。
按照上面这句话,是不是我每……
[/Quote]
个人认为
做一次检测是更合理的方式
当然理论上你说的应该是没有问题的
其实这种问题最好是通过实践
都是一些经验的东西
不过我作这方面也不多
说来说去也都是自己的理解
不见得就一定正确
acdbxzyw 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xianglitian 的回复:]
小于说明没有全部读入缓冲,当然也不能自动将剩下的发过去,所以剩下的需要再发一次,对于底层协议是几个UDP包无所谓,但是对于上层协议这两次发的是一个包,在接受端要进行重组,所以一般建议每个数据包封的封的小一点,可控性比较强[/Quote]
哦,了解。。。
对于数据报类套接口,必需注意发送数据长度不应超过通讯子网的IP包最大长度。
按照上面这句话,是不是我每次想要发送的数据不超过IP包的长度,就无须多次调用sendto()函数,而一次成功写入缓冲区并将按照一个UDP包发送?还是说要不要多次调用sendto()要视当前网络环境而定?
wpllg 2011-07-10
  • 打赏
  • 举报
回复
1024
向立天 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwllg 的回复:]
楼上的几位,发大于1.5K的数据试试,UDP没有自动分片之说。
[/Quote]
这个我还真没试过,而且也不知道该怎么使,见笑见笑

[Quote=引用 12 楼 joanlynnlove 的回复:]
我想知道的是:我用sendto()函数后的返回值小于了我要发送的数据量,这代表什么含义,剩下的数据会自动发出去吗?
如果被分多次发送了,是属于一个UDP数据包还是多个UDP数据包?
[/Quote]
小于说明没有全部读入缓冲,当然也不能自动将剩下的发过去,所以剩下的需要再发一次,对于底层协议是几个UDP包无所谓,但是对于上层协议这两次发的是一个包,在接受端要进行重组,所以一般建议每个数据包封的封的小一点,可控性比较强
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 joanlynnlove 的回复:]
那我在调用sendto()函数时,返回值是成功发送的字节数,如果小于我要发送的字节数,请问这是什么意思?我的本意是将len长的数据作为一个udp包发送。。。如果被分成多个包,那包的顺序控制就成了大问题了。。。
在使用send()函数时,我会用循环发送,因为tcp是流式的,但是udp的话,我不清楚返回值小于要发送的len的含义,以及如何处理。。。
[/Quote]
各位前辈,ip层是有可能自动分片的,我想知道的是:我用sendto()函数后的返回值小于了我要发送的数据量,这代表什么含义,剩下的数据会自动发出去吗?
如果被分多次发送了,是属于一个UDP数据包还是多个UDP数据包?
UDX协议 2011-07-10
  • 打赏
  • 举报
回复
楼上的几位,发大于1.5K的数据试试,UDP没有自动分片之说。
辰岡墨竹 2011-07-10
  • 打赏
  • 举报
回复
不用担心,普通UDP包是不设置DF位的,所以会被IP协议自动分片。不过最好不要超过1024个字节,你可以程序内部建缓冲区,每次发送1024个字节,在消息里加个CRC和序号,就能保证数据正确到达。
IP包最大长度在WSAStartup()调用返回的WSAData的iMaxUdpDg元素中。如果数据太长无法自动通过下层协议,则返回WSAEMSGSIZE错误,数据不会被发送。
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]
sendto只是放入缓冲
底层协议不需要我们关心
[/Quote]
那我在调用sendto()函数时,返回值是成功发送的字节数,如果小于我要发送的字节数,请问这是什么意思?我的本意是将len长的数据作为一个udp包发送。。。如果被分成多个包,那包的顺序控制就成了大问题了。。。
在使用send()函数时,我会用循环发送,因为tcp是流式的,但是udp的话,我不清楚返回值小于要发送的len的含义,以及如何处理。。。
新手上路,还请指点。。。
向立天 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 joanlynnlove 的回复:]
引用 2 楼 xianglitian 的回复:

你就正常发
底层协议自然会为你分包
不过如果说从上层上再做一次控制
这个恐怕不用网络环境不一样
就一般宽带来说10K左右都是可以的吧
不过像你说的聊天
除了图片和表情恐怕一次聊出个1K的量就不小了

有可能大段大段地复制粘贴发送。。。
我有个疑问,在调用一次sendto()函数时,要发送的数据长度是len,返回值是成功发送的字……
[/Quote]
sendto只是放入缓冲
底层协议不需要我们关心
UDX协议 2011-07-10
  • 打赏
  • 举报
回复
公网上,不能超过1048字节,这是最大值

如果有一些,代理或者是,在一以太网上再包装一层的话,可能会更少。

所以,建议1024字节,这样,不管外面套多少层应该是足够了。

如果发大于1048字节,你的出口路由,无情丢弃不会反馈你任何信息。
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wpllg 的回复:]

1024
[/Quote]
嗯,网上说一般建议不超过1K。。。
但是貌似QQ聊天不太受这方面的限制,应该是有自己的确保传输成功的机制。。。
acdbxzyw 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xianglitian 的回复:]

你就正常发
底层协议自然会为你分包
不过如果说从上层上再做一次控制
这个恐怕不用网络环境不一样
就一般宽带来说10K左右都是可以的吧
不过像你说的聊天
除了图片和表情恐怕一次聊出个1K的量就不小了
[/Quote]
有可能大段大段地复制粘贴发送。。。
我有个疑问,在调用一次sendto()函数时,要发送的数据长度是len,返回值是成功发送的字节数,难道sendto()不是把buf里面的len长度的数据当成一个UDP包发送吗?成功的返回值应该就是len吧?
如果是的话,对于UDP协议来说,整个包的最大长度为65535,但是这么大的包肯定传送成功率很低,那么最大多大的包长比较合适呢?
HBack 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wpllg 的回复:]
1024
[/Quote]
1024 莫非是 cao6达淫.....
UDP里面有个什么MTU什么的 一般最大是1500字节
  • 打赏
  • 举报
回复
在哪儿看见过,好像说是1.5k
向立天 2011-07-10
  • 打赏
  • 举报
回复
你就正常发
底层协议自然会为你分包
不过如果说从上层上再做一次控制
这个恐怕不用网络环境不一样
就一般宽带来说10K左右都是可以的吧
不过像你说的聊天
除了图片和表情恐怕一次聊出个1K的量就不小了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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