【网络原理】❤️Tcp 常用机制❤️ —— 延时应答,捎带应答, 面向字节流, 异常情况处理。保姆式详解 , 建议收藏 !!!

news/2024/10/4 3:00:52/文章来源:https://blog.csdn.net/mgzdwm/article/details/142168458

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

引言

想象一下,如果没有可靠的数据传输机制,我们的网络世界将会怎样?信息可能会丢失,邮件可能无法送达,在线交易可能无法完成。幸运的是,TCP协议为我们提供了一种确保数据完整性和顺序的通信方式。它不仅确保了数据的准确传输,还通过一系列核心机制优化了网络性能。

目录

  1. 延时应答

  2. 捎带应答

  3. 面向字节流

  4. 异常情况处理

一. 延时应答

1. 延时应答的初识

小伙伴应该知道,确认应答是返回一个 ACK = 1 , 且带有 确认序号没有载荷 的报文。

而延时应答则是在 确认应答流量控制 的基础上, 进行了 优化了

之前是一收到发送方发来的数据, 就立即 返回 ACK

但是延时应答的是: 等待一段时间 ,等 应用程序 消耗了 接收缓冲区 一定的数据之后, 再返回 ACK

2. 延时应答的大体流程

在这里插入图片描述

如上图:

上面是一个 接收缓冲区

假设这个缓冲区的空间为 100KB , 原有数据 40KB, 然后新发送(写) 缓冲区数据 20KB, 还剩下 40KB空间大小

如果说,按照 确认应答机制实施 , 接收方一收到这个 20KB数据ACK 就返回接收缓冲区剩余40KB数据的信息 , 这样的话,

从上一篇我们学习过的 流量控制的角度 , 我们知道滑动窗口的窗口大小就是根据接收缓冲区的剩余大小来衡量的, 如果接收缓存区 剩余空间越小, 发送方 设置的窗口就越小发送速度就越低, 效率就越低效

但是我们假设设置一个 100ms 的等待时间

让应用程序在这 100 ms 内尽可能的消耗 尽可能的消耗接收缓冲区 的数据, 可能 消耗了20KB

ACK 等待了100ms 后返回, 就会从之前返回剩余40KB 变成 返回60KB 的信息。

同时发送方就会调整为 更大的窗口大小 , 从而 加快传输速度

可能小伙伴们还听的不是很清楚吧

下面小编举个栗子说明一下吧

小编是在一所高校上学的, 可能平常又很懒,几乎不写作业~

然后老师也 看不下去 了,就发个消息提醒我。

老师: 同学, 你作业好多没写, 快把你作业补一补吧!

这时小编有两种策略:

策略一: 小编立即回复

我: 老师, 最近有点忙,抱歉哦, 我尽快把作业补完。

这时我就指不定什么时候能够补完了, 说是马上去补,肯定是去哈皮咯, 好比 确认应答机制

策略二: 小编先 不急着回复老师消息 , 而是先一顿 狂补八九次作业 , 最后只 剩下两次 , 然后我再去回复老师。

我: 老师, 我这个作业已经快写完了, 我只剩下两次作业了,分分钟搞定了。 就好比: 延时应答机制

这上面的两次策略就对应两种不同的应答, 确认应答机制延时应答机制

我们就可以看出, 我 立即补作业过会再写作业 的方案的效率是 不一样 的,过会写作业还 指不定什么时候开始补 呢, 但是现在开始补就相当于 延时一点时间 , 让我不断 消耗现有作业的量, 从中体现 延时应答机制 更能体现出 提高效率

鱼式疯言

总结补充:

  1. 延时应答其实本质上就是 多消耗接收缓冲区数据多加快传输速率提高效率减少Tcp因可靠传输而造成的性能的影响

如果要保证在延时应答的机制下, 缓冲区的数据是 尽可能被消耗而不是增加 的, 就要确保以下两点

  1. 应用程序 是不断 源源不断的消耗着缓冲区的数据的
  1. 发送方不会有 新的数据 发送过来 。

二. 捎带应答

1. 捎带应答的初识

捎带应答是什么?

捎带应答可以认为就是 在原本是 三次握手中中间一次的发送过程SYN ACK 同时合并 捎带一起发送 , 也是 一种提高效率减少Tcp可靠传输的对性能的损耗

鱼式疯言

捎带应答不用可以是 同一个源头发送的数据合并, 也可以是 不同的源头发送的数据合并


下面我们以四次挥手合并成三次挥手为栗子来说明:

2. 捎带应答的大体流程

在这里插入图片描述

在之前的文章中, 小编讲过 四次挥手 的全过程, 如果还有点模糊的小伙伴记得回顾哦 ❣️ ❣️ ❣️ ❣️

三次握手, 四次挥手详解

这次从四次挥手的中间两次来介绍捎带应答的大体流程

首先, 按照一般的情况来说, 中间两次挥手是不能合并的, ACK是系统内核返回到,只要一收到发送方发送FIN 就会立即返回 ACK, 而 FIN应用程序 发送的, 只要执行到 close() 才会发送。

从正常情况考虑, 两个报文的发送时间是 不同的 , 所以很难 同时一起发送

但是因为Tcp有 延时应答的机制,就可以让 快一点的ACK 经可能的 慢点发送, 直到应用程序执行到 close() 方法后 , ACK 就和 FIN 一起同时发送, 从而 提高效率 , 这就是 捎带应答机制

什么是捎带应答机制, 可能主编这边讲的还不是很通俗易懂, 下面来举个小栗子吧 ❣️ ❣️ ❣️ ❣️

比如我室友是特别懒的一位, 就在我旁边的床位, 平常要不是上课就根本不想动, 就整天躺在床上刷视频。

他经常看着看着就口渴了, 这时他因为太懒了, 根本不想动, 那么他就会等等…

等到什么时候呢?

等到他要上厕所了, 就会 下床先去上厕所 , 然后就 顺便去喝水

我室友的这种方式就完美的诠释了什么叫做 捎带应答 , 他等的过程就相当于 ACK 等待 FIN 相似直到 FIN 需要发送了 然后再 顺便发送ACK ,从而 提高传输的效率

鱼式疯言

总结补充

对于 相同的发送源头Tcp 可以直接实现使用 捎带应答

对于 不同的发送源头TCP 就需要在 延时应答 的基础上使用 捎带应答

三. 面向字节流

1. 黏包问题

在前面的文章中, 谈及Tcp 必然谈及Tcp 的特点之一——面向字节流

关于前面Tcp 面向字节流的特点还有不清楚的, 小伙伴们可以重新巩固下哦 ❤️ ❤️ ❤️ ❤️

面向字节流博客详解

而在本篇中就需要给小伙伴们介绍Tcp 在面向字节流进行网络通信时, 所可能产生的黏包问题

什么是黏包问题?

在这里插入图片描述

入上图:

就是当发送方发送几段数据后, 这些数据就会在接收缓冲区中连成一片, 相互黏合。

而当 主机B 从接收缓冲区中读取数据 , 就有可能会出现:

aa , abbb , ccc

aaab, bbc, cc

aa,abb,bccc 等… 各种读取情况, 就会出现实际数据信息读取错误, 这样的情况称之为: 黏包问题

如何解决黏包问题呢?

下面提供两种方案 🤔 🤔 🤔 🤔 🤔

2. 黏包问题的解决方案

<1>. 使用分隔符

使用分隔符 例如 \n 换行来 分隔每一个数据包 的信息。

比如当 主机A 写出一段数据, 就使用 nextLine() 方法, 只要 换行了就说明写出完毕

主机B 读入一段数据 , 就使用 println 来读取, 代表 一行一行的来读取

<2>. 使用固定长度来分隔

使用固定长度这个方案, 我们就可能参考UDP 的报头结构,

在这里插入图片描述

从载荷(应用层数据包)的首部开始分配一个 2/ 4字节 长度的空间, 用一段固定的空间来作为 每个数据包与数据包的边界 , 如此用一个 固定的长度来分隔数据 ,就很难出现 黏包问题

鱼式疯言

关于这种黏包问题, 小编这里只是举例 两种常用的方案 , 其实解决黏包问题的方案是 很多种的

四. 异常情况处理

对于异常情况的可能性很多, 下面小编就一一来为小伙伴们讲解 💞 💞 💞 💞

1. 进程崩溃

对于Java来说, 当进程崩溃时, 就会抛出异常, JVM 就会来处理 , 这时就会使 整个程序结束

但实际上, 操作系统就进行 善后工作 , 自动回收 PCB 的文件描述符表 , 并且会对 每一个PCB 中的 文件描述符表 的每一个 Socket 对象 进行释放。

针对 Socket文件 进行释放, 也就是进行 四次挥手断开连接操作。

2. 主机正常关机

对于主机正常关机,会出现两种情况:

1. 四次挥手 先完成 ,正常断开连接后, 主机正常关机

在这里插入图片描述

<2>. 四次挥手还没完成, 主机就已经断开连接

如上图 ,还没来得及完成四次挥手, 主机 A就先关机 , 此时主机B 没有收到ACK

而且 不能感知到主机A 已经关机了, 所以主机B 就会 一直进行超时重传 , 当主机B 超时重传一定次数后,就 不会进行超时重传 , 主机B 就会 自动一方断开连接 , 也就是 删除对方的信息

3. 主机意外掉电

对于主机意外掉电的情况, 就有分为

  1. 发送方先发完数据掉电

  2. 接收方接收完就掉电

<1>. 发送方掉电

在这里插入图片描述

当A 发送了两段报文后, A 就直接掉电, 掉电之后B返回两个ACK

但从B 的角度来看, 不知道 A掉电了 还是 休息一会再发

所以这时B 就会发送一个 探测报文 , 来 检查A 是嘎了 还是 想歇会

如果B 接收到A 返回的ACK 就说明, A 想休息会。

如果发送了多次探测报文都 没有接收到了ACK , 就说明 A已经嘎了

这时B 就会 单方面释放连接

鱼式疯言

补充说明

探测报文是一种 不携带载荷, 为了 触发ACK 的一种 特殊报文

就是用来探测对方 生死 的一种数据包, 该数据包我们称之为 心跳包

心跳包是一种为了 触发ACK 而周期性发送的一种探测报文 , 在Tcp配置中, 探测报文的周期是 秒/ 分钟来衡量的。

应用程序 则这一层会 自动生成 一些心跳包 , 来达到更快的 保活机制

<2>. 接收方断电

在这里插入图片描述

如果 A 发送多段数据包 , 没有接收到 ACK , 就会超时重传, 但 重传达到一定的上限, A 就会重置连接, 如果 重置连接失败 , A 就会单方面的释放连接

4. 网线断开

在这里插入图片描述

如果网线断开了, 也就意味着网络通信瘫痪了, 那么 A 无法发送数据给B , 同时 B也无法接收到 A 发送过来的数据

A 的角度来看, A 发送数据后, 没有接收到ACK , 就会超时重传 , 超时重传达到 一定的上限 那么就会 重置连接 , 那么 A 这边就会单方面的释放连接

B 的角度来看, B未接收到数据, 就会 周期性的发送心跳包 , 如果发送 一定次数的心跳包都没有接收到 ACK , 同时也会但 方面释放连接

鱼式疯言

总结补充 :

发送方 的探测方式: 重置连接

接收方 的探测方式: 心跳包

总结

  • 延时应答: Tcp用于减少 可靠传输 带来的损耗的一种机制, 消耗一定时间尽可能的 消耗接收缓冲区中已有的数据,
    提高效率。

  • 捎带应答: 将两次或两次以上的发送 合并成一次一起发送 ,提高效率, 并可能会利用 延时应答机制 来配合使用。

  • 面向字节流:面向字节流的常见问题就是 粘包问题 , 常用的解决方案: 使用 分隔符 和 固定数据长度

  • 异常情况处理:介绍多次异常的情况, 同时 重置连接 或者 心跳包 确定是否存活, 如果对端不存活就会 单方面的释放连接

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

Andrej Karpathy谈AI未来:自动驾驶、Transformer与人机融合

引言 在人工智能领域&#xff0c;Andrej Karpathy 是一个无法忽视的名字。从他早期在 OpenAI 的工作&#xff0c;到后来担任 Tesla 的 AI 主管&#xff0c;他在自动驾驶、深度学习等方面的贡献广为人知。最近&#xff0c;卡帕西做客了著名的播客节目 No Priors&#xff0c;他在…

AWS 将 OpenSearch 纳入 Linux 基金会旗下

AWS 今天宣布&#xff0c;随着OpenSearch 基金会的成立&#xff0c;它将把OpenSearch&#xff08;流行的 Elasticsearch 搜索和分析引擎的开源分叉&#xff09;移交给 Linux 基金会。在 Elastic 将其 Elasticsearch 和 Kibana 项目的许可证更改为自己的专有许可证 Elastic Lice…

【SSRF漏洞】——http协议常见绕过

改变的确很难&#xff0c;但结果值得冒险 本文如有错误之处&#xff0c;还请各位师傅指正 一.ssrf概述 SSRF全称为Server-side Request Fogery,中文含义服务器端请求伪造 SSRF是一种由攻击者构造形成由目标服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标…

软考高级:存储系统IO 数据传输方式:程序控制方式、程序中断方式、DMA 方式、通道方式、IO 处理机 AI 解读

关于计算机中的IO数据传输方式&#xff0c;有几种不同的策略可以用来进行数据的传输和控制。我们分别讲解一下它们。 生活化例子 假设你在一条生产线上工作&#xff0c;有几种方式可以处理不同的任务&#xff08;如搬运、检查、修理产品&#xff09;&#xff1a; 程序控制方…

信息安全工程师题

机密性&#xff1a;网络信息不泄露给非授权用户、实体或程序&#xff0c;能够防止非授权者获取信息完整性&#xff1a;网络信息或系统未经授权不能进行更改的特性可用性&#xff1a;是指合法许可的用户能够及时获取网络信息或服务的特性。例如防止拒绝服务攻击就是保证了可用性…

new/delete和malloc/free到底有什么区别

new和malloc 文章目录 new和malloc前言一、属性上的区别二、使用上的区别三、内存位置的区别四、返回类型的区别五、分配失败的区别六、扩张内存的区别七、系统调度过程的区别总结 前言 new和malloc的知识点&#xff0c;作为一个嵌入式工程师是必须要了解清楚的。new和malloc的…

商混ERP系统 Operater_Action.aspx SQL注入漏洞复现

0x01 产品简介 杭州荷花软件有限公司开发的商混ERP系统。这套系统主要是处理建筑公司或者各项工程的搅拌站管理,内部含有销售模块、生产管理模块、实验室模块、人员管理等。 0x02 漏洞概述 商混ERP系统 Operater_Action.aspx 接口存在SQL注入漏洞,未经身份验证的远程攻击者…

沉浸式利用自然语言无代码开发工具生成式AI产品应用(下)

背景 小伙伴们过去在开发应用时&#xff0c;经常需要编写大量代码文件以实现业务逻辑&#xff0c;想必肯定有小伙伴开发过类似于快消行业索赔处理、订单库存跟踪和项目审批等系统。去解决这些业务实际问题&#xff0c;我们需要定制地开发业务应用程序为这些问题提供解决方案。…

Linux基础---10进程管理

一.查看和关闭进程 1.查看进程 基础指令: ps -efPID 进程编号&#xff0c;PPID 父进程编号&#xff0c; CMD命令名称 进阶指令–查看进程的树形结构&#xff1a; yum install psmisc -y #首先安装psmisc后可直接使用pstreepstree2.关闭进程 要想关闭某个或多个进程需要知道…

C语言刷题日记(附详解)(5)

一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…

【C++题目】1.日期差值

日期差值 题目&#xff1a; 链接&#x1f517;&#xff1a;日期差值 代码&#xff1a; #include <iostream> using namespace std; /* *思路&#xff1a; * 1. 分别求出每一个日期与0000年0月1日距离的天数 * 2. 两个距离天数相减即可得到两个日期相差的天数 *///平年…

Java浅,深拷贝;内,外部类的学习了解

目录 浅拷贝 深拷贝 内部类 匿名内部类 实例内部类 静态内部类 外部类 浅拷贝 简单理解&#xff1a;定义了A&#xff0c;A里面有age和num&#xff0c;拷贝成为B&#xff0c;B里面有age和num package demo1浅克隆和深克隆;//interfaces 是定义了一个接口//implements是使…

报错 - undefined reference to `main‘

一、问题 今天在Linux下使用 g 编译代码时&#xff0c;出了一个报错&#xff1a; /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function _start: (.text0x24): undefined reference to main collect2: error: ld returned 1 exit s…

【网络】TCP/IP 五层网络模型:数据链路层

文章目录 认识以太网mac 地址mac 地址和 IP 地址的区别 类型ARP 协议 MTU 日常开发主要是应用层&#xff0c;传输层和应用层密切交互&#xff0c;传输层用到的也不少。网络层以及再往下&#xff0c;日常开发就涉及到的非常少了 认识以太网 插网线的上网方式 80211 是无线 WiF…

Leetcode—环形链表||

题目描述 思路 快慢指针 结论 我们需要用到一个重要的结论&#xff1a;让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 画图解释 1.利用快慢指针找到相遇点 2. 定义两个…

如何在GitHub上克隆仓库:HTTPS、SSH和GitHub CLI的区别

GitHub是开发者的天堂&#xff0c;提供了丰富的工具和功能来管理代码和项目。在克隆GitHub仓库时&#xff0c;你可能会遇到三种常见的方法&#xff1a;HTTPS、SSH和GitHub CLI。每种方法都有其独特的优势和适用场景。本文将深入探讨这三种克隆方式的区别&#xff0c;帮助你选择…

【C++】——list

文章目录 list介绍和使用list注意事项 list模拟实现list和vector的不同 list介绍和使用 在C中&#xff0c;list是一个带头双向链表 list注意事项 迭代器失效 删除元素&#xff1a;当使用迭代器删除一个元素时&#xff0c;指向该元素的迭代器会失效&#xff0c;但是不会影响其他…

Java-数据结构-二叉树-习题(二) (´▽`)ノ

文本目录&#xff1a; ❄️一、习题一(分层遍历)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(二叉树的最近公共祖先)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(从前序和中序遍历序列中构造二叉树)&#xff1a; ▶ 思路…

【数据结构与算法 | 灵神题单 | 自顶向下DFS篇】力扣1022,623

1. 力扣1022&#xff1a;从根到叶的二进制之和 1.1 题目&#xff1a; 给出一棵二叉树&#xff0c;其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。 例如&#xff0c;如果路径为 0 -> 1 -> 1 -> 0 -> 1&#xff0c;那…

Linux:RPM软件包管理以及Yum软件包仓库

挂载光驱设备 RPM软件包管理 RPM软件包简介 区分软件名和软件包名 软件名&#xff1a;firefox 软件包名&#xff1a;firefox-52.7.0-1.el7.centos.x86_64.rpm 查询软件信息 查询软件&#xff08;参数为软件名&#xff09; ]# rpm -qa #当前系统中所有已安装的软件包 ]# r…