6 KCP Basic Usage
winlin edited this page 2017-02-16 12:07:21 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

基本使用

  1. 创建 KCP对象

    // 初始化 kcp对象conv为一个表示会话编号的整数和tcp的 conv一样通信双
    // 方需保证 conv相同相互的数据包才能够被认可user是一个给回调函数的指针
    ikcpcb *kcp = ikcp_create(conv, user);
    
  2. 设置回调函数:

    // KCP的下层协议输出函数KCP需要发送数据时会调用它
    // buf/len 表示缓存和长度
    // user指针为 kcp对象创建时传入的值用于区别多个 KCP对象
    int udp_output(const char *buf, int len, ikcpcb *kcp, void *user)
    {
      ....
    }
    // 设置回调函数
    ikcp_setoutput(kcp, udp_output);
    
  3. 循环调用 update

    // 以一定频率调用 ikcp_update来更新 kcp状态并且传入当前时钟毫秒单位
    // 如 10ms调用一次或用 ikcp_check确定下次调用 update的时间不必每次调用
    ikcp_update(kcp, millisec);
    
  4. 输入一个下层数据包:

    // 收到一个下层数据包比如UDP包时需要调用
    ikcp_input(kcp, received_udp_packet, received_udp_size);
    

    处理了下层协议的输出/输入后 KCP协议就可以正常工作了使用 ikcp_send 来向 远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。

协议配置

协议默认模式是一个标准的 ARQ需要通过配置打开各项加速开关

  1. 工作模式:

    int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc)
    
    • nodelay :是否启用 nodelay模式0不启用1启用。
    • interval :协议内部工作的 interval单位毫秒比如 10ms或者 20ms
    • resend 快速重传模式默认0关闭可以设置22次ACK跨越将会直接重传
    • nc 是否关闭流控默认是0代表不关闭1代表关闭。
    • 普通模式:`ikcp_nodelay(kcp, 0, 40, 0, 0);
    • 极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1);
  2. 最大窗口:

    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可以手动更改该值

    kcp->rx_minrto = 10;