mirror of
https://github.com/skywind3000/kcp.git
synced 2025-03-25 08:50:09 +08:00
Updated KCP Basic Usage (markdown)
parent
f022a0cafb
commit
2246e90425
@ -1,41 +1,77 @@
|
||||
基本使用
|
||||
=======
|
||||
# 基本使用
|
||||
|
||||
1. 创建 KCP对象:
|
||||
|
||||
```cpp
|
||||
// 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双
|
||||
// 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针
|
||||
ikcpcb *kcp = ikcp_create(conv, user);
|
||||
```
|
||||
```cpp
|
||||
// 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双
|
||||
// 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针
|
||||
ikcpcb *kcp = ikcp_create(conv, user);
|
||||
```
|
||||
|
||||
2. 设置回调函数:
|
||||
|
||||
```cpp
|
||||
// KCP的下层协议输出函数,KCP需要发送数据时会调用它
|
||||
// buf/len 表示缓存和长度
|
||||
// user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象
|
||||
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
|
||||
{
|
||||
....
|
||||
}
|
||||
// 设置回调函数
|
||||
kcp->output = udp_output;
|
||||
```
|
||||
```cpp
|
||||
// KCP的下层协议输出函数,KCP需要发送数据时会调用它
|
||||
// buf/len 表示缓存和长度
|
||||
// user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象
|
||||
int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
|
||||
{
|
||||
....
|
||||
}
|
||||
// 设置回调函数
|
||||
kcp->output = udp_output;
|
||||
```
|
||||
|
||||
3. 循环调用 update:
|
||||
|
||||
```cpp
|
||||
// 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位)
|
||||
// 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用
|
||||
ikcp_update(kcp, millisec);
|
||||
```
|
||||
```cpp
|
||||
// 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位)
|
||||
// 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用
|
||||
ikcp_update(kcp, millisec);
|
||||
```
|
||||
|
||||
4. 输入一个下层数据包:
|
||||
|
||||
```cpp
|
||||
// 收到一个下层数据包(比如UDP包)时需要调用:
|
||||
ikcp_input(kcp, received_udp_packet, received_udp_size);
|
||||
```
|
||||
处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send来向远端发
|
||||
送数据。而另一端使用ikcp_recv(kcp, ptr, size)来接收数据。
|
||||
```cpp
|
||||
// 收到一个下层数据包(比如UDP包)时需要调用:
|
||||
ikcp_input(kcp, received_udp_packet, received_udp_size);
|
||||
```
|
||||
处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send 来向
|
||||
远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。
|
||||
|
||||
|
||||
# 协议配置
|
||||
|
||||
协议默认模式是一个标准的 ARQ,需要通过配置打开各项加速开关:
|
||||
|
||||
1. 工作模式:
|
||||
```cpp
|
||||
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. 最大窗口:
|
||||
```cpp
|
||||
int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
|
||||
```
|
||||
该调用将会设置协议的最大发送窗口和最大接收窗口大小,默认为32. 这个可以理解为 TCP的 SND_BUF 和 RCV_BUF,只不过单位不一样 SND/RCV_BUF 单位是字节,这个单位是包。
|
||||
|
||||
3. 最大传输单元:
|
||||
|
||||
纯算法协议并不负责探测 MTU,默认 mtu是1400字节,可以使用ikcp_setmtu来设置
|
||||
该值。该值将会影响数据包归并及分片时候的最大传输单元。
|
||||
|
||||
4. 最小RTO:
|
||||
|
||||
不管是 TCP还是 KCP计算 RTO时都有最小 RTO的限制,即便计算出来RTO为40ms,由
|
||||
于默认的 RTO是100ms,协议只有在100ms后才能检测到丢包,快速模式下为30ms,可
|
||||
以手动更改该值:
|
||||
```cpp
|
||||
kcp->rx_minrto = 10;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user