在计算机技术体系中存在很多网络通信协议。那么通信协议的本质究竟是什么呢?其实,通信协议实质上就是一段数据,通信双方事先约定好按照规定的格式去编码和解码,最终达到传输消息的目的。而对通信协议的设计与处理其中隐藏着许多问题
从TCP协议说起
TCP是一种流式协议,所谓流式协议就是说协议的内容是流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地给这些内容划分边界。
如果没有人为地划分边界,那会发生什么问题呢?
举个例子,A和B进行TCP通信,A先后给B发送了两个大小分别是100字节和200字节的数据包,那么A是怎么收到数据包的呢?B可能先后收到100字节和200字节的数据包,也可能先后收到100、100和100的数据包…
作为发送方的A来说,A是知道如何划分这两个数据包的界限的,但是对于B来说,如果不人为规定将多少字节作为一个数据包,则B是不知道应该将收到的字节数据中的多少字节作为一个有效的数据包的。
这就引出了一个问题:粘包问题
如何解决粘包问题
什么是粘包问题?所谓粘包,就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中收到的数据包数量可能大于1个,当大于1个时,可能是几个(包括一个)包加上某个包的部分,或者干脆几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫作半包。
无论是半包问题还是粘包问题,因为TCP是流式数据格式,所以其解决思路还是从收到的数据中把包与包的边界区分出来,一般有以下三种方法:
(1