【TCP】核心机制:延时应答、捎带应答和面向字节流

news2024/11/23 2:55:39

文章目录

  • 延时应答
  • 捎带应答
  • 面向字节流
    • 粘包问题
      • 方案一:指定分隔符
      • 方案二:指定数据的长度
  • TCP 报头
    • 首部长度
    • 保留(6 位)
    • 选项
    • 序号
    • 确认序号

延时应答

尽可能降低可靠传输带来的性能影响
提升性能==>让滑动窗口变大

image.png|396

  • 如果我们立即返回 ACK,此时窗口大小就是 4KB
  • 其实在收到数据的时候,应用程序也在源源不断的消费接收缓冲区中的数据
    • 所以我们返回的时间可以晚一些,这样应用程序就有机会读取缓冲区中更多的数据
    • 假设让 ACK 不是立即返回,而是 100ms 之后再进行返回,这就意味着,此时在 100ms 之内,应用程序可能又消费掉 2KB 的数据了,此时返回的 ACK 携带的窗口大小就是 6KB
      延时返回的 ACK 窗口大小,大概率要比立即返回 ACK 的窗口大小更大,因为在这个时间里,会有一个消费数据的过程
  • 不是一定,只是有“大概率”,关键取决于程序是不是在不停地读取数据、延时时间内发送方是否会新发数据过来(发多了窗口还变得更小了)

捎带应答

在延时应答的基础上,引入的提升效率的机制,把返回的业务数据和 ACK 两者合二为一了

实际网络通信中,大部分情况都是“一问一答”的形式
image.png

  • ACK 是内核返回的,是收到请求之后,立即就返回 ACK
  • 响应,则是应用程序返回的,代码中根据请求,计算得到响应,再把响应写回到客户端
    正常情况下,ACK 和响应是不同的时机,无法合并。但是,ACK 涉及到“延时应答”,
  • 延时应答就会使 ACK 的返回时间被往后拖,这样一延时,就可能赶上接下来发送响应数据的操作了
  • 也是就可以在发送响应的时候,把刚才 ACK 的信息也带上
    • 本身 ACK 报文,不需要载荷,包头中,设置 ACK 这一位为 1,设置窗口大小的值,设置确认序号
    • 响应数据主要是设置载荷,和 ACK 不冲突,可以共存
      image.png
  • 在四次挥手中也说到过这样的情况,ACK 和 FIN 是不同的时机,不能合并在一起
  • 但是,在延时应答之下,ACK 可能返回的时间更晚,此时,就可能可以和 FIN 合并,使四次挥手变成三次挥手

比如说,你在床上口渴了,但是你不想起来,就等到要上厕所的时候再起来,顺带把水喝了

延时应答,捎带应答都是 TCP 提升性能的机制。TCP 之所以复杂,不仅仅在考虑可靠传输,还要在可靠传输的基础上尽可能提高效率

面向字节流

读写 100 个字节的数据

  1. 可以一次读写一个字节,分 100 次
  2. 一次读写 10 个字节,分 10 次
  3. 一次读写 50 个字节,分 2 次
  4. 一次读写 100 个字节,一次搞定

粘包问题

通过面向字节流的方式传输数据,都是会涉及到“粘包问题”

  • 粘的是 TCP 携带的载荷(应用层数据包)

  • aaa、bbb、ccc 分别是三个不同的应用层数据包

  • 接收方那边就有一个接收缓冲区,三个数据就进去了

  • 应用程序需要读取接收缓冲区中的数据,由于 TCP 是面向字节流的,所以怎么读都可以

    • 可以读成:a,aa,b,bb,ccc
    • 也可以:aaa,b,b,bc,cc
    • 存在很多种读法
  • 但只有一是正确的读法,才是完整的“应用层数据包”

应用层在 TCP 的接收缓冲区中连成一片,就称为“粘包问题

要想解决粘包问题,关键就是要明确“包之间的边界

方案一:指定分隔符

前面在写 TCP Echo Server 的时候,我们约定:请求和响应都以 \n 结尾。

  • 发送请求响应的时候,专门使用 println 进行写数据
  • 接受请求响应的时候,专门使用 scanner.next 按照 \n 进行解析

需要确认数据内容的正文中,不能包含分隔符。如果传输的数据,是纯文本数据的话,此时使用 \n 或者 ; 之类的可能都不合适,但是可以使用 ASCII 码表中的一些不常见的字符

方案二:指定数据的长度

比如,约定在每个应用层数据包开头的几个字节,表示数据包的长度

  • 如果是传输二进制数据,这个方案就很有用

如果希望在文件中存储结构化数据,也是存在这样的问题的。所以存文件,也经常会使用 XML/JSON 这样的格式来存储(也就是解决粘包问题)
UDP 这种面向数据报的传输方式,不涉及到上述问题,因为 send/receive 得到的就是一个完整的 DatagramPacket,这里携带的二进制的字节数组,就是一个完整的应用层数据包

TCP 报头

image.png|449

首部长度

TCP 报头的长度

  • UDP 协议报头固定就是 8 个字节
  • 对于 TCP 来说,报头长度是可变的
    4 个比特位可表示的范围:
  • 0000~1111——>0x0~0xF——>0~15
  • 此处的长度单位是 4 字节,不是字节(所以范围是 0~60 字节)

保留(6 位)

虽然现在不用,但是先把这个东西申请下来,以备不时之需。用于考虑未来的可扩展性

  • 充分吸取了 UDP 的教训,UDP 的报文长度字段,是没法扩展的
  • 如果未来某一天,TCP 需要新增属性或者谋和属性的长度不够用,就可以把保留位拿出来,进行使用
  • TCP 的结构不需要发生太大的改变,这样的升级就会容易很多

关于“可扩展性”也是属于编程的时候需要考虑到的一点,毕竟写的代码不可能写一份就能持续地使用。对代码做出调整,做出修改,是非常普遍、常见的情况
但是,

选项

TCP 报头边长的主要原因。四个字节为一个单位

  • 可以有, 也可以没有
  • 可有一个,也可有多个
    通过“首部长度”确定报头有多长,如果是两个四个字节长度就是两个选项,三个四个字节长度就是三个选项,以此类推

序号

由于会出现“后发先至”的情况,所以需要通过编号,区分出数据的先后顺序
序号:表示的就是 TCP 数据报载荷中的第一个字节的序号,由于序号是连续递增,知道了第一个字节的序号,后续每个字节的序号也就知道了
image.png|565

  • 32 位/四字节,表示的范围是 0~42亿9千万0~4G
  • 因为 TCP 是面向字节流的,所以一个 TCP 数据报和下一个 TCP 数据报携带的数据,是可以直接进行拼装的
  • 比如要传输一个特别大的数据,传输过程中,本身就会通过多个 TCP 数据报来进行携带,这些 TCP 数据报彼此之间携带的载荷都是可以在接受方自动拼起来的
    • 这样就不像 UDP 存在传输的上限,使用 UDP 传输大数据,就需要考虑调用这一次 send 操作,参数是否超过了 64KB,超过了就不行
    • 使用 TCP 的话就没关系,可以调用一次 write,也可以调用多次 write。无论怎么进行 write,在网络传输和对端接收的角度来看是没有任何差别的
    • 如果多次 write,传输的总数据量超过上述的 4G 也没关系,这里的数据序号是可以再从 0 开始重新设置的

确认序号

确认序号的设定方式,和后发先至中发短信的例子,略有差别

  • TCP 序号不是按照“一条两条”来编排的,而是按照“字节”来编排的
    image.png|357

TCP 的确认序号这里,填写的是 1001,接收方收到的数据的最后一个字节序号的下一个序号

  • 表示的含义是 <1001 的序号的数据都收到了(TCP 序号是连续增长的)
  • 对于应答报文来说,“确认序号”就会按照收到的数据的最后一个字节序号+1 的方式来填写
  • 并且六个标志位中,第二个标志位(ACK)会设为 1
    • 普通报文的 ACK0,应答报文的 ACK1
    • 如果是普通报文,序号是有效的,确认序号是无效的;如果是应答报文,序号和确认序号都是有效的
    • 应答报文的序号是另一套编号体系,和传输数据的序号是不一样的
    • 应答报文默认情况下是不携带数据的

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

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

相关文章

Chat App 项目之解析(二)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

Docker最佳实践进阶(二):Docker Compose部署SpringCloud微服务项目

大家好&#xff0c;在上篇文章中博主演示了Dockerfile常用的命令&#xff0c;以及如何利用Dockerfile构建镜像&#xff0c;生成容器服务&#xff0c;但是在实际应用环境中&#xff0c;特别是在微服务架构中&#xff0c;一个应用系统可能包含多个微服务&#xff0c;每个微服务可…

软数据与硬数据的深度解析:住宅代理如何优化数据抓取

引言 什么是软数据&#xff1f;有哪些类型&#xff1f; 什么是硬数据&#xff1f;有哪些类型&#xff1f; 软数据和硬数据的区别是什么&#xff1f; 如何收集软数据和硬数据&#xff1f; 如何优化抓取软数据和硬数据&#xff1f; 总结 引言 在大数据时代&#xff0c;企业…

Sanic 和 Go Echo 对比

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【Python系列】 并发编程在数据处理中的应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

iOS 17.6.1版本重发,修复高级数据保护错误

今日&#xff0c;苹果没有带来iOS 17.6.2的更新&#xff0c;而是重新发布了iOS 17.6.1版本&#xff0c;本次升级版本号为21G101&#xff0c;高于第一版的21G93。距离初版发布相隔一周半时间。 在 iOS / iPadOS 17.6.1 的更新日志&#xff0c;苹果公司写道&#xff1a;“此更新包…

只用一个 HTML 元素可以写出多少形状?——伪元素篇(上)

只用一个 div 元素&#xff0c;我们已经通过四个篇章写了很多形状。 首先&#xff0c;我们通过对这个 div 的宽度与高度的直接控制&#xff0c;轻松写出矩形和正方形&#xff0c;并结合 transform 的 skew 方法写出了平行四边形与菱形。 其次&#xff0c;我们通过对边框的灵活…

iphone异常问题常用修复方法

作为智能手机的领军者&#xff0c;iPhone凭借其卓越的性能和稳定的系统赢得了全球用户的青睐。然而&#xff0c;就像任何电子设备一样&#xff0c;iPhone在使用过程中也难免会遇到各种异常问题&#xff0c;如卡顿、无法充电、应用闪退等。这些问题虽然令人头疼&#xff0c;但大…

linux之ELK

ELK概述 ELK是一套开源的日志分析系统&#xff0c;由elasticsearchlogstashKibana组成。 官网说明:https://www.elastic.co/cn/products 首先: 先一句话简单了解E,L,K这三个软件 elasticsearch: 分布式搜索引擎 logstash: 日志收集与过滤&#xff0c;输出给elasticsearch Kiban…

校园快递代取系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Windows搭建我的世界MC服务器 【Minecraft外网联机教程】

目录 ⛳️推荐 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 1.3 创建我的世界服务器 2. 局域网联机测试 3. 安装cpolar内网穿透 4. 公网联机Minecraft 5. 配置固定远程联机端口地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通…

【启明智显技术分享】工业级HMI芯片Model系列GUI合成到项目中的指南

在工业自动化、智能终端HMI、车载仪表盘等领域&#xff0c;高性能的HMI&#xff08;人机界面&#xff09;芯片是不可或缺的核心组件。启明智显推出的Model系列&#xff08;如Model3C、Model3、Model4&#xff09;HMI芯片&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c…

大模型学习应用 2:快速上手大模型基于langchain实现RAG检索应用

快速上手大模型基于langchain实现RAG检索应用 - 项目作业 目录 准备工作镜像选择算力选择安装包数据说明提示参考链接 Task1 申请 api 后&#xff0c;使用 langchain 导入大模型&#xff0c;并打印出大模型信息Task2 使用 langchian 加载数据&#xff0c;并把数据打印出来Task…

WebSocket 快速入门

WebSocket是什么 WebSocket 是基于 TCP 的一种新的应用层网络协议。它实现了浏览器与服务器全双工通信&#xff0c;即允许服务器主动发送信息给客户端。因此&#xff0c;在 WebSocket 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性…

Linux系统中安装Git(详细教程)

在Linux系统中安装Git&#xff0c;可以通过多种方式来实现&#xff0c;主要包括使用包管理器安装和从源代码编译安装。以下是详细的安装步骤&#xff1a; 一、使用包管理器安装&#xff08;不建议该方式&#xff09; 大多数Linux发行版都提供了包管理器&#xff0c;如Debian/…

90%的人都在用这7个图片转pdf技巧,转换速度很快!

图片怎么转换成pdf格式&#xff1f;图片和pdf格式是两种完全不一样的格式&#xff0c;但是如果想要将图片转换成pdf格式还是蛮容易的&#xff0c;常见的方法就有数十种了。 本文整理了几种常见的图片转pdf的方法&#xff0c;包括图片转pdf在线方法&#xff0c;有需要的朋友可以…

取证工具 ElcomSoft iOS Forensics Toolkit: 在 Windows 中加载 HFS 镜像

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 Elcomsoft iOS Forensics Toolkit 功能简介 Elcomsoft iOS Forensics Toolkit 软件工具包适用于取证工作&#xff0c;对 iPhone、iPad 和 iPod Touch 设备执行完整文件系统和逻辑数据采集。对设备文件系统制…

【Linux操作系统】基础IO

目录 一、接口使用1.1 铺垫知识1.2 C接口使用1.3 系统接口使用 二、认识fd三、缓冲区四、文件系统五、软硬连接六、动静态库6.1 静态库的制作和使用6.1 动态库的制作和使用 七、理解动态库加载 一、接口使用 1.1 铺垫知识 文件文件内容文件属性 。一个文件如果它的文件内容为…

AI产品经理如何入门?零基础入门到精通,收藏这一篇就够了

现在做产品经理&#xff0c;真的挺累的。 现在产品越来越难做&#xff0c;晋升困难&#xff0c;工资迟迟不涨……公司裁员&#xff0c;产品经理首当其冲&#xff01;&#xff01; 做产品几年了&#xff0c;还没升职&#xff0c;就先到了“职业天花板”。 想凭工作几年积累的…

linux被植入木马排查思路

linux被植入木马排查思路 一、是否侵入检查 1&#xff09;检查系统登录日志 last命令 2&#xff09;检查系统用户 1、检查是否有异常用户 cat /etc/passwd 2、查看是否产生了新用户、uid和gid为0的用户 grep "0" /etc/passwd 3、查看passwd的修改时间&#xf…