Skip to content

模拟高丢包率环境下时出现的问题 #4

@vzex

Description

@vzex

A B通讯,丢包率A:50%,B:75%
用脚本连续1000次请求发送一定数据

然后 kcp.snd_queue开始堆积
经过调试,发现是kcp.snd_buf队列中,segment.resendts延迟几乎每次都在100s后左右,导致snd_buf队列中的包一直很难发出,致使snd_una几乎不再更新
然后 _itimediff(kcp.snd_nxt, kcp.snd_una + cwnd) >= 0 这个条件基本上一直为true,最后snd_queue也开始堆积了。我用的版本是从c版本直接翻译成golang的,理论上行为全部一致,另外我看另外一个强制snd_buf发包的条件是包头的fastack大于0,但是这个也是依赖A发送B,B再回复ACK才会更新的,所以这个情况下基本上就是没有快速重试的途径,最后只能断开连接

我目前暂时的解决方案,snd_buff的第一个元素(影响snd_una更新的包)当xmit>2时强制重发,不知道有没有更合适的方法可以解决上面的问题?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions