为什么TCP和KCP互相可以通信?比如我Gate使用TCP的启动 Map使用KCP启动,为什么Gate可以将消息转化给Map而可以正常解析消息体, 是ET在应用层做了什么适配吗?没有看到相关代码,求解答。
gxh_1995 跟协议没关系,解析消息体是protobuf或memorypack的事情,都是二进制流转化成对应的类
evalli 消息体是二进制流没有问题,可他们之间的protocol不同,在传输层就会被丢弃吧?onRead可能都不会触发,我理解的是这样的。
gxh_1995 协议不同没太大影响的, 我没去看9.0的代码,我的理解是:不管什么协议发的包,都是按定义的包的格式,发送的一串二进制流, 处理好粘包和拆包就好了。 不管是tcp发kcp收,还是kcp发tcp收,本质都是收到一堆数据包, 剩下来的时候是怎么从这些包拆出一个完整的消息出来, 这就是拆包的逻辑了。
9.0之前NetInnerComponent,9.0ProcessOuterSender。 TCP和KCP都不是一个层的东西,TCP传输层,KCP应用层。KCP包体在UDP,TCP的Data部分。
gxh_1995
evalli 嗯嗯,感谢解答
IxbxAx 协议不同在网络传输时不时应该被自动丢弃了吗 为什么Gate(TCP)发往Map(KCP)能被正确发送并接收呢
gxh_1995 可能看错了吧,内网都是KCP
gxh_1995 Gate对外开的TCP吧,内网协议也改成TCP了吗?
gxh_1995 不是协议不同就要被丢弃, 能被丢弃的原因是数据包没法正常解析出来, 不管什么协议发送的, 只要数据包能被正常解析,那就不会被丢弃
IxbxAx
我有修改过的,对外开放连接是tcp
IxbxAx 内网还是kcp
evalli 啊? 协议不同会被丢弃呀。在传输层解析网络包是协议不同就不会处理这个网络包了,上层都没有处理包的机会
gxh_1995 NetInnerComponent负责内网通信的
gxh_1995 Gate对外监听TCP端口,去处理玩家的连接。然后会把消息转发到其他进程。各个游戏进程监听了UDP端口去处理其他进程的内网连接。比如client=>gate=>map。有一步转发的过程,比如7.2 NetServerComponentOnRead那块儿代码。
IxbxAx 【然后会把消息转发到其他进程】:这里gate转发到map时,为啥map能收到数据呢,他们两的协议族都不同
gxh_1995 就是gate和map又创建了新的连接,udp包着kcp通信的。
IxbxAx 哦哦,意思是gate有两个连接吗?一个是对外的tcp协议,一个是对内的kcp,对外的socket收到数据,使用对内的kcp转发给其他进程
gxh_1995 √
IxbxAx 🤩 通了通了,感谢解答