【网络】TCP协议面向字节流和粘包问题

news2024/12/27 11:09:39

目录

面向字节流

粘包问题

解决粘包问题的方法


个人主页:东洛的克莱斯韦克-CSDN博客

面向字节流


TCP是一种面向字节流的协议,这意味着TCP并不将传输的数据视为独立的消息或报文,而是将其视为一个连续的字节序列。在TCP连接中,发送方将应用层数据写入TCP发送缓冲区,TCP将这些数据视为字节流进行处理,并在接收方将其重新组合成原始数据。这种处理方式提供了很高的灵活性,因为TCP可以传输任意类型的数据,包括文本、图像、音频等。

创建一个 TCP 的 socket, 同时在内核中创建一个 发送缓冲区 和一个 接收缓冲区; 调用 write 时, 数据会先写入发送缓冲区中;  如果发送的字节数太长, 会被拆分成多个 TCP 的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或 者其他合适的时机发送出去;  接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区; 然后应用程序可以调用 read 从接收缓冲区拿数据; 另一方面, TCP 的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一 个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工 由于缓冲区的存在, TCP 程序的读和写不需要一一匹配, 例如:  写 100 个字节数据时, 可以调用一次 write 写 100 个字节, 也可以调用 100 次 write, 每次写一个字节;  读 100 个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以一次 read 100 个字节, 也可以一次 read

然而,面向字节流的特性也带来了一些挑战。由于TCP不保留消息的边界,接收方在接收数据时可能无法直接识别出单个消息的起始和结束位置。这可能导致接收方在解析数据时遇到困难,尤其是在发送方发送了多个小消息且这些消息在传输过程中被合并成一个大的数据包时。

粘包问题


粘包问题是指在TCP通信过程中,发送方发送的多个数据包在接收方被错误地合并成一个数据包,导致接收方无法正确地解析出单个的数据包。粘包问题的发生原因主要有以下几点:

TCP的面向字节流特性:如前所述,TCP不保留消息的边界,这是粘包问题发生的根本原因。


发送方发送的数据包较小且发送速率较快:在这种情况下,TCP可能会为了提高传输效率而将多个小数据包合并成一个大的数据包进行发送。


接收方缓冲区大小不足:如果接收方的缓冲区不足以存储所有接收到的数据包,就可能导致数据包在缓冲区中被合并。


网络延迟和丢包:TCP协议虽然是一种可靠的传输协议,但网络延迟和丢包仍然可能导致数据包的到达顺序和时间发生变化,从而增加粘包问题的可能性。

解决粘包问题的方法


为了解决TCP通信中的粘包问题,可以采取以下几种方法:

固定长度的消息:将每个消息的长度固定为某个特定的值。接收方在接收到足够长度的数据后,就认为已经接收到了一个完整的消息。然而,这种方法可能会导致数据的浪费和灵活性降低。

特殊字符作为边界:在消息的末尾添加一个特定的分隔符(如换行符\n)。接收方在接收到这个分隔符时,就认为已经接收到了一个完整的消息。但需要注意的是,如果消息内容中可能包含这个分隔符,则需要进行转义处理。

自定义消息结构:在每个消息前添加一个包含消息长度的头部。接收方在接收到头部后,先解析出消息的长度,然后根据这个长度来读取后续的数据。这种方法既灵活又高效,但需要发送方和接收方事先约定好消息结构的格式。
 

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

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

相关文章

通过AI帮我分析实现的2019销售季度对比叠加图

话不多说,看效果 1)先准备销售表内容:高手自测.xlsx 2)向kimi上传文件,并提问 3)得出结果,代码如下: import pandas as pd from pyecharts.charts import Bar, Line, Overlap from pyecharts import options as opts# 读取Excel文件 df pd.read_excel(高手自测3.xlsx)# 数据预…

jenkins工具配置

上一篇(https://blog.csdn.net/abc666_666/article/details/141207741)文章我们介绍了基于docker安装jenkins的过程,本文将介绍如何配置jenkins的相关全局工具如maven、 jdk以及git等 配置的页面如下: 打开后的页面如下&#xff…

JookDB和MobaXterm下载安装使用

文章目录 1.使用背景2.MobaXterm的下载安装使用3.JooKDB的下载安装使用 1.使用背景 由于xshell和xftp等工具都是收费的,即使有破解版但是有的公司里不让用盗版的软件。可以使用MobaXterm来替代。 同理可使用JooKDB来代替收费的navicat 来连接数据库。 2.MobaXterm…

机器学习深度学习中的搜索算法浅谈

机器学习&深度学习中的搜索算法浅谈 搜索算法是计算机科学中的核心算法,用于在各种数据结构(如数组、列表、树、图等)中查找特定元素或信息。这些算法不仅在理论上具有重要意义,还在实际应用中扮演着关键角色。本文将详细探讨…

vulnhub靶机:DC-4

目录 导入靶机 信息收集 发现IP 目录扫描 端口扫描 访问 web 弱口令爆破 反弹shell 获得交互式 shell 提权 使用 hydra 暴力破解 SSH 连接 jim 用户 登录charles账户 使用 teehee 创建 root 用户 导入靶机 点击重试 然后网卡换成 NAT模式,开启靶机 信息…

web前端之实现霓虹灯背景魔术卡、旋转的背景动画、模糊效果、边框、变量、filter

MENU 前言效果图htmlstyle 前言 代码段定义一个名为Magic Card的卡片&#xff0c;并通过一系列CSS属性和动画效果来美化和增强该卡片的视觉效果。 效果图 html <div class"card">Magic Card </div>style 代码 property --rotate {syntax: "<a…

EasyCVR视频汇聚平台:深度解析GB/T 28181协议下的视频资源整合与应用

随着安防技术的快速发展和智慧城市建设的推进&#xff0c;视频监控系统作为公共安全、城市管理、企业运营等领域的重要基础设施&#xff0c;其重要性和应用范围不断扩大。在这一过程中&#xff0c;GB/T 28181作为国家标准中关于视频监控设备通信协议的规范&#xff0c;正逐渐受…

DatawhaleAI夏令营 多模态大模型

任务讲解 此次的任务和一般以模型为中心的任务不同&#xff0c;是以数据为核心的。要求在官方给定的数据集的基础上进行数据清洗和数据合成&#xff0c;生成更为优质的数据集&#xff0c;以提高多模态模型的性能。&#xff08;此次的模型以图文能力为主&#xff09; 我们将会…

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…

[vue] pdf.js / vue-pdf 文件花屏问题

vue-pdf内核也是pdf.js&#xff0c;修改方式一样 在pdf.worker.js中加入几行代码&#xff0c;追加到”precinct.zeroBitPlanesTree zeroBitPlanesTree;“之后。 for (var l 0; l < layerNumber; l) {if (readBits(1) ! 0) {throw new JpxError("Invalid tag tree&qu…

vba代码插入折线图

xqwertyy52152018139hi303533312015 Sub test()Set sht1 ThisWorkbook.Worksheets("示例")x sht1.Range("I1").Lefty sht1.Range("I1").Topw sht1.Range("N15").Width * 15h sht1.Range("N15").Height * 25Set ch1 s…

Progressive Multi-modal Conditional Prompt Tuning

文章汇总 动机 图像的重复消化有助于提高分类精度。ProMPT不是直接进行预测&#xff0c;而是多次重新访问原始图像以检查答案&#xff0c;逐步将预测从粗糙细化到精确。 希望达到的效果如下&#xff1a; 图7:通过迭代进化&#xff0c;ProMPT逐步将CLIP产生的错误结果纠正为正…

el-select远程搜索,查询条件为空,没有搜索到数据时,展示“无数据”

el-select远程搜索&#xff0c;查询条件为空&#xff0c;没有搜索到数据时&#xff0c;展示“无数据” 现状&#xff1a;1、查询条件没有值&#xff0c;远程接口没有数据时&#xff0c;不展示“无数据”&#xff1b; 2、查询条件有值&#xff0c;远程接口没有数据时&#xff0c…

公用事业公司签署大规模电力供应协议

随着人工智能技术的迅猛发展&#xff0c;美国公用事业公司与数据中心运营商之间的电力供应协议数量显著增加&#xff0c;为未来几季度的销售和利润增长奠定了基础。根据高盛今年5月发布的一份报告&#xff0c;到2030年&#xff0c;数据中心的发电量预计将占美国总发电量的8%&am…

autoware中ROS2学习笔记

文章目录 一、学习资料&#xff1a;1.1、说明1.2、Autoware Documentation1.3、Autoware Universe Documentation1.4、总结 二、概述三、ros2--节点组件什么是组件容器组件的实现原理可组合节点--节点组件什么是节点组件为什么需要可组合节点创建可组合节点时构造函数为什么需要…

Android 12系统源码_屏幕设备(一)DisplayManagerService的启动

前言 DisplayManagerService是Android Framework中管理显示屏幕相关的模块&#xff0c;各种Display的连接、配置等&#xff0c;都是通过DMS和来管理控制。 在DMS模块中&#xff0c;对显示屏幕的描述分为物理显示屏(physical display)和逻辑显示屏(logical display)&#xff0c…

您知道有哪些主流的大模型LLM开源项目吗?

随着人工智能技术的飞速发展&#xff0c;大模型LLM&#xff08;Large Language Models&#xff09;已成为自然语言处理领域的一股不可阻挡的潮流。从早期的探索到今天的广泛应用&#xff0c;LLM在理解、生成和处理人类语言方面取得了令人瞩目的成就。本文旨在提供一个全面的视角…

【网络安全】密码重置中毒漏洞解析

未经许可 不得转载。 文章目录 概述重置密码的正常流程如何构造密码重置投毒攻击悬垂标记攻击概述 密码重置投毒是一种技术,攻击者利用该技术操纵易受攻击的网站,使其生成指向其控制域的密码重置链接。此行为可被用来窃取重置任意用户密码所需的秘密令牌,并最终盗取其帐户。…

最新级联文生图技术,StableCascade模型部署

Stable Cascade是 Stability AI 开发的一款先进的文生图&#xff08;Text-to-Image&#xff09;生成模型。 Stable Cascade由三个模型组成&#xff1a;Stage A、Stage B 和 Stage C&#xff0c;它们分别处理图像生成的不同阶段&#xff0c;形成了一个“级联”&#xff08;Casc…

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…