skywind3000 / kcp

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

上行卡顿,下行通畅后续 #416

Closed Haoson closed 1 month ago

Haoson commented 2 months ago

Hello,skywind3000。之前我反馈过一个实际生产过程中,kcp上行卡顿的案例,当时我观测到发送窗口缩小到1,我以为是rto那块弄错了。但是后来发现不是,我查错了。 后面又出现一次相同反馈,但是这次有一些新的线索: 玩家登录时候,发送了第一个ping包(每秒都会发送1个),此时服务器没有收到(做了一些动态的监测)。大概过了1min多之后,玩家手动关闭了wifi然后开启,也就是重启了wifi,此时服务器收到了玩家登陆时发送的第一个ping包(有特定标识可以确认)。也就是玩家重启了wifi,让上行通道突然就通了。并且可以确认的是,并不是发生了断线重连导致的通畅。并且玩家的出口ip+端口也没有变化,因为服务器用了这两者作为key的一部分。请问这可能是什么原因呢? 我个人的猜想是重启wifi让操作系统对发送缓冲区做了一些操作,比如丢弃了一些拥塞在前面的数据包之类,因为操作系统可能认为网络断开之后,有一些数据包可以丢弃。不过这是我个人猜想。 @skywind3000

skywind3000 commented 1 month ago

网络断开,请重新创建新的 kcp 对象,就像你 tcp 断开再连,内部状态机也是新的一样。

Haoson commented 2 days ago

网络断开,请重新创建新的 kcp 对象,就像你 tcp 断开再连,内部状态机也是新的一样。

这个肯定是这么做的。不过我上面描述的问题不是这个问题,我上面描述的是: 新建一个kcp对象之后,客户端服务器都是一个新的对象。此时客户端发送了一个ping包到服务器,服务器没收到,玩家自己手动关闭wifi在打开的时候,之前发送的这个ping包突然就被服务器收到了。根据包里面的时间来看,这个包是1min之前就发送了。 从现象上看,大概率是包积累在客户端,但是没真正发出去,后面玩家关闭wifi打开wifi的操作,不知道触发了什么,就把包发出去了

David-xian66 commented 1 day ago

网络断开,请重新创建新的 kcp 对象,就像你 tcp 断开再连,内部状态机也是新的一样。

这个肯定是这么做的。不过我上面描述的问题不是这个问题,我上面描述的是: 新建一个kcp对象之后,客户端服务器都是一个新的对象。此时客户端发送了一个ping包到服务器,服务器没收到,玩家自己手动关闭wifi在打开的时候,之前发送的这个ping包突然就被服务器收到了。根据包里面的时间来看,这个包是1min之前就发送了。 从现象上看,大概率是包积累在客户端,但是没真正发出去,后面玩家关闭wifi打开wifi的操作,不知道触发了什么,就把包发出去了

为什么没有可能是你发送出去后,ping包其实早就过了你的路由器了,已经从路由器向公网的服务器传输了,只是不知道为何,延迟很大

你试试自己建立两个子局域网,子网1里的设备给子网2里的设备发送ping(这样排除下是不是我上面说的情况),你试一下,看看能不能复现问题