UDP协议丢包解决思路
UDP协议丢包
我看网上有人写(UDP只能保证你一件事,那就是包的完整性。你如果发一个256bytes的包,那么对方收到的肯定也是一个256bytes的包。他不会只收到半个包之类的。当然这其实也是UDP唯一能保证你的事情。其他事情都要靠你自己去订制。) 这个地方不是太理解他说的包。 这个包指的是我发送的数据还是UDP封装的包,比如我用SendTo函数发送了一个字符串,那么这个字符串是一个包呢,还是这个字符串会被分为几个包。
------解决方案--------------------
UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download.****.net/detail/geoff08zhang/4571358
------解决方案--------------------
你调用一次sendto,就是一个包,哪怕这个包只有一个字节,当包长超过最大长度时,我记得是发送失败的,此时你要自己分包,这是非常好理解的,假如你有一个文件要发送,你总不至于一个包发一个文件吧,肯定要自己分包。
你收到的包,都可以认为是正确的,完整的。tcp的话,收到的数据可以认为是正确的,但完整性保证不了。
------解决方案--------------------
SendTo发送出去的数据,加上底层协议栈给你加的包头,就是一个包,UDP协议栈保证收上来的是一个完整的包,和发送出来的东西一样的,有问题的包给你过滤掉。
我看网上有人写(UDP只能保证你一件事,那就是包的完整性。你如果发一个256bytes的包,那么对方收到的肯定也是一个256bytes的包。他不会只收到半个包之类的。当然这其实也是UDP唯一能保证你的事情。其他事情都要靠你自己去订制。) 这个地方不是太理解他说的包。 这个包指的是我发送的数据还是UDP封装的包,比如我用SendTo函数发送了一个字符串,那么这个字符串是一个包呢,还是这个字符串会被分为几个包。
------解决方案--------------------
UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download.****.net/detail/geoff08zhang/4571358
------解决方案--------------------
你调用一次sendto,就是一个包,哪怕这个包只有一个字节,当包长超过最大长度时,我记得是发送失败的,此时你要自己分包,这是非常好理解的,假如你有一个文件要发送,你总不至于一个包发一个文件吧,肯定要自己分包。
你收到的包,都可以认为是正确的,完整的。tcp的话,收到的数据可以认为是正确的,但完整性保证不了。
------解决方案--------------------
SendTo发送出去的数据,加上底层协议栈给你加的包头,就是一个包,UDP协议栈保证收上来的是一个完整的包,和发送出来的东西一样的,有问题的包给你过滤掉。