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 思否