TCP“粘包”是什么?

我认为TCP粘包这个概念其实不太准确,因为TCP协议本身的特性就是基于字节流的传输协议,对于TCP层来说,是不存在粘包的概念的。我们常说的粘包,应该是基于TCP协议的应用层需要在读取数据时候面对的问题。所以TCP如何解决粘包也可以理解成应用层协议如何解析字节流数据。

造成粘包现象的原因可以分为三种:
①tcp协议本身的流式传输特性决定了接收端可以把发送方多次发送的数据一次接收到。
②TCP协议为了提高传输效率而启用了TCP_NODELAY,也就是Nagle算法,可以把间隔短、数据量小的数据合并一起,等待缓冲区满了再一起发送。
③接收方的接收工作线程处理不过来,造成接收方缓冲区粘包。

那么解决这种粘包现象。通常有以下几种方法:
①因为粘包问题是应用层需要解决的问题,因此可以在应用层发送数据时添加一个应用层数据结构的报文包头,常用的方法有:1.固定包头长度,接收方按固定长度读取;2.以指定的字符或者字符串作为结束标记,用来区分不同的数据流;3.采用包头+包体的格式,包头固定大小,并且包头中携带一个记录包体长度的字段,接收方根据固定包头长度读取到包体的长度,往缓冲区里读取相应长度的字节流数据。
②针对于TCP协议本身的特性,TCP提供了强制数据立即发送的push指令,不用等待缓冲区满了也可以立即发送。又或者是通过设置TCP_DELAY关闭Nagle算法,但是关闭了Nagle算法在大多数情况下会降低网络发送速率,不建议使用。
③针对接收方引起的粘包现象,可以通过优化程序设计,提高负责接收数据的进程的执行效率,比如可以把负责接收数据的工作线程的优先级提高。但是这种方法只是能减少出现粘包的可能性,不能完全避免粘包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值