当前位置: 首页 > news >正文

TCP粘包问题

TCP粘包问题

  • TCP粘包问题
  • 造成TCP粘包的原因
    • 发送方原因
    • 接收方原因
  • 如何处理TCP粘包
    • 发送方
    • 接收方
    • 应用层
  • 为什么UDP没有粘包问题

TCP粘包问题

TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。

造成TCP粘包的原因

TCP粘包现象的根本原因是TCP采用了面向字节流的传输,面向字节流的传输不认为消息是一条一条的,它是无保护消息边界的

具体来说,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

发送方原因

发送端为了将多个发往接收端的包,更加高效的发给接收端,于是采用了优化算法(Nagle算法),将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。

TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:

  • 只有上一个分组得到确认,才会发送下一个分组
  • 收集多个小分组,在一个确认到来时一起发送

Nagle算法造成了发送方可能会出现粘包问题。

接收方原因

TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

如何处理TCP粘包

如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象。如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了

发送方

对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。

接收方

接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。

应用层

应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。

解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?

  • 格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
  • 发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。

为什么UDP没有粘包问题

TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。

UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。

举个例子:有三个数据包,大小分别为2k、4k、6k,如果采用UDP发送的话,不管接受方的接收缓存有多大,我们必须要进行至少三次以上的发送才能把数据包发送完,但是使用TCP协议发送的话,我们只需要接受方的接收缓存有12k的大小,就可以一次把这3个数据包全部发送完毕。

相关文章:

TCP粘包问题

TCP粘包问题 TCP粘包问题造成TCP粘包的原因发送方原因接收方原因 如何处理TCP粘包发送方接收方应用层 为什么UDP没有粘包问题 TCP粘包问题 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据…...

QT【day1】

登录框: #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//窗口设置this->setFixedSize(600,600); //大小this->setWindowTitle("MUMU"); //文本内容this->setWindowOpacity(0.8); //透…...

【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

文章目录 前言官方解释内存布局程序运行中的内存布局通用方法 前言 在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。 举个例子: package mainimport "fmt"func foo(v inter…...

两数相加 II——力扣445

题目描述 法一 栈 本题旨在从后往前加,为了逆序处理所有数位,利用栈,把数字压入栈中,再依次取出相加,注意进位!进位是/10,另外需要注意栈的常用函数,push()、pop()、top()&#xff0…...

js获取上传视频的封面第一帧

代码如下&#xff1a;粘贴到这个在线编辑器里&#xff0c;可以测试效果。 菜鸟教程在线编辑器 <div><div style"flex: 1;border: 1px solid #999; position:relative;color: #333;background-color:#FFF2B8;"><span style"position: absolute…...

Nginx 高可用负载均衡(三种模式)

一、nginx普通集群负载均衡 1、安装keepalived (1)下载 https://www.keepalived.org/download.html(2)解压 tar -zxvf keepalived-2.0.18.tar.gz(3)使用configure命令配置安装目录与核心配置文件所在位置&#xff1a; ./configure --prefix/usr/local/keepalived --sysconf/e…...

Linux tail命令

在Linux中&#xff0c;tail命令用于查看文件的末尾内容。它可以显示文件的最后几行&#xff0c;默认情况下显示最后10行。 以下是一些常见的使用方式和示例&#xff1a; 显示文件的最后10行&#xff1a; tail filename将会显示名为filename的文件的最后10行内容。 显示文件…...

【屏幕适配发展介绍 Objective-C语言】

一、接下来,我们花一天时间,给大家介绍这个屏幕适配 1.那么,屏幕适配,是什么意思啊 我们说,写程序的时候,我们有时候要做 1)系统适配 2)屏幕适配 1)系统适配:是指的你写的这个代码,在iOS6、iOS7、iOS8,在不同的iOS系统下,是不是运行的效果,一致吧 这个指的是…...

linux中ls命令详解

ls 显示目录内容列表 补充说明 ls命令 就是list的缩写&#xff0c;用来显示目标列表&#xff0c;在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示&#xff0c;以分区不同类型的文件。 语法 ls [选项] [文件名...][-1abcdfgiklmnopqrstuxABCDFGLNQRSUX…...

大盗阿福(记忆化搜索板子)

提供核心代码&#xff1a;&#xff08;经典的记忆化搜索套路&#xff09; int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界&#xff0c;越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…...

打卡力扣题目八

#左耳听风 ARST 打卡活动重启# 目录 一、问题 二、解题方法一 三、解题方法二 四、两种方法的区别 关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一…...

matlab使用教程(5)—矩阵定义和基本运算

本博客介绍如何在 MATLAB 中创建矩阵和执行基本矩阵计算。 MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言&#xff0c;数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形&#xff0c;在这种意义上沿任何维度的分量向量的长度…...

用HTML写一个简单的静态购物网站

实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>购物网站</title> &l…...

如何在go中实现程序的优雅退出,go-kratos源码解析

使用kratos这个框架有近一年了&#xff0c;最近了解了一下kratos关于程序优雅退出的具体实现。 这部分逻辑在app.go文件中&#xff0c;在main中&#xff0c;找到app.Run方法&#xff0c;点进入就可以了 它包含以下几个部分: App结构体:包含应用程序的配置选项和运行时状态。 …...

Appium+python自动化(二十八)- 高级滑动(超详解)

高级溜冰的滑动 滑动操作一般是两点之间的滑动&#xff0c;这种滑动在这里称其为低级的溜冰滑动&#xff1b;就是上一节给小伙伴们分享的。然而实际使用过程中用户可能要进行一些多点连续滑动操作。如九宫格滑动操作&#xff0c;连续拖动图片移动等场景。那么这种高级绚丽的溜…...

github token使用方法

git remote set-url origin https://<githubtoken>github.com/<username>/<repositoryname>.git 在私有仓库的HTTPS的url上加入<githubtoken>即为token url&#xff0c;可以免ssh key登录...

Spring属性注解对配置项名称的自动转换

一、前言 在Spring中&#xff0c;我们经常需要将配置文件中的属性值注入到Java类中。Spring提供了两个主要的注解来实现这一功能&#xff1a;Value 和 ConfigurationProperties。其中 ConfigurationProperties支持将配置项名称与Java类中的属性名进行自动转换&#xff0c;包括…...

Docker 安全 Docker HTTPS请求过程与配置

Docker 容器安全注意点 尽量别做的事 尽量不用 --privileged 运行容器&#xff08;授权容器root用户拥有宿主机的root权限&#xff09; 尽量不用 --network host 运行容器&#xff08;使用 host 网络模式共享宿主机的网络命名空间&#xff09; 尽量不在容器中运行 ssh 服务 尽…...

DevOps(三)

CD(二) 1. 整体流程2. 环境准备1. jenkins安装2. 编译安装git3. docker安装4. docker-compose安装5. sonarqube安装6. harbor安装7. gitlab私服8. maven安装9. Nexus部署10. K8s部署3. 安装java及编写代码3.1 安装java3.2 安装IntelliJ IDEA3.3 安装tomcat3.4 安装maven3.5 c…...

AOP的妙用

一、改代码 自定义注解用于提示该代码已经在AOP中重构了 public interface ReviseToAop {// 用于记录修改状态String value() default ""; }使用注解&#xff08;无意义&#xff0c;只是表名被修改&#xff09; ReviseToAop("修改于&#xff1a;2023/7/30&quo…...

LaTeX模板-主流SCI期刊模板-IEEE模板-Elsevier模板-Springer模板-Science模板-ACM模板-arXiv模板-MDPI模板

出版商模板下载链接适用领域IEEEIEEE-Template Selector电气工程、通信、计算机科学等SpringerSpringerLaTeX模板计算机、数学、生物、医学等多个领域ElsevierElsevier工程、物理、化学、医学、社会科学等ScienceScience跨学科顶刊ACMACM模板计算机科学会议与期刊MDPIMDPI模板自…...

Phi-3-mini-gguf辅助C语言学习:从指针理解到项目实战

Phi-3-mini-gguf辅助C语言学习&#xff1a;从指针理解到项目实战 1. 为什么选择AI辅助学习C语言 学习C语言就像学骑自行车&#xff0c;刚开始总会摇摇晃晃&#xff0c;特别是遇到指针和内存管理这些概念时&#xff0c;很容易"摔跟头"。传统的学习方式往往需要反复查…...

LCMV与MVDR傻傻分不清?一个约束矩阵讲透两者的区别与联系

LCMV与MVDR&#xff1a;从约束矩阵维度看波束形成算法的核心差异 在嘈杂的会议室里&#xff0c;智能音箱总能准确捕捉你的声音&#xff1b;雷达系统可以在复杂环境中锁定特定目标——这些场景背后&#xff0c;都离不开阵列信号处理中的波束形成技术。当工程师们深入算法层时&am…...

烽火HG680-MC全分区TTL救砖指南:从黑屏到流畅运行的完整解决方案

1. 烽火HG680-MC救砖前的准备工作 遇到黑屏、卡LOGO的烽火HG680-MC盒子别急着扔&#xff0c;TTL线刷能救回90%的"砖机"。我经手过上百台同型号设备&#xff0c;先说说你手头要准备的"救命工具包"&#xff1a; 硬件三件套&#xff1a;CH340G芯片的TTL转USB模…...

DeepSeek-OCR-2应用实战:快速提取发票信息,财务效率翻倍

DeepSeek-OCR-2应用实战&#xff1a;快速提取发票信息&#xff0c;财务效率翻倍 1. 财务人的痛点&#xff1a;发票处理的效率黑洞 每个月末&#xff0c;财务部门总要面对这样的场景&#xff1a; 堆积如山的纸质发票需要手工录入电子发票PDF需要逐个打开复制粘贴关键信息&…...

Phi-3-mini-4k-instruct快速上手:Ollama部署指南,开启你的第一个AI项目

Phi-3-mini-4k-instruct快速上手&#xff1a;Ollama部署指南&#xff0c;开启你的第一个AI项目 1. 认识Phi-3-mini-4k-instruct&#xff1a;轻量级AI助手 Phi-3-mini-4k-instruct是一个仅有38亿参数的轻量级AI模型&#xff0c;由微软团队开发。虽然体积小巧&#xff0c;但它在…...

用LLM自动生成CUDA内核真的靠谱吗?实测KernelBench框架效果与避坑指南

LLM自动生成CUDA内核的实践验证&#xff1a;KernelBench框架深度评测与技术指南 当我在项目中发现某个PyTorch模型的矩阵乘法操作消耗了60%的推理时间时&#xff0c;第一反应是考虑手工编写CUDA内核来优化。但作为一个同时维护三个项目的工程师&#xff0c;时间成本让我犹豫——…...

手把手教你用HuggingFace+BGE模型搭建本地向量检索系统(附FAISS实战代码)

从零构建基于BGE模型的本地语义搜索系统&#xff1a;代码级实践指南 在信息爆炸的时代&#xff0c;如何快速从海量文本中精准找到相关内容&#xff1f;语义搜索技术正成为解决这一痛点的利器。不同于传统的关键词匹配&#xff0c;语义搜索能理解查询背后的意图&#xff0c;找到…...

Java微服务Istio配置必须立即更新的4个安全补丁:CVE-2024-23652等高危漏洞绕过配置详解

第一章&#xff1a;Java微服务Istio配置安全补丁的紧急性与背景近年来&#xff0c;Java微服务架构在云原生环境中广泛应用&#xff0c;而Istio作为主流服务网格控制平面&#xff0c;承担着流量管理、可观测性与零信任安全策略实施的关键角色。然而&#xff0c;2024年披露的CVE-…...

LangFlow问题解决:常见部署错误与连接Ollama配置详解

LangFlow问题解决&#xff1a;常见部署错误与连接Ollama配置详解 如果你正在尝试用LangFlow搭建自己的AI应用工作流&#xff0c;但卡在了部署和配置环节&#xff0c;这篇文章就是为你准备的。LangFlow作为一款低代码的可视化工具&#xff0c;理论上能让构建LangChain流水线变得…...