Comments (17)
- conv是会话id。conv需要外部进行指定。例子中是hard code。实际使用中,可以客户端与服务器端进行协商。
- 包模式是会保留数据包的边界。会收到所有分片后才返回给外部。流模式没有这些。现在kcp-netty在包模式下,并没有将所有分片合成到一个ByteBuf里,而是将每个分片的ButeBuf都调用了一次channelRead,并在最后调用了一次channelReadComplete,以此来表示一个数据包的边界。我考虑之后可以增加一个开关,用来控制是否将数据合并到一个ByteBuf中。
from kcp-netty.
conv写死,serverchannel里根据clientsocket进行管理在大部分场景下是没有问题的。
client端用一个socket去handle多个kcp会话这种做法估计不存在。
from kcp-netty.
Hi @szhnet
conv是会话id。conv需要外部进行指定。例子中是hard code。实际使用中,可以客户端与服务器端进行协商
请问关于“协商”,是在什么时候/什么地方进行?因为我看demo里都是在channelActive
函数中set的,那么在channelActive
之前Server/Client应该怎么协商?
Hi @caoli5288
你的意思是指Server和所有Cilent都写死一个conv是没问题的吗?
from kcp-netty.
@yellowb 在kcp连接建立之前进行协商,用tcp,或者raw udp,或者其他协议如http。
仅限于kcp-netty的实现,conv写死是没问题的,因为kcp-netty根据channel.remoteAddress()保存会话。
from kcp-netty.
是的,可以在外部用tcp或者udp进行协商。
另外,kcp-netty也确实根据channel.remoteAddress()保存了会话。
from kcp-netty.
=
是的,可以在外部用tcp或者udp进行协商。
@szhnet 作者你好,请问能给出udp协商的 例子吗
from kcp-netty.
Hi @szhnet
conv是会话id。conv需要外部进行指定。例子中是hard code。实际使用中,可以客户端与服务器端进行协商
请问关于“协商”,是在什么时候/什么地方进行?因为我看demo里都是在
channelActive
函数中set的,那么在channelActive
之前Server/Client应该怎么协商?Hi @caoli5288
你的意思是指Server和所有Cilent都写死一个conv是没问题的吗?
我也有同样的疑问,看例子中是channelActive的时候设置了conv,但在实际应用中,此时服务端并不知道这个链接对应的客户端的conv的值,想问下楼主解决了这个问题了吗?
from kcp-netty.
服务端并不知道这个链接对应的客户端的conv的值
你可以把这个值存在channel的metadata里。虽然我并不知道这么做有什么用。前文我已经解释过了,kcp-netty根据channel.remoteAddress()保存会话
,事实上你在使用tcp时也是根据remoteAddress,存在conv只是因为udp本身并没有会话这种逻辑上的概念,你可以事实上复用端口开多个会话,但是为什么要这么做呢?
from kcp-netty.
@caoli5288 恩,可能暂时我们也不会使用conv这个字段
from kcp-netty.
发现有个UkcpChannelOption.UKCP_AUTO_SET_CONV
参数,服务端设置该参数,可以不需要提前设置conv,直接读取客户端传递过来的conv
from kcp-netty.
服务端用childOption(UkcpChannelOption.UKCP_AUTO_SET_CONV, true),客户端随机一个数值conv。只要客户端前后两次端口值和conv值不是一样即没问题。两个随机值都相同的可能性太小,理论上没问题。
from kcp-netty.
我这边使用时是通过tcp来进行协商的,conv是服务器端分配的,通过tcp告诉客户端,所以不会重复。把UkcpChannelOption.UKCP_AUTO_SET_CONV设置为true,就是为了先暂时接受客户端传过来的conv,然后消息传到上层,由服务器端上层逻辑判断conv是否合法(也就是判断conv是否与之前分配的一致)。
from kcp-netty.
@szhnet 恩,感觉你这种方式才是正确的。也是KCP文档里推荐的方式。但是目前我们客户端觉得这样需要一个KCP一个TCP两套逻辑,比较复杂,所以就没有搞,只用了一套方案。
from kcp-netty.
@caoli5288 大佬,有一个小问题。只根据remoteAddress标识会话是不是无法区分同一端口的前后两次连接。或者是旧报文的影响。就像是tcp即使有socket四元组后,也还是需要通过三次握手协商seq
仅限于kcp-netty的实现,conv写死是没问题的,因为kcp-netty根据channel.remoteAddress()保存会话。
from kcp-netty.
我简单了解过一点kcp-go的实现。 看起来也是通过remoteaddr来保存一条会话。在此基础再比较conv的值是否变化来判断连接状态。 conv则单纯由客户端随机生成,没有协商过程。这是一种最佳实践吗?请问目前比较流行怎么用呢
from kcp-netty.
RE: @TXYH1
只根据remoteAddress标识会话是不是无法区分同一端口的前后两次连接
所以为什么要复用同一个udp端口前后发起两次连接?
conv则单纯由客户端随机生成,没有协商过程。这是一种最佳实践吗?
这跟写死conv一样,都是讨巧的做法。最规范的做法是在kcp连接发起前,通过别的协议(如tcp)协商出一个conv出来,但规范不代表最佳,最佳实践这东西就看场景见仁见智了。
from kcp-netty.
@caoli5288 感谢大佬的回复
所以为什么要复用同一个udp端口前后发起两次连接
我只是感觉会不会存在一些特殊情况,比如在一条链接结束后,又用同一个端口重新建立了一条,或者断开重连了,同一时间只有一条链接,但是前后是不同两条链接了,避免旧包的影响啥的。
from kcp-netty.
Related Issues (20)
- 支持Epoll HOT 6
- kcp echo client为什么收不到server的响应? HOT 1
- 抛了KcpException,必须要断开连接吗 HOT 3
- 客户端ip或port发生变化时连接丢失,这种情况如何处理? HOT 3
- kcp使用中的几个问题
- 怎么用
- Client不能向Client发送消息吗? HOT 1
- 有协议的报文文档吗
- io.jpower.kcp.netty.KcpException: State=-1 after update() HOT 3
- 当客户端发包速度过快时,服务端只收到一部分消息包 HOT 2
- Kcp.peekSize出现空指针异常 HOT 2
- Bug反馈 HOT 1
- EventLoopGroup为什么像ServerBootstrap不分BossGroup和WorkGroup? HOT 2
- 发送包太大的bug HOT 2
- java.io.IOException: Conv inconsistency HOT 1
- 服务端存在大量的 ICMP input histogram destination unreachable: 146375480
- 支持Android吗? HOT 2
- 有没有什么 qq 交流群啊? HOT 2
- 示例里的 echo 和 rtt 分别是什么意思啊???(我刚接触 kcp)
- 速度远低于tcp协议
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kcp-netty.