「 计算机网络 」TCP的粘包拆包问题
「 计算机网络 」TCP的粘包/拆包问题
参考&鸣谢
大病初愈,一分钟看懂TCP粘包拆包 雷小帅
TCP 的粘包拆包以及解决方案 一乐说
文章目录
- 「 计算机网络 」TCP的粘包/拆包问题
- 一、前言
- 二、为什么UDP没有粘包
- 三、粘包拆包发生场景
- 四、常见的解决方案
- 五、Netty对粘包和拆包问题的处理
- 六、小结
一、前言
当我们在进行网络传输时,由于各种原因,数据包的发送和接收可能会出现粘包和拆包的问题。粘包和拆包都是数据分组错误的情况,其中粘包指的是多个数据包被合并成一个,而拆包则是一个数据包被拆成了多个数据包。这些问题会导致数据的解析和处理变得困难,进而影响整个系统的稳定性和可靠性。
TCP协议是一种面向连接、可靠的传输协议,在网络传输中被广泛应用。TCP采用了一系列机制来解决粘包和拆包问题,保证数据的可靠传输。本文将介绍TCP协议如何解决粘包和拆包问题,让读者更深入地了解TCP协议的传输特点和实现方式。
二、为什么UDP没有粘包
粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。
UDP协议没有粘包的概念,因为它是面向无连接的协议。在UDP中,每个数据报都是独立的,发送方发送多少数据报,接收方就会收到多少数据报。UDP不会对数据进行任何拆分或重组,也不会对数据包进行排序,因此不存在数据包粘连的问题。另外,UDP中也没有类似于TCP的流量控制和拥塞控制机制,所以即使出现丢包或延迟,发送方也不会调整发送速率,从而导致粘包的情况。
三、粘包拆包发生场景
因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化,例如缓冲区为1024个字节大小。
如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。
如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包。
关于粘包和拆包可以参考下图的几种情况:
粘包/拆包
上图中演示了以下几种情况:
- 正常的理想情况,两个包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
- 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
- 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
- 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。
四、常见的解决方案
对于粘包和拆包问题,常见的解决方案有四种:
- 发送端将每个包都封装成固定的长度,比如100字节大小。如果不足100字节可通过补0或空等进行填充到指定长度;
- 发送端在每个包的末尾使用固定的分隔符,例如\r\n。如果发生拆包需等待多个包发送过来之后再找到其中的\r\n进行合并;例如,FTP协议;
- 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
- 通过自定义协议进行粘包和拆包的处理。
五、Netty对粘包和拆包问题的处理
Netty对解决粘包和拆包的方案做了抽象,提供了一些解码器(Decoder)来解决粘包和拆包的问题。如:
- LineBasedFrameDecoder:以行为单位进行数据包的解码;
- DelimiterBasedFrameDecoder:以特殊的符号作为分隔来进行数据包的解码;
- FixedLengthFrameDecoder:以固定长度进行数据包的解码;
- LenghtFieldBasedFrameDecode:适用于消息头包含消息长度的协议(最常用);
基于Netty进行网络读写的程序,可以直接使用这些Decoder来完成数据包的解码。对于高并发、大流量的系统来说,每个数据包都不应该传输多余的数据(所以补齐的方式不可取),LenghtFieldBasedFrameDecode更适合这样的场景。
六、小结
TCP协议粘包拆包问题是因为TCP协议数据传输是基于字节流的,它不包含消息、数据包等概念,需要应用层协议自己设计消息的边界,即消息帧(Message Framing)。如果应用层协议没有使用基于长度或者基于终结符息边界等方式进行处理,则会导致多个消息的粘包和拆包。
针对 TCP 粘包拆包的现象,常见的解决思路如下:
(1)发送端给每个数据包添加包首部。
(2)发送端将每个数据包封装为固定长度
(3)可以在数据包之间设置边界(特殊字符串分割)。
虽然很多框架中都有现成的解决方案,比如Netty,但底层的原理我们还是要清楚的,而且还要知道有这么回事,才能更好的结合场景进行使用。
「 计算机网络 」TCP的粘包拆包问题相关推荐
- Netty详解(五):Netty TCP粘包 拆包
1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...
- Netty(二)——TCP粘包/拆包
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7814644.html 前面讲到:Netty(一)--Netty入门程序 主要内容: TCP粘包/拆包的基础知 ...
- Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道
无论是服务端还是客户端,读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制. TCP粘包/拆包 TCP是个"流"协议. 流:没有界限的一串数据.如同河里的流水,它们是连成 ...
- TCP——粘包/拆包
TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,它们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,它会根 ...
- TCP粘包/拆包问题
目录 TCP粘包/拆包 TCP粘包/拆包问题说明 TCP粘包/拆包发生的原因 粘包问题的解决策略 未考虑TCP粘包导致功能异常案例 TimeServer的改造 TimeClient的改造 利用Lin ...
- TCP粘包|拆包和解决方案
1 产生原因 TCP是面向连接的,面向流的,提供高可靠性服务.收发两端(客户端和服务端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化算法(Nagle ...
- netty解决TCP粘包/拆包导致的半包读写问题的三种方案
解决方案一:LineBasedFrameDecoder+StringDecoder来解决TCP的粘包/拆包问题 只需要在客户端和服务端加上45.46两行代码并且在发送消息的时候加上换行符即可解决TCP ...
- 一起学Netty(六)之 TCP粘包拆包场景
TCP编程底层都有粘包和拆包机制,因为我们在C/S这种传输模型下,以TCP协议传输的时候,在网络中的byte其实就像是河水,TCP就像一个搬运工,将这流水从一端转送到另一端,这时又分两种情况: 1)如 ...
- 面试题:聊聊TCP的粘包、拆包以及解决方案
TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中,比如RPC框架.Netty等.如果你的简历中写了类似的技术或者你所面试的公司使用了相关的技术,被问到该面试的几率会非常高. 今天这篇文章就带大家 ...
最新文章
- docker基础维护命令
- html 访问 php 变量
- jmeter(五)几种不同的content-type方式
- GetCursorPos/WindowFromPoint/SendMessage
- USACO Training Section 1.2 双重回文数 Dual Palindrom
- 汇编语言之常见的汇编指令
- Oracle常用知识总结
- 7时过2小时是几时_飞机2小时和高铁7小时你愿意坐哪个?
- 内核同步 (来自chinaunix总结)
- 计算机系统-电路设计09-计数器的内部电路实现
- bzoj 1614: [Usaco2007 Jan]Telephone Lines架设电话线(二分+SPFA)
- linux设备模型之mmc子系统
- mysql 导入1045错误_解决MyQL数据库中1045错误的方法——Windows系统
- Unity3D 与udk 3D游戏动漫引擎的开发特点
- Java 上传附件后端接口大体流程和逻辑
- IT安全面试问题汇总
- 推荐几款基于 Markdown 在线制作简历的网站
- 论文分享:大数据智能决策,《自动化学报》
- 自动驾驶中图像与点云融合的深度学习研究综述
- DNS欺骗原理及工作工程分析
热门文章
- 基于GPIB总线的无线电频谱监测系统的设计delphi多线程超时控
- 基于OpenVINOTM2022.2和蝰蛇峡谷优化并部署YOLOv5模型
- 《MATLAB面向对象程序设计》
- html嘻哈素材,音效素材-470个现代嘻哈风格混合Trap声音流行音乐会节目音乐制作工具包...
- 虚拟机文件的压缩与打包
- 亿唐高管反思六年烧钱:转型Web2.0重提专注
- HighCharts中柏拉图上显示数值
- 《 算法精解:c语言描述》chm 电子书下载
- 报税系统服务器地址怎么填,报税服务器地址
- Google面对点击欺诈拷问 广告主拟诉诸法律