TCP的粘包和拆包

UDP有数据边界,TCP是没有数据边界,是流协议。如何拆包,就要靠应用层来处理。

 

 四层网络模型,消息在进入每一层时都会多加一个报头。mac头部记录的是硬件的唯一地址,IP头记录的是从哪来和到哪去,传输层头记录到是到达目的主机后具体去哪个进程。

需要拆包发送的原因?

 MTU:Maximum Transmit Unit最大传输单元。由网络接口层(数据链路层)提供给网络层最大一次传输数据的大小;一般MTU=1500byte.

MSS:Maximum Segment Size,TCP提交给IP层最大分段大小,不包含TCPHeader,只有TCP的负载,也就是消息体。假设MTU为1500Byte,则MSS=1500-20(IP头部)-20(TCP Header)=1460Byte,应用层发送的消息超过1460Byte就会切片发送。

为什么会粘包?

TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。粘包就是基于字节流这个特点。这些字节流是一堆二进制数据,没有任何边界。由于数据太小,每次小数据量发送,会占用网络资源,及时很小的包发送,如果应用层很忙,没有来得及及时取出,TCP Recv Buffer中可能会有msg2和msg3,这样还是会粘包。

粘包出现的根本原因是不确定的消息边界,应用层面对一堆二进制流,不知道多少个01才是一个消息。

如何解决粘包?

只要在发送端发送消息的时候带上识别消息边界的信息,接收端就可以根据这些信息识别出消息的边界,区分出每个消息。

应用层做的:

  1. 包封装成固定大小
  2. 在包的末尾加指定特殊字符\r\n
  3. 消息头+消息尾 头部有体的大小

UDP不存在粘包问题吗? 

UDP是无连接,不可靠,基于数据包的传输层通信协议。

基于数据报是指无论应用层交给UDP多长的报文,UDP都照样发送,即一次发送一个报文。如果数据太长,需要切片,那是IP层的事情。UDP发送几次,接收端就会接收几次。

TCP协议通过以下机制避免粘包和拆包的问题:

1. 为每个TCP连接维护一个发送缓冲区和接收缓冲区,可以按照字节序列传输数据,保证发送和接收的数据是一一对应的,并且TCP协议保证了数据的可靠性。

2. TCP采用流量控制机制,防止发送方过快发送数据导致接收方丢失数据。当发送方发送数据时,会根据接收端的缓冲区状态和网络条件动态调整发送窗口大小,从而避免了发送方过快发送数据的情况。

相比之下,UDP协议不会维护发送和接收缓冲区,也没有流量控制机制,因此数据包的传输完全取决于网络的状态,若数据包较大,经过网络传输时可能会被分为多个数据包,但UDP协议并不保证接收端收到这些数据包的顺序,也没有重传机制,因此可能会导致数据包的丢失或者乱序,这是UDP协议的缺陷之一。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优化问题的拉格朗日Lagrange对偶法原理

首先我们定义一般形式的求解x的优化问题: 表示优化的目标函数,上述为最小优化,实际上最大优化可以改写为的形式表示第i个不等式约束表示等式约束 1. Lagrange对偶问题 上述优化问题的拉格朗日Lagrange对偶法求解,是将上述带约束…

【Vue学习笔记6】好用的 Vueuse 工具包

1. 安装Vueuse VueUse 的官方(https://vueuse.org/)的介绍说这是一个 Composition API 的工具集合,适用于 Vue 2.x 或者 Vue 3.x,用起来和 React Hooks 还挺像的。 VueUse 插件的安装 npm install vueuse/core2. 实现全屏功能 …

【网络安全】记一次杀猪盘渗透实战

看起来非常假的网站,这个网站是没有 cdn 的用的是 thinkphpk 框架搭建的。 先打一波 poc 没有效果 访问一下后台直接在 url 后面加/admin。 一个开源的 cms 还没有验证码尝试用 burp 进行爆破,首先在火狐上设置代理 ip 为 127.0.0.1 代理端口为 8081。 B…

GPT详细安装教程-GPT软件国内也能使用

GPT (Generative Pre-trained Transformer) 是一种基于 Transformer 模型的自然语言处理模型,由 OpenAI 提出,可以应用于各种任务,如对话系统、文本生成、机器翻译等。GPT-3 是目前最大的语言模型之一,其预训练参数超过了 13 亿个…

ChatGPT终于被我问到胡说八道的程度了!

问:Python是强类型语言,还是弱类型语言 chatgpt:Python是强类型语言。Python很少会隐式地转换变量的类型,所以Python是强类型的语言 问:什么是强类型语言 chatgpt:强类型语言是指在编程语言中&#xff0…

Packet Tracer - 配置交换机端口安全

Packet Tracer - 配置交换机端口安全 地址分配表 设备 接口 IP 地址 子网掩码 S1 VLAN 1 10.10.10.2 255.255.255.0 PC1 NIC 10.10.10.10 255.255.255.0 PC2 NIC 10.10.10.11 255.255.255.0 非法笔记本电脑 NIC 10.10.10.12 255.255.255.0 目标 第 1 部…

MTK6765安卓智能模组5G核心板联发科MTK方案主板开发板

联发科MTK6765这是一款12纳米八核A53处理器,最高运行速度可达2.3GHz。它使用Android 9.0操作系统,配备2G16G内存,也支持其他选项1G/3G/4G8G/32G/64G。 此外,它支持全球主流频段,包括默认的国内频段以及2G GSM、2G/3G E…

学生台灯什么牌子好对眼睛好?专业护眼灯的学生台灯分享

据报告统计,2022年我国儿童青少年总体近视率为52.7%,其中6岁儿童为14.3%,小学生为35.6%,初中生为71.1%,高中生为80.5%,这些数据让人不寒而栗! 专家表示,导致儿童青少年近视的因素&am…

离散数学下--- 代数系统

代数系统 定义: 代数系统是用代数运算构造数学模型的方法。 • 通过构造手段生成,所以也称代数结构 • 代数运算:在集合上建立满足一定规则的运算系统 (一)二元运算 二元运算的定义 二元运算需要满足的两个条件&a…

在Ubuntu18.04中安装uWebSockets库

目录 1.下载uWebSockets库2.下载uSockets3.安装openssl开发包4.编译首先说明这里使用的Ubuntu版本为18.04。 1.下载uWebSockets库 下载uWebSockets库有两种方式,一是终端,从Github中克隆uWebSockets库到Ubuntu本地文件夹,二是打开uWebSockets库下载链接自己下载到Windows,然…

Qt音视频开发38-ffmpeg视频暂停录制的设计

一、前言 基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件必须…

BoldReports Embedded Reporting 5.1 Crack

Embed Paginated Reports 嵌入式报告平台,商业智能报告解决方案,探索满足各种业务需求的报告功能,所有功能View Features,像素完美报告,创建像素完美的分页业务报表,随处部署,选择适合您的部署环…

一文了解获得 Zebec Labs 投资的 Coral Finance,空投计划或在不久推出

在前不久,Zebec Labs宣布对链上衍生品协议Coral Finance进行150万美元的投资,以帮助该协议完成早期启动并,并在后续持续的为其提供孵化支持。Coral Finance将在不久部署在Nautilus Chain主网上。据了解,Coral Finance是Nautilus C…

RabbitMQ入门Demo 简单模式

出现的问题,原本4个操作,要么全部执行,要么全部不执行------->强一致性 但是现在分开了-----------最终一致性 强一致性:指在消息传递的过程中,系统会确保每个消息被精确地按照发送的顺序被传递,并且每个消息都会被正确地处理。强一致性…

GaussDB数据库基础函数介绍-下

接上一篇,本节继续介绍GaussDB数据库常用基础函数 目录 5、范围函数 6、窗口函数 7、聚集函数 8、安全函数 9、系统信息函数 10、动态脱敏函数 GaussDB常用基础函数介绍与示例 5、范围函数 在GaussDB数据库中,范围函数是指用于处理数据库范围的函…

SPSS如何进行相关分析之案例实训?

文章目录 0.引言1.双变量相关分析2.偏相关分析3.距离分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对相关分析进行阐述。 …

Java 将增加虚拟线程,挑战 Go 协程

Java19 正式发布,带来了一个 Java 开发者垂涎已久的新特性 —— 虚拟线程。在 Java 有这个新特性之前,Go 语言的协程风靡已久,在并发编程领域可以说是叱咤风云。随着国内 Go 语言的快速发展与推广,协程好像成为了一个世界上最好语…

【Java笔试强训 22】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥小易的升…

DX算法还原

早在之前作者就写过一篇关于顶象的滑块验证,潦潦草草几句话就带过了。 出于互相学习的想法,给了一个大学生,奈何不讲武德把源码甩群里了,虽然在大佬们眼里不难, 不过拿着别人的东西乱传还是不太好。自认倒霉&#xf…

【ONE·C++ || 二叉搜索树】

总言 二叉树进阶:主要介绍二叉搜索树相关内容。 文章目录 总言1、基本介绍1.1、什么是二叉搜索树 2、相关实现2.1、基本框架2.1.1、如何构建二叉树单节点2.1.2、如何定义一个二叉搜索树 2.2、非递归实现:插入、查找、删除2.2.1、二叉搜索树插入&#xf…