Update README.md
new readme
This commit is contained in:
parent
e62bf5cb8b
commit
798a3a919e
28
README.md
28
README.md
@ -3,14 +3,23 @@ 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不翻倍:
|
#### RTO翻倍vs不翻倍:
|
||||||
|
|
||||||
@ -85,7 +94,8 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的
|
|||||||
// 收到一个下层数据包(比如UDP包)时需要调用:
|
// 收到一个下层数据包(比如UDP包)时需要调用:
|
||||||
ikcp_input(kcp, received_udp_packet, received_udp_size);
|
ikcp_input(kcp, received_udp_packet, received_udp_size);
|
||||||
```
|
```
|
||||||
处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send 来向远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。
|
处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send 来向
|
||||||
|
远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。
|
||||||
|
|
||||||
|
|
||||||
# 协议配置
|
# 协议配置
|
||||||
@ -129,7 +139,8 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的
|
|||||||
# 最佳实践
|
# 最佳实践
|
||||||
#### 内存分配器
|
#### 内存分配器
|
||||||
|
|
||||||
默认KCP协议使用 malloc/free进行内存分配释放,如果应用层接管了内存分配,可以用ikcp_allocator来设置新的内存分配器,注意要在一开始设置:
|
默认KCP协议使用 malloc/free进行内存分配释放,如果应用层接管了内存分配,可以
|
||||||
|
用ikcp_allocator来设置新的内存分配器,注意要在一开始设置:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
ikcp_allocator(my_new_malloc, my_new_free);
|
ikcp_allocator(my_new_malloc, my_new_free);
|
||||||
@ -138,9 +149,12 @@ TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的
|
|||||||
|
|
||||||
#### 前向纠错注意
|
#### 前向纠错注意
|
||||||
|
|
||||||
为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致kcp以为对方重发了,这样会产生更多的ack占用额外带宽。
|
为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根
|
||||||
|
据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致kcp
|
||||||
|
以为对方重发了,这样会产生更多的ack占用额外带宽。
|
||||||
|
|
||||||
比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个数据包,以及上上一个数据包的内容:
|
比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个数
|
||||||
|
据包,以及上上一个数据包的内容:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
Fn = (Pn, Pn-1, Pn-2)
|
Fn = (Pn, Pn-1, Pn-2)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user