TCP“粘包”是什么?
Posted 每天告诉自己要努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP“粘包”是什么?相关的知识,希望对你有一定的参考价值。
我认为TCP粘包这个概念其实不太准确,因为TCP协议本身的特性就是基于字节流的传输协议,对于TCP层来说,是不存在粘包的概念的。我们常说的粘包,应该是基于TCP协议的应用层需要在读取数据时候面对的问题。所以TCP如何解决粘包也可以理解成应用层协议如何解析字节流数据。
造成粘包现象的原因可以分为三种:
①tcp协议本身的流式传输特性决定了接收端可以把发送方多次发送的数据一次接收到。
②TCP协议为了提高传输效率而启用了TCP_NODELAY,也就是Nagle算法,可以把间隔短、数据量小的数据合并一起,等待缓冲区满了再一起发送。
③接收方的接收工作线程处理不过来,造成接收方缓冲区粘包。
那么解决这种粘包现象。通常有以下几种方法:
①因为粘包问题是应用层需要解决的问题,因此可以在应用层发送数据时添加一个应用层数据结构的报文包头,常用的方法有:1.固定包头长度,接收方按固定长度读取;2.以指定的字符或者字符串作为结束标记,用来区分不同的数据流;3.采用包头+包体的格式,包头固定大小,并且包头中携带一个记录包体长度的字段,接收方根据固定包头长度读取到包体的长度,往缓冲区里读取相应长度的字节流数据。
②针对于TCP协议本身的特性,TCP提供了强制数据立即发送的push指令,不用等待缓冲区满了也可以立即发送。又或者是通过设置TCP_DELAY关闭Nagle算法,但是关闭了Nagle算法在大多数情况下会降低网络发送速率,不建议使用。
③针对接收方引起的粘包现象,可以通过优化程序设计,提高负责接收数据的进程的执行效率,比如可以把负责接收数据的工作线程的优先级提高。但是这种方法只是能减少出现粘包的可能性,不能完全避免粘包。
以上是关于TCP“粘包”是什么?的主要内容,如果未能解决你的问题,请参考以下文章