TCP 粘包
2017-11-03
什么是粘包
TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的包头紧接着前一包数据的尾。
产生原因
- 发送方
TCP默认会使用Nagle算法,Nagle算法主要做两件事:1) 只有上一个分组得到确认,才会发送下一个分组;2) 收集多个小分组,当上一个确认到来后一同发送。
因此Nagle算法会导致粘包。
- 接收方
数据接收方会将接收到的TCP分组保存至接收缓冲区中,然后应用程序主动从缓冲区中读到分组,如果TCP接收分组的速度大于应用程序度分组的速度,多个包就会被存至缓存,应用程序读取时就会读到多个收尾相粘到一起的数据包。
处理方法
- 发送方
发送方造成的粘包现象主要由Nagle算法来解决,通过使用选项TCP_NODELAY将Nagle关闭即可。
- 接收方
需要再应用层进行处理。应用程序在处理从缓存读取的分组时,读完一条数据时应循环读取下一条数据,直到所有的数据都被处理。
数据长度
判断每条数据的长度的方法主要有两种:
- 格式化数据
每条数据有固定格式(开始符、结束符),这种方法简单易行,但是选择开始符和结束符时一定要注意每条数据的内部一定不能出现开始符或结束符。
- 发送长度
发送每条数据的时候,将数据的长度一并发送,根据数据包中的载荷长度来进行读取。