游戏网络 UDP+FEC+KCP

        FEC主要针对原始传输数据生成冗余的数据,然后一起进行传输,在传输过程中,如果部分原始数据丢失了,可以通过收到的部分冗余信息和部分原始数据进行原始数据的还原。这个技术在流媒体中运用比较多,在网络延迟的时候保证视频观看体验丝滑。简单说就是用流量换数据完整。

        在即时性要求比较高的游戏中,为了提升玩家的体验和即时性,网络传输会采用可靠UDP(如KCP)而不是TCP,主要是TCP传输时间开销比较大。但仅是可靠UDP,面对网络延迟还是捉襟见肘,此时在协议栈上加入FEC技术是一个不错的选择。

        那么如何接入FEC呢?

        这里推荐学习charp-kcp,实现了kcp+fec,其中FEC是RS-FEC算法。

FEC主要是通过K份原始数据,生成M份冗余数据,K+M数据组成一份FEC包,FEC包中的任意K份数据,可以还原出所有原始数据。

csharp-kcp中的FEC协议:

        原始数据: | sequenceID | flag | bodyLen |  source data |

        冗余数据: | sequenceID | flag | redundant data |

sequenceID: 每份数据的序号

flag:区分原始数据和冗余数据

bodylen:原始数据的长度

redundant data:冗余数据,长度取决于K份数据中最长的bodyLen

发送端:

先依次接收上层(KCP)K份数据进行缓存并直接转发下层协议(UDP),当缓存数等于K时,使用FEC算法生成M份原始数据,向下层协议分开发送M份原始数据,然后释放K份缓存。

接收端:

通过flag可以判断数据是原始数据还是冗余数据,原始数据缓存并转发上层协议(KCP),冗余数据同样进行缓存。

通过数据的sequenceID可以简单的得知,原始数据和冗余数据是否来自同一个FEC包中。

在收到每一份数据后,都检查这份数据所在的FEC包中的原始数据是否都已经接收了,如果没有,是否已经收到FEC包中K份数据,如果是,直接进行解码,将解出的原始数据转发给上层协议。然后这份FEC包相关的缓存数据就可以移除了。

注意:

kcp最佳实践中提及:为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致 kcp以为对方重发了,这样会产生更多的ack占用额外带宽。

也就是说:有可能FEC刚解出原始数据,之后又接收到已被解码的原始数据。如果继续往上层转发,对kcp来说是收到两次同样的数据,从而误以为是重发,导致产生更多的ack占用额外带宽。最好对接收过的原始数据进行记录,及时剔除重复的数据。

开发时可以关注的:

1 减少解码导致的原始数据重复input

2 缓存数据的内存多次开辟和释放(对客户端来说就是很多GC)

3 多层协议数据封装同样有内存块多次开辟和释放的问题(在csharp-kcp中的做法是:申请空间时先为下层协议留好足够的协议头空间)

4 FEC协议头部分,主要还是根据自己的协议栈进行设计。csharp-kcp中上层协议是KCP,KCP的部分本身会对发送的数据做一些拆分,到FEC层的时候数据量比较小,因此可以把一次发送作为FEC包的一份数据。如果换成其他协议栈,且每次发送数据量比较大,最好在FEC上层做一些分片的操作。

李超:WebRTC传输与服务质量 - 知乎 (zhihu.com)

谈谈网络通信中的 FEC 基础_Jhuster的专栏的技术博客_51CTO博客

流媒体弱网优化之路(FEC)——FEC原理简介_qw225967的博客-优快云博客_fec原理

程序名:国内山寨随机视频聊天 v1.1beta 演 示:http://ybyt.com/chat 官 方:http://ddpoo.com 修 改:shileiye 邮 件:shileiye@qq.com 时 间:2010.4.6 安装说明: 1、本程序需要用到Google的地图KEY,因此你先要免费申请一个GG的地图密匙,申请地址:http://code.google.com/intl/zh-CN/apis/maps/signup.html 2、申请到类似“ABQIAAAA54YSddnq2S4aS6WRs-jSNRRxJ3KsNDxbOF8X47Xxn0Jf1cNodRRMT-FmiX_vEKM1rEGDeGW2W7Cebw”这样的密匙之后用记事本打开Index.htm和Other/v.js查找这段密匙替换成你的即可。 3、打开Other/v.js找到“http://ybyt.com/chat/”替换为你程序所在的网址。 4、上传所有文件到你的网站访问即可。 程序说明: 上次发布了一个国外随机视频聊天程序,没有署名,没有说明,败笔啊!这次写个说明先。 本程序并不是完整的,因为涉及到从服务器获取数据,所以几个关键文件是连接到山寨随机视频的服务器的。主要用于获取视频对象数据。所以程序里某些地址不能更改,更改就会出问题。另外请山寨头子表来找我,关键性的东西还是在你手里头。别人安装了本程序也是以你的服务器为基准的,用户必须通过你的服务器才能获取聊天对象,就算别人把看的到的版权全改了对你也是有利的,毕竟别个免费帮你聚拢人气了,杂个说都是双赢的局面。当然,主动权再你,你完全可以在服务器上弄点小把戏,让这个程序失去意义。 在Index.htm页面有一段统计代码,一个是官方的,一个是我的,希望大家不要删除,官方的自然是让山寨头子晓得具体的流量信息。我的嘛,也只是看看程序的流通情况,以便后续是否有跟随官方升级的可能。代码都是隐藏的,完全不会影响程序性能及使用,请勿担心。实在觉得碍眼,删就删吧。写套程序很困难,抠别人程序也不容易呐! 好了,最后一句,本程序不保证长期有效,如果失效,请到http://ybyt.com看看有没更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值