TCP的“可靠性”(上)

news2025/1/6 20:54:34

目录

  • TCP的“可靠性”(上)
    • 确认应答(可靠性传输的基础)
    • 超时重传
    • 连接管理(三次握手,四次挥手)

TCP的“可靠性”(上)

想必大家都或多或少的听说过TCP的特性:有连接,可靠传输,面向字节流,全双工

本文重点讲讲TCP的“可靠性”

网络通信过程是复杂的,无法确保发送方发送出去的数据,100%能够到达接收放。

此处可靠性,只能“退而求其次”,只要尽可能的去进行发送了,发送方能够指定对方是否收到,就认为是可靠传输了。

网上很多帖子说:”TCP的可靠性是因为三次握手四次挥手“

这个说法是很不准确的,因为三次握手四次挥手只有初次建立连接的时候才会,但是可靠性是整个过程都可靠,那靠的什么呢?

用来确保可靠性,最核心的机制,称为“确认应答”

确认应答(可靠性传输的基础)

确认应答就是:句句有回应!

在这里插入图片描述

比如:银角大王每次像金角大王发出请求,金角大王都有响应

在这里插入图片描述

但是上述的时序有些过于理想了,实际上网络传输过程中,经常会出现“后发先至”情况

为什么网络中会出现“后发先至”情况呢?

一个数据包从发送方到接收方过程中走的路线可能不一样

第一个数据包,走路线一,第二个数据包走路线二

有可能路线二非常通畅,路线一堵车了,第二个数据包虽然发的迟,但是能先到!!

在这里插入图片描述

如果出现后发先至的情况,再去理解这里的含义就会出现问题了!

在这里插入图片描述

为了解决上述问题,引入了序号和确认序号,对于数据进行编号,应答报文里就告诉发送方说,我这次应答的是哪个数据

在这里插入图片描述

这只是简化版本的模型,真实的TCP的情况要更复杂一些。

TCP是面向字节流的,以字节为单位进行传输的,没有“一条两条”的概念

实际上,TCP的序号和确认序号都是以字节来进行编号的

在这里插入图片描述

应答报文中的确认序号,是按照发送过去的最后一个字节的序号再加上1来进行设定的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

超时重传

超时重传是确认应答的补充

如果一切顺利,通过应答报文就可以告诉发送方,当前数据是不是成功收到

但是,网络上可能存在“丢包”情况。如果数据包丢了,没有到达对方,对方自然也没有ack报文了。

这个情况下,就需要超时重传了

TCP可靠性就是在对抗丢包(期望在丢包客观存在的背景下,也能够尽可能的把包传过去)

发送方发了个数据之后,要等

等的时间里,收到了ack(数据报在网络上传输,需要时间)

如果等了好久,ack还没等到,此时发送方就认为数据的传输出现丢包了

当认为丢包之后,就会把刚才的数据包再传输一次(重传)

等待的过程有一个时间的阈值(上线),就是(超时)

为啥会存在“丢包”?

网络中的路由器/交换机,不仅仅是给你这一次通信提供服务,还要能支持千千万万的主机之间的通信

整个网络中,就可能存在,某个路由器/交换机,某个时刻,突然负载量很高,短时间内可能有大量的数据包要几个这个设备转发。这个时候,如果瞬间的高负载超出了这个设备能转发的数据量的极限,多出来的部分,就无了,就被设备丢包了。

在这里插入图片描述

当然,没收到ack不一定就是丢包了,也可能是数据到达了,ack丢了

在这里插入图片描述

所以,这里要分情况讨论:

1.丢包了(数据包丢了)

这种情况接收方本身没有收到数据,此时你重传理所应当,没有任何问题

2.ack丢了

数据已经被接收方B接收了,但是B返回的ack丢了

此时发送到再传输一次,同一份数据,B就会收到两次

试想一下,如果发的请求是扣款请求呢??这是肯定不行的

TCP socket再内存中存在接收缓冲区(一块内存空间)

发送方发来的数据,是要首先放到接收方缓冲区中,然后应用程序调用read/sanner.next才能读到数据,这里的读操作其实是读接收缓冲区。

【缓冲区的应对方案】

  • 1)去重

当数据到达接收缓冲区的时候,接收方首先会判断一下看当前缓冲区是否已经有这个数据了(或者这个数据曾经在接收缓冲区中存在过)

如果已经存在或者存在过,就直接把重复发来的数据就丢弃了

就能确保不会出现重复数据了

接收方如何判定这个数据是否是 “重复数据”
核心判定依据:【数据的序号】

  1. 数据还在接受缓冲区里,还没被 read 走。 此时,就拿着新收到的数据的序号,和缓冲区中的所有数据的序号对一下,看看有没有一样的。有一样的就是重复了,就可以把新收到的数据丢弃了。
  2. 数据在接受缓冲区中,已经被应用程序给 read 走了,此时新来的数据序号直接无法再接受缓冲区查到
    注意!!应用程序读取数据的时候,是按照序号的先后顺序,连续读取的!! 先读 1 - 1000 1001 - 2000
    2001 - 3000 一定是先读序号小的数据后读序号大的数据的(可以把接收缓冲区这个队列想象成带有优先级的阻塞队列)
    此时socket api 中就可以记录上次读的最后一个字节的序号是多少
    比如上次读的最后一个字节的序号是 3000
    新收到一个数据包的序号是 1001,这个 1001 一定是之前已经读过的了,这个时候同样可以把这个新的数据包判定为 “重复的包”
    直接丢弃了。

上述谈到的,ack,重传,保证顺序,自动去重,都是 TCP 内置的。使用 TCP 的 api 的时候outputStream.write ()
只需要调用一个这样的简单代码,上述功能就都自动生效了~~程序员需要操的心就少多了。 如果使用 UDP,上述这些问题就都得好好考虑考虑。

超时是会重传,但不是无限的重传,有一定的策略的

  1. 重传次数是有上限的。重传到一定程度,还没有 ack,就尝试重置连接,如果重置也失败,就直接放弃连接。
  2. 重传的超时时间阈值也不是固定不变的,随着重传次数的增加,而增大(重传频率越来越低)

连接管理(三次握手,四次挥手)

后续内容,在我的下一篇文章中有讲到:【TCP的“可靠性”(下)——三次握手四次挥手】

建立连接: 客户端执行 :socket=new Socket(serberIp,serverPort)这个操作就是在建立连接

上述只是调用 socket API ,真正连接建立的过程,是在操作系统内核完成的

在这里插入图片描述

建立连接(三次握手)

此处的连接是“虚拟的,抽象的”连接,目的是让通信双方都能保存对方的相关信息

断开连接(四次挥手)

断开连接的本质目的,就是为了把对端的信息从数据结构中给删除掉 / 释放掉。

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

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

相关文章

【C++】求第二大的数详细解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯输入描述💯解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…

Linux图形化工具推荐

1、MobaXterm MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - DownloadFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Downloadhttps://mobaxterm.mobatek.net/download.html 2、FinalShell FinalShell SSH工具,服…

SQL计算字段:拼接字段

为了说明如何使用计算字段,本文将通过一个简单的示例来展示如何将两列组合成一个标题。假设Vendors表包含供应商的名称和国家信息,我们希望生成一个报表,其中列出每个供应商的名称和所在国家,并且需要格式化名称显示,国…

【Spring项目】表白墙,留言板项目的实现

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 2:准备工作 (1)…

MySQL | 尚硅谷 | 第12章_MySQL数据类型精讲

MySQL笔记:第12章_MySQL数据类型精讲 文章目录 MySQL笔记:第12章_MySQL数据类型精讲第12章_MySQL数据类型精讲 1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择?演示…

ElasticSearch常见面试题汇总

一、ElasticSearch基础: 1、什么是Elasticsearch: Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。 全文检索是指对每一个词建立一个索引…

40分钟学 Go 语言高并发:负载均衡与服务治理

负载均衡与服务治理 一、知识要点总览 模块核心内容技术实现难度负载策略轮询、权重、最小连接数自定义负载均衡器中服务降级服务降级、熔断降级、限流降级Hystrix模式高熔断机制熔断器状态机、失败计数、自动恢复Circuit Breaker高限流设计令牌桶、滑动窗口、计数器Rate Lim…

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命,改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展,大模型的数据集(包括多模态数据集)制作已经形成了规约,Meta、Go…

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144353087 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 VLMEva…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…

DCL语句和函数

1.DCL语句 DCL:数据控制语言,用来管理数据库用户,控制数据库的访问权限。 1.控制数据库有哪些用户可以访问。 2.控制每一个用户的访问权限。 1.1 DCL-管理用户 查询用户 USE mysql SELECT * FROM user; 创建用户 CREATE USER 用户名主…

[go-redis]客户端的创建与配置说明

创建redis client 使用go-redis库进行创建redis客户端比较简单,只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…

【NLP高频面题 - 分词篇】WordPiece 分词器是如何训练的?

【NLP高频面题 - 分词篇】WordPiece 分词器是如何训练的? 重要性:★★ 💯 NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用…

机器学习决策树原理详解

一、引言 在当今蓬勃发展的人工智能与大数据领域,大模型正以前所未有的影响力改变着众多行业的格局。而决策树作为机器学习算法家族中的经典成员,以其简洁直观的特点和广泛的适用性,不仅能独立解决诸多实际问题,更是诸多先进大模…

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。(/data/prometheus/可根据自己需要调整) global:scrape_interval: 15s # By default, scrape targets ev…

【Qt之·类QSettings·参数保存】

系列文章目录 文章目录 前言一、概述1.1 QSetting是什么1.2 为什么学习QSetting是重要的 二、不同存储位置的优缺点三、 QSetting的高级用法四、实例演示总结 前言 在当今的应用程序开发中,设置管理是一个至关重要的方面。应用程序的设置包括用户偏好、配置选项和其…

HCIP——VRRP的实验配置

一、VRRP的理论知识 1.1VRRP(虚拟路由冗余协议)的概述: 通过把几台路由设别联合组成一台虚拟的路由设备,既能够实现网关的备份,又能解决多个网关之间互相冲突的问题。 1.2VRRP状态机: VRRP协议状态机有…

从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅

上一篇:《再用RNN神经网络架构设计生成式语言模型》 序言:本文探讨了如何通过多种方法改进模型的输出,包括扩展数据集、调整模型架构、优化训练数据的窗口设置,以及采用字符级编码。这些方法旨在提高生成文本的准确性和合理性&am…

Mysql | 尚硅谷 | 第02章_MySQL环境搭建

Mysql笔记:第02章_MySQL环境搭建 说明:本内容整理自尚硅谷B站MySQL视频>>尚硅谷B站MySQL视频 文章目录 Mysql笔记:第02章_MySQL环境搭建第02章_MySQL环境搭建 1. MySQL的卸载步骤1:停止MySQL服务步骤2:[软件](h…

unity 让文字呈现弧度变化

效果: using UnityEngine; using TMPro; using Core;[ExecuteInEditMode] public class TMTextWrap : MonoBehaviour {private TMP_Text m_TextComponent;public AnimationCurve VertexCurve new AnimationCurve(new Keyframe(0, 0), new Keyframe(0.5f, 1), new …