TCP粘包和抓包

在 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.mzph.cn/web/51229.shtml

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

相关文章

大模型从入门到精通——词向量及知识库介绍

词向量及知识库介绍 1.词向量 1.1 什么是词向量 词向量是一种将单词表示为实数向量的方式。每个单词通过一个高维向量来表示,向量的每一维都是一个实数,这些向量通常位于一个高维空间中。词向量的目标是将语义相似的单词映射到相邻的向量空间中&#…

自定义@ResponseBody以及SpringMVC总结

文章目录 1.需求分析2.目录3.自定义ResponseBody注解4.MonsterController.java5.Monster.java 实现序列化接口6.引入jackson7.Adapter.java 如果有ResponseBody注解就返回json8.测试9.SpringMVC执行流程 1.需求分析 2.目录 3.自定义ResponseBody注解 package com.sunxiansheng…

[Linux][软件]CentOS 系统部署 RabbitMQ

简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通…

24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III

目录 198. 打家劫舍题目描述题解 213. 打家劫舍 II题目描述题解 337. 打家劫舍 III题目描述题解 打家劫舍的一天 😈 198. 打家劫舍 点此跳转题目链接 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷…

(贪心) LeetCode 135. 分发糖果

原题链接 一. 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xf…

rapidjson的移植

因为rapidjson是只有头文件 使用模板来实现json 所以只需要添加头文件就行 make使用-I/路径指定头文件 解压后编写makefile 下载地址 https://github.com/Tencent/rapidjson https://github.com/Tencent/rapidjson/releases/tag/v1.1.0 下载了版本 rapidjson-1.1.0.zip 使用…

OpenCV与AI深度学习 | 基于改进YOLOv8的景区行人检测算法

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:基于改进YOLOv8的景区行人检测算法 作者:贵向泉,刘世清,李立等 来源:《计算机工程》期刊 编…

docker应用

打包传输 1.将镜像打包 #查看帮助文件 docker --help #找到save,可以将镜像保存为一个tar包 docker save --help #查看save使用方式 #查看现有的镜像 docker images # docker save --output centos.tar centos:latest ls ...centos.tar... 可以将tar发送给其他用户…

若依如何添加测试单元

一、引入依赖 在ruoyi-admin的pom文件中加入以下依赖&#xff0c;此处为什么不需要写版本号&#xff1f;SpringBoot版本中有对应的默认版本&#xff0c;可以防止新手小白乱写版本后引发冲突。 <dependency><groupId>org.springframework.boot</groupId><…

class_4:条件语句和逻辑运算符

mood_index int(input("对象今天的心情怎么样&#xff01;"))if mood_index > 80:print("今天可以好好happy一下了")print("O(∩_∩)O哈哈~") else:print("今天还是乖乖的吧&#xff01;否则小命不保") #BMI 体重 /&#xff08;身…

[mysql][sql]安装完mysql8跨主机不能访问解决办法

SQL语句是针对MySQL数据库的操作&#xff0c;用于更新用户信息和用户密码。 use mysql; update user set host% where userroot; ALTER USER root% identified with mysql_native_password by 密码;以下是每个命令的简要说明&#xff1a; 切换到mysql数据库: USE mysql; 这…

css实现闪烁渐变背景,@property自定义属性

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

ArkTS---HAR

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。 一、使用场景 作为二方库&#xff0c;发布到OHPM私仓&#xff0c;供公司内部其他应用使用。作为…

Linux --- 文件系统

1. 文件系统的概念 Linux 文件系统是一种用于管理、存储和组织数据的层次结构&#xff0c;用于在 Linux 操作系统中管理磁盘上的数据存储。它定义了如何在存储介质&#xff08;如硬盘、固态硬盘或 USB 闪存&#xff09;上组织文件和目录&#xff0c;以及如何读取、写入和操作这…

java整合DL645-2007与Dl645-1997

注意事项: 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重传输次序-所有的数据项都是先传低字节,…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;用于跨设备跨进…

嵌入式八股-C++面试35题(20240824)

1. 进程和线程的基本概念是什么&#xff1f; 进程&#xff1a;进程是操作系统分配资源的基本单位&#xff0c;是一个正在运行的程序实例。每个进程都有自己的内存空间、文件句柄和其他资源。线程&#xff1a;线程是进程的一个执行单元&#xff0c;是CPU调度和分派的基本单位。…

K8S部署MySQL5.7的主从服务

mysql-slave-0是master mysql-slave-1是备份 当mysql写的时候&#xff0c;找headless service中的 mysql-slave-0.mysql57-slave-headless&#xff1b;当mysql读的时候&#xff0c;找clusterip service中的mysql57-slave-read读&#xff0c;实现读写分离。 statefulset维护两个…

linux文本分析工具grep、sed和awk打印输出文本的单双奇偶行(grep也可以打印奇偶行)以及熟悉的ssh命令却有你不知道的一些用法

一、linux文本分析工具grep、sed和awk打印输出文本的单双奇偶行&#xff08;grep也可以打印奇偶行&#xff09; 其实sed和awk要打印输出奇偶行是很容易的事情&#xff0c;不过只能使用grep来输出奇偶行的话怎么实现呢&#xff1f;今天我就想了一下&#xff0c;如果真的只能使用…

【Leetcode 1897 】重新分配字符使所有字符串都相等 —— 数组模拟哈希表

给你一个字符串数组 words&#xff08;下标 从 0 开始 计数&#xff09;。 在一步操作中&#xff0c;需先选出两个 不同 下标 i 和 j&#xff0c;其中 words[i] 是一个非空字符串&#xff0c;接着将 words[i] 中的 任一 字符移动到 words[j] 中的 任一 位置上。 如果执行任意…