kcp 关于connect和close

xiozqbni  于 2个月前  发布在  其他
关注(0)|答案(8)|浏览(72)

假如希望能在某些场合下用KCP取代TCP,是否需要在应用层上自行实现SYN和FIN,RST机制?
(比如希望封装出类似connect/accept的函数,以及封装出shutdown/close函数。)
我的理解是,KCP本身并不解决这些问题,例如当上层调用client调用ikcp_send(),上层是完全不知道对方是否有一个server在运行的。如果是TCP,对方会返回一个RST,下次调用recv或者send时就会失败。

怎么才能通过封装KCP达到这个类似TCP的效果?

8yoxcaq7

8yoxcaq71#

先建立tcp链接,再把kcp帮到到tcp。看wiki

aiqt4smr

aiqt4smr2#

同时保持一个tcp来做连接和关闭有点奇葩,感觉不太干净。如果我基于KCP增加SYN和FIN的处理会有什么问题?需要注意哪些问题?

pnwntuvh

pnwntuvh3#

设计你可以参考下 kcptun 和 smux, 在kcp 之上再封装一层

esyap4oy

esyap4oy4#

直接实现没问题,更麻烦而已,自己管理SYN/FIN之类的。

xzlaal3s

xzlaal3s5#

@notedit kcptun和smux是自己管理SYN/FIN吗?还是他们也是附带一个TCP来做连接管理?

vohkndzv

vohkndzv6#

你可以读一下它的文档 �不需要tcp 他在kcp 之上又封装了一下 来做连接管理

kcwpcxri

kcwpcxri7#

看了一下kcptun和smux,它在kcp之上再来了一个包头。这样做是不修改kcp代码的最简单的搞法。但是有些地方感觉和kcp重复并且矛盾。例如加了一个包头之后就必须有len字段,这相当于udp->kcp->smux是包->流->包。因为上层协议通常会有长度字段,所以smux这个长度唯一的意义就是区分smux自己的包边界以便找到cmd字段。我觉得更好的方案应该是kcp直接提供一个shutdown函数,给对方发一个FIN包。语义上类似tcp的shutdown(send)。对方收到FIN包之后直接设置一个标志位即可。可以通过类似ikcp_gotfin()来获得这个标志。

rqqzpn5f

rqqzpn5f8#

可以参考我写的rust版kcp,因为需要,我内部实现了超时机制,在90s内没有收到包就认为超时。recv就会返回0,这样服务器内存压力也小很多,因为我们有个需求是设备一个月只给服务器发几次包

相关问题