TCP粘包问题

        TCP是一种可靠、顺序、耗资的传输协议,UDP则反之。

         关于TCP的粘包问题

       首先,关于传输层协议中的TCP和UDP两种协议,其中只有TCP会出现这个沾包的问题,因为,TCP是流式套接字传输的,传输的时候是字节流传输,是没有消息保护边界的,无法区分哪里是消息的开始,哪里是消息的结束。而UDP协议则相反,他是通过数据报传输的,接收方一次只接受一条独立的信息,其具有消息保护边界,所以不用考虑沾包的问题。

        关于TCP沾包产生的原因,其实可以分为两类,一种是发送方需要等缓冲区满才发出去,此时就会将多个小的数据包合在一起发送,另一种是TCP会把接收到的数据存放在缓冲区中,然后通知应用层取数据,如果应用层取数据取得不及时,就会导致缓冲区有多个数据包堆在一起。

         并不是所有的粘包问题都需要进行处理,如果传输的数据是没有啥结构的,比如说文件传输,这就不需要去分包,但倘若传输的数据是带结构的数据,此时就不能混为一谈,需要分包。

        关于接收方造成的沾包问题,其实是由于发送端采用了优化算法Nagle,可以试着将其关闭,来避免发送方将较小的数据包合并发送。但这种做法显然无法解决另一种产生沾包问题的可能。并且这种做法会降低网络传输的效率,进而影响程序的性能,一般不用

         对于接收方缓冲区处理造成的粘包,可以优化应用层的处理程序,提高其接收效率,但这种做法显然无法做到百分百解决粘包的问题,只能说是可以改善。

         当然,在思考问题的时候,可以从TCP的无消息保护边界性入手,我们可以在发送数据的时候将数据的长度也发送给接收一方,接收方先收到数据的大小信息,然后根据这个大小信息再去接收发送方发过来的真正的数据内容。当然也可以在发送时,做特殊的标记做间隔来区分消息,或者也可以固定消息的长度进行发送。

 

 

 

你可能感兴趣的:(linux学习历程,tcp/ip,网络,服务器)