KCP

  • 本质是一套算法,而下层通信是自己选择(UDP,TCP),通过回调函数(udp.send)的方式进行处理
    • 所以 UDP 收到数据时调用 input 解析 kcp 协议后,调用接受接口就能得到数据
  • 握手机制需要自行协商创建 conv
  • 使用 send 会放到发送队列,当时钟更新(update)后,从队列换到缓冲区

https://s2.loli.net/2025/03/03/pVqZR8AEm9XJiQg.jpg

  • ts 为 timestamp,发送时间戳,可以用于计算 RTT,再得到 RTO
  • una:已发送,但是为收到确认的第一个序号
  • sn:una 之后的不连续的序号(cmd=82),和 TCP seq 一样(cmd=81)
    • 这样最开始未确认的地方会选择性重传,等这段 una 补全后,再到下一段缺失的 una 和 sn
  • cmd:操作码,表示协议解析的一些特殊操作
  • wnd:当 cmd = 83 时,表示询问远端窗口大小,当 cmd = 84 时,表示告知远端窗口大小
  • conv:是会话匹配数字
  • frg:是拆分数据的编号
  • len:表示总长度

特点:

  • RTO 超时重传时间是 1.5 倍

报文类型

  • 数据报文 IKCP_CMD_PUSH
  • 确认报文 IKCP_CMD_ACK
  • 窗口探测报文 IKCP_CMD_WASK, 询问对端剩余接收窗口的大小.
  • 窗口通知报文 IKCP_CMD_WINS, 通知对端剩余接收窗口的大小.