KCP协议如何实现从TCP过渡至UDP家族,包括QUIC、KCP和ENET?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1891个文字,预计阅读时间需要8分钟。
KCP是一种快速、可靠的协议,比TCP节省带宽10%-20%,平均延迟降低30%-40%,最大延迟降低三倍,传输效率更高。TCP为了实现网络通信的可靠性,采用了复杂的拥塞控制算法,构建了“
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。行文前先安利下《再深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP》、《再谈UDP协议—浅入理解深度记忆》
KCP协议科普KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。本文传输协议之考虑UDP的情况。
整个KCP协议主要依靠一个循环ikcp_update来驱动整个算法的运转,所有的数据发送,接收,状态变化都依赖于此,所以如果有操作占用每一次update的周期过长,或者设置内部刷新的时间间隔过大,都会导致整个算法的效率降低。在ikcp_update中最终调用的是ikcp_flush,这是协议中的一个核心函数,将数据,确认包,以及窗口探测和应答发送到对端。
KCP使用ikcp_send发送数据,该函数调用ikcp_output发送数据,实际上最终调用事先注册的发送回调发送数据。KCP通过ikcp_recv将数据接收出来,如果被分片发送,将在此自动重组,数据将与发送前保持一致。
KCP为什么存在?首先要看TCP与UDP的区别,TCP与UDP都是传输层的协议,比较两者的区别主要应该是说TCP比UDP多了什么?
-
面向连接:TCP接收方与发送方维持了一个状态(建立连接,断开连接),双方知道对方还在。
-
可靠的:发送出去的数据对方一定能够接收到,而且是按照发送的顺序收到的。
-
流量控制与拥塞控制:TCP靠谱通过滑动窗口确保,发送的数据接收方来得及收。TCP无私,发生数据包丢失的时候认为整个网络比较堵,自己放慢数据发送速度。
-
TCP协议的可靠性让使用TCP开发更为简单,同时它的这种设计也导致了慢的特点。
-
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。
-
TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于TCP内置在系统协议栈中,极难对其进行改进。
-
UDP协议简单,所以它更快。但是,UDP毕竟是不可靠的,应用层收到的数据可能是缺失、乱序的。
-
UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP,如网页浏览、流媒体、实时游戏、物联网。
随着网络技术飞速发展,网速已不再是传输的瓶颈,CDN服务商Akamai报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。
KCPKCP协议就是在保留UDP快的基础上,提供可靠的传输,应用层使用更加简单——TCP可靠简单,但是复杂无私,所以速度慢。KCP尽可能保留UDP快的特点下,保证可靠。
-
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。
-
KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。
TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。
MOBA类和“吃鸡”游戏多使用帧同步为主要同步算法,竞技性也较高,无论从流畅性,还是从公平性要求来说,对响应延迟的要求都最高,根据业内经验,当客户端与服务器的网络延迟超过150ms时,会开始出现卡顿,当延迟超过250ms时,会对玩家操作造成较大影响,游戏无法公平进行。类似地,“吃鸡”游戏(如《绝地求生》)玩法对玩家坐标、动作的同步要求极高,延迟稍大导致的数据不一致对体验都会造成较大影响,其实时性要求接近MOBA类游戏。而对于传统mmorpg来说,多采用状态同步算法,以属性养成和装备获取为关注点,也有一定竞技性,出于对游戏流畅性的要求,对延迟也有一定要求,同步算法的优化程度不一样,这一要求也不一样,一般情况下为保证游戏正常进行,需要响应延迟保持在300ms以下。相比之下,对于炉石传说、斗地主、梦幻西游等回合制游戏来说,同时只有一个玩家在操作双方数据,无数据竞争,且时间粒度较粗,甚至可通过特效掩盖延迟,因此对网络延迟的要求不高,即便延迟达到500ms~1000ms,游戏也能正常进行
不同传输层协议在可靠性、流量控制等方面都有差别,而这些技术细节会对延迟造成影响。
tcp追求的是完全可靠性和顺序性,丢包后会持续重传直至该包被确认,否则后续包也不会被上层接收,且重传采用指数避让策略,决定重传时间间隔的RTO(retransmission timeout)不可控制,linux内核实现中最低值为200ms,这样的机制会导致丢包率短暂升高的情况下应用层消息响应延迟急剧提高,并不适合实时性高、网络环境复杂的游戏。
基于udp定制传输层协议,引入顺序性和适当程度或者可调节程度的可靠性,修改流控算法。适当放弃重传,如:设置最大重传次数,即使重传失败,也不需要重新建立连接。比较知名的tcp加速开源方案有:quic、enet、kcp、udt。
kcp/quic/enet协议的区别先安利下《浅谈QUIC协议原理与性能分析及部署方案》,
-
quic 是一个完整固化的 zhuanlan.zhihu.com/p/112442341
可靠UDP,KCP协议快在哪?wetest.qq.com/lab/view/391.html
KCP 协议与源码分析(一)github.com/skywind3000/kcp
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势www.52im.net/thread-1277-1-1.html
转载本站文章《KCP协议:从TCP到UDP家族QUIC/KCP/ENET》,
请注明出处:www.zhoulujun.net/html/theory/ComputerScienceTechnology/network/2016_0106_387.html
本文共计1891个文字,预计阅读时间需要8分钟。
KCP是一种快速、可靠的协议,比TCP节省带宽10%-20%,平均延迟降低30%-40%,最大延迟降低三倍,传输效率更高。TCP为了实现网络通信的可靠性,采用了复杂的拥塞控制算法,构建了“
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。行文前先安利下《再深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP》、《再谈UDP协议—浅入理解深度记忆》
KCP协议科普KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。本文传输协议之考虑UDP的情况。
整个KCP协议主要依靠一个循环ikcp_update来驱动整个算法的运转,所有的数据发送,接收,状态变化都依赖于此,所以如果有操作占用每一次update的周期过长,或者设置内部刷新的时间间隔过大,都会导致整个算法的效率降低。在ikcp_update中最终调用的是ikcp_flush,这是协议中的一个核心函数,将数据,确认包,以及窗口探测和应答发送到对端。
KCP使用ikcp_send发送数据,该函数调用ikcp_output发送数据,实际上最终调用事先注册的发送回调发送数据。KCP通过ikcp_recv将数据接收出来,如果被分片发送,将在此自动重组,数据将与发送前保持一致。
KCP为什么存在?首先要看TCP与UDP的区别,TCP与UDP都是传输层的协议,比较两者的区别主要应该是说TCP比UDP多了什么?
-
面向连接:TCP接收方与发送方维持了一个状态(建立连接,断开连接),双方知道对方还在。
-
可靠的:发送出去的数据对方一定能够接收到,而且是按照发送的顺序收到的。
-
流量控制与拥塞控制:TCP靠谱通过滑动窗口确保,发送的数据接收方来得及收。TCP无私,发生数据包丢失的时候认为整个网络比较堵,自己放慢数据发送速度。
-
TCP协议的可靠性让使用TCP开发更为简单,同时它的这种设计也导致了慢的特点。
-
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。
-
TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于TCP内置在系统协议栈中,极难对其进行改进。
-
UDP协议简单,所以它更快。但是,UDP毕竟是不可靠的,应用层收到的数据可能是缺失、乱序的。
-
UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP,如网页浏览、流媒体、实时游戏、物联网。
随着网络技术飞速发展,网速已不再是传输的瓶颈,CDN服务商Akamai报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。
KCPKCP协议就是在保留UDP快的基础上,提供可靠的传输,应用层使用更加简单——TCP可靠简单,但是复杂无私,所以速度慢。KCP尽可能保留UDP快的特点下,保证可靠。
-
TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。
-
KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。
TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。
MOBA类和“吃鸡”游戏多使用帧同步为主要同步算法,竞技性也较高,无论从流畅性,还是从公平性要求来说,对响应延迟的要求都最高,根据业内经验,当客户端与服务器的网络延迟超过150ms时,会开始出现卡顿,当延迟超过250ms时,会对玩家操作造成较大影响,游戏无法公平进行。类似地,“吃鸡”游戏(如《绝地求生》)玩法对玩家坐标、动作的同步要求极高,延迟稍大导致的数据不一致对体验都会造成较大影响,其实时性要求接近MOBA类游戏。而对于传统mmorpg来说,多采用状态同步算法,以属性养成和装备获取为关注点,也有一定竞技性,出于对游戏流畅性的要求,对延迟也有一定要求,同步算法的优化程度不一样,这一要求也不一样,一般情况下为保证游戏正常进行,需要响应延迟保持在300ms以下。相比之下,对于炉石传说、斗地主、梦幻西游等回合制游戏来说,同时只有一个玩家在操作双方数据,无数据竞争,且时间粒度较粗,甚至可通过特效掩盖延迟,因此对网络延迟的要求不高,即便延迟达到500ms~1000ms,游戏也能正常进行
不同传输层协议在可靠性、流量控制等方面都有差别,而这些技术细节会对延迟造成影响。
tcp追求的是完全可靠性和顺序性,丢包后会持续重传直至该包被确认,否则后续包也不会被上层接收,且重传采用指数避让策略,决定重传时间间隔的RTO(retransmission timeout)不可控制,linux内核实现中最低值为200ms,这样的机制会导致丢包率短暂升高的情况下应用层消息响应延迟急剧提高,并不适合实时性高、网络环境复杂的游戏。
基于udp定制传输层协议,引入顺序性和适当程度或者可调节程度的可靠性,修改流控算法。适当放弃重传,如:设置最大重传次数,即使重传失败,也不需要重新建立连接。比较知名的tcp加速开源方案有:quic、enet、kcp、udt。
kcp/quic/enet协议的区别先安利下《浅谈QUIC协议原理与性能分析及部署方案》,
-
quic 是一个完整固化的 zhuanlan.zhihu.com/p/112442341
可靠UDP,KCP协议快在哪?wetest.qq.com/lab/view/391.html
KCP 协议与源码分析(一)github.com/skywind3000/kcp
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势www.52im.net/thread-1277-1-1.html
转载本站文章《KCP协议:从TCP到UDP家族QUIC/KCP/ENET》,
请注明出处:www.zhoulujun.net/html/theory/ComputerScienceTechnology/network/2016_0106_387.html

