TCP粘包与拆包之一

数字踏浪使
• 阅读 3100

TCP粘包/拆包

什么是TCP粘包/拆包问题
TCP以流方式传输,是没有界限的一串数据,并没有消息边界。
- TCP传输数据时,会根据底层的TCP缓存区实际情况进行数据包划分:
- 1.业务上定义的完整数据(比方说一个完整的json串),可能会被TCP拆分成多个数据包进行发送(拆包)。
- 2.业务上特殊含义的独立数据,也有可能因为大小或者缓冲区原因,被TCP封装成一个大数据包发送(粘包)。
通过一个图来理解

TCP粘包与拆包之一

通过图我们可以发现,数据包接收有很多情况:
1、没有粘包拆包,终端2收到了完整的数据包A和数据包B。
2、终端2一次性读取到数据包A和数据包B,这就是粘包。
3、终端2读取到完整的数据包A和部分数据包B1,第二次才读取到数据包B剩余部分(数据包B2),这就是拆包。
4、类似第三点,数据包A也有可能分成两部分(A1、A2), 被前后读取。
5、假设数据包很大,那么可能产生多次拆包,如数据包A分N次被读取。
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tcp粘包与udp丢包的原因
tcp粘包与udp丢包的原因一,什么是tcp粘包与udp丢包TCP是面向流的, 流要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送
Stella981 Stella981
3年前
Netty使用解码器Decoder解决TCP粘包和拆包问题
解码器Decoder和ChannelHandler的关系netty的解码器通常是继承自ByteToMessageDecoder,而它又是继承自ChannelInboundHandlerAdapter,其实也是一种ChannelHandler和我们自定义的ChannelHandler一样都是来处理进
Wesley13 Wesley13
3年前
TCP协议粘包问题详解
TCP协议粘包问题详解前言在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。基于TCP协议的socket实现远程命令输入我们准备做一个可以在Clie
Wesley13 Wesley13
3年前
C# TCP与UDP
Http使用端口是80SMTP使用端口是25TCP是首选协议,它提供有保证的传输、错误校正和缓冲。System.Net.Sockets.TcpClient类封装了TCP链接,提供属性字段来控制链接,包括缓冲、缓冲区的大小和超时。TCP提供很多功能来确保数据的传输,它还提供了错误校正以及当数据丢失或数据包损坏时重新传输的功能。TCP可缓冲传入
Stella981 Stella981
3年前
Dubbo处理TCP拆包粘包问题
Dubbo处理TCP拆包粘包问题在TCP网络传输工程中,由于TCP包的缓存大小限制,每次请求数据有可能不在一个TCP包里面,或者也可能多个请求的数据在一个TCP包里面。那么如果合理的decode接受的TCP数据很重要,需要考虑TCP拆包和粘包的问题。我们知道在Netty提供了各种Decoder来解决此类问题,比如LineBasedFrameDecod
Wesley13 Wesley13
3年前
TCP的粘包问题以及数据的无边界性
服务端:include <stdio.hinclude <winsock2.hpragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll define BUF_SIZE 100 int main(int argc, char ar
Stella981 Stella981
3年前
Netty中粘包和拆包的解决方案
粘包和拆包是TCP网络编程中不可避免的,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制。TCP粘包和拆包TCP是个“流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包
Stella981 Stella981
3年前
Netty解决TCP粘包和拆包问题的四种方案
 在RPC框架中,TCP粘包和拆包问题是必须解决一个问题,因为RPC框架中,各个微服务相互之间都是维系了一个TCP长连接,比如dubbo就是一个全双工的长连接。由于微服务往对方发送信息的时候,所有的请求都是使用的同一个连接,这样就会产生粘包和拆包的问题。本文首先会对TCP粘包和拆包问题进行描述,然后介绍其常用的解决方案,最后会对Netty提供的几种解决方案进
Wesley13 Wesley13
3年前
Vertx eventbus模块解析
eventbus事件總線協議棧TCP分包,粘包解決採用方案:消息定长(定義消息体總长度),消息分为消息头和消息体dataTypebytesdescriptionint4包体总大小code:<<buffer.setInt(0,buffer.length()4)by
Wesley13 Wesley13
3年前
TCP、UDP协议及两者的区别
一、TCP协议:位于传输层,提供可靠的字节流服务。所谓的字节流服务(ByteStreamService)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。即TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达
Stella981 Stella981
3年前
Netty(三) 什么是 TCP 拆、粘包?如何解决?
!(https://ws3.sinaimg.cn/large/006tKfTcgy1ftuojmzbvxj31kw11xqbq.jpg)前言记得前段时间我们生产上的一个网关出现了故障。这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信。但这个请求并不是常见的HTTP,而是利用Netty自定义的协议。有
数字踏浪使
数字踏浪使
Lv1
各有归舟,各有渡口。
文章
4
粉丝
0
获赞
0