skywind3000 / kcp

:zap: KCP - A Fast and Reliable ARQ Protocol
MIT License
15.2k stars 2.49k forks source link

KCP在高延迟环境下怎样使用才能满足大流量,而不是快速响应? #406

Open haozia816 opened 5 months ago

haozia816 commented 5 months ago

我们需要同时工作在TCP和UDP协议中,所以选择了使用KCP,但是我的软件中还需要传输文件,我测试了在高延迟(1s)环境中,TCP协议、2048的窗口也只能达到400k左右的速度,还经常出现传输中断,ikcp_input后KCP再无任何响应。请问在高延迟环境中,只要求大流量而不要求快速响应我应该怎么使用呢? 无延迟环境测试为16M/S

jiangguilong2000 commented 5 months ago

你这用KCP用错了场景了吧

------------------ 原始邮件 ------------------ 发件人: "skywind3000/kcp" @.>; 发送时间: 2024年3月21日(星期四) 下午4:34 @.>; @.***>; 主题: [skywind3000/kcp] KCP在高延迟环境下怎样使用才能满足大流量,而不是快速响应? (Issue #406)

我们需要同时工作在TCP和UDP协议中,所以选择了使用KCP,但是我的软件中还需要传输文件,我测试了在高延迟(1s)环境中,TCP协议、2048的窗口也只能达到400k左右的速度,还经常出现传输中断,ikcp_input后KCP再无任何响应。请问在高延迟环境中,只要求大流量而不要求快速响应我应该怎么使用呢?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

skywind3000 commented 5 months ago

自己再 issue 里翻翻,别人传输速度比你这个快。

haozia816 commented 5 months ago

自己再 issue 里翻翻,别人传输速度比你这个快。

麻烦大神指导下呢,没有找到相似的issue,我是asio实现的,下面是伪代码

boost::asio::stready_timer  m_timer;

void active_update()
{
    ikcp_update(m_kcp);
    m_timer.expires_at(ikcp_check(m_kcp));
    m_timer.async_wait([]
    {
        active_update();
    });
}

//实例启动
void start()
{
    //开启周期性update
    active_update();
}

//网络接收到数据
void handle_recv(const uint8_t* data, size_t size)
{
    ikcp_input(m_kcp, data, size);
    while (true)
    {
        int len = ikcp_recv(m_kcp, buffer1);
        if(len == -1)
        {
            break; //无可用数据,结束while循环
        }
        //处理KCP接收到的数据,存储在buffer1中
        ......
    }
    while (ikcp_waitsnd(m_kcp) < m_kcp->snd_wnd * 2)
    {
        //发送队列未满,继续读取文件发送
        if (pf) //FILE* pf;
        {
            fread(buffer2, 1, m_kcp->mss, pf);
            ikcp_send(m_kcp, buffer2, m_kcp->mss);
            active_update(); //测试过这里只能执行ikcp_update,执行ikcp_flush的话,数据不会立刻发送
        }
        else
        {
            break;
        }
    }
}