Custom Protocol
协议概念
对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。想要在网络上不同架构、不同系统、不同编程语言间相互通信,就要约定一种相同的数据通信方式,这种方式就是协议。
自定义用户层协议,就要考虑使用哪种传输层协议:TCP 或 UDP。
UDP 比较简单,需要考虑的比较少,因为是面向数据报的协议,直接按约定好的数据格式传输数据即可。
这里主要介绍基于 TCP 的自定协议。
TCP 的问题
TCP 是面向字节流的,如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去,这个过程中就会把不同的数据混在一个 TCP 包中,导致粘包问题。
要处理粘包问题,就要想办法明确两个包之间的边界,这里有几种方法:
-
采用特殊字符作为分隔,但这样就要求数据内容中不能包含用到的特殊字符,或者采用一些方法来转义数据正文的特殊字符。
-
定长报文,这样的方法比较简单,但是确定也很明显,传输的数据大小很不灵活。
-
报头 + 子描述字段,类似 HTTP 的实现方式,报头中使用
\r\n
的方式分隔不同的报头字段,在报头中规定数据正文的大小,我们这里实现的自定义协议也是采用这种方式。