skywind3000 / kcp

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

用java实现kcp,运行test(2)是出现收不到client的ack的问题。调试后发现是fastresend只要设置了正数就会有问题。 #426

Closed shadowvv closed 1 month ago

shadowvv commented 1 month ago

我在用java翻译kcp的实现,在运行test(1)时,出现当sn=260多时,就会卡住。 打印部分日志如下。 [RI] 1152 bytes [RO] user:0 size:432 input psh: sn=185 ts=3783335296 [RI] 432 bytes input psh: sn=209 ts=3783335311 [RI] 1392 bytes input psh: sn=218 ts=3783335357 [RI] 432 bytes input psh: sn=247 ts=3783335357 [RO] user:0 size:1344 [RO] user:0 size:48 [RI] 48 bytes input psh: sn=284 ts=3783335481 [RO] user:0 size:1344 [RO] user:0 size:1152 [RO] user:0 size:432 [RI] 1344 bytes input psh: sn=157 ts=3783336884 [RI] 1152 bytes input psh: sn=185 ts=3783336899 [RO] user:0 size:1392 [RO] user:0 size:432 [RI] 432 bytes input psh: sn=209 ts=3783336914 [RI] 1392 bytes input psh: sn=218 ts=3783336961 [RI] 432 bytes input psh: sn=247 ts=3783336961 [RO] user:0 size:1344 [RO] user:0 size:48 [RI] 1344 bytes input psh: sn=256 ts=3783337040 [RI] 48 bytes input psh: sn=284 ts=3783337087 [RO] user:0 size:1344 [RO] user:0 size:1152 [RO] user:0 size:432 [RI] 1344 bytes input psh: sn=157 ts=3783340088 [RI] 1152 bytes input psh: sn=185 ts=3783340104 [RI] 432 bytes [RO] user:0 size:1392 input psh: sn=209 ts=3783340119 [RO] user:0 size:432 [RI] 1392 bytes input psh: sn=218 ts=3783340167 [RI] 432 bytes input psh: sn=247 ts=3783340167 [RO] user:0 size:1344 [RO] user:0 size:48 [RI] 1344 bytes input psh: sn=256 ts=3783340247 [RI] 48 bytes input psh: sn=284 ts=3783340291 这块可能时那块代码在翻译的时候有问题?

skywind3000 commented 1 month ago

你不会是多线程调用了吧?

shadowvv commented 1 month ago

没有多线程调用。测试代码应该完全跟C代码一致。我把kcp的几个count成员删掉了,直接用了java容器的size代替了。然后把kcp的buffer改成了ByteBuffer。我把代码对比了很多次没有发现不一样的地方。这个时最新跑出来的日志:input ack: sn=252 rtt=83 rto=200 [RO] user:0 size:144 [RO] user:1 size:108 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=254 ts=3830713463 input psh: sn=255 ts=3830713463 input psh: sn=256 ts=3830713463 [RO] user:0 size:144 [RO] user:1 size:108 [RI] 96 bytes input psh: sn=255 ts=3830713483 input psh: sn=256 ts=3830713483 [RO] user:0 size:144 [RO] user:1 size:72 [RI] 108 bytes input ack: sn=253 rtt=76 rto=200 input ack: sn=254 rtt=76 rto=200 [RO] user:0 size:144 [RO] user:0 size:192 [RI] 108 bytes input ack: sn=254 rtt=86 rto=200 input ack: sn=255 rtt=86 rto=200 [RI] 144 bytes input psh: sn=255 ts=3830713495 input psh: sn=256 ts=3830713495 input psh: sn=257 ts=3830713495 [RI] 144 bytes input psh: sn=256 ts=3830713504 input psh: sn=257 ts=3830713504 [RO] user:0 size:144 [RO] user:1 size:108 [RI] 144 bytes input psh: sn=256 ts=3830713513 input psh: sn=257 ts=3830713513 [RO] user:0 size:96 [RO] user:1 size:36 [RI] 144 bytes input psh: sn=257 ts=3830713523 [RI] 72 bytes input ack: sn=255 rtt=86 rto=200 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=257 ts=3830713534 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=257 ts=3830713543 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=258 ts=3830713553 [RO] user:0 size:144 [RI] 108 bytes input ack: sn=255 rtt=108 rto=200 input ack: sn=256 rtt=108 rto=200 [RI] 36 bytes [RO] user:0 size:144 [RI] 96 bytes input psh: sn=259 ts=3830713563 [RI] 144 bytes input psh: sn=259 ts=3830713573 [RO] user:0 size:192 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=260 ts=3830713593 [RI] 144 bytes input psh: sn=261 ts=3830713603 [RO] user:0 size:144 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=261 ts=3830713615 [RI] 192 bytes input psh: sn=261 ts=3830713624 [RO] user:0 size:144 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=262 ts=3830713634 [RI] 144 bytes input psh: sn=263 ts=3830713643 [RO] user:0 size:144 [RO] user:0 size:144 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=263 ts=3830713654 [RI] 144 bytes input psh: sn=264 ts=3830713663 [RI] 144 bytes input psh: sn=264 ts=3830713673 [RO] user:0 size:144 [RO] user:0 size:144 [RO] user:0 size:144 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=265 ts=3830713684 [RI] 144 bytes input psh: sn=265 ts=3830713694 [RI] 144 bytes input psh: sn=266 ts=3830713704 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=266 ts=3830713714 [RO] user:0 size:96 [RI] 144 bytes input psh: sn=267 ts=3830713723 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=267 ts=3830713735 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=257 ts=3830713744 [RO] user:0 size:192 [RO] user:0 size:144 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=258 ts=3830713753 [RO] user:0 size:144 [RI] 96 bytes input psh: sn=269 ts=3830713763 [RI] 192 bytes input psh: sn=259 ts=3830713773 [RI] 144 bytes input psh: sn=270 ts=3830713783 [RO] user:0 size:192 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=260 ts=3830713794 [RO] user:0 size:144 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=271 ts=3830713804 [RI] 144 bytes input psh: sn=271 ts=3830713814 [RI] 144 bytes input psh: sn=271 ts=3830713823 [RI] 192 bytes input psh: sn=261 ts=3830713833 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=262 ts=3830713843 [RO] user:0 size:240 [RI] 144 bytes input psh: sn=273 ts=3830713853 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=263 ts=3830713873 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=274 ts=3830713883 [RO] user:0 size:240 [RO] user:0 size:192 [RI] 240 bytes input psh: sn=265 ts=3830713894 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=275 ts=3830713903 [RO] user:0 size:192 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=276 ts=3830713913 [RI] 240 bytes input psh: sn=266 ts=3830713923 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=276 ts=3830713933 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=267 ts=3830713943 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=268 ts=3830713953 [RI] 144 bytes input psh: sn=279 ts=3830713965 [RO] user:0 size:192 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=269 ts=3830713974 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=280 ts=3830713984 [RO] user:0 size:192 [RI] 192 bytes input psh: sn=270 ts=3830713994 [RI] 192 bytes input psh: sn=280 ts=3830714003 [RO] user:0 size:144 [RO] user:0 size:192 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=281 ts=3830714014 [RI] 192 bytes input psh: sn=271 ts=3830714024 [RI] 192 bytes input psh: sn=272 ts=3830714034 [RO] user:0 size:144 [RO] user:0 size:144 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=283 ts=3830714044 [RI] 192 bytes input psh: sn=273 ts=3830714053 [RI] 144 bytes input psh: sn=284 ts=3830714063 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=284 ts=3830714073 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=285 ts=3830714083 [RI] 144 bytes input psh: sn=285 ts=3830714093 [RO] user:0 size:240 [RO] user:0 size:192 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 240 bytes input psh: sn=274 ts=3830714104 [RI] 144 bytes input psh: sn=286 ts=3830714119 [RI] 144 bytes input psh: sn=287 ts=3830714123 [RI] 240 bytes input psh: sn=276 ts=3830714134 [RO] user:0 size:240 [RO] user:0 size:144 [RO] user:0 size:144 [RO] user:0 size:240 [RI] 192 bytes input psh: sn=257 ts=3830714145 [RI] 240 bytes input psh: sn=258 ts=3830714154 [RI] 144 bytes input psh: sn=289 ts=3830714163 [RO] user:0 size:144 [RO] user:0 size:192 [RI] 240 bytes input psh: sn=259 ts=3830714174 [RO] user:0 size:192 [RI] 144 bytes input psh: sn=290 ts=3830714184 [RI] 144 bytes input psh: sn=290 ts=3830714193 [RO] user:0 size:192 [RI] 240 bytes input psh: sn=260 ts=3830714203 [RO] user:0 size:192 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=291 ts=3830714213 [RO] user:0 size:288 [RI] 192 bytes input psh: sn=281 ts=3830714223 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=261 ts=3830714233 [RI] 192 bytes input psh: sn=262 ts=3830714246 [RI] 192 bytes input psh: sn=283 ts=3830714253 [RO] user:0 size:240 [RO] user:0 size:192 [RI] 288 bytes input psh: sn=263 ts=3830714275 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=295 ts=3830714283 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 240 bytes input psh: sn=265 ts=3830714294 [RO] user:0 size:240 [RI] 192 bytes input psh: sn=295 ts=3830714303 [RI] 144 bytes input psh: sn=296 ts=3830714313 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 240 bytes input psh: sn=266 ts=3830714323 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 240 bytes input psh: sn=267 ts=3830714343 [RI] 240 bytes input psh: sn=268 ts=3830714355 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 144 bytes input psh: sn=299 ts=3830714364 [RO] user:0 size:192 [RI] 240 bytes input psh: sn=269 ts=3830714374 [RO] user:0 size:192 [RI] 240 bytes input psh: sn=270 ts=3830714396 [RO] user:0 size:192 Disconnected from the target VM, address: '127.0.0.1:62741', transport: 'socket' [RO] user:0 size:144 [RI] 144 bytes input psh: sn=301 ts=3830714404 [RO] user:0 size:240 [RO] user:0 size:144 [RI] 192 bytes input psh: sn=291 ts=3830714415 从收到input ack:256之后再也没有打印这个日志了。现在segment的头部时36byte,数据是12byte。需要我把代码贴过来吗?大概有可能那个方法出了问题呢?

shadowvv commented 1 month ago

之前的问题已经解决了。是本人代码有问题。现在有了新问题。我在测试test(2)的时候,同样发现了ack收不到的问题。调试后发现是if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) < 0) 这块代码始终大于0.sn的值远大于rcv_nxt.

shadowvv commented 1 month ago

已经解决了。debug发现是parseData的时候插入数据有问题,没有正确按照sn排序插入。