粘包

article/2025/10/13 4:28:20

粘包

  • 一、什么是粘包
  • 二、为什么会粘包
  • 三、粘包解决思路

一、什么是粘包

粘包是指发送方发送的若干数据到接收方,而接收方在接收数据时这些数据粘在一起,后一包数据头紧接着前一包数据尾部。

二、为什么会粘包

首先了解一下socket收发消息原理:
底层原理参考另一篇:socket收发消息底层原理
socket收发消息原理
在发数据时,一条数据的大小对应用程序是不可见的,即接收端从自己缓存区接收数据时,根本不知道自己要从缓存区接受多少数据。

那为什么只用TCP有粘包现象,而UDP没有?

  1. TCP 是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。 即面向流的通信是无消息保护边界的。
  2. UDP 是没有连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。

TCP 协议的数据不会丢失,没有接收完的包,下次会继续接收,传输可靠,但是会造成粘包。

两种粘包情况:

  1. 发送端发送间隔小,数据量小,为了有效发送数据,使用Nagle算法,合成一个大的数据包。
  2. 发送端数据量大,但接受端接收数据量小。

三、粘包解决思路

  1. 在数据发送前,计算数据量大小,并将结果发送给接收端
#服务端
from socket import *
import subprocess
ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)while True:conn,addr=tcp_server.accept()print('新的客户端链接',addr)while True:#收try:cmd=conn.recv(buffer_size)if not cmd:breakprint('收到客户端的命令',cmd)#执行命令,得到命令的运行结果cmd_resres=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE,stdin=subprocess.PIPE)err=res.stderr.read()if err:cmd_res=errelse:cmd_res=res.stdout.read()#发if not cmd_res:cmd_res='执行成功'.encode('gbk')length=len(cmd_res)conn.send(str(length).encode('utf-8'))client_ready=conn.recv(buffer_size)if client_ready == b'ready':conn.send(cmd_res)except Exception as e:print(e)break
#客户端
from socket import *
ip_port=('127.0.0.1',8080)
back_log=5
buffer_size=1024tcp_client=socket(AF_INET,SOCK_STREAM)
tcp_client.connect(ip_port)while True:cmd=input('>>: ').strip()if not cmd:continueif cmd == 'quit':breaktcp_client.send(cmd.encode('utf-8'))#解决粘包length=tcp_client.recv(buffer_size)tcp_client.send(b'ready')length=int(length.decode('utf-8'))recv_size=0recv_msg=b''while recv_size < length:recv_msg += tcp_client.recv(buffer_size)recv_size=len(recv_msg) print('命令的执行结果是 ',recv_msg.decode('gbk'))
tcp_client.close()
  1. 直接使用固定的四个字节来表示数据长度

http://chatgpt.dhexx.cn/article/t945U49O.shtml

相关文章

网络通讯中粘包的处理

参考&#xff1a;网络通讯中粘包的处理 - 走看看 在网络通讯中&#xff0c;不仅仅是TCP通讯&#xff0c;也包括串口通讯中&#xff0c;我们经常会遇到数据包粘连的问题&#xff0c;本文详细介绍粘包问题产生的原因和解决办法。 一、粘包定义 TCP 传输中&#xff0c;客户端发送…

什么是粘包?

TCP/IP 协议簇建立了互联网中通信协议的概念模型&#xff0c;该协议簇中的两个主要协议就是 TCP 和 IP 协议。TCP/ IP 协议簇中的 TCP 协议能够保证数据段&#xff08;Segment&#xff09;的可靠性和顺序&#xff0c;有了可靠的传输层协议之后&#xff0c;应用层协议就可以直接…

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(2)

注&#xff1a;感谢这位大佬的帮忙&#xff0c;没有他我估计还在github里面或者其他博客里面瞎找小雨aaa Ret2libc:Return to libc,顾名思义&#xff0c;就是通过劫持控制流使控制流指向libc中的系统函数&#xff0c;从而实现打开shell等其他工作。 在本次作业中&#xff0c;…

Linux ALSA音频工具

参考&#xff1a; ALSA 音频工具 amixer、aplay、arecord Linux Alsa ALSA的配置文件 音频录制——arecord 音频播放——aplay 音频配置——amixer alsamixer与amixer的区别 alsamixer是Linux音频框架ALSA工具之一&#xff0c;用于配置音频各个参数; alsamixer是基于文本图形…

[pwn]ROP:绕过ASLRNX

[详细] ROP&#xff1a;绕过ASLR&NX 这次使用的程序是Defcon - 2015初赛题目&#xff0c;r0pbaby&#xff0c;也是一道经典的pwn题目了。 程序链接&#xff1a;https://pan.baidu.com/s/1kr6z_crZfW7qNjtASmRMGw 提取码&#xff1a;eajs NX策略是指在栈中的代码不会被执行…

ORA-445报错与ASLR

数据库多次出现ORA-00445: background process "J002" did not start after 30 seconds报错及ORA-3136错误 查看相关文档(文档 ID 1600807.1)&#xff0c;两个报错都可能与内存压力过大有关 另外关于ORA-00445还有另一篇文档提到&#xff0c;在Oracle启用ASLR会无法…

[二进制学习笔记]Ubuntu20.04关闭开启ASLR

文章目录 Ubuntu20.04关闭开启ASLR Ubuntu20.04关闭开启ASLR ​ ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术&#xff0c;通过对堆、栈、共享库映射等线性区布局的随机化&#xff0c;通过增加攻击者预测目的地址的难度&#xff0c;防止攻击者…

ASLR和PIE的区别

总结&#xff1a;ASLR 不负责代码段以及数据段的随机化工作&#xff0c;这项工作由 PIE 负责。但是只有在开启 ASLR 之后&#xff0c;PIE 才会生效。

【HUST】信息系统安全:Ret2libc多函数调用,ASLR两种情况(1)

Ret2libc:Return to libc,顾名思义&#xff0c;就是通过劫持控制流使控制流指向libc中的系统函数&#xff0c;从而实现打开shell等其他工作。 在本次作业中&#xff0c;我们的目标是通过运行stack.c程序来访问系统上的/tmp/flag程序的内容&#xff0c;其中&#xff0c;可以看到…

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

1. ASoC的由来 ASoC--ALSA System on Chip &#xff0c;是建立在标准ALSA驱动层上&#xff0c;为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。在ASoc出现之前&#xff0c;内核对于SoC中的音频已经有部分的支持&#xff0c;不过会有一些局限性&#xff1a…

astrill android,Astrill

你想知道你所用的网络速度是多少吗&#xff1f;你想在全球任何地方都可以使用到手机网络吗&#xff1f;你想在需要下载文件时定位到信号最强的地方进行传输吗&#xff1f;小编今天为企业家和用户安利一款手机测速游戏——Astrill APP&#xff01;用户可以随时随地的查询到自己的…

Linux下 ASLR功能与 -no-pie 选项说明

一. Linux下ASLR功能 1. ASLR 技术介绍 ASLR 技术是一种针对缓冲区溢出的安全保护技术。 ASLR&#xff0c;全称为 Address Space Layout Randomzation&#xff0c;地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统&#xff0c;它将进程…

ASLR和PIE的区别和作用

ASLR和PIE的区别和作用 ASLR的作用 首先ASLR是归属于系统功能的&#xff0c; aslr是一种针对缓冲区溢出的安全保护技术&#xff0c;通过对堆、栈、共享库映射等线性区布局的随机化&#xff0c;通过增加攻击者预测目的地址的难度&#xff0c;防止攻击者直接定位攻击代码位置&…

Linux下关闭ASLR(地址空间随机化)的方法

##0x00 背景知识 ASLR(Address Space Layout Randomization)在2005年被引入到Linux的内核 kernel 2.6.12 中&#xff0c;当然早在2004年就以patch的形式被引入。随着内存地址的随机化&#xff0c;使得响应的应用变得随机。这意味着同一应用多次执行所使用内存空间完全不同&…

ASLR技术

简述 ASLR&#xff08;Address Space Layout Randmoization&#xff0c;地址空间布局随机化&#xff09;是一种针对于缓冲区溢出的安全保护技术。 windows 内核版本 OS内核版本windows 20005.0windows XP5.1windows Server 20035.2windows Vista6.0windows Server 20086.0wi…

ASLR

ASLR 一、ASLR是什么&#xff1f;二、测试ASLR技术1.一个简单的源文件2.生成ALSR.exe与ALSR_no.exe3.使用OllDbg调试器查看程序入口地址与栈地址3.1 ASLR.exe3.2 ASLR_no.exe 4.使用CFF Explorer查看PE文件信息4.1 重定位表的区别4.2 IMAGE_FILE_HEADER/Characteristics属性4.3…

[ASLR,地址空间,Linux,随机化,Windows]ASLR 是如何保护 Linux 系统免受缓冲区溢出攻击的

地址空间随机化&#xff08;ASLR&#xff09;是一种内存攻击缓解技术&#xff0c;可以用于 Linux 和 Windows 系统。了解一下如何运行它、启用/禁用它&#xff0c;以及它是如何工作的。 -- Sandra Henry-stocker 地址空间随机化(Address Space Layout Randomization)&#xff0…

ALSR

一 ALSR介绍&#xff1a; 1.1定义 aslr是一种针对缓冲区溢出的安全保护技术&#xff0c;通过对堆、栈、共享库映射等线性区布局的随机化&#xff0c;通过增加攻击者预测目的地址的难度&#xff0c;防止攻击者直接定位攻击代码位置&#xff0c;达到阻止溢出攻击的目的的一种技…

如何提高强化学习算法模型的泛化能力?

深度强化学习实验室 官网&#xff1a;http://www.neurondance.com/ 来源&#xff1a;https://zhuanlan.zhihu.com/p/328287119 作者&#xff1a;网易伏羲实验室 编辑&#xff1a;DeepRL 在深度学习中&#xff0c;模型很容易过拟合到参与训练的数据集。因此&#xff0c;深度学习…

BatchFormer:有效提升数据稀缺场景的模型泛化能力|CVPR2022

文 | 侯志知乎&#xff08;已授权&#xff09;源 | 极市平台 摘要 当前的深度神经网络尽管已经取得了巨大的成功&#xff0c;但仍然面临着来自于数据稀缺的各种挑战&#xff0c;比如数据不平衡&#xff0c;零样本分布&#xff0c;域适应等等。 当前已经有各种方法通过样本之间的…