TCP粘包/拆包

        熟悉TCP编程的读者可能都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。下面具体介绍下TCP粘包/拆包问题以及解决之道。

        TCP是个“流”协议,所谓流,就是没有界限的一串数据。大家可以想想河里的流水,它们是连成一片的,其间并没有分界线。

问题:

                                

        TCP粘包:socket读取时,读到了实际意义上的两个或多个数据包的内容,同时将其作为一个数据包进行处理。

        TCP拆包:socket读取时,没有完整地读取一个数据包,只读取一部分。

解决方式:

        粘包/拆包问题一般的处理方式有四种:

         1、数据段定长处理,位数不足的空位补齐。

         2、消息头+消息体,消息头中一般会包含消息体的长度,消息类型等信息,消息体为实际数据体。

         3、特殊字符(如:回车符)作为消息数据的结尾,以实现消息数据的分段。

         4、复杂的应用层协议,这种方式使用的相对较少,耦合了网络层与应用层。

        上面的四种方式目的都是为了将数据在流中精确分开以便进一步解析处理,在自定义的协议中,第二种方式用的比较多,因为它更能满足定制化协议开发需求,比如自定义Netty协议时可以将具体数据报文放入消息体,消息头中根据需要放入其他变量(如:消息类型,此处可以具体对应到维护netty长链接的心跳消息、客户端请求消息、服务端处理结果消息等)。

猜你喜欢

转载自my.oschina.net/u/3345762/blog/1543648