• OpenHarmony网络协议通信—kcp


    kcp 是一种 ARQ 协议,可解决在网络拥堵情况下 tcp 协议的网络速度慢的问题

    下载安装

    直接在 OpenHarmony-SIG 仓中搜索 kcp 并下载。

    使用说明

    准备一套完整的 OpenHarmony 3.1 Beta 代码

    1. 库代码存放路径:./third_party/kcp

    2. 修改添加依赖的编译脚本

    在/developtools/bytrace_standard/ohos.build 文件中添加以下修改:

    {
      "subsystem": "developtools",
      "parts": {
        "bytrace_standard": {
          "module_list": [
            "//developtools/bytrace_standard/interfaces/innerkits/native:bytrace_core",
            "//developtools/bytrace_standard/bin:bytrace_target",
            "//developtools/bytrace_standard/bin:bytrace.cfg",
            "//developtools/bytrace_standard/interfaces/kits/js/napi:bytrace",
            "//third_party/kcp:kcp_targets"
          ],
          "inner_kits": [
            {
              "type": "so",
              "name": "//developtools/bytrace_standard/interfaces/innerkits/native:bytrace_core",
              "header": {
                "header_files": [
                  "bytrace.h"
                ],
                "header_base": "//developtools/bytrace_standard/interfaces/innerkits/native/include"
              }
            }
          ],
           "test_list": [
            "//developtools/bytrace_standard/bin/test:unittest"
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    1. 用命令 ./build.sh --product-name rk3568 --ccache 编译

    2. 生成库文件路径:

      out/rk3568/common/common

    该路径会生成 test 可执行文件

    接口说明

    1. 接收到下层协议 UDP 传进来的数据底层数据 buffer 转换成 kcp 的数据包格式 int ikcp_input(ikcpcb *kcp, const char *data, long size) KCP 报文分为 ACK 报文、数据报文、探测窗口报文、响应窗口报文四种。 kcp 报文的 una 字段(snd_una:第一个未确认的包)表示对端希望接收的下一个 kcp 包序号,也就是说明接收端已经收到了所有小于 una 序号的 kcp 包。解析 una 字段后需要把发送缓冲区里面包序号小于 una 的包全部丢弃掉

    2. 用户层面的数据读取

    ikcp_recv(ikcpcb *kcp, char *buffer, int len)

    首先合并 fragment,如果 rcv_queue 小于 rcv_wnd(接收窗口大小),则将 rcv_buf 中合适的 segment 放入 rcv_queue 中

    1. 将 buffer 中的数据发送,把要发送的 buffer 分片成 KCP 的数据包格式,插入待发送队列中

    ikcp_send(ikcpcb *kcp, const char *buffer, int len)

    当用户的数据超过一个 mss(最大分片大小)的时候,会对发送的数据进行分片处理。KCP 采用的是流的方式进行分片处理

    如果需要发送的数据大小大于 mss,则将其拆分为多个 segment 发送,将其 frg 至为其相应的序号,序号从 count-1 开始递减至 0,即 count-1 表示第一个 segment,0 表示最后一个 segment。

    1. 刷新待处理数据,待处理数据包括 ack,win probe,push data 等等,以及检测 snd_buf 中的数据是否需要重传

    ikcp_flush(ikcpcb *kcp)

    约束与限制

    在下述版本验证通过:DevEco Studio: 3.1 Beta1,OpenHarmony SDK: API9。

    目录结构

    |---- kcp
    |     |---- ikcp.c   #kcp的主要实现逻辑
    |     |---- test.c   #测试代码文件
    |     |---- screenshot   #测试结果图
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    2022-04-07-SpringCloud
    【从零开始的Java开发】1-6-1 集合排序:对整型和字符串、Comparator接口、Comparable接口
    Java NIO :如何为通道注册多个事件及多线程处理 Accetp 请求
    期中考核复现(web)
    单片机论文参考:6、基于单片机8路抢答器
    ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“
    【C语言】入门——结构体
    js制作动态表单
    pytorch数学运算
    【图像压缩】基于二叉树和优化截断(BTOT)实现遥感图像压缩附matlab代码
  • 原文地址:https://blog.csdn.net/maniuT/article/details/138010836