社区
网络编程
帖子详情
UDP协议丢包
lidatou
2012-09-20 04:55:40
我看网上有人写(UDP只能保证你一件事,那就是包的完整性。你如果发一个256bytes的包,那么对方收到的肯定也是一个256bytes的包。他不会只收到半个包之类的。当然这其实也是UDP唯一能保证你的事情。其他事情都要靠你自己去订制。) 这个地方不是太理解他说的包。 这个包指的是我发送的数据还是UDP封装的包,比如我用SendTo函数发送了一个字符串,那么这个字符串是一个包呢,还是这个字符串会被分为几个包。
...全文
207
7
打赏
收藏
UDP协议丢包
我看网上有人写(UDP只能保证你一件事,那就是包的完整性。你如果发一个256bytes的包,那么对方收到的肯定也是一个256bytes的包。他不会只收到半个包之类的。当然这其实也是UDP唯一能保证你的事情。其他事情都要靠你自己去订制。) 这个地方不是太理解他说的包。 这个包指的是我发送的数据还是UDP封装的包,比如我用SendTo函数发送了一个字符串,那么这个字符串是一个包呢,还是这个字符串会被分为几个包。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lidatou
2012-09-21
打赏
举报
回复
谢谢各位,分平均分给你们!
kyotrue
2012-09-21
打赏
举报
回复
SendTo发送出去的数据,加上底层协议栈给你加的包头,就是一个包,UDP协议栈保证收上来的是一个完整的包,和发送出来的东西一样的,有问题的包给你过滤掉。
youngwolf
2012-09-21
打赏
举报
回复
你调用一次sendto,就是一个包,哪怕这个包只有一个字节,当包长超过最大长度时,我记得是发送失败的,此时你要自己分包,这是非常好理解的,假如你有一个文件要发送,你总不至于一个包发一个文件吧,肯定要自己分包。
你收到的包,都可以认为是正确的,完整的。tcp的话,收到的数据可以认为是正确的,但完整性保证不了。
lidatou
2012-09-21
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download……
[/Quote]
用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,这句话的意思是不是我如果发送65507大小的数据,对方要么都收到要么都收不到,不会收到一部分。
lidatou
2012-09-21
打赏
举报
回复
这个我知道,我就是搞不清楚哪个地方是我编程需要注意的。 UDP只能保证你一件事,那就是包的完整性,这句话所说的包是不是你说的(之后操作系统底层会为你组装成一个UDP数据包)UDP数据包。 如果是也就是说我发送一个长字符串可能会被分成2个包发,对方要么收到1或2个包,要么没收到,不会说收到一个包的一半吧?
Geoff08Zhang
2012-09-21
打赏
举报
回复
UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download.csdn.net/detail/geoff08zhang/4571358
Gloveing
2012-09-20
打赏
举报
回复
你得去理解TCP/UDP,理解数据时怎么发送出去的
你使用UDP,调用SendTo函数发送了一个字符串,
---》之后操作系统底层会为你组装成一个UDP数据包
---》之后再组装成IP数据包
---》组装成MAC数据帧 -》发送出去
接收端又“一层层”的把mac帧头,IP包头“剥掉”,最终还原出真正数据
UDP
主要
丢包
原因
1、接收端处理时间过长导致
丢包
:接收端调用recv方法收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区。 2、发送的包太大导致
丢包
:虽然send方法会将大包切割成小包然后再发送,但包太大也不行。例如超过50K的一个
udp
包,不切割直接通过send方法发送也会导致这个包丢失。这种情况需要切割成小包再逐个send。 3、
UDP
发送的包较大,超过接受者缓存导致
丢包
:几个大的
udp
包可能会超过接收者的缓冲,导
UDP
解决
丢包
问题总结
收包率低/
丢包
率高的原因分析 1 缓存太小,不能及时接收数据。 连续多个
UDP
包超过了
UDP
接收缓冲区大小 ,比如: 如:
UDP
包过大 如:
UDP
发包速率过快,突发大数据流量超过了缓冲区上限 2 recvfrom()接收到数据之后处理速度太慢 如果数据接收和处理是连续进行的,那么可能由于数据处理过慢,两次recvfrom调用的时间间隔里发过来的包丢失。 对应的解决方法 1
UDP
包过大 解决方法:增加系统发送或接收缓冲区大小 int nBuf=32*1024;//设置为32K setsockopt(s,
UDP
主要
丢包
原因及具体问题分析
文章来源:http://www.2cto.com/net/201311/254835.html
UDP
主要
丢包
原因及具体问题分析 一、主要
丢包
原因 1、接收端处理时间过长导致
丢包
:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这种情况可以修改接收端,将包接收后存入一个缓冲区,然后迅速返回继续......
UDP
老
丢包
咋办?
最近公司一个网关项目出现概率性问题,WiFi网关发消息给终端设备时概率性
丢包
,导致有些控制消息没有执行。产品结构框图产品结构图如上,一次对家电的过程消息先由手机发给云端服务器,云端服务器...
UDP
分片与
丢包
,
UDP
真的比TCP高效吗?
根据
UDP
通信的有界性,在 buf 足够大的情况下,接收到的一定是一个完整的数据包,
UDP
数据在下层的分片和组片问题由 IP 层来处理,提交到
UDP
传输层一定是一个完整的
UDP
包,那么 recvfrom(9000) 将返回 8000。对于一些多点通信的场景,如果采用有连接的 TCP,那么就需要和多个通信节点建立其双向连接,然后有时在 NAT 环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,在涉及 NAT 穿越的时候,
UDP
协议
的无连接性使得穿透成功率更高.
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章