社区
网络编程
帖子详情
在公网上一个UDP包多少个字节以下比较合适?
acdbxzyw
2011-07-10 10:50:41
请问,要较好的保证UDP数据的到达,在公网上一个UDP包多少个字节以下比较合适?
常说QQ聊天是采用UDP,而其在一次发送很多聊天内容时,基本上也能正确到达,请问其中是否有什么较好的处理方式?
...全文
1082
20
打赏
收藏
在公网上一个UDP包多少个字节以下比较合适?
请问,要较好的保证UDP数据的到达,在公网上一个UDP包多少个字节以下比较合适? 常说QQ聊天是采用UDP,而其在一次发送很多聊天内容时,基本上也能正确到达,请问其中是否有什么较好的处理方式?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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字节
postyourinformation
2011-07-10
打赏
举报
回复
在哪儿看见过,好像说是1.5k
向立天
2011-07-10
打赏
举报
回复
你就正常发
底层协议自然会为你分包
不过如果说从上层上再做一次控制
这个恐怕不用网络环境不一样
就一般宽带来说10K左右都是可以的吧
不过像你说的聊天
除了图片和表情恐怕一次聊出个1K的量就不小了
UDP
一个
数据
包
最大能有多大
1、局域网 链路层中每一帧数据头部18
字节
,数据区域:46 - 1500
字节
...
一个
包
会分为多个片发送,如果
一个
片丢了那么就需要重新发送整个
包
,非常浪费 2、
公
网 unix网络编程里面说了,ipv4规定ip...
IP分片--为什么单次最大传输1472个
字节
在使用
UDP
传输的时候,每次接收的最大
字节
数为1472个
字节
,然后数据就会被分
包
,重新进行发送,在进行数据接收的时候,经常会遇到本次数据还没有接收完,数据就被分
包
的情况,那么为什么是1472个
字节
对数据进行分片...
UDP
在
公
网上
实际传输速度最快的
包
大小
UDP
在
公
网上
实际传输速度最快的
包
大小
一个
UDP
包
的固定分
包
丢
包
问题
一个
UDP
包
的固定分
包
丢
包
问题 作者: yanyun 时间: October 6, 2017 ...发送
一个
8K的
UDP
包
,由于MTU为1500,那么
包
被分为6个
包
,但是出现OFFSET在4440的第四个分
包
会丢
包
,并不是所有的8
UDP
分片与丢
包
,
UDP
真的比TCP高效吗?
根据
UDP
通信的有界性,在 buf 足够大的情况下,接收到的一定是
一个
完整的数据
包
,
UDP
数据在下层的分片和组片问题由 IP 层来处理,提交到
UDP
传输层一定是
一个
完整的
UDP
包
,那么 recvfrom(9000) 将返回 8000。...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章