序(CODEC)。
4. 针对TCP心跳的一些说明
TCP协议内容较多,有好几本大书,但核心内容,网上也转载很多,这里只提一些内容。
TCP如果不在初始化socket的时候给予超时timeout设定(看tcp类库支持哪些超时,一般如java io/NIO支持连接超时,传输超时等),那么默认就是2小时(120分钟),在120分钟内TCP协议内部自己有心跳维持socket连接通道,
超过120分钟,则按照状态机变化,两端都开始拆除TCP连接。当然,两端庄模块开发的如果不好,这就会导致对端有大量端口TIME_WAIT等等TCP状态机不能顺利,快速,高效的拆除并被复用,导致资源消耗,甚至耗光65535个port口。
除了TCP自身的超时,或者网络lib库能力范围内给予的连接超时,传输超时(闲置idle超时)外,桩模块可以人为的在逻辑层添加自己的超时和心跳机制。举例如下:
(1)收到PING,就发PONG,收到PONG,不响应;这是对等心跳探测包,有发起者探测对方是否活着alive;
(2)两边约定心跳间隔时间,比如每120秒发送心跳包(比如“HB”2个字符,或某种字节等),或者约定只有server发给client,不用反向;
特别说明:这是高层逻辑的心跳,应用层自己使用的,而且其实现根据前述3种使用方法而不同,比如你用TLV,那么也需要额外定义一个“心跳包”的协议;
5. 用哪些类库?
一般开发桩模块的时候,两端约定好传输协议,比如TLV,那么就各自开发。你用熟悉的语言比如java,而且会进一步使用现成的框架,比如netty(异步io框架),
这样你就不用赤裸的使用java的nio自己一步步处理,不用重复发明轮子。netty是一个非常好用的库,开发者同时也开发了mina,两个库有点类似,各有千秋和侧重。
详见我整理的[ITIS-资料集合贴]中的介绍和电子书;
6. 对接协议的的安全性问题
TCP是有连接,有状态,有序,丢包重传的,所以他有基础的正确性保证。但TCP完全会受到重传攻击,或侦听窃听,或篡改数据包等破坏方式。而且TCP保证的是网络层的字节流的按序正确到达,不保证上层逻辑(应用层)认为的数据是百分百正确的。所以,有如下建议:
(1)可以根据需求,对自己的数据进行编码,压缩,加密;
(2)可以参考一些开源的密钥,加密算法,认证,证书等协议的使用;
(3)曾经这样弄过,给payload转为base64,并且做了MD5摘要,传到对端MD5用来验证数据对不对,也可作为异步反馈的key值。
总结,总是TCP协议丰富多彩,如果熟悉一些框架和常用手段,再加上一些诸如MD5,加密压缩算法等,完全可以自己搭建和实现不同的传输协议,满足不同情况的要求,在两个对端桩模块之间实现数据的传递。
END