- UDP是个“数据包”协议,两段数据间是有界限的,在接收端要么接收不到数据要么就是接收一段完整的数据。
- TCP是个“流”协议,是没有界限的一串数据。连续调用两次send分别发送两段数据date1和date2,接收端可以出现的接收情况:
- 先接收到date1,然后接收到date2;
- 先接收到date1的部分,然后接收到date1余下部分和date2;
- 先接收到date1全部和date2部分,然后接收到date2余下的部分;
- 一次性接收到date1和date2的全部数据。
上述2、3、4就会产生粘包现象,就需要把接收到的数据进行拆包,拆成一个个独立的数据包,而为了拆包就必须在发送端进行封包。
产生粘包的原因:
- 由Nagle算法1造成的发送端粘包:Nagle算法是一种改善网络传输效率的算法,但也可能造成困扰。
- 接收端接受不及时造成的接收端粘包:当应用层由于某些原因未能及时从TCP缓冲区取出数据,就会造成TCP缓冲区中存放了多段数据。
封包
封包就是给一段数据加上包头,这样一来数据包就分为包头和包体两部分内容了。包头其实是个大小固定的结构体,其中有个结构体成员变量表示包体的长度。根据固定的包头长度以及包头中含有的包体长度的变量值就能正确的拆分出一个完整的数据包。
Nagle算法详见【后台开发】【TCP/IP】TCP协议选项—>Nagle算法。 ↩︎