Category Archives: 网络编程

用好你的瑞士军刀/netcat

Netcat 号称 TCP/IP 的瑞士军刀并非浪得虚名,以体积小(可执行 200KB)功能灵活而著称,在各大发行版中都默认安装,你可以用它来做很多网络相关的工作,熟练使用它可以不依靠其他工具做一些很有用的事情。 最初作者是叫做“霍比特人”的网友 Hobbit hobbit@avian.org 于 1995 年在 UNIX 上以源代码的形式发布,Posix 版本的 netcat 主要有 GNU 版本的 netcat 和 OpenBSD 的 netcat 两者都可以在 debian/ubuntu 下面安装,但是 Windows 下面只有 GNU 版本的 port。 不管是程序员还是运维,熟悉这个命令都可以让很多工作事半功倍,然而网上基本 90% 的 netcat 文章说的都是老版本的 OpenBSD 的 netcat,已经没法在主流 linux … Continue reading

Loading

Posted in 网络编程 | Tagged , | Leave a comment

如何在高丢包率的链路上建立低延迟连接?

这是其实通信领域的话题了,低延迟传输有上百种优化方式,上面说的那些冗余码只是很小一部分,不考虑信道容量的冗余编码系统都是在耍流氓,不用等到同信道内跑两套这样的协议你才会发现问题,一套协议再接近信道带宽容量限制时,就会出现指数上升的丢包率,所以不考虑带宽检测的冗余法就是一个残次品。 要系统的解决低延迟传输问题,需要同时在传输层,协议层,路由层,应用层几个方面着手: 传输层带外冗余:弱智重复法 设你要发送的数据为 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

Loading

Posted in 网络编程 | Tagged , | Leave a comment

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

Loading

Posted in 网络编程 | Tagged , | 9 Comments

网络程序计时器通常用啥实现?

通常来讲,就是利用 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

Loading

Posted in 编程技术, 网络编程 | Tagged | Leave a comment

EPoll 和高性能没什么关系

现在很多人一提高性能后端开发,就总会想起 EPoll 来。其实一个成熟的高性能服务器,epoll相关的代码,不到万分之一。 而往往入门服务端的人,都天真的人为:高性能服务端开发 == EPOLL,真好笑,之所以会出现 epoll这种被捧上天的垃圾,明明就是 posix 或者最早版本的 unix/bsd/systemv 的设计考虑不完善。 按今天的眼光反思 posix 和 unix/bsd/systemv 当年的设计,epoll 这种补丁就不应该实现。 异步 reactor 框架应该就只有一个简单而统一的 selector 就足够了,所有系统都相同,提供: register: 注册 unregister:删除 set:设置 wait:等待事件 read:读取事件 wake:将等待中的 wait 无条件唤醒 别以为这些 poll / epoll / kevent / pollset / … Continue reading

Loading

Posted in 网络编程 | Tagged | Leave a comment

再谈网游同步技术

实时动作游戏在近年来得到迅猛的发展。而游戏同步问题,成为大家继续解决的核心问题之一。早在 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

Loading

Posted in 游戏开发, 网络编程 | Tagged , | 21 Comments

游戏服务端架构发展史(下)

(占位符)  

Loading

Posted in 游戏开发, 网络编程 | 28 Comments

游戏服务端架构发展史(中)

《游戏服务端发展史》转载请著名出处:http://www.skywind.me/blog/archives/1301 类型4:第三代游戏服务器 2007 从魔兽世界开始无缝世界地图已经深入人心,比较以往游戏玩家走个几步还需要切换场景,每次切换就要等待 LOADING个几十秒是一件十分破坏游戏体验的事情。于是对于 2005年以后的大型 MMORPG来说,无缝地图已成为一个标准配置。比较以往按照地图来切割游戏而言,无缝世界并不存在一块地图上面的人有且只由一台服务器处理了:

Loading

Posted in 游戏开发, 网络编程 | 13 Comments