Random Posts
Tags
Categories
Recent Comments
- yilufeiyang on 游戏服务端架构发展史(下)
- 小肥 on GDB 从裸奔到穿戴整齐
- flandre on 异步事件模型的 Self-pipe trick
- inv on 异步事件模型的 Self-pipe trick
- skywind on 异步事件模型的 Self-pipe trick
Links
Meta
Tag Archives: 网络
如何在高丢包率的链路上建立低延迟连接?
这是其实通信领域的话题了,低延迟传输有上百种优化方式,上面说的那些冗余码只是很小一部分,不考虑信道容量的冗余编码系统都是在耍流氓,不用等到同信道内跑两套这样的协议你才会发现问题,一套协议再接近信道带宽容量限制时,就会出现指数上升的丢包率,所以不考虑带宽检测的冗余法就是一个残次品。 要系统的解决低延迟传输问题,需要同时在传输层,协议层,路由层,应用层几个方面着手: 传输层带外冗余:弱智重复法 设你要发送的数据为 x1-xn,你实际发送出去的包为 p1-pn,那么比如 Pn = [Xn, Xn-1, Xn-2],重复前面出现过的 1-2个数据,丢包了你可以随时恢复出来。 传输层带外冗余:异或法 每发四个包 x1-x4,你多发一个冗余包,内容为前面四个包的异或: R = x1 ^ x2 ^ x3 ^ x4,那么本组数据五个数据包(x1-x4, R)中任意丢失一个,都可以从其他四个异或得到。当然,不一定要四个包冗余一个,你可以根据情况和丢包率,两个包或者三个包冗余一个。 传输层带外冗余:解方程法 把每个数据包看成一个整数,要发送 x1-x4 四个包,并不直接发送x,而是将他们进行线性运算得到 y1-y7,然后发送出去: A1 * x1 + B1 * x2 + C1 * … Continue reading
KCP同 UDT/ENET的性能比较
如果不丢包那么 KCP(https://github.com/skywind3000/kcp)和 TCP性能差不多,KCP不会有任何优势,但是网络会卡,造成卡的原因就是丢包和抖动,有同学在内网这样好的环境下没有用任何丢包模拟直接跑,跑出来的数据是差不多的,但是放到公网上,放到3G/4G网络情况下,差距就很明显了,公网在高峰期有平均接近10%的丢包,wifi/3g/4g下更糟糕,这正是造成各种网络卡顿的元凶。 感谢 asio-kcp 的作者 zhangyuan 对 KCP 与 enet, udt做过的一次横向评测,结论如下: ASIO-KCP has good performace in wifi and phone network(3G, 4G). Extra using 20% ~ 50% network flow for speed improvement. The kcp is the first choice for realtime … Continue reading
网络程序计时器通常用啥实现?
通常来讲,就是利用 select 的空余时间,来进行时钟检查,不管是 select / poll / epoll/ kevent,以下统称 select,它有一个等待时间作为参数,即没有事件时,最多 wait 多少时间,我们把这个作为网络库的基准频率,比如 10MS,或者 20MS, 25MS, 50MS,都是常用的几个值。 就是说网络库调用 select 等待事件时如果没有事件,那么最长等待 10MS 就返回了,这时再处理完所有网络事件后,就可以来处理时钟数据了。事件处理函数就是这样: def update_events(milisec = 10): result = selector.select(milisec) for fd, event in result: do something with socket … Continue reading
再谈网游同步技术
实时动作游戏在近年来得到迅猛的发展。而游戏同步问题,成为大家继续解决的核心问题之一。早在 2004 年,国内游戏开发还处于慢节奏 RPG 满天飞的情况下,我就开始实时动作游戏研究,分别在 2005-2006 期间写了一系列相关文章,被好多网站转载: 帧间同步模式:《帧锁定同步算法》(2007): http://www.skywind.me/blog/archives/131 玩法规避模式:《网络游戏同步法则》(2005): http://www.skywind.me/blog/archives/112 预测插值模式:《影子跟随算法》(2007): http://www.skywind.me/blog/archives/1145 如今十年过去,网上越来越多的人开始讨论游戏同步技术了,然而很多文章往往只针对某种特定的游戏情况,而观点又经常以偏概全。很多人并没有真正开发过实时动作游戏,更别说了解同步技术的前世今生了。转载别人的观点并加上自己理解的人很多,实际动过手的人很少。避免给更多人造成无谓的误导,我今天基于先前的实践和对欧美动作游戏,战网游戏,主机游戏(PSN,XBox Live等)网络技术的了解,来对这个问题做一个简单总结: 网速的变化 开发快速动作游戏,首先要对公网的网络质量数据有详细的了解。这里所说到的网速,是指 RTT,数据往返一周的毫秒时间,而非每秒传送多少 KB/s。我写这篇文章是基于我 2005-2006 年开发的东西来说的,当时国内公网质量比国外差很多: 上图为 2005-2006 年国内的网络环境,某三个省级 IDC的情况采样。当时公网 RTT平均值基本在 100ms,120ms 左右徘徊。所以我文中引用了很多 100ms。这个情况在2009 年以后已经好了很多(60ms 的 rtt)。到了 2012 年以后,公网平均 RTT已经降低到平均 40ms-50ms,省内平均 10ms 以内了: 上图为 2015 … Continue reading
快速可靠协议-KCP
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。 整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 URL:https://github.com/skywind3000/kcp
[业余土制] 简易网络库 easenet
1. 跨平台网络库 2. 异步事件:kevent, iocp, epoll, poll, select封装 3. 内存管理:SlabPlus 4. 可靠协议:类tcp纯协议实现,包括重传机制,窗口管理,流量控制,拥塞处理。 5. 多种工具:缓存池,环状缓存,高性能hashmap等。 代码贴上:
[业余土制] Python P2P模块
项目地址:http://code.google.com/p/pyp2p/
影子跟随算法(2007年老文一篇)
算法简述 动作类游戏如何在高延迟下实现同步?不同的客户端网络情况,如何实现延迟补偿?十年前开始关注该问题,转眼十年已过,看到大家还在问这类问题,旧文一篇,略作补充(关于游戏同步相关问题还可以见我写于2005年的另外两篇文章,帧锁定算法 和 网游同步法则): 影子跟随算法由普通DR(dead reckoning)算法发展而来,我将其称为“影子跟随”意再表示算法同步策略的主要思想: 1. 屏幕上现实的实体(entity)只是不停的追逐它的“影子”(shadow)。 2. 服务器向各客户端发送各个影子的状态改变(坐标,方向,速度,时间)。 3. 各个客户端收到以后按照当前重新插值修正影子状态。 4. 影子状态是跳变的,但实体追赶影子是连续的,故整个过程是平滑的。 图1 算法演示 前面的1号终端控制红色飞船P1向左飞,并把自己的状态时时告诉服务器 后面的2号终端上接收到飞船P1的影子S1的状态(向左移动),并让P1的实体追赶S1 网络性能指标一:带宽,限制了实时游戏的人数容量 网络性能指标二:延时,决定了实时游戏的最低反应时间 使用该算法可以容易的开发出一款马里奥赛车,或者Counter Strike,详细说明见后: