搜索
写经验 领红包
 > 情感

tcp粘包问题解决方法(tcp粘包问题环型存储)

导语:TCP粘包问题

一、什么是tcp粘包?

发送方发送的多个数据包,接收方接收时以一个数据包接收。

粘包

二、为什么会粘包?

TCP基于流式传输,造成粘包的原因有很多,主要有:

(1)发送方naggle算法的开启,会将多次间隔较小、数据量小的数据包合成一个大的数据块进行封包发送;

(2)接收方应用层处理不及时导致接收缓冲区堆积多个数据包后,下次再接收时会将多个数据包收到应用层一起处理。

三、为什么UDP不会粘包?

UDP是面向消息传输的,具有消息边界,即传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息。也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。而面向流则是指无保护消息保护边界的,如果发送端连续发送数据,接收端有可能在一次接收动作中,会接收两个或者更多的数据包。

由于UDP面向的是消息传输,它把所有接收到的消息都挂接到缓冲区的接受队列中,因此,它对于数据的提取分离就更加方便,但是当发送数据量较小的时候,会增加多次发送的系统发送开销(系统调用,写硬件等)和接收开销。

四、如何处理粘包问题?

循环处理:应用程序在处理读缓存分组时,读完一条数据就应该循环读下一条数据,直到所有的数据都被处理。但是如何判断每条数据的长度呢?

两种途径:

(1)格式化数据:每条数据有固定的格式(开始符、结束符);(不推荐)

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

本文内容由小迪整理编辑!