TCP粘包和抓包

news2024/11/14 18:19:05

在 TCP 套接字中,发送和接收缓冲区用于暂存数据,以确保数据的可靠传输。具体来说,TCP 的 socket 收发缓冲区的主要特点和概念如下:

1. 发送缓冲区(Send Buffer)

定义: 发送缓冲区用于存储待发送的数据。应用程序将数据写入发送缓冲区,TCP 协议会将这些数据逐渐发送到网络中。

大小: 发送缓冲区的大小可以通过套接字选项进行配置,默认大小通常由操作系统决定。可以使用 setsockopt() 函数来修改送的缓冲区大小,例如:

int size = 1048576; // 1MB setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));

2. 接收缓冲区(Receive Buffer)

定义: 接收缓冲区用于存储接收到的网络数据,通常由 TCP 协议管理。数据从网络中接收后,首先会存入接收缓冲区,应用程序随后从缓冲区中读取数据。

大小: 跟发送缓冲区一样,接收缓冲区的大小也可以通过 setsockopt() 调整。例如:

int size = 1048576; // 1MB setsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));

3. 缓冲区管理

TCP 是面向连接的协议,使用流控、拥塞控制等机制来管理数据传输。当发送缓冲区满时,发送操作会被阻塞,直到有数据被确认接收,腾出空间;同样,接收缓冲区满时,recv() 调用将阻塞,直到缓冲区有可读数据。

4. 缓冲区溢出

如果接收缓冲区的大小不够以存放所有传入的数据,丢失的数据将被丢弃。因此,合理设置缓冲区的大小对提升 TCP 性能是重要的。

5. 查看缓冲区大小(仅在 Linux 上)

使用 getsockopt() 函数可以查看当前缓冲区的大小。例如:

int size; socklen_t optlen = sizeof(size); getsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, &size, &optlen); printf("Send buffer size: %d\n", size); getsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &size, &optlen); printf("Receive buffer size: %d\n", size);

6. 影响因素

(1)网络带宽: 高带宽网络可能需要更大的发送和接收缓冲区。

(2)延迟和延迟带宽积: 高延迟的连接通常需要更大的缓冲区,以防止网络延迟导致的传输效率降低。

粘包:

粘包的原因:

  1. TCP流的特性:TCP 是一种面向字节流的协议,无论发送方发送多少次数据,接收方可能在一次 recv 调用中接收到多个数据包,或者一个数据包被拆分为多个部分。

  2. 数据发送速率:发送方的连接速率快于接收方处理速率,造成多个数据在同一时间到达。

  3. 数据包大小差异:当小的数据包被频繁发送时,TCP 可能会将它们合并在一起以减少网络协议开销。

  4. 网络拥塞:网络拥塞可能会导致数据在发送过程中的堆积,从而导致粘包。

解决方案:

  1. 固定长度协议:每个数据包有固定的字节长度,接收方只需按此长度接收数据。

  2. 分隔符协议:在每个数据包后添加特定的分隔符(如 \nEOF 等),接收方通过检测分隔符来分割数据包。

  3. 消息头:在每个数据包前加上一个头部,头部包含消息体的长度信息。接收方先读取头部,知道完整消息的长度后,再读取相应字节的数据。

    例如,可以设计如下数据格式:

    [length][data]

    其中 length 为数据长度(通常为 4 字节),data 为实际数据。

  4. 使用高层协议:使用已有的高层协议(如 HTTP、WebSocket 等),这些协议内置了解决粘包问题的机制

127.0.0.1 是一个特殊的IP地址,称为回环地址,通常用于网络测试和本地通信。它代表本地计算机或设备本身。使用这个地址,您可以在没有网络连接的情况下测试网络应用程序,因为所有通过该地址发送的数据都返回给同一设备。

二、recv和send

1. send 函数

send 函数用于在已连接的 socket 上发送数据。它的基本原型如下(C语言):

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

  • 参数说明:

    • sockfd: 套接字描述符,标识已连接的 socket。
    • buf: 指向包含要发送数据的缓冲区的指针。
    • len: 要发送的数据的长度(字节数)。
    • flags: 发送操作的标志,通常可以为0。
  • 返回值:

    • 成功时返回实际发送的字节数;失败时返回 -1,并设置 errno。

2. recv 函数

recv 函数用于从连接的 socket 接收数据。它的基本原型如下(C语言):

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

  • 参数说明:

    • sockfd: 套接字描述符,标识已连接的 socket。
    • buf: 指向一个缓冲区,接收到的数据将存储在其中。
    • len: 缓冲区的大小(字节数)。
    • flags: 接收操作的标志,通常可以为0。
  • 返回值:

    • 成功时返回实际接收的字节数;返回值为0表示对方关闭了连接;失败时返回 -1,并设置 errno。

三、常用网络调试工具

ifconfig//查看主机上,网卡网络信息
ping//测试 两台主机之间是否连通
telnet//远程登录工具
ssh//硬件(开发板)

netstat// 查看当前主机上,活动的网络进程的相关的状态信息
arp

抓包

四、HTTP

1.http (超文本传输协议)

2.URL统一资源定位符

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

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

相关文章

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码,您的 Android 移动设备将锁定您。发生这种情况时,通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是,这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

排查Maven问题的步骤

0.检查pom文件完整性 1.检查IDEA中配置是否正确 2.使用清楚工具将所有的lastupdate清除, 3.有些依赖是公司的依赖 —>配置私服 —>拷贝同事仓库,覆盖自己的仓库 4.有了私服地址,但是还是下载不到 —>查看地址是否能访问 —>挂VPN

linux多进程与多线程总结

这里写自定义目录标题 2 linux多进程与多线程2.1 进程间通信2.1.1 管道2.1.2 信号2.1.3 消息队列2.1.4 共享内存 3 线程4 IO多路复用4.1 非阻塞IO4.2 IO多路复用 2 linux多进程与多线程 学习并发程序。 linux系统中,使用树型管理进程。因此进程之间有父子关系。通…

如何使用ssm实现学生公寓管理系统的设计与实现

TOC ssm106学生公寓管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,…

LeetCode.3146.两个字符串的排列差

题目描述: 给你两个字符串 s 和 t,每个字符串中的字符都不重复,且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 输入输出示例: 思路一&#xff1…

TMC2209模块开启无限位归零

TMC2209无限位归零配置步骤: 3.1 配置内部采样电阻。具体在GCONF中internal_Rsens 1; 此步发送数据 05 00 80 00 00 00 83 00 3.2 电机电流设置,配置IHOLD_RUN寄存器; 此处发送数据 05 00 90 00 00 16 16 12 3.3 设置失速电流阈…

QT接收并解析GPS模块串口数据

目录 一、QT读取串口数据 二、解析数据 目标: 使用QT,读取gps模块的串口数据,并解析其中的经纬高数据,然后进行处理 一、QT读取串口数据 变量定义 QSerialPort *serial; QSerialPortInfo SerialPortInfo; QByteArray lineData…

Deepin【2】:Deepin系统盘扩容

Deepin【2】:Deepin系统盘扩容 1、进入live系统1.1、live系统入步骤 2、连接网络3、新增系统仓库4、安装gparted应用5、使用gparted进行扩容操作5.1、观察当前分区5.2、压缩data分区5.3、Rootb分区合并空闲空间5.4、Rootb分区压缩空间5.5、Roota合并空闲空间5.6、核…

【学习笔记】STM32F407探索者HAL库开发(二)STM32F4最小系统设计

【学习笔记】STM32F407探索者HAL库开发(二)STM32F4最小系统设计 0 什么是最小系统1 电源电路1.1 数字部分电源1.2 模拟部分电源1.3 参考电压1.4 VBAT 2 复位电路3 BOOT启动电路(F4)4 晶振电路4.1 低速晶振4.2 高速晶振 5 下载调试…

计算机操作员试题(公共科目)

计算机操作员试题(公共科目) ★★★ RZer整理 仅供参考 ★★★ 单项选择题 “人的本质”这一概念是人对自身的认识发展到一定阶段形成的,它力图从根本上回答“人是什么”或“什么是人”这一重大问题。马克思主义认为,人的本质( )。 A.永恒不变 B.可随主观意志而任意改变 C…

【Material-UI】Radio Group中的 Color 属性详解

文章目录 一、Radio Group 组件概述1. 组件介绍2. 基本用法 二、Color 属性详解1. Color 属性的作用2. 使用 Color 属性设置颜色3. 自定义颜色 三、Color 属性的实际应用场景1. 品牌一致性2. 状态指示3. 突出特定选项 四、注意事项1. 色彩对比2. 无障碍设计3. 主题定制 五、总结…

electron仿微信,点击子窗口以外的区域时、关闭子窗口

环境 windows:PC微信 我们可以看到,微信聊天界面点击右上角三个点时,会显示这个人的聊天信息窗口,我们把鼠标点击在其他位置时,这个聊天信息窗口就消失了,那么,这是怎么实现的呢,能…

Git的使用教程及常用语法02

四.将文件添加到仓库 创建仓库 git init查看仓库的状态 git status 添加到暂存区 git add提交 git commitgit status 可以查看当前仓库的状态信息,例如包含哪些分支,有哪些文件以及这些文件当前处在怎样的一个状态。 由于当前没有存储任何的东西&…

深度解析丨AI绘画StableDiffusion如何实现模特精准换装,以及如何将假人模特替换成真人模特!

大家好,我是灵魂画师向阳 今天给大家分享一下用AI绘画Stable Diffusion 进行模特换装!本篇教程主要运用StableDiffusion这个工具来进行操作,下面会通过几个小案例,给大家展示不同需求下,我们该如何使用StableDiffusio…

Linux查看jvm相关参数以及设置调优参数

1、查看jvm相关参数 1.1、查看Java进程命令 jcmd会显示出来对应的Java进程id 1.2、查看堆内存各个区域的使用大小、具体大小和GC次数以及耗时 jstat -gc 4036145jstat -gc 进程id 各个参数的含义。 如上图,4036145的进程,FGCT是0.452,FGC是4.平均每次full gc耗时0.11秒。 …

如何选择行为审计管理软件?值得收藏的三款行为审计管理软件

在选择行为审计管理软件时,企业需要考虑多个方面以确保所选软件能够满足其特定的需求和目标。以下是一些关键的选择标准,以及基于这些标准推荐的三款优秀软件。 选择行为审计管理软件的关键标准 1.功能全面性:软件应覆盖行为审计的各个方面&…

Godot《躲避小兵》实战之为游戏添加音效

现在,我们已经完成了游戏的所有功能。以下是一些剩余的步骤,为游戏加点“料”,改善游戏体验。 随意用你自己的想法扩展游戏玩法。 背景 默认的灰色背景不是很吸引人,那么我们就来改一下颜色。一种方法是使用 ColorRect节点。将…

JavaScript学习文档(6):什么是对象、对象使用、遍历对象、内置对象、术语解释

目录 一、什么是对象 1、对象是什么 二、对象使用 1、对象使用 2、对象有属性和方法组成 (1)对象属性(增删改查) (2)对象方法 三、遍历对象 1、遍历对象 2、渲染学生信息案例 四、内置对象 1、…

旅游行业怎么利用C#接口发送短信

旅游企业一般拥有众多的分支机构,同时各地分支机构又有众多下属分散在当地各区的旅游营业报名点,以前传统的解决方案是采用专线、MODEM拔号等方式,专线的成本很高,MODEM拔号更费时,且长途拔号互联成本在多点情况下费用…

scikit-learn特征抽取

为什么需要特征工程 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已 什么是特征工程 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程 意义:会直接影响机器学习的效果 特征…