面试六--TCP粘包问题

本文探讨了流式传输协议的特点,如实时性、低延迟和按需传输,以及TCP粘包现象的出现原因,包括Nagle算法和接收缓存的影响。还介绍了如何通过标准协议封装和数据头来避免粘包,并指出UDP协议不会出现粘包的情况。
摘要由CSDN通过智能技术生成

1.流式传输协议

        流式传输协议(Streaming Protocol)是一种用于在网络上传输数据的通信协议,它允许数据以连续的流的形式进行传输,而不是一次性发送完整的数据包。流式传输协议即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志。

流式传输协议的关键特点包括:

1. 实时性:数据可以边生成边传输,无需等待所有数据都准备好后再发送。

2. 低延迟:流式传输减少了数据传输的延迟,使得接收端可以更快地接收到数据。

3. 可扩展性:流式传输协议通常设计为可以处理大量并发连接,这对于需要同时服务多个用户的服务尤其重要。

4. 容错性:即使在网络不稳定的情况下,流式传输协议也能够通过重传丢失的数据包来维持数据的完整性。

5. 按需传输:流式传输可以根据接收端的请求动态调整传输的数据,例如,视频流可以根据用户的带宽和设备性能调整分辨率。

2. TCP粘包问题

        粘包出现的根本原因是不确定消息的边界。接收端在面对"无边无际"的二进制流的时候,根本不知道收了多少 01 才算一个消息。一不小心拿多了就说是粘包。其实粘包根本不是 TCP 的问题,是使用者对于 TCP 的理解有误导致的一个问题。TCP 的首部没有表示数据长度的字段

        发送方在发送数据时未按照正确的消息边界进行划分,或者接收方在接收数据时未按照正确的方式进行解析和处理。

        2.1 出现的原因

https://segmentfault.com/a/1190000039691657

(1)发送方原因

TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:

只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题

(2)接收方原因

TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

        2.2 解决方法

TCP数据粘包的处理 | 爱编程的大丙 (subingwen.cn)

1. 使用标准的应用层协议(比如:http、htps)来封装要传输的不定长的数据包

2. 加入标志,但是在接收的时候按字节寻找标志的时候,浪费时间

3. 加入数据头,表示数据长度

 

3. udp不会发生粘包

硬核图解|tcp为什么会粘包?背后的原因让人暖心 - golang小白成长记 - SegmentFault 思否

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值