假如希望能在某些场合下用KCP取代TCP,是否需要在应用层上自行实现SYN和FIN,RST机制?(比如希望封装出类似connect/accept的函数,以及封装出shutdown/close函数。)我的理解是,KCP本身并不解决这些问题,例如当上层调用client调用ikcp_send(),上层是完全不知道对方是否有一个server在运行的。如果是TCP,对方会返回一个RST,下次调用recv或者send时就会失败。
怎么才能通过封装KCP达到这个类似TCP的效果?
8yoxcaq71#
先建立tcp链接,再把kcp帮到到tcp。看wiki
aiqt4smr2#
同时保持一个tcp来做连接和关闭有点奇葩,感觉不太干净。如果我基于KCP增加SYN和FIN的处理会有什么问题?需要注意哪些问题?
pnwntuvh3#
设计你可以参考下 kcptun 和 smux, 在kcp 之上再封装一层
esyap4oy4#
直接实现没问题,更麻烦而已,自己管理SYN/FIN之类的。
xzlaal3s5#
@notedit kcptun和smux是自己管理SYN/FIN吗?还是他们也是附带一个TCP来做连接管理?
vohkndzv6#
你可以读一下它的文档 �不需要tcp 他在kcp 之上又封装了一下 来做连接管理
kcwpcxri7#
看了一下kcptun和smux,它在kcp之上再来了一个包头。这样做是不修改kcp代码的最简单的搞法。但是有些地方感觉和kcp重复并且矛盾。例如加了一个包头之后就必须有len字段,这相当于udp->kcp->smux是包->流->包。因为上层协议通常会有长度字段,所以smux这个长度唯一的意义就是区分smux自己的包边界以便找到cmd字段。我觉得更好的方案应该是kcp直接提供一个shutdown函数,给对方发一个FIN包。语义上类似tcp的shutdown(send)。对方收到FIN包之后直接设置一个标志位即可。可以通过类似ikcp_gotfin()来获得这个标志。
rqqzpn5f8#
可以参考我写的rust版kcp,因为需要,我内部实现了超时机制,在90s内没有收到包就认为超时。recv就会返回0,这样服务器内存压力也小很多,因为我们有个需求是设备一个月只给服务器发几次包
8条答案
按热度按时间8yoxcaq71#
先建立tcp链接,再把kcp帮到到tcp。看wiki
aiqt4smr2#
同时保持一个tcp来做连接和关闭有点奇葩,感觉不太干净。如果我基于KCP增加SYN和FIN的处理会有什么问题?需要注意哪些问题?
pnwntuvh3#
设计你可以参考下 kcptun 和 smux, 在kcp 之上再封装一层
esyap4oy4#
直接实现没问题,更麻烦而已,自己管理SYN/FIN之类的。
xzlaal3s5#
@notedit kcptun和smux是自己管理SYN/FIN吗?还是他们也是附带一个TCP来做连接管理?
vohkndzv6#
你可以读一下它的文档 �不需要tcp 他在kcp 之上又封装了一下 来做连接管理
kcwpcxri7#
看了一下kcptun和smux,它在kcp之上再来了一个包头。这样做是不修改kcp代码的最简单的搞法。但是有些地方感觉和kcp重复并且矛盾。例如加了一个包头之后就必须有len字段,这相当于udp->kcp->smux是包->流->包。因为上层协议通常会有长度字段,所以smux这个长度唯一的意义就是区分smux自己的包边界以便找到cmd字段。我觉得更好的方案应该是kcp直接提供一个shutdown函数,给对方发一个FIN包。语义上类似tcp的shutdown(send)。对方收到FIN包之后直接设置一个标志位即可。可以通过类似ikcp_gotfin()来获得这个标志。
rqqzpn5f8#
可以参考我写的rust版kcp,因为需要,我内部实现了超时机制,在90s内没有收到包就认为超时。recv就会返回0,这样服务器内存压力也小很多,因为我们有个需求是设备一个月只给服务器发几次包