在讲粘包问题之前,首先得明白这个包是应用层的数据包。
当数据在传输层时,由于TCP是面向字节流的,所以它看到的数据是按照顺序一个个放在缓冲区中的,而对于应用层而言,看到的只是一连串的数据,那么应用层该从哪里读数据,读到哪合适呢?因此就有了粘包问题。
所以要避免粘包问题,就得明确两个包之间的边界:
- 对于定长的数据包,保证每次都按固定的大小读取即可;
- 对于变长的包,可在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
- 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是我们自己写的,只要保证分隔符不和正文冲突即可)
若传输层是UDP协议,应用层会不会出现粘包问题?
- 对于UDP而言,报文长度是固定的,就算没有交付,长度依然在,同时,UDP是一个一个把数据交付给应用层的,就有很明显的边界
- 站在应用层的角度,每次收到的UDP报文,要么是一整个,要么不收,不会出现半个的情况