自己实现类RUDP协议

发布: 2014-05-18 14:42

UDP协议是一种无状态,不可靠协议,这个描述指的是UDP包之间没有前后顺序关系,也不一定所有的包都能达到目标地址。
在UDP协议由于附带额外包数据小,不需要做包验证等特点,UDP协议效率还是比较高的。
所以,RFC结合TCP和UDP两种协议的优点,制订了RUDP协议标准。

RUDP的核心部分包括,加入包编号,包重传,包确认机制,模拟连接操作与断开连接操作。
标准RUDP协议为UDP包加了8字段的状态数据。

我在实现可靠UDP的时候,参考这RFC RUDP协议同标准,实现了包编号,包重传,包确认机制,
但没有实现模拟连接操作与断开操作。

之所以没有实现模拟三次握手连接,是发现连接包与其他数据包发送接收方式并不一致,
需要额外的方式保证连接包的可靠性。因为连接包参与编号和重传的话,控制上比较复杂,
还不如直接发送数据包,加上编号和和重传、确认,系统的可靠性就已经非常好了。

现在说明一下实际实现时的问题,虽然实现了编号和重传、确认机制,但一个需要注意的是,
需要在发送端实现类似网络协议桟中的发送缓存的机制,不能够有包就发送出去,
并参与重传检查。因为这样的话会有大量的包在发送,造成网络拥塞,
而实际需要重传的包迟迟没有机会参与重传,或者重传的包以很小的概率参与重传,
而润滑端由于验证包的到达顺序问题,虽然已经接收到了许多包,
但由于重传的包数量也非常大,产生了比较多的额外带宽,
但需要的包却一直收取不到,从而加大整个数据传输过程的延迟。

可以使用的方式就是在发送端做一个固定包数量发送队列,如果发送队列中还有包未发出,
则一直重传这个相对比较小的队列中的包。而后续的的需要发送的包放在另一个大队列中,
直到发送队列全部发送成功(已接收到确认包),在从大队列中拿出固定数量的包放在发送队列中,
重复执行以上过程,达到降低整个数据传输过程的延迟。

实现demo:
https://raw.githubusercontent.com/kitech/toxsh/master/p2psh/srudp.cpp
https://raw.githubusercontent.com/kitech/toxsh/master/p2psh/srudp.h



原文: http://qtchina.tk/?q=node/809

Powered by zexport