TCP 粘包问题

news2024/9/22 19:36:16

TCP是一个面向字节流的传输层协议。“流” 意味着 TCP 所传输的数据是没有边界的。这不同于 UDP 协议提供的是面向消息的传输服务,其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。于是就有了粘包、拆包问题的出现。粘包、拆包问题只发生在TCP协议中。

TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。

粘包问题出现的原因: 

     1. 发送端:需要等缓冲区满时才发送出去,造成粘包;

     2. 接收端:不及时的接收缓冲区内的包,造成多个包接收。

 避免粘包问题的方法:

     1. 对于定长的包,保证每次都按固定大小读取即可;//  结构体

     2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。


     
TCP报文头

    标志位:
    1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
    2. ACK: 确认应答标志
    3. PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
    4. RST: 重置连接标志
    5. SYN: 表示请求建立一个连接
    6. FIN: finish标志, 表示释放连接

TCP的机制

TCP复杂是因为它既要保证可靠性,同时又要尽可能的提高性能。

    可靠性:

        (1)三次握手和四次挥手机制
        
         (2) 确认应答:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达

        (3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。

        (4)流量控制:按照ACK中“窗口大小”字段控制发送端的发送速度

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

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

相关文章

为什么最近多模态大模型工作中用Q-Former结构的变少了?

前言 训练资源有限的情况下(有限的 GPU、训练数据等),Q-former 也只是一个“低效”压缩器。如果想减少图片 token 数量来降低训练代价,简单的 AdaptiveAveragePooling 就够了。 转载自丨PaperWeekly 我们组最近的工作 DeCo: De…

Eagle 4.0:强大插件加持的素材收集管理工具

期待很久的全新 Eagle 4.0 现已正式推出了! Eagle 是一款 Win / Mac 双平台素材收集管理工具,它可以帮你高效整理电脑中的图片、字体、视频、音频等各种素材,是众多设计师、美图收集爱好者的信赖之选。 4.0 版是一次全面的革新,从…

二十三设计模式速记

文字版 Java设计模式通常被分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)。每种类型包含若干种具体的设计模式。 创建型模…

Unity URP Shader 修改深度让人物不再被地面遮挡

Unity URP Shader 修改深度让人物不再被地面遮挡 前言项目场景布置代码编写 前言 遇到一个小问题,人物总是被XY平面的地面遮挡,于是在Shader中改一下深度输出,这样地面再也不会挡住人物了。 项目 场景布置 将人物放到XY平面的后面 配置S…

在ubuntu22.04上部署RagFlow一个深度文档理解的开源 RAG

RAGFlow 是一个基于深度文档理解的开源 RAG(Retrieval-Augmented Generation)引擎。它为任何规模的企业提供简化的 RAG 工作流程,结合 LLM(大型语言模型)以提供真实的问答功能,并由来自各种复杂格式数据的有…

微服务——远程调用

为什么需要远程调用? 在微服务架构中,每个服务都是独立部署和运行的,它们之间需要相互协作以完成复杂的业务逻辑。因此,远程调用成为微服务之间通信的主要方式。通过远程调用,一个服务可以请求另一个服务执行某些操作或…

Ubuntu 22安装和配置PyCharm详细教程(图文详解)

摘要:本文提供了在 Ubuntu 22 上通过官方 .tar.gz 文件安装 PyCharm 的详细教程。包括从 JetBrains 官方网站下载适合的 PyCharm 版本(Community 或 Professional),在终端中解压并将其移动到 /opt 目录,配置适当的权限…

探索《旅行青蛙》:在Scratch上重温温暖与治愈的旅程

Scratch青蛙跳一跳(回家版)- 趣味跳跃挑战,轻松助力青蛙回家之旅-小虎鲸Scratch资源站 在这个快节奏的世界中,治愈系游戏《旅行青蛙》以其独特的魅力吸引了无数玩家。这个游戏不仅让我们能够体验到与青蛙一起旅行的温暖与宁静&…

【运筹学】【数据结构】【经典算法】最小生成树问题及贪心算法设计

1 知识回顾 我们已经讲过最小生成树问题的基础知识,我们现在想要利用贪心算法解决该问题。我们再来回顾一下最小生成树问题和贪心算法的基础知识。 最小生成树问题就是从某个图中找出总权重最小的生成树。 贪心算法是一种算法设计范式,每一步都选…

芯片后端之 PT 使用 report_timing 产生报告 之 -input_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max -include_hierarchical_pins 我们使用命…

我们再次陷入软件危机

裁员、裁员、裁员,似乎永无止境。创业公司融资处于 5 年来最低水平。除了整体经济挑战之外,人工智能取代软件工作的担忧也即将出现。每天的科技新闻读起来就像世界末日的故事。 这又是软件开发的终结吗? 作为一名在互联网泡沫破灭后开始从事软…

【数据结构2】链表(使用头插法和尾插法创建链表)、链表的插入和删除、双链表节点的插入、双链表节点的删除

1 链表 1.2 使用头插法和尾插法创建链表 2 链表的插入和删除 3 双链表 3.1 双链表节点的插入 3.2 双链表节点的删除 1 链表 链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。 通过节点之间的相互连接最终串联成一个链…

【qt】自定义信号

我们在上篇中,服务器收到的消息是由线程类去处理的,消息在线程类中,传不到widget中的ui中去,如果我们要在界面显示客户端的消息,必须通过自定义信号. 1.构建信号 当线程收到信息,就会被填充在ba中&#xf…

Robot Operating System——自定义Service/Client通信消息结构

大纲 初始化环境生成自定义服务的工程创建包自定义消息package.xml完整文件 CMakeLists.txt完整文件 编译注册 使用自定义服务的工程创建包代码CMakeLists.txt编译运行 工程地址参考资料 在《Robot Operating System——自定义订阅/发布的消息结构》一文中,我们讲解…

Linux | 文件系统进阶:Inode与软硬链接艺术剖析

当时共我赏花人,点检如今无一半。 - 《木兰花》(晏殊) 2024.8.24 目录 1. 文件系统的基本概念 1.1 ls -l命令查看目录信息 1.2 stat命令查看具体文件的详细信息 1.3 inode ext2文件系统的主要组成部分: 例子:创建main.c文件 文件的创建步骤&a…

leetcode:2520. 统计能整除数字的位数(python3解法)

难度:简单 给你一个整数 num ,返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 ,则认为整数 val 可以整除 nums 。 示例 1: 输入:num 7 输出:1 解释:7 被自己整除,因…

继续修改原神角色数据列表

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本获得角色数据表</title> </…

【STM32】一些外设通用内容

在学习各种外设的过程中&#xff0c;发现外设有一些通用的东西可以总结一下&#xff0c;后面发现再继续更新。图来源于正点原子的学习视频和PPT。 目录 1 外设的时钟的开启 2 外设初始化的回调机制 3 外设的中断服务函数 4 HAL库中断回调机制 5 函数的常见…

SpringCache源码解析(一)

一、springCache如何实现自动装配 SpringBoot 确实是通过 spring.factories 文件实现自动配置的。Spring Cache 也是遵循这一机制来实现自动装配的。 具体来说,Spring Cache 的自动装配是通过 org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration 这个类来…

文件树控件开发

文件树控件和获取驱动信息功能 然后添加上查看文件信息的按钮 双击这个按钮添加上如下代码 void CRemoteClientDlg::OnBnClickedBtnFileinfo() {int ret SendCommandPacket(1);if (ret -1) {AfxMessageBox(_T("命令处理失败!!!"));return;}ClientSocket* pClient…