diff --git a/README.md b/README.md index a80aa34..cdc073f 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,14 @@ KCP - A Fast and Reliable ARQ Protocol # 简介 -KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 -30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP) -的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 -连时钟都需要外部传递进来,内部不会有任何一次系统调用。 +KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。 -整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。 -也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实 -现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 +整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 # 技术特性 -TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP -是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的 -代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的 -大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达 -到提高流速的结果: +TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略达到提高流速的结果: #### RTO翻倍vs不翻倍: @@ -106,11 +97,15 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc) nodelay :是否启用 nodelay模式,0不启用;1启用。 + interval :协议内部工作的 interval,单位毫秒,比如 10ms或者 20ms + resend :快速重传模式,默认0关闭,可以设置2(2次ACK跨越将会直接重传) + nc :是否关闭流控,默认是0代表不关闭,1代表关闭。 普通模式:`ikcp_nodelay(kcp, 0, 40, 0, 0); + 极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1); 2. 最大窗口: @@ -143,12 +138,9 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的 #### 前向纠错注意 -为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会 -根据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致 -kcp以为对方重发了,这样会产生更多的ack占用额外带宽。 +为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致kcp以为对方重发了,这样会产生更多的ack占用额外带宽。 -比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个 -数据包,以及上上一个数据包的内容: +比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个数据包,以及上上一个数据包的内容: ```cpp Fn = (Pn, Pn-1, Pn-2)