网络基础 — TCP粘包浅析

TCP粘包浅析





粘包问题其实呢还是很容易理解的,从缓冲区来看,后一包的数据的头部紧接着前一包数据的尾部,使得接收方不能准确的读取一包数据,也就是

收方多读或少读一包数据所造成的现象就是粘包现象. 粘包问题只会在TCP的长连接时才可能发送,因为TCP是面向字节流的,以流的方式处理数

据, 当长连接时才可能有多个数据报粘在一起的情况. UDP是面向数据包的,有固定的消息边界.


为什么会出现粘包



粘包既可能是发送方需要等待缓冲区满了之后才发送数据造成的,也有可能是接收方来不及接受缓冲区的包,造成多个包一起接受的现象. 

发送方造成的粘包: 粘包是由TCP协议本身造成的,TCP协议为了提高传输效率,发送方往往要收集足够多的数据后才发送出去,若是连续几次发送

数据都很少,通常TCP会根据算法把这些数据合成一个包然后发送出去,这样接收方就会出现粘包.

接收方造成的粘包:接受方会把发送方的数据先放到缓冲区当中,应用程序再从缓冲区中取数据,若是下一包数据到达时前一包数据没有被应用取

走,则下一包数据就黏在前一包的尾部. 应用程序根据预先设定的缓冲区的大小从系统接收缓冲区当中取数据,这样就一次提取了多个数据包.

怎样避免粘包



HTTP的避免粘包的三种方式:

1.使用回车换行符作为分隔,也就是以空行作为消息报头的结束

2. 以固定的方式读取消息报头,http消息报头中每一行都是一个完整内容

3..给出数据报的大小,按照大小读取. http的消息报头中有一个Content_Length字段标记消息正文的大小.


所以根据http协议,我们至少有三种方式来避免粘包:

1.添加分隔符,来标识每一包数据的起始和结束

2.发送方将数据结构化,接收方按照结构读取

3.发送方在发送的时候,在首部加上数据报的大小,接收方在接受的时候先解析出大小,再按照大小读取数据.


猜你喜欢

转载自blog.csdn.net/dawn_sf/article/details/79231085
今日推荐