有关TCP粘包
1 TCP协议
首先回顾一下TCP协议
-
TCP
是面向连接的传输层协议。 -
每一条
TCP
连接只有两个端点,每一条TCP
连接只能是点对点的(一对一)。 -
TCP
提供可靠的交付服务,保证传输的数据无差错、不丢失、不重复且有序。 -
TCP
提供全双工通信,TCP
允许通信双方的应用进程在任何时候都能发送数据,为此TCP
连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。 -
TCP
是面向字节流的。 虽然应用程序和TCP
的交互是一次一个数据块(大小不等),但TCP
把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
2 什么是粘包与拆包
要彻底搞懂粘包,首先要搞清楚一连串问题
(1)为什么数据要切片
答:MTU 与 MSS 的规定,东西太多一次带不走
网络 ==》 水管
水管的粗细 ==》MTU
由网络接口层提供给网络层最大一次传输数据的大小;一般 MTU=1500 Byte。
最多能通过的流量 ==》MSS
TCP 提交给 IP 层最大分段大小;不包含 TCP Header 和 TCP Option,只包含 TCP Payload
(2)什么是粘包
答:李东亚 健康终结者
(3)为什么会出现粘包
TCP:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
答:字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。这些 01 串之间没有任何边界。
应用层传到 TCP 协议的数据,不是以消息报为单位向目的主机发送,而是以字节流的方式发送到下游,这些数据可能被切割和组装成各种数据包,接收端收到这些数据包后没有正确还原原来的消息,因此出现粘包现象。
(4)为什么要组装发送的数据
答:东西太少,能走一趟不走两趟 AND 前人留了烂摊子还得后人去收拾
来自 Nagle 算法的优化
(5)关掉Nagle算法就不会粘包了吗?
答:并不会;接收端因为应用层的繁忙没及时取数据,也会造成TCP的数据堆积发送粘包。本质还是分不清边界
3 如何处理粘包
关于粘包的处理,一般考虑从应用层出发解决
-
消息长度固定
-
特定分隔符
-
消息长度 + 消息内容
🌰举两个栗子🌰
HTTP的解决办法
-
报文长度字段 Content-Length;用于指示报文的长度。
接收方在接收到报文后,根据Content-Length字段来判断报文的边界,从而正确解析数据。
-
报文分割符;有一定局限性
HTTP协议还可以通过在报文中添加分割符来解决TCP粘包问题。发送方在发送数据时,在每个数据包之间添加一个分割符,接收方根据分割符来判断每个数据包的边界,从而正确解析数据。
XMPP的解决办法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述