计算机网络⑨ —— TCP粘包与拆包

1. 什么是TCP粘包与拆包

  • TCP作为传输层协议并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进⾏数据包的划分,所以在业务上认为是⼀个完整的包,可能会被TCP拆分成多个包进⾏发送,也有可能把多个⼩的包封装成⼀个⼤的数据包发送,这就是所谓的TCP粘包和拆包问题。
  • 产生原因:
    • TCP是以流的⽅式传输数据的,传输的最⼩单位为⼀个报⽂段(Segment)。报文段header中有个options标识位,里面有个标识MSS(Maximum Segment Size),他的大小是传输数据的最大限制MTU(Maximum Transmission Unit)减去TCP报文段header的大小,一般为1460bit,也就是180多字节,超过这个大小就要分成多个报⽂段传输。
    • TCP为提⾼性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了以后,再将缓冲中的数据发送到接收⽅。同理,接收⽅也有缓冲区这样的机制来接受数据。
      • 若应⽤程序写⼊数据⼤于套接字缓冲区⼤⼩,会发⽣拆包
      • 若应⽤程序写⼊数据⼩于套接字缓冲区⼤⼩,⽹卡会将应⽤多次写⼊的数据一起发送到⽹络上,这将会发送粘包
      • 若TCP报文长度-TCP header长度 > MSS时,会发送拆包
      • 若接收⽅不及时读取套接字缓冲区数据,这将发⽣粘包

2. 如何处理粘包和拆包

2.1 TCP Negal算法

  • 通信双方会发送很多小的数据包,每次传输数据都要经历TCP确认、校验等各种流程,这样会造成网络资源的浪费,Negal算法会让多个小包组合成一个大包一起发送,这样就可以提高网络传输的效率
  • 但是会出现问题,比如分属两个不同页面的包被合并在一起了,那么如何区分?这就是粘包问题

2.2 处理方法

  • 处理粘包的方法:
    • 发送⽅对于发送⽅造成的粘包问题,可以通过关闭Nagle算法来解决,可以使⽤TCP_NODELAY选项来关闭算法
    • 接收⽅没有办法来处理粘包现象,只能将问题交给应⽤层来处理。
      • 解决办法:循环处理,应⽤程序从接收缓存中读取分组时,读完⼀条数据,就应该循环读取下⼀条数据,直到所有数据都被处理完成,判断每条数据的⻓度的⽅法有两种:
        • 格式化数据:每条数据有固定的格式(开始符,结束符),这种⽅法简单易⾏,但是选择开始符和结束符时⼀定要确保每条数据的内部不包含开始符和结束符。
        • 发送长度:发送每条数据时,将数据的⻓度⼀并发送,例如规定数据的前4位是数据的⻓度,应⽤层在处理时可以根据⻓度来判断每个分组的开始和结束位置。
  • 处理拆包的方法:
    • 通过包头+包⻓+包体的协议形式,当服务器端获取到指定的包⻓时才说明获取完整
    • 指定包的结束标识,这样当我们获取到指定的标识时,说明包获取完整

3. UDP会不会产生粘包问题?

  • TCP为了保证可靠传输并减少额外的开销,采⽤了基于流的传输,基于流的传输不认为消息是⼀条⼀条的,是⽆保护消息边界的
    • 保护消息边界:指传输协议把数据当做⼀条独⽴的消息在⽹上传输,接收端⼀次只能接受⼀条独⽴的消息。
  • UDP则是⾯向消息传输的,是有保护消息边界的,接收⽅⼀次只接受⼀条独⽴的信息,所以不存在粘包问题。

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

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

相关文章

fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化

为了 提供数据做后端回环优化和手动回环优化,需要保存每帧的点云和每帧的里程计为单独的文件,并且需要保存的名字为ros时间戳。 效果很好,比我自己写的手动回环模块好用 // This is an advanced implementation of the algorithm described in the // following paper: /…

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu)系统下安装依赖的方法: #除了…

如何修改电脑用户名user后的名字

更改电脑用户名(C:\Users\用户名) 直接上步骤 1.WinR打开运行窗口,输入regedit,打开注册表,CtrlF搜索,找到ProfileList,这里会出现几个S-1-5开头的文件。 这里有一处注意的: 图片中的这个位置要…

2024.4.8-day12-CSS 常用样式属性和字体图标

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业2024.4.8-学习笔记盒子阴影文本阴影透明的vertical-align字体使用 作业 &…

2024年网络安全趋势前瞻:从AI攻击到云安全新挑战

随着2024年开展新的序幕,网络安全领域正面临着前所未有的挑战与机遇,一系列引人注目的趋势和预测逐渐浮出水面。 一、AI技术发展引发的安全问题 近年来,我们见证了AI技术的飞速进步,其中ChatGPT等引领潮流的AI服务成为公众瞩目的…

STL优先队列比较器

有两个比较器&#xff0c;在std里面&#xff0c;一个是greater&#xff0c;一个是less&#xff0c;他们都有一个可以指定的模板类型。 #include <bits/stdc.h> using namespace std; struct node {bool operator ()(const string& a, const string& b){return a…

Linux——计算机进程基础知识

计算机基础知识 1.计算机组成五大部件: (1) 运算器 &#xff1a;也叫算数逻辑单元&#xff0c;完成对数据的各种常规运算&#xff0c;如加减乘除&#xff0c;也包括逻辑运算&#xff0c;移位&#xff0c;比较等。 (2) 控制器 &#xff1a; 它是整个计算机系统的控制中心&…

【云开发笔记No.29】如何建设数据中台

数据中台的建设是一个系统性工程&#xff0c;涉及多个层面和多个步骤。以下是根据当前行业实践和技术发展趋势总结的数据中台建设的关键步骤&#xff1a; 统一数据标准与规范&#xff1a; 确立统一的数据指标口径&#xff0c;消除数据的二义性&#xff0c;这是确保数据质量和一…

嵌入式算法开发系列之大林算法

嵌入式系统中的大林算法 文章目录 嵌入式系统中的大林算法前言一、大林算法原理二、大林算法应用三、C语言实现总结 前言 在嵌入式系统中&#xff0c;算法的选择对系统性能和资源利用具有重要影响。大林算法是一种常见的图论算法&#xff0c;用于求解最小生成树和最短路径等问…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南(更新中)

目录 一、NeRFStudio安装1.安装&#xff08;ubuntu系统&#xff09;2.安装&#xff08;windows系统&#xff09; 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap 四、使用NeRFStudio进行三维重…

行云防水堡-打造企业数据安全新防线

企业数据安全&#xff0c;顾名思义就是通过各种手段或者技术或者工具保障企业数据的安全性&#xff1b;保障数据信息的硬件、软件及数据受到保护&#xff0c;不受偶然的或者恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;信息服务不中断。目…

常见的八大排序总结

下面列出了八种常见的排序算法&#xff0c;以及它们的特点以及相同点和不同点&#xff1a; 1. 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; - 特点&#xff1a;通过重复遍历要排序的列表&#xff0c;比较每对相邻的元素&#xff0c;并依次交换顺序&#xff0…

linux tasklet

软中断、tasklet 以及工作队列&#xff0c;均是 linux 中将任务推后执行的机制。其中工作队列与用户态使用的线程池类似。 什么是任务推后执行呢 ? 可以借助于开发应用时经常使用的线程池来理解。任务推后执行&#xff0c;就是任务本该执行的时候没有立即执行&#xff0c;而是…

文档转换失败如何排查?魔众文库系统

如何排查 文档转换失败时&#xff0c;请查看最新的日志文件 storage/logs/laravel-*.log 日志文件中会将执行的命令和命令执行后返回的结果存储到日志中&#xff0c;请参考日志报错信息自行解决。

西圣、漫步者、万魔开放式耳机怎么样?无广真实测评对比推荐

开放式耳机因其独特的音质体验和佩戴舒适度&#xff0c;受到了越来越多消费者的青睐。西圣、漫步者、万魔作为国内知名的耳机品牌&#xff0c;各自都推出了自家的开放式耳机产品&#xff0c;那么&#xff0c;这三款耳机究竟如何呢&#xff1f;身为开放式耳机党的我&#xff0c;…

Datacom HCIP笔记-MPLS协议 之一

MPLS标签放在二层头和IP头之间可以称之为2.5层的位置 LSP&#xff08;Label Switched Path&#xff09;&#xff1a;标签交换路径&#xff0c;艮即到达同一目的地址的报文在MPLS网络中经过的路径。 FEC&#xff08;Forwarding Equivalent Class&#xff09;&#xff1a;一般指具…

编辑脚本 shell中的符号

shell中的符号 ~&#xff1a;家目录 !&#xff1a;执行历史命令 $&#xff1a;取变量内容 - * / %:数学运算符 &&#xff1a;后台执行 *&#xff1a;通配符 ?&#xff1a;匹配除回车以外的一个字符 ;&#xff1a;命令分隔符 |&#xff1a;管道符&#xff0c;该符号的上一…

【科研】SCI同行评审-审稿指南与意见撰写

【科研】SCI同行评审-审稿指南与意见撰写 文章目录 1、审稿指南 By Elsevier2、审稿指南 By Nature3、审稿意见撰写 1、审稿指南 By Elsevier Elsevier审稿人注意事项 Elsevier如何进行同行评审 how-to-review 完整的研究文章 检查手稿中解决的研究问题的重要性&#xff08;例…

uniapp:Hbuilder没有检测到设备请插入设备或启动模拟器的问题解决

问题 使用模拟器调试运行项目时&#xff0c;出现以下提示&#xff0c;“没有检测到设备&#xff0c;请插入设备或启动模拟器后点击刷新再试”。排查了一天最终找到原因。 解决 已确认模拟器是已经正常启动&#xff0c;并且Hbuilder设置中的adb路径和端口都配置没有问题&#…

一文搞懂从爬楼梯到最小花费(力扣70,746)

文章目录 题目前知动态规划简介动态规划模版 爬楼梯一、思路二、解题方法三、Code 使用最小花费爬楼梯一、思路二、解题方法三、Code 总结 在计算机科学中&#xff0c;动态规划是一种强大的算法范例&#xff0c;用于解决多种优化问题。本文将介绍动态规划的核心思想&#xff0c…