网络游戏中使用TCP处理粘包的两种思路

    TCP作为面向连接的、可靠的、基于字节流的传输层网络通讯协议,应用非常广泛。由于是基于字节流的网络协议,我们使用TCP协议进行网络通讯,底层会将发送的数据进行拆分组合,这样一般都会遇到粘包和半包的问题。一般我们为了解决粘包问题,解决粘包和半包问题有两种思路:

  1. 将发送数据封装成包,就像TCP协议一样加一个包头。
  2. 使用分隔符,对发送数据时在数据尾部加入分割符。

 

     第一种方式处理粘包,可以在要发送数据的首部加2字节大小的包头储存数据包的长度,在数据结束位置加一个字节的包尾用来校验数据。校验值等于循环数据的每个字节按位异或的最终值。

     一般网络游戏服务器中比如手游会采用第一种方式处理粘包问题,在设计协议时都会考虑粘包问题,每一条协议都包含协议头和协议体。而设计协议头时就需要考虑粘包问题,而协议体便是我们要发送的数据。

协议头:

struct protocol_head_t
{
   unsigned short tag;  // 0xFBFC 先导码标志消息起始
   unsigned short len;  // 数据包的长度,用来处理TCP粘包
   unsigned char  tp; // 标志协议体格式,json协议格式、Protocol Buffer协议格式等等
   unsigned short  msg_id; // 协议号用于区分协议数据,根据协议号解析数据
}__attribute__((packed));//取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,GCC特有的语法。

     第二种方式是添加分隔符,一般是用\r\n来作为分隔符,因为http请求便是用\r\n作为分割符。有些游戏中会用到websocket协议。websocket跟一般http协议不同,它是长连接的,能够实现web端与服务器间通讯。而在H5标准中底层实现了websocket协议,所以在H5网页游戏、微信小游戏、抖音小游戏中会用到用\r\n来作为分隔符,服务器端实现websocket进行通讯。

    我们在处理粘包问题时,可以作为参考,选择合适地方式处理TCP的粘包和半包问题,根据实际情况设计协议用于网络通讯

猜你喜欢

转载自blog.csdn.net/qq_19825249/article/details/108453972
今日推荐