【计网】一起聊聊TCP的粘包拆包问题吧

这篇具有很好参考价值的文章主要介绍了【计网】一起聊聊TCP的粘包拆包问题吧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、介绍

在TCP中,粘包和拆包问题是十分常见的,如基于TCP协议的RPC框架、Netty等。

粘包(Packet Stickiness)指的是在网络通信中,发送方连续发送的多个小数据包被接收方一次性接收的现象。这可能是因为底层传输层协议(如TCP)会将多个小数据包合并成一个大的数据块进行传输,导致接收方在接收数据时一次性接收了多个数据包,造成粘连

拆包(Packet Splitting)指的是在网络通信中,发送方发送的一个大数据包被接收方拆分成多个小数据包进行接收的现象。这可能是因为底层传输层协议(如TCP)将一个大数据包拆分成多个小的数据块进行传输,导致接收方在接收数据时分别接收了多个小数据包,造成拆开

来自于百度词典:粘包读zhān bāo而非nián bāo

2、为什么会出现粘包/拆包问题

2.1、TCP协议

那就需要先了解 TCP 的定义。TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

其中跟粘包/拆包关系最大的就是基于字节流这个特点。字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。这些 01 串之间没有任何边界。

tcp拆包粘包,计算机网络,tcp/ip,网络,网络协议

应用层传到 TCP 协议的数据,不是以消息报为单位向目的主机发送,而是以字节流的方式发送到下游,这些数据可能被切割和组装成各种数据包,接收端接收到这些数据包后没有正确还原之前的消息,因此出现粘包/拆包现象。

2.2、粘包问题

由于TCP是面向流的协议,发送方将数据流切割成数据块并通过网络发送,而接收方则将接收到的数据块重新组装成数据流。当发送方连续发送多个小数据块时,这些数据块可能会被合并成一个大的数据块,从而产生粘包现象。造成粘包问题的主要原因有以下几点:

  • 数据发送速度快于接收方处理速度:当发送方连续发送多个小数据块时,由于网络传输延迟等原因,接收方的缓冲区可能无法及时处理所有数据块,从而导致这些数据块被合并成一个大的数据块;
  • TCP缓冲区合并:TCP协议在发送端和接收端都有缓冲区,TCP层可能在缓冲区中将多个小数据块合并为一个大数据块再进行传输。

2.3、拆包问题

同样,由于TCP是面向流的协议,发送方将数据流切割成数据块并通过网络发送,而接收方则将接收到的数据块重新组装成数据流。当发送方发送一个较大的数据块时,在网络传输过程中,可能会被拆分成多个小的数据块进行传输,从而产生拆包现象。造成拆包问题的主要原因有以下几点:

  • 数据发送速度慢于接收方处理速度:当发送方发送一个较大的数据块时,由于网络传输延迟等原因,接收方的缓冲区可能无法一次性接收所有数据块,从而导致数据被拆分成多个小的数据块;
  • TCP缓冲区拆分:TCP协议在发送端和接收端都有缓冲区,TCP层可能在缓冲区中将一个大数据块拆分成多个小数据块再进行传输。

3、粘包/拆包场景

因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。

如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。

如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就形成了拆包问题。

关于粘包和拆包可以参考下图的几种情况:

  • 正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
  • 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
  • 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
  • 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。

tcp拆包粘包,计算机网络,tcp/ip,网络,网络协议

4、解决方案

4.1、固定长度的数据包

发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

下图每个包的固定长度为 4,接收端很容易进行区分。

tcp拆包粘包,计算机网络,tcp/ip,网络,网络协议

4.2、特殊字符或标记

在数据包中使用特殊的字符或标记来标识数据包的边界,接收端根据特殊字符或标记进行数据解析和处理。

如下图,在每个包的后面加上特殊字符:/

tcp拆包粘包,计算机网络,tcp/ip,网络,网络协议

4.3、消息头

在数据包的开头添加一个消息头,用来记录数据包的长度或其他信息,接收端先读取消息头来确定数据包的长度,然后根据长度进行数据解析和处理。

如下图,在每个包前面加上包的实际长度。

tcp拆包粘包,计算机网络,tcp/ip,网络,网络协议

当然,还有一种常见的方法就是通过自定义协议进行粘包和拆包的处理。但对于个人开发而已,这种成本就相对比较高了。

5、为什么UDP没有粘包/拆包问题

UDP(User Datagram Protocol)是一个无连接的、不可靠的传输协议,与TCP不同,它并不提供像TCP那样的可靠数据传输和流控制机制。因为UDP没有像TCP那样的字节流特性,所以在UDP中不存在粘包和拆包问题

在UDP中,每个数据报(Datagram)都是独立的,包含了完整的数据和目标地址信息。每次发送的数据都会被封装成一个独立的数据报,而接收端也会逐个接收每个数据报,不会将多个数据报合并成一个大的数据块,也不会将一个大的数据块拆分成多个小的数据块。

由于UDP的无连接特性,它不会进行流控制、拥塞控制和重传等机制,因此在传输过程中可能会丢失数据包,也可能会乱序。但是,由于每个数据报都是独立的,所以在UDP中不存在粘包和拆包问题文章来源地址https://www.toymoban.com/news/detail-848319.html

到了这里,关于【计网】一起聊聊TCP的粘包拆包问题吧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity-TCP-网络聊天功能(一): API、客户端服务器、数据格式、粘包拆包

    TCP是面向连接的。因此需要创建监听器,监听客户端的连接。当连接成功后,会返回一个TcpClient对象。通过TcpClient可以接收和发送数据。 VS创建C# .net控制台应用 项目中创建文件夹Net,Net 下添加TCPServer.cs类,用来创建TCPListener和Accept客户端连接,实例化一个TCPServcer放在Main函数

    2024年02月07日
    浏览(65)
  • workerman 自定义的协议如何解决粘包拆包

    前言:         由于最近在使用 workerman 实现 Unity3D 联机游戏的服务端,虽然也可以通过 TCP 协议直接通信,但是在实际测试的过程中发现了一些小问题。         比如双方的数据包都是字符串的方式吗,还有就因为是字符串就需要切割,而有时候在客户端或服务端接收时都

    2024年02月09日
    浏览(38)
  • Netty编解码器,Netty自定义编解码器解决粘包拆包问题,Netty编解码器的执行过程详解

    当Netty发送或者接收一个消息的时候,就会发生一次数据转换。入站消息会被解码(从字节转换为另一种格式,比如java对象);出站消息会被编码成字节。 Netty 提供一系列实用的编解码器,他们都实现了 ChannelInboundHadnler 或者 ChannelOutboundHandler 接口。在这些类中,channelRead 方

    2023年04月23日
    浏览(43)
  • Netty自定义应用层协议逃不开的粘包和拆包处理

    导致一次发送的数据被分成多个数据包进行传输,或者多次发送的数据被粘成一个数据包进行传输 使用TCP进行数据传输时,TCP是一种有序的字节流,其中是一个一个的数据报文发送到系统的缓冲区中。因此在发送端和接收端之间无法保证数据的分割和边界。这就可能导致数据

    2023年04月23日
    浏览(97)
  • Tcp的粘包和半包问题及解决方案

    目录 粘包: 半包: 应用进程如何解读字节流?如何解决粘包和半包问题? ①:固定长度 ②:分隔符 ③:固定长度字段存储内容的长度信息 一次接收到多个消息,粘包 应用进程无法从一个粘包中解析出数据 出现粘包的原因: ①:发送方每次写入数据内核缓冲区大小;导致

    2024年02月11日
    浏览(34)
  • TCP粘包和拆包问题及其解决方法

    含义: TCP 传输协议是面向流的,没有数据包界限,也就是说消息无边界。客户端向服务端发送数据时,可能将一个完整的报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大的报文进行发送。(TCP协议的底层,并不了解上层业务的具体定义,它会根据TCP缓冲区

    2023年04月21日
    浏览(40)
  • 解决TCP粘包/拆包问题的方法及示例

    TCP粘包和拆包是网络编程中常见的问题,特别是在数据传输的过程中,可能会发生将多个数据包粘在一起或将一个数据包拆成多个数据包的情况,这可能会导致应用程序无法正确解析数据,从而造成数据错误或系统故障。本文将介绍TCP粘包和拆包的原因、解决方案以及两个示

    2024年02月10日
    浏览(45)
  • Socket TCP/IP协议数据传输过程中的粘包和分包问题

    一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解: 下面对上面的图进行解释: 1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。 2.粘包情况:Socket Client发送的数据包,

    2024年02月12日
    浏览(42)
  • 粘包/拆包问题一直都存在,只是到TCP就拆不动了。

    OSI open-system-Interconnection TCP/IP 5层协议栈 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api TCP/UDP 概况 TCP粘包问题 TCP/IP报头深思 定义了网络框架,以层为单位实现协议,同时控制权逐层传递。 OSI实际并没有落地,TCP/IP 5层协议栈是目前主流的落地实现 。 TC

    2024年02月03日
    浏览(68)
  • 网络编程:TCP粘包问题——各层粘包/拆包、Nagle 算法、Go实现长度字段协议解决TCP粘包、使用TCP的应用层协议设计

    1.1 TCP介绍 如上图,TCP具有面向连接、可靠、基于字节流三大特点。 字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。纯裸TCP收发的这些 01 串之间是没有任何边界的,你根本不知道到哪个地方才算一条完

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包