粘包/拆包问题一直都存在,只是到TCP就拆不动了。

news2024/11/17 0:20:44
  • 1c395805a77984b367ec3d5107ceca44.gif

  • • OSI open-system-Interconnection

  • • TCP/IP 5层协议栈

    • • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api

  • • TCP/UDP 概况

  • • TCP粘包问题

  • • 结合TCP/IP报头再回顾,柳暗花明

OSI开放系统互联

定义了网络框架,以层为单位实现协议,同时控制权逐层传递。

ec0130f2e3158a62826b950193cf930d.gif

OSI实际并没有落地,TCP/IP5层协议栈是目前主流的落地实现。

TCP/IP 5层协议栈

TCP/IP协议栈不止是传输层tcp/网络层ip, 还包括应用层等,这是一个协议簇,只是因为TCP/IP很具代表性。

不管是OSI还是TCP/IP5层协议栈,均会出现应用程序和操作系统边界(代码执行在用户态/内核态)。

04d41286b78d7a9c2c5809ba2b4e3c80.png

边界调用被称为系统调用system call, socket api便是TCP/IP协议栈中应用层的网络编程接口。

TCP/UDP概览

  • • TCP: Transmission Control Protocol面向连接的,可靠的,基于字节、双向流式传输层协议。

  • • UDP: USer Datagram Protocol面向消息的传输服务,传输的数据是有边界的。

  • 区别:

TCP可靠性是tcp三次握手的基础,在此之上,增加了seq、ack数据确认机制、 拥塞控制, 其中ack= seq+len(data)。

UDP:想法就发,不用三次握手建连,无粘包问题。

我们目前常见的应用场景底层都是tcp,比如http请求、sql数据库请求。

建立TCP连接之后,才能做http请求、sql请求,tcp连接很耗时,故服务器都存在连接池化机制。

这里我要给自己强调的是:开发者对于tcp一定不要带入http请求-响应模型,tcp是双向通信流。

TCP粘包/拆包

粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。

数据链路层,网络层的粘包和拆包问题都由协议自行处理了(注意看tcp、ip报头中的长度),日常应用开发都在对接传输层,故面临的是TCP粘包。

d129268677d8599762f14808cb99089e.png

TCP粘包并不是TCP协议造成的问题,因为tcp协议本就规定流式传输(算法决定:利用缓冲区,有拥塞控制,大小包合并),它不含消息、数据包等概念,需要应用层自己设计消息边界。

5b8899507254422c0dd9bb518a10ac2b.png

HTTP 超文本传输协议的规定如下:

cf86f9be8416a38e5af15784c423822b.png

附:TCP报头、IP报头

tcp报头结构:[源端口、目标端口、SEQ/ACK在这定义]

006fbec7b406d70f85d4fe29831fbf0f.png

ip报头结构:[源ip、目标ip在这定义]

186d4bb2618224515f47bf0fbdba0c22.png

旁白

结合TCP报头/IP报头, 我们知道粘包、拆包一直都存在(TCP/IP报头附录里利用数据长度/偏移量,协助封包、拆包)。

只是协议栈一层层帮我们拆到TCP层的时候,如果没有特殊机制,我们是没有办法区分应用层断续发送的请求/调用。 故同理应对TCP粘包问题,上次应用层需要使用特殊分隔符或者长度来协助封包/拆包。

点“aff8f2ba00dfb1172459a58605ff678d.gif戳“在看b5db0e3863e7cf9046c9ee015fb7042b.gif

体现态度很有必要!

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

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

相关文章

【VSLAM】ORB-SLAM3安装部署与运行

心口如一,犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. ORB-SLAM3介绍:blush:2. 代码安装部署1. 安装ros与opencv2. 安装Pangolin作为可视化和用户界面3. 安装Eigen3一个开源线性库,可进行矩阵运算4. 安装ORB-SLAM3 :satisfied:3. 案例运…

OpenHarmony开发者大会正式召开 百业齐鸣开源共兴​

4月19日,OpenHarmony 开发者大会于北京正式召开。此次会议以“开源正当时,共赢新未来”为主题,邀请了各行各业众多开发者与会,盛况非凡。据了解,此次大会由开放原子开源基金会指导,OpenHarmony 项目群工作委…

依赖引入手册Idea常用设置常用工具手册

目录 数据库相关web应用工具相关postmancanal 测试相关插件相关Idea相关 数据库相关 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--连接池-->…

进程控制(上)

目录 &#xff1a; 1.fork&#xff08;&#xff09;写实拷贝 -- 缺页中断 2.进程终止 1.退出码 2.exit&#xff08;进程终止&#xff09;、_exit() 3.进程等待 1.进程等待的必要性 2.进程如何进入等待 -----------------------------------------------------------------…

MySQL常见的存储引擎

InnoDB&#xff1a;InnoDB是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在MySQL 5.5之后&#xff0c;InnoDB是默认的MySQL存储引擎。 特点&#xff1a;1、DML操作遵循ACID模型&#xff0c;支持事务; 2、行级锁&#xff0c;提高并发访问性能; 3、支持外键FOREIGN KEY约…

爬虫框架有Scrapy、BeautifulSoup、Selenium

爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。Scrapy的扩展&#xff0c;支持和社区比BeautifulSoup更大。Scrapy应被视为蜘蛛&#xff0c;而BeautifulSoup则是Parser。 1.爬虫基础知识 在开始Python爬虫之前&#xff0c;需要先掌握一些基础知…

C++特殊类设计

文章目录 1.设计一个类&#xff0c;不能被拷贝2.设计一个类&#xff0c;只能在堆上创建对象3.设计一个类&#xff0c;只能在栈上创建对象4.设计一个类&#xff0c;不能被继承5.设计一个类&#xff0c;只能创建一个对象5.1 单例模式5.2 饿汉模式5.3 懒汉模式5.4 两种模式的析构函…

操作系统进程线程(二)—父子进程、僵尸进程、孤儿进程、进程终止、守护进程

父子进程、进程组、作业、会话 父进程 已创建一个或者多个进程 子进程 fork创建的。这个函数被调用一次但是返回两次&#xff0c;子进程返回0&#xff0c;父进程返回子进程id。 fork之后&#xff0c;操作系统会赋值一个与父进程完全相同的子进程&#xff0c;虽然是父子关系…

微软 BingChat,全面开放使用 !

前两天&#xff0c;微软突然官宣全面开放BingChat&#xff1a; 无需任何等待。只需注册一个账户&#xff0c;首页即可体验。 更关键的是&#xff0c;还有一大堆堪称“家底”的新功能来袭&#xff01; 支持100种语言多模态输出、持续聊天且记录可随时导出、类ChatGPT插件功能…

企业内部信息太琐碎怎么办?选择一款在线工具制作内部知识库

在一个企业内部&#xff0c;信息的传递和沟通是非常重要的。企业内部的信息往往比较杂碎&#xff0c;包括各种文件、资料、报告、流程等等&#xff0c;如果不加以整理和管理&#xff0c;就会给企业的工作带来困难和不便。因此&#xff0c;选择一款在线工具制作内部知识库是非常…

桌面虚拟化的优势

启用基于云的虚拟桌面基础架构 &#xff08;VDI&#xff09; OpenText™ Exceed TurboX™ &#xff08;ETX&#xff09; 长期以来一直是虚拟化在 Linux 主机上运行的图形要求苛刻的软件的黄金标准。ETX 最新版本&#xff08;12.5&#xff09;增加了许多Microsoft Windows功能&…

JetPack WindowManager详解

一、JetPack架构 Android Jetpack 是Android官方提供的一套组件、工具和指导,可以帮助开发者摆脱编写样板代码并简化复杂任务,并且Jetpack组件提供向后的兼容性, 能够帮助开发者更快的开发更稳定且易维护的应用。 Jetpack大体分为4类:Architecture(架构)、Foundationy(…

项目经理如何及时掌控项目进度?

延迟是指超出计划的时间&#xff0c;而无法掌控则意味着管理者对实际情况一无所知。 为了解决这些问题&#xff0c;我们需要建立好的制度和沟通机制。例如使用项目管理软件来跟踪进度、定期开会并避免沟通障碍等。 管理者可以建立相关制度&#xff1a; 1、建立进度记录制度。…

SpringBoot启用web模拟测试(二)

1.web环境模拟测试 设置测试端口&#xff08;见SpringBoot启用web模拟测试&#xff08;一&#xff09;&#xff09; 模拟测试启动&#xff08;见SpringBoot启用web模拟测试&#xff08;一&#xff09;&#xff09; 测试模拟匹配&#xff08;各组成信息皆可配置&#xff09; …

JUC----ThreadLocal

目录 一、什么是ThreadLocal 二、ThreadLocal常用API 三、ThreadLocal的内部结构 四、ThreadLocal内存泄漏问题 一、什么是ThreadLocal ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问&#xff08;通过get和set方法访问&#xff09;时能保证各个线程…

shell脚本中函数的运用

shell脚本中函数的运用 一、函数的定义二、函数的作用范围三、实验1、阶乘2、函数库 一、函数的定义 shell函数是经常使用的&#xff0c;因为有些命令序列是需要反复调用执行的&#xff0c;将命令序列按格式写在一起&#xff0c;以便可以重复的使用。 shell函数&#xff1a; 使…

【C++】STL简介

在C领域我们正式进入到STL的学习&#xff0c;本期我们简单的介绍一下STL 目录 一、什么是STL 二、STL的版本 2.1 原始版本 2.2 P. J. 版本 2.3 RW版本 2.4 SGI版本 三、STL的六大组件 四、STL的缺陷 一、什么是STL STL(standard template libaray-标准模板库)&#x…

保姆级教程!教你打造自己的AI孙燕姿;全程使用AI工具设计一款桌游;搭建基于LLM的客服系统的实践 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『大模型技术与应用思考导图』跟着大佬做判断 王咏刚&#xff0c;创新工场CTO&#xff0c;技术撰稿人&#xff0c;有数个知名出版作品…

Nat. Commun. | 无需参数的几何深度学习,可准确预测蛋白质结合界面

编译 | 曾全晨 审稿 | 王建民 今天为大家介绍的是来自Matteo Dal Peraro团队的一篇关于预测蛋白质结合的论文。蛋白质是生命的重要分子组成部分&#xff0c;由于其特定的分子相互作用而负责大多数生物功能。然而&#xff0c;预测它们的结合界面仍然是一个挑战。作者提出了一种几…

【JS】1676- 重学 JavaScript API - Page Visibility API

在前端开发中&#xff0c;我们经常需要根据页面的可见性来控制资源的使用和提高页面的性能和响应速度。而 JavaScript 中的 Page Visibility API[1] 就提供了一种「检测页面是否可见」的方法。 本文将介绍 Page Visibility API 的概念、使用方法、兼容性和实际应用案例。 什么是…