TCP粘包现象

粘包现象算法

TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。缓存

粘包现象产生的缘由:并发

发送缘由:循环

(1)发送方缘由程序

  咱们知道,TCP默认会使用Nagle算法。而Nagle算法主要作两件事:1)只有上一个分组获得确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一块儿发送。方法

  因此,正是Nagle算法形成了发送方有可能形成粘包现象。数据

2)接收方缘由格式化

  TCP接收到分组时,并不会马上送至应用层处理,或者说,应用层并不必定会当即处理;实际上,TCP将收到的分组保存至接收缓存里,而后应用程序主动从缓存里读收到的分组。这样一来,若是TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一块儿的包。

 

处理粘包问题:

(1)发送方

  对于发送方形成的粘包现象,咱们能够经过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。

(2)接收方

TCP并无处理接收方粘包现象的机制,只能在应用层进行处理。

(3)应用层处理

解决方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到全部的数据都被处理;

 

两种途径:

    1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候必定要注意每条数据的内部必定不能出现开始符或结束符;

    2)发送长度:发送每条数据的时候,将数据的长度一并发送,好比能够选择每条数据的前4位是数据的长度,应用层处理时能够根据长度来判断每条数据的开始和结束。