网络开发高手请进,想问你们个netty服务器的问题
时隔N年,第二次在csdn发帖,不足之处,谢谢指正
由于笔者公司是做物联网这一块的,用到了tcp协议传递消息,笔者主要是负责tcp client这一块的开发,基本上逻辑很简单,连上服务器,发送认证,等待返回,如果成功、发送心跳、处理心跳返回,接受服务端的下发控制指令; 如果认证失败,超时后继续重连服务器,发送认证... 基本没有任何问题。如果说是客户端某些情况下无法重连服务器,那是客户端的bug。
就是服务端每次更新重启之后,大量客户端开始发送登录认证,就导致服务端出问题,表现现象如下:
1、有的客户端已经认证发送了,服务器也返回认证成功了,之后心跳都正常,服务端有时候显示设备还是离线,有时候显示在线,但是此时客户端不能收到任何服务器的控制消息,我说是服务端的问题,他说是我客户端的问题,根本扯不清
2、另外有这种情况,客户端拔掉电源,之后服务器重启,服务器显示设备还是在线,按理说,tcp服务重启之后,之前记录的所有的tcp会话id都没有意义了,所以一般不用持久化存储的对吧,都是保存在内存里面的吧,我不清楚为什么他们用的持久化存储
另外,不清楚那些诸如腾讯公司的qq、微信,包括认证,状态存储等等都是怎么tcp和服务器进行通讯的,先说说我们目前的设计问题点:
1、tcp消息传输限制在65535,因为他们设计的包头就两个字节,用的Netty分隔符解码器DelimiterBasedFrameDecoder,我个人觉得这样拆包效率太低,是不是应该考虑LengthFieldBasedFrameDecoder分包机制效率最高
2、tcp包运载效率太低,即使心跳包实际传输内容为空的情况下,还会产生62字节的数据包,因为他们要求每个tcp包都要把认证信息附带上,不清楚为什么这么做
3、按理说tcp只有第一次连接时候需要认证,之后只要当前tcp连接不断开,tcp会话id并不会发生变化,认证身份也不会发生变化,不需要每条消息都验证吧,个人觉得每次都校验数据包无故浪费大量服务器运算资源,也可能导致服务器在每次重启后瞬间根本处理不过来
4、他们所有tcp包数据做了xor运算,得到一个值,接收方每次都要计算一遍,但是不能实现加密,数据在公网上处于裸奔状态,另外tcp通讯已经实现可靠传输,个人觉得纯属多余
5、是不是应该考虑TLS加密,包括证书的认证,管理等等?