有关TCP粘包

TCP粘包

1 TCP协议

首先回顾一下TCP协议

  1. TCP 是面向连接的传输层协议。

  2. 每一条 TCP 连接只有两个端点,每一条 TCP 连接只能是点对点的(一对一)。

  3. TCP 提供可靠的交付服务,保证传输的数据无差错、不丢失、不重复且有序。

  4. TCP 提供全双工通信,TCP 允许通信双方的应用进程在任何时候都能发送数据,为此 TCP 连接的两端都设有发送缓存接收缓存,用来临时存放双向通信的数据。

  5. 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的解决办法

发送的文件都是以XML形式进行包装;XML文件必然是有头有位且分明

posted @   Felm  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示