可靠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逻辑。

时间: 2024-08-06 02:43:55

可靠UDP设计的相关文章

可靠UDP

tcp为我们做了什么事情? 总得来说,tcp做了这几件事: 通过序列号和基于确认的超时重传机制,为上层提供了可靠的字节流服务: 通过滑动窗口.拥塞窗口提供了流量控制: 默认情况下,为了有效利用带宽,tcp的报文一次会尽量携带更多的数据.但与此同时,为了避免IP层的分片,又不会发送超过MTU大小的数据包. udp为我们做了什么事情? 首先应该清楚的是,一个udp数据包仅仅是在IP数据包之上加了一个udp协议头.这个协议头十分精简,仅有的四个字段是:目的端口号.源端口号.数据包长度.校验和.通过se

Tcp可靠Udp不可靠原理

1. Socket缓冲区 应用程序通过调用send, read方法向网络上发送应用数据,该过程中由于应用程序调用send/write的速度同网络介质发送数据的速度存在差异,所以,应用通过socket发往 网络上的的数据会先被缓存,即socket发送缓冲区,等待网络空闲时再发送出去.同样,socket从网络上接受到的数据,也会被缓存,即socket接受缓冲区,等待应用程序把数 据从中读出.其中,应用程序调用send发送数据,是将数据拷贝到socket的内核发送缓冲区中,然后send便会返回,即se

高性能服务框架revolver:RUDP(可靠UDP)算法详解(2)

除了发送函数以外,发送缓冲区对象还会响应来自网络的on_ack和on_nack消息,这两个消息分别是处理正常的状态报告和丢包情况下的网络报告.如果收到on_ack,缓冲区对象会把已经接收端报告过来的报文ID全部从发送窗口中删除,然后调用attempt_send尝试新的块发送.如果收到的是on_nack,表示对端有丢包,则先会记录丢包的ID到loss_set中,再调用on_ack进行处理. 触发attempt_send还有可能是定时器Timer,定时器每5MS会检查一下发送缓冲区,并调用attem

高性能服务框架revolver:RUDP(可靠UDP)算法详解

数据块定义 在RUDP模块中,所有发送的数据被定义成RUDPRecvSegment 和 RUDPSendSegment结构,其中RUDPSendSegment是发送块定义,RUDPRecvSegment 是接收块定义.如下: //发送数据片 typedef struct tagRUDPSendSegment { uint64_t seq_; //块序号 uint64_t push_ts_; //进入发送队列的时刻 uint64_t last_send_ts_; //最后一次发送的时刻 uint1

高性能服务框架revolver:RUDP(可靠UDP)算法详解(3)

接收缓冲区相对比较简单,其主要功能是接收发送方的数据并生成接收块.块排序.丢包判断和反馈.读事件通知等.以下是接收缓冲区的定义: class RUDPRecvBuffer { public: ... //来自网络中的数据 int32_t on_data(uint64_t seq, const uint8_t* data, int32_t data_size); //定时事件 void on_timer(uint64_t now_timer, uint32_t rtc); //读取BUFFER中的

UDP可靠传输那些事

有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非常非常的简单,我最开始接触udp可靠传输大约是在2005年,因为那时候开发FtpAnywhere,由于路由的映射和网关nat处理方面,认为udp具有天生优势,因此开始编写自己的udp可靠传输协议,好象那个时候已经有了udt,我也下了源代码看了下,不过很快就看不下去了,因为它用了定时器,加上跨平台处理

为什么 UDP 有时比 TCP 更有优势

随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1.网速的提升给UDP稳定性提供可靠网络保障 CDN服务商Akamai(NASDAQ: AKAM)报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍.网络环境变好,网络传输的延迟.稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性. 2.对比测试结果U

UDP的崛起

随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1,网速的提升给UDP稳定性提供可靠网络保障 CDN服务商Akamai(NASDAQ: AKAM)报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍.网络环境变好,网络传输的延迟.稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性. 2,对比测试结果U

《守望先锋》架构设计与网络同步

原文链接 Overwatch Gameplay Architecture and Netcode Timothy Ford Lead Gameplay Engineer Blizzard Entertainment 翻译:kevinan 在GDC2017[Overwatch Gameplay Architecture andNetcode ]的分享会上,来自暴雪的Tim Ford介绍了<守望先锋>游戏架构和网络同步的设计.一起来看看吧. 哈喽,大家好,这次的分享是关于<守望先锋>(