当前位置:网站首页>游戏网络 UDP+FEC+KCP
游戏网络 UDP+FEC+KCP
2022-08-04 15:02:00 【墨池象牙白】
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)
边栏推荐
- 苏秋贵:揭秘绿联科技用5年时间从0做到6亿,如何一枝独秀?
- using关键字学习
- 用于X射线聚焦的复合折射透镜
- G.登山小分队(暴力&dfs)
- AOSP built-in APP franchise rights white list
- leetcode:215无序数组中找第k大的元素
- Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
- Redis-哨兵模式
- Android Sqlite3 basic commands
- CloudCompare&PCL 点云按网格划分(点云分幅)
猜你喜欢
leetcode: 259. Smaller sum of three numbers
快解析结合千方百剂
Http-Sumggling缓存漏洞分析
JCMsuite应用:倾斜平面波传播透过光阑的传输
【 HMS core 】 【 Media 】 online video editing service 】 【 material can't show, or network anomalies have been Loading state
输入输出流总结
用于X射线聚焦的复合折射透镜
Google plug-in. Download contents file is automatically deleted after solution
leetcode: 254. Combinations of factors
特殊品种的二次开户验资金额
随机推荐
FRED应用:毛细管电泳系统
using关键字学习
License server system does not support this version of this feature
leetcode: 251. Expanding 2D Vectors
xampp安装包含的组件有(php,perl,apche,mysql)
Qt的QItemDelegate使用
【云原生 | 从零开始学Kubernetes】kubernetes之StatefulSet详解
IP第十六天笔记
饿了么智能头盔专利获授权,进一步提升骑手安全保障
Database recovery
Hangzhou Electric School Competition (Counter Attack Index)
Phasecraft连下两城,助力英国量子技术商业化加速!
关于pnpm包管理器的版本问题
用了TCP协议,就一定不会丢包吗?
基本介绍PLSQL
IP第十五天笔记
leetcode:255 验证前序遍历序列二叉搜索树
Go 语言快速入门指南: 变量和常量
G.登山小分队(暴力&dfs)
【剑指offer33】二叉搜索树的后序遍历序列