最近加入了一个用帧同步的项目,帧同步方案对网络有着极大的影响,于是采用了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设计的更多相关文章

  1. 可靠UDP

    tcp为我们做了什么事情? 总得来说,tcp做了这几件事: 通过序列号和基于确认的超时重传机制,为上层提供了可靠的字节流服务: 通过滑动窗口.拥塞窗口提供了流量控制: 默认情况下,为了有效利用带宽,t ...

  2. Unity跨平台C/CPP动态库编译---可靠UDP网络库kcp基于CMake的各平台构建实践

    1.为什么需要动态库 a)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. b)某 ...

  3. TCP与UDP,可靠UDP如何实现

    两种协议都是传输层协议,为应用层提供信息载体. TCP协议是基于连接的字节流的可靠协议,有三次握手,四次挥手,超时重传,流量控制(滑动窗口),拥塞控制和差错控制,也正因为有可靠性的保证和控制手段,所以 ...

  4. 开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等

    开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等 C++开发网络通信程序时用asio是个不错的选择 ...

  5. 可靠UDP,KCP协议快在哪?

    WeTest 导读 云真机已经支持手机端的画面投影.云真机实时操作,对延迟的要求比远程视频对话的要求更高(100ms以内).在无线网络下,如何更实时.更可靠的传输视频流就成了一个挑战.通过websoc ...

  6. rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计

    非集群下,简单的说:- 如果是excl,则设置durability没有意义,因为不管服务器挂了还是客户端主动/被动断开了,队列都会自动删除.- auto-delete,其实可简单的认为是同理,即使非e ...

  7. 云风的BLOG❳可靠 UDP 传输

    http://mp.weixin.qq.com/s?__biz=MzA3NjYxOTA0MQ==&mid=405432715&idx=1&sn=2e40ceafd4b298e1 ...

  8. UDP可靠传输那些事

    有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...

  9. UDP如何实现可靠传输

    概述 UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响. 传输层无法保证数据的可靠传输 ...

随机推荐

  1. 异步消息处理机制,UI更新

    UI只能在主线程中完成更新,在子线程中更新UI报错如下 Only the original thread that created a view hierarchy can touch its vie ...

  2. A brief look at the Objects in JavaScript

    Objects  An object is a self-contained collection of data. This data comes in to forms:  properties ...

  3. Dcgpofix

    TechNet Library Windows Server Windows Server 2012 R2 and Windows Server 2012 Management and Tools C ...

  4. Gradle task

    本文来自网易云社区 作者:孙有军 1:gradle脚本是使用groovy语言写的(DSL),groovy中有一个重要的概念闭包(Closure),Closure是一段单独的代码块,它可以接收参数,返回 ...

  5. Python+selenium(警告框处理)

    在Webdriver中处理JavaScript生成的alert.confirm.prompt,使用switch_to_alert()方法定位到alert.confirm.prompt,然后进行如下操作 ...

  6. 贪吃蛇—C—基于easyx图形库(下):从画图程序到贪吃蛇【自带穿墙术】

    上节我们用方向控制函数写了个小画图程序,它虽然简单好玩,但我们不应该止步于此.革命尚未成功,同志还需努力. 开始撸代码之前,我们先理清一下思路.和前面画图程序不同,贪吃蛇可以有很多节,可以用一个足够大 ...

  7. MFC编程入门之二十八(常用控件:列表视图控件List Control上)

    前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...

  8. PAT1032

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  9. HDU3232 Crossing Rivers 数学期望问题

    Crossing Rivers                                                                                     ...

  10. Ansible实战之Nginx高可用代理LNMP-wordpress

    author:JevonWei 版权声明:原创作品 blog:http://119.23.52.191/ --- 实验环境:前端使用Nginx做代理服务器,静态资源经由缓存服务器,连接后端web集群, ...