「 计算机网络 」TCP的粘包拆包问题

news2025/1/14 20:33:00

「 计算机网络 」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,但底层的原理我们还是要清楚的,而且还要知道有这么回事,才能更好的结合场景进行使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~

文章目录 ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~HuggingFace 简介HuggingChat 登场展望 ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~ 二话不说上链接 htt…

ChatGPT情商很高,但并不适合当搜索引擎

微软和谷歌正急于使用大型语言模型技术来强化搜索引擎。但有充分的理由认为,相比于提供事实性信息,这项技术更适合作为人们情感上的伴侣。 美媒评论称,目前基于大型语言模型的人工智能工具,例如ChatGPT,更擅长共情而不…

初访Chirper:一个禁止人类发言的人工智能社交网络,AI们居然在吵架,太6了

最近,在网上仅仅用ChatGPT和AI聊天已经不够刺激了,现在,AI已经有了属于自己的专属社区:Chirper 简而言之,这是一个禁止人类发帖、评论、转发的类推特网站。人类进去后只能看见:成千上万个AI聊天机器人在其…

[特征提取与匹配]基于Open CV使用SIFT提取特征,并使用FLANN完成单应性匹配

关于单应性 单应性:当一张图是另一张图的一个透视畸变时,在两张图中寻找彼此的一种情况 实现步骤 导入需要的库;读取两张灰度图像作为匹配对象;创建SIFT对象,用于检测SIFT特征点并计算描述子;在两张图像…

提效篇 |当项目紧急入场,如何先测量后校正?

施工队进场后,设计院还没交桩怎么办? 部分工程由于设计与施工间隔时间较久,导致控制点被破坏、复测未通过怎么办? 工期紧张,难道只能干等吗? 答案是:先测量后校正!与常规RTK作业不…

tensorflow基础

tensorflow基础 (一)编程模型(1)编程模型中的运行机制(2)编写hello world程序(3)使用注入机制进行代码编写(4)保存和载入模型的方法介绍(4.1&…

代码随想录|day58|单调栈part01 ● 739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度 链接:代码随想录 今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。 大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙 fvfdvsf fdfd ddf fdd fd fsd 496.下一个更…

轻量级服务器nginix:如何实现Spring项目的负载均衡

这里写目录标题 一 生成war包并给数据库导入数据1.1生成war包1.2 向数据库中导入数据 二 启动Tomcat三 配置负载均衡并启动Nginx1.cent121这台虚拟机上2.检测两个tomcat的运行状态3.配置nginx4.启动4.1 nginx报错4.2 成功启动项目 四 命令总结 一 生成war包并给数据库导入数据 …

docker和k8s基础介绍

一 Docker介绍 1.1 docker是什么 Docker 是一个开源项目, 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0协议, 项目代码在…

SQL——索引

💡 索引 在关系型数据库中,索引是一种单独的、物理上的对数据库表中的一列或多列的值进行排序的一种存储结构,他是某个表中的一列或着若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单(类似于图书目录&#x…

RF技术设计的机械数码一体化防盗锁

机械数码一体化防盗锁在传统锁具的基础上增加了一个受控的弹子,只能通过设置过的合法钥匙开启,并且增加了防盗报警功能。本文介绍了基于PIC单片机、RF技术和无线数据传输技术的机械数码一体化防盗锁的设计。 引言 机械锁和数码锁是我们日常生活中最常见的…

CDGA|数据监管越来越严,数据治理发展何去何从?

尽管数据监管越来越严格,但仍然存在许多机会。事实上,数据监管的加强可能会促进金融科技行业更好地运用数据,激发金融科技行业更多的创新和合作,创造更多的价值和机会。 推动金融机构重视数据安全和隐私保护 促使他们采取更严格的安全措施&a…

Ueditor 富文本编辑器 插入 m3u8 和 mp4 视频(PHP)

当前环境:PHP、Ueditor的版本是1.4.3 新的需求是,需要在Ueditor 富文本编辑器中,插入视频播放,并且视频格式有MP4,也有M3U8。 百度编辑器默认的是embed,需要修改下配置。 ueditor.all.js和 ueditor.confi…

C++vector的动态扩容,为何是1.5倍或者是2倍

1. vector如何进行扩容 当插入元素时,如果size capacity,触发扩容机制。 拷贝元素释放旧空间 2. 如何避免扩容导致效率低 在插入前,预估好vector的容量,通常使用reserve。如果没有reserve,边插边扩容,…

ROS学习7:ROS机器人导航仿真

【Autolabor初级教程】ROS机器人入门 1. 概述 在 ROS 中机器人导航 (Navigation) 由多个功能包组合实现,ROS 中又称之为导航功能包集,关于导航模块,官方介绍如下 一个二维导航堆栈,它接收来自里程计、传感器流和目标姿态的信息&a…

汽车智能化「出海」红利

在高阶智能座舱中,车载导航产品作为与用户体验息息相关的模块之一,同样也进入了升级迭代周期。 基于高精度地图渲染、高精度定位算法、AR等技术的车道级导航、AR导航等产品快速上车,但同时随着人机交互多模发展以及3D沉浸式用户体验需求趋势下…

DataX-在Windows上实现postgresql同步数据到mysql

场景 DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步: DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步_霸道流氓气质的博客-CSDN博客 在上面实现sqlserver到mysql的数据同步之后,如果要实现postg…

FPGA/Verilog HDL/AC620零基础入门学习——8*8同步FIFO实验

实验要求 该项目主要实现一个深度为8、位宽为8bit的同步FIFO存储单元。模块功能应包括读控制、写控制、同时读写控制、FIFO满状态、FIFO空状态等逻辑部分。 该项目由一个功能模块和一个testbench组成。其中功能模块的端口信号如下表所示。 提示: (1&a…

Sqoop 从入门到精通

Sqoop Sqoop 架构解析 概述 Sqoop是Hadoop和关系数据库服务器之间传送数据的一种工具。它是用来从关系数据库如:MySQL,Oracle到Hadoop的HDFS,并从Hadoop的文件系统导出数据到关系数据库。 传统的应用管理系统,也就是与关系型数…

【微服务笔记24】微服务组件之Sleuth + Zipkin实现服务调用链路追踪功能

这篇文章,主要介绍微服务组件之Sleuth Zipkin实现服务调用链路追踪功能。 目录 一、Sleuth链路追踪 1.1、什么是Sleuth 1.2、Sleuth专业术语 (1)Span (2)Trace (3)工作原理 1.3、Sleuth…