浅谈TCP粘包问题-----网络基础

浅谈TCP粘包问题

一、浅谈粘包问题

        粘包问题就是实际所取包的长度不等于规定包的长度(分俩种情况:情况一,实际所取包的长度大于规定包的大小;情况二:实际所取包的长度小于规定包的大小),也就是接收方多读或者少读数据导致的现象。粘包问题只会出现在TCP的长连接中,因为TCP面向字节流的,当长连接时才可能有多个数据报粘在一起的情况。

二、为什么UDP不会出现粘包问题

        1.对于UDP,如果如果还没有向上层交付数据,UDP的报文长度仍然存在。同时,UDP是一个一个将数据报交付给应用层的,有明确的数据边界。

        2.站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收。不会出现“半个”的情况。

三、粘包原因分析

        1.首先要明确,粘包问题中的“包”,是指应用层的数据包;

        2.在TCP的协议头中,没有如同UDP一样的“报文长度”这样的字段,但是有一个序号这样的字段;

        3.站在传输层的角度,TCP是一个一个报文过来的,按序号放置缓冲区中;

        4.站在应用层的角度,看到的只是一串连续的字节流数据;

5.那么那么应用程序看到了这么一连串的字节数据,就不知道从那个部分开始到那个部分,是一个完整的应用层数据包。

四、如何避免粘包问题

        归根结底就是需要明确俩个包之间的边界。(分以下三种情况进行讨论)

        1.对于定长的包,保证每次都按固定大小读取即可;

        2.对于变长的包,可以在包头的位置,约定一个总包长度的字段,从而就知道了包的结束位置;

        3.对于变长的包,还可以在包与包之间使用明确的分隔符(应用层协议,是程序猿自己定的,只要保证分隔符不与正文冲突即可)。

猜你喜欢

转载自blog.csdn.net/cyd_csdn/article/details/80433094
今日推荐