可靠UDP设计
最近加入了一个用帧同步的项目,帧同步方案对网络有着极大的影响,于是采用了RUDP(可靠UDP),那么为什么要摒弃TCP,而费尽心思去采用UDP呢?要搞明白这个问题,首先要了解TCP和UDP的区别 , 明白TCP无法避免的痛点。
TCP VS UDP
1.Tcp 面向连接,提供可靠的传输; UDP面向无连接,提供不可靠传输
2. Tcp 提供流量控制 ; UDP不提供流量控制
3. Tcp 保证传输数据顺序 ; UDP不保证传输顺序,也就是可能是乱序收包
4. TCP 面向字节流 ; UDP 面向数据包
……
简单说TCP保证了传输的准确性和相应的流量控制,而UDP不提供任何准确性保证。既然TCP提供这么多完备的方案,为什么还要大费周章地去设计RUDP呢,这里主要愿意可以用两个字概括“速度”,TCP提供了过多的保护,在及时性上做了很多的妥协,比如:控制微包(Nagle算法),延时ACK,流量控制,超时重传等,这些设计严重影响了Tcp的速度和及时性。更多的信息参考链接:http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/
帧同步中的UDP
帧同步方案中逻辑帧一般都在8~16帧左右,一般都在12帧以上,这要的网络传输频率决定了不可能采用TCP协议,那么如果采用UDP会出现什么问题呢?
1. 丢包,帧同步中逻辑帧在每个Client上一定是一致的,也就是说决定不能出现丢帧的情况,
2. 数据完整性,UDP协议头部虽然有16位的校验和,但是IPv4并不强制执行,也就是说UDP无法抱枕数据的完整性
3. 乱序。 UDP并不保证数据的顺序,故可能出现数据包乱序问题
以上问题任何一项都会导致Client在逻辑帧上出现不同步问题,为了解决这个问题就必须引入RUDP概念,这里的RUDP主要是解决上述的问题,并不某个RFC定义的规范。
RUDP初步
简单思路,既然原生UDP有那么多痛点,那我能不能像应用层协议一样在UDP数据包头再加一段包头,从而定义为RUDP呢,答案是肯定的。首先思考RUDP需要解决哪些问题,然后根据问题加上必要的包头字段。
1. 数据完整性 –> 加上一个16或者32位的CRC验证字段
2. 乱序 –> 加上一个数据包序列号SEQ
3. 丢包 –> 需要确认和重传机制,就是和Tcp类似的Ack机制
在思考一下既然是自定义协议是不是需要一个协议号字段来过滤一些非法包,那么又可以加入一个新字段:
4. 协议字段 –> protol 字段,标识当前使用协议
综合以上字段,我们的RUDP就可以简单实现成如下:
根据初步得到的协议头,就可以尝试去实现协议啦,后面会开始一步一步实现整个RUDP逻辑。
可靠UDP设计的更多相关文章
- 可靠UDP
tcp为我们做了什么事情? 总得来说,tcp做了这几件事: 通过序列号和基于确认的超时重传机制,为上层提供了可靠的字节流服务: 通过滑动窗口.拥塞窗口提供了流量控制: 默认情况下,为了有效利用带宽,t ...
- Unity跨平台C/CPP动态库编译---可靠UDP网络库kcp基于CMake的各平台构建实践
1.为什么需要动态库 a)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. b)某 ...
- TCP与UDP,可靠UDP如何实现
两种协议都是传输层协议,为应用层提供信息载体. TCP协议是基于连接的字节流的可靠协议,有三次握手,四次挥手,超时重传,流量控制(滑动窗口),拥塞控制和差错控制,也正因为有可靠性的保证和控制手段,所以 ...
- 开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等
开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等 C++开发网络通信程序时用asio是个不错的选择 ...
- 可靠UDP,KCP协议快在哪?
WeTest 导读 云真机已经支持手机端的画面投影.云真机实时操作,对延迟的要求比远程视频对话的要求更高(100ms以内).在无线网络下,如何更实时.更可靠的传输视频流就成了一个挑战.通过websoc ...
- rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计
非集群下,简单的说:- 如果是excl,则设置durability没有意义,因为不管服务器挂了还是客户端主动/被动断开了,队列都会自动删除.- auto-delete,其实可简单的认为是同理,即使非e ...
- 云风的BLOG❳可靠 UDP 传输
http://mp.weixin.qq.com/s?__biz=MzA3NjYxOTA0MQ==&mid=405432715&idx=1&sn=2e40ceafd4b298e1 ...
- UDP可靠传输那些事
有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...
- UDP如何实现可靠传输
概述 UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响. 传输层无法保证数据的可靠传输 ...
随机推荐
- 按位与&、或|、异或^等运算方法
(转载) 按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; ...
- 4 Template层-CSRF
1.csrf 全称Cross Site Request Forgery,跨站请求伪造 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站 ...
- 9 RESTful API
1 RESTful API 2 post创建一个视频 put帖子加精,delete删除 3 自定义状态码 4 5 6 7 8
- easyui-numberbox限定仅输入数字
许多必填项都涉及到数字,比如电话号码,身份证号这些要求用户在输入时只能输入数字.Easyui提供了数字框控件,允许用户只输入数字, <td> <input id="ssd& ...
- asp.net中使用ffmpeg
protected void Button1_Click(object sender, EventArgs e) { string FFmpegArguments = @" -i D:\离歌 ...
- copy & deepcopy
1 import copy 2 3 字典参照列表结论,看是否有深层嵌套. 4 a = {'name':1,'age':2} 5 b = a 6 a['name'] = 'ff' 7 print(a) ...
- Halcon18 Linux For Armv7a 下载
Halcon18 Linux For Armv7a 下载地址:http://www.211xun.com/download_page_16.html HALCON 18 是一套机器视觉图像处理库,由一 ...
- nginx在基于域名访问的时候是下载的界面
刚才在做nginx实验时候出现访问域名的时候是下载页面一直下载了好多文件,使用IP访问就正常,在配置文件中找到一个sendfile的参数,把参数值改为off或者直接注释掉这个参数就可以访问了.
- vim configure
vim configure .vimrc " An example for a vimrc file. " " Maintainer: Bram Moolenaar &l ...
- [AGC004C] AND Grid [构造]
题面: 传送门 思路: 一眼看上去是一道很迷的题目......直到我发现,红蓝色涂色的过程是互相独立的 而且最外围没有紫色 那么可以这样操作: 最左边一列全部红色,最右边一列全蓝 然后中间的一行红一行 ...