跳转至

自定义协议

协议概念

对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。想要在网络上不同架构、不同系统、不同编程语言间相互通信,就要约定一种相同的数据通信方式,这种方式就是协议。

自定义用户层协议,就要考虑使用哪种传输层协议:TCP 或 UDP。

UDP 比较简单,需要考虑的比较少,因为是面向数据报的协议,直接按约定好的数据格式传输数据即可。

这里主要介绍基于 TCP 的自定协议。

TCP 的问题

TCP 是面向字节流的,如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去,这个过程中就会把不同的数据混在一个 TCP 包中,导致粘包问题。

要处理粘包问题,就要想办法明确两个包之间的边界,这里有几种方法:

  • 采用特殊字符作为分隔,但这样就要求数据内容中不能包含用到的特殊字符,或者采用一些方法来转义数据正文的特殊字符。

  • 定长报文,这样的方法比较简单,但是确定也很明显,传输的数据大小很不灵活。

  • 报头 + 子描述字段,类似 HTTP 的实现方式,报头中使用 \r\n 的方式分隔不同的报头字段,在报头中规定数据正文的大小,我们这里实现的自定义协议也是采用这种方式。