浅谈网络通信(3)

文章目录

  • 一、TCP[!]
    • 1.1、TCP协议报文格式
    • 1.2、TCP十大机制
      • 1.2.1、确认应答机制
      • 1.2.2、超时重传机制
      • 1.2.3、连接管理机制
        • 1.2.3.1、三次握手[其流程至关重要,面试必考]
          • 1.2.3.2.1、那为啥要建立连接??建立连接的意义是啥??
        • 1.2.3.2、四次挥手
      • 1.2.4、滑动窗口机制
      • 1.2.5、流量控制机制

一、TCP[!]

1.1、TCP协议报文格式

TCP协议报文格式的表现形式1:
在这里插入图片描述
TCP协议报文格式的表现形式2:
在这里插入图片描述
1、源端口号、目的端口号:
端口号是传输层协议的一个重要部分,知道了端口号,才能进一步确认这个数据报应该交给哪个应用程序;所占字节也都是2个字节,TCP的端口号其使用规则与UDP的端口号一致。

2、32位序号、32位确认序号:
32位序号这个字段用来给普通报文使用,32位确认序号这个字段用来给确认应答报文使用的,确认应答:即数据报被正确传送,并且返回响应。

3、4位首部长度:
TCP的报头是 变长 的,4位(bit)首部长度表示的数据范围是 0 ~ 15,但是其实此处 0 ~ 15 的单位是字节 ,即 4字节 ~ 15*4 字节,才是真正的首部长度。因此 TCP 数据报的最大长度最短、固定时是20个字节,最长时是60个字节。故TCP能够传送的数据比只能够传送64KB的UDP协议要多得多。我们需要使用首部长度来判断,报头到哪里结束,而载荷部分从哪里是开始。

4、6位保留位:
保留位是设计TCP协议的团队,汲取了UDP64KB长度的教训,用来给未来TCP留下可以升级扩展的空间的一个字段。其实就类似我们电脑预留的接口、插槽一样。有的电脑是轻薄本,因此可能只能够插一个内存,但是有的电脑他的设计师设计电脑时预留了很多插槽,即使可能这些插槽用户也用不上,但是还是预留了,以防出现突发情况。相对的,这些电脑,价格也就会相对插槽少的电脑昂贵一些,虽然价格昂贵,但是也还是会有大部分的用户选择这类扩展性好的电脑。

保留位后面是6个标志位,分别是:UBG、ACK、PSH、RST、SYN、FIN,他们的具体含义后续会补充介绍。

5、16位窗口大小、16位校验和、16位紧急指针:
暂时不用了解。

6、选项:
选项部分,可以有,也可以没有;可以有一个选项,也可以有多个选项。最少是0个字节,最多可以是40个字节。

7、载荷数据:应用层数据报。

1.2、TCP十大机制

TCP特性:
1、有连接
2、可靠传输:可靠传输是由内核实现的,我们写代码时无法感知到。(TCP的可靠传输不代表安全传输)
3、面向字节流
4、全双工

那么TCP就围绕这4个特性,提供了一系列重要的 机制 ,让我们更深入的理解报头结构。

1.2.1、确认应答机制

确认应答机制,是保证 TCP “可靠性” 最核心的机制。
举个例子理解:
在这里插入图片描述
上述情况3其应答消息就出现了 “后发先至” 的情况。其实不止代码会发生这样的情况,现实生活中,这类情况比比皆是:
比如说:结婚时的接亲过程:接亲一般就是男方开婚车队伍到女方家。一般来说,接亲车队的车辆排列顺序都是有一定讲究的一般是新郎的车在最前头。但是,有可能在接亲路上遇到一些突发状况(比如过红绿灯时),导致新郎的车落在后头了,别的婚车在新郎前面了。

那对于传输在网络中的数据也是一样的,数据从主机A发出,到被主机B接收的这一过程中,数据在网络中走的路线有很多,同时每个节点(路由器/交换机)的繁忙程度不一,此时,这样的转发过程,就会存在差异,就和等红绿灯一样。

那怎么保证数据的可靠传输(数据的顺序性、数据的完整性、数据的正确性…)??可以 针对数据进行编号 解决该问题。

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

1.2.2、超时重传机制

针对丢包、传输失败的数据,进行重传。
在这里插入图片描述
如果发送方的数据丢了,正常超时重传就行;

如果是确认应答报文(ACK)丢了,有两种情况:
(1)、ack发送成功,但接收方不回复,无视你的消息,发送方也会进行重传,因为发送方得不到回复,就会认为数据丢包了。

(2)、ack发送失败,你收不到回复。针对2这种情况,正常重传即可;针对1这种情况,会导致接收方收到重复内容的消息,这不太好。因此TCP针对接收方丢失ACK而受到重复的消息这种情况,他会根据消息的序号来进行 去重 ,即如果接收方已经收了一个序号为 1001 的数据,没多久又收到 1001 序号的数据,此时 TCP 就会将序号相同的消息进行去重。

那么超时时间如何确定 ??一般系统中有一个配置项,描述了超时的时间阈值。例如:第一次丢包出现后,发送方就会在达到超时时间阈值之后,进行重传;如果重传的数据仍然无响应,还会继续超时重传,第二次的超时时间一般要比第一次更长。超时的时间并非是均等的,而是逐渐变大的。因为假设单个数据报丢包的概率为10%,那么第一次丢包的概率是0.1,第二次丢包的概率是0.1 * 0.1 = 0.01,因此丢包的概率是逐渐减小的,所以第二次传输,大概可以顺利到达的,所以超时重传的时间是逐渐变大的。那如果第二次传输也没有到达,说明当前网络环境比较糟糕,那单个数据报丢包的概率可能非常大,甚至概率是100%的,断网了,都断网了,再怎么频繁的重传,也没用,所以把超时重传的频率降低一点(时间间隔长一点),至少可以节省主机的开销。

超时重传几次之后,仍然无法传输,就会尝试重置 TCP 连接(断开连接),如果还是连不上,此时就直接释放TCP连接(彻底放弃)。

那到底基础的重传间隔时间是多少?每次间隔增加多少??最多重传几次??不知道!没有具体的参数,因为不同的系统他们的时间都不一样,一旦给出了具体的参数,可能大家就会对此数值过度关注,甚至于对此数值死记硬背,没必要,我们需要关注的是超时重传此机制的本身策略,而不是这个数字。

典型的反例就是HashMap解决哈希冲突,是通过链表的方式,但如果链表太长了怎么办??需要把链表转成红黑树。那链表元素个数达到多少时,会转成红黑树呢?不知道,不好说!不同的哈希表的表现方式不同,只是 JDK1.8 标准库的 HashMap 是按照这个数字来设定的,如果是其他版本的 JDK 或者不是标准库实现 或者是 其他语言中的其他版本的实现,还是不是这个数字,不好说!

不变的是策略,可变的是参数。

1.2.3、连接管理机制

连接管理机制:描述的是TCP建立连接和断开连接的过程。

什么是连接?
(1)、物理上的连接:使用网线把两个电脑连上,这是 “物理上” 的连接。
(2)、逻辑上的连接:只要是网络通信,不管是用 TCP 还是 UDP 还是别的协议,物理上已经连接好了。逻辑上的连接就是:主机A与主机B建立连接,主机A的系统内核里,记录了一个数据结构,包含了和他连接的对方信息(IP、端口、使用的协议…);主机B的系统内核里,记录了一个数据结构,包含了和他连接的对方信息。

1.2.3.1、三次握手[其流程至关重要,面试必考]

三次握手只能是客户端先握,四次挥手既可以是客户端先挥,也可以是服务器先挥。[!]
TCP是通过三次握手完成建立连接的(即双方建立一个相互认同的关系)。
在这里插入图片描述

[!]
在这里插入图片描述
ack 标志位我们前面已经讲过了,ack = 1,表示当前是个应答报文,ack = 0,表示当前是个普通报文。syn 也是TCP报头6个标志位里的其中之一,syn = 1,说明这是一个同步报文段(即:尝试和对方建立连接);syn = 0,则反之。

1.2.3.2.1、那为啥要建立连接??建立连接的意义是啥??

1、投石问路。即:检查一下当前的网络情况是否是通畅的。就像地铁每天运营之前,都需要先空车跑一趟,来看看当前地铁线路是否畅通。
2、三次握手同时也是在检查通信双方的 发送能力 和 接收能力。
在这里插入图片描述

3、三次握手过程中,也在协商一些重要参数。
TCP 里面有很多参数需要协商。例如TCP的序号并非是从1开始的,通常都是建立连接的时候协商了一个数字。目的是保证两个连接的序号有差别,如果连接断开又快速重连,
接收方就可以区分当前收到的数据是当前连接的还是上个连接的。

TCP3次握手的详细流程图:(流程图上详细说明了TCP3次握手的两个比较重要的状态,当然还有别的状态,但就不一一列举了)
在这里插入图片描述

1.2.3.2、四次挥手

四次挥手用于断开连接,即双方取消相互认同关系。通信双方,各自向对方申请断开连接,再各自给对方回应。
在这里插入图片描述
那4次挥手能像3次握手那样合并吗??不一定能。为什么??
在这里插入图片描述
在这里插入图片描述
TCP4次挥手的详细流程图:(流程图上详细说明了TCP4次挥手的两个比较重要的状态,当然还有别的状态,但就不一一列举了)
在这里插入图片描述
ACK( acknowledge应答) 和 响应(response) 是否相同呢??
不相同。ACK只是告诉发送方,我收到数据了。而 响应 则是携带业务上的数据。

就像一些企业所用的软件:企业微信、钉钉、飞书、雨雀…当A给B发消息,网络没问题的话消息就会顺利传送到B处,那这个消息上就会出现 “已读” 两个字,这就是ACK,即系统内核收到请求就会立即返回的,不表示任何业务上的概念,只是单纯进行反馈而已。B收到消息后,回复的内容,就是响应,他表示了具体的业务数据,是由应用程序负责的,取决于代码怎么写。

1.2.4、滑动窗口机制

TCP通过 超时重传机制、确认应答机制、连接管理机制 来确保TCP协议的可靠传输。由于TCP协议是可靠传输,因此TCP的传输效率比UDP慢一些,但是 TCP 也在想方设法的提高自己的传输效率。即通过 滑动窗口机制。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面我们讨论的是使用滑动窗口机制时是在正常的情况,如果在使用滑动窗口机制时,出现了 丢包(1、发送方传的数据丢了。2、接收方回复的ACK丢了) ,那该怎么办??

情况一:数据报抵达,但 ACK 丢了。
在这里插入图片描述

丢了就丢了,对于TCP的可靠传输没有任何影响,无需处理。这是因为,虽然丢了,但是只要后面发送的数据有ACK就足够了。

比如1001丢了,但是后面ACK 2001 成功了,此时就说明其实 1001 也已经 ACK 成功了。

就好比,有人问你,大学毕业了没,你回答说你已经硕士毕业了,这时候人家就明白了,原来你已经小学、初中、高中、大学都毕业了。

情况二:数据包丢包了。
在这里插入图片描述
在这里插入图片描述
在上述设定中,只是把丢失的数据进行了重传,没丢的包,无需重传,这种传输效率比较高,叫做 “快速重传”(快速重传是搭配 滑动窗口机制的 超时重传)。当传输数据很多时,批量传输,自然是遵守快速重传的方式,但如果传输的数据很少(就只有一条),此时仍然是按照超时重传的方式进行。只要是丢包重传的,都是 “超时重传”,快速重传算是超时重传的特殊情况。

1.2.5、流量控制机制

使用滑动窗口机制之后,TCP协议效率高不高,主要取决于窗口大小,窗口越大,效率越高;窗口越小,效率越小。假设窗口大小是无限大、无穷大,此时发送方就完全不需要等待ACK了,此时效率就和 UDP 协议是一样的了。但是发送方的窗口大小不能无限大,要考虑接收方的接受能力。因此TCP协议的 流量控制机制 出现了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)

数据库管理204期 2024-06-15 数据库管理-第204期 数据库的IO掉速,也许是SSD的锅(20240615)1 SSD物理结构2 SSD颗粒类型3 DRAM & SLC Cache3.1 DRAM3.2 SLC Cache3.3 其他方式 4 缓外降速总结 数据库管理-第204期 数据库的IO掉速&#xff…

System-Verilog 实现DE2-115流水灯

文章目录 一、 SystemVerilog1. SystemVerilog简介2. 基本语法和特性 二、实验过程hello.v文件引脚分配 三、实验效果参考 一、 SystemVerilog 1. SystemVerilog简介 SystemVerilog是一种高级的硬件描述语言(HDL),它不仅继承了Verilog语言的…

Qt项目天气预报(2) - 重写事件函数

鼠标右键实现退出界面 知识点QMenu: QMenu 弹出对话框 --> 相对QMessageBox 更加轻量点 QMenu是Qt库中用于创建弹出式菜单的类,它通常出现在应用程序的顶部菜单栏、按钮的右键菜单或自定义上下文菜单中。以下是关于QMenu的详细介绍: 1. 类的基本特…

JUnit 5学习笔记

JUnit 5 学习笔记 1.JUnit5的改变2.JUnit5常用注解及测试2.1 DisplayName/Disabled/BeforeEach/AfterEach/BeforeAll/AfterAll2.2 Timeout2.3 RepeatedTest 3.断言3.1 简单断言3.2 数组断言3.3 组合断言3.4 异常断言3.5 超时断言3.6 快速失败 4.前置条件5.嵌套测试6.参数化测试…

《Fundamentals of Power Electronics》——理想变压器基本公式推导

接下去推导理想变压器的基本公式。理想变压器满足以下三个条件: 1、无铜损。假设原副边线圈均无纯电阻,则不会因在铜导线中产生焦耳热引起能量损耗,另外也不考虑回路中的分布电容。 2、无铁损。忽略通过铁芯的磁通量变化引起的涡流损耗&…

DistilBertModel模型的简单解释

前言 DistilBertModel((embeddings): Embeddings((word\_embeddings): Embedding(30522, 768, padding\_idx0)(position\_embeddings): Embedding(512, 768)(LayerNorm): LayerNorm((768,), eps1e-12, elementwise\_affineTrue)(dropout): Dropout(p\0.1, inplaceFalse))(trans…

解决方案︱视频孪生智慧高速解决方案

系统概述 在交通强国战略的指导下,我国政府高度重视以数字化为核心的智慧高速公路建设与发展。2023年9月,交通运输部印发了《交通运输部关于推进公路数字化转型加快智慧公路建设发展的意见》,强调到2035年,全面实现公路数字化转型…

【多线程】Thread类及其基本用法

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. Java中多线程编程1.1 操作系统线程与Java线程1.2 简单使用多线程1.2.1 初步创建新线程代码1.2.2 理解每个…

IDEA创建lib目录,导入jar

IDEA创建lib目录,导入jar lib第一种创建方法: 当发现项目没有lib目录时,File>>>Project Structure 打开Artifacts目录 lib第二种创建方法: 按需选择需要的jar包或者全选即可 lib第三种创建方法:

MongoDB使用$addToSet向数组中添加元素

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第66篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

为什么白昼最长的地方不是在太阳的直射点

因为地球的自传轴相对于地球的公转平面成23.5度的夹角,地球自转一周是24小时,只有白天和黑夜两种状态。白天就可以定义为我们坐在地球上,跟着地球一直转,穿过有光照的地方所花的时间。 假设太阳光正对北回归线(这一天…

2024.ZCPC.M题 计算三角形个数

题目描述: 小蔡有一张三角形的格子纸,上面有一个大三角形。这个边长为 的大三角形, 被分成 个边长为 1 的小三角形(如图一所示)。现在,小蔡选择了一条水平边 删除(如图二所示),请你找出图上剩余…

把FydeOS塞进U盘,即插即用,小白都懂能看懂的Fyde To Go教程

前言 之前小白给各位小伙伴分享过关于Windows塞进U盘的教程: 把Windows系统装进U盘,从此到哪都有属于你自己的电脑系统 如果Windows都能装到U盘里,随身携带。那fydeOS能不能也像Windows一样塞到U盘里,实现FydeOS to Go呢&#…

树的基本概念

树(Tree) "树"这种数据很像现实生活中的“树”, 这里的每个元素我们叫做“节点” 用来连线相邻节点之间的关系,我们叫做“父子关系” A节点就是B节点的父节点,B节点是A节点的‘子节点’B,C,D这三个节点的…

Java基础语法Ⅰ【注释、关键字、字面量、变量】

Java基础语法① 注释关键字与标识符数据类型字面量和常量变量转义字符 注释 注释是在写代码时,对代码作出的一些解释说明,比如某一个函数的作用(功能)、函数接收的参数以及函数返回什么东西等等。 这些解释说明没有任何功能&…

C# Winform DPI自适应方案

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形。 1.设置窗体和自定义用户控件的AutoScaleMode为None 实现目标:禁止窗体因为字体大小缩放变形 因为显示的高分屏,然后操作系统的设置了字体缩放引起的。窗体默认的AutoScaleMode = Font,控件会因为高分屏自动缩放…

遇到的状态308问题

前端用的vue.config.js做的代理,请求后端的地址https://n6118lr7-10010.usw3.devtunnels.ms 在请求的时候会308 是因为本地是http而请求地址是https 前端代理允许https接口代理即可

python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg671815,现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据,将数据保存在本地以后使用不用高频率访问tushare数据接口&#xf…

【Spring】Spring事务相关源码分析

目录: 1.讲述事务的一些基础概念。 2.讲述事务的生命周期源码 3.配置事务,以及事务注解的源码 1.前言 具体事务中Spring是怎么管理事务,怎么去管理、创建、销毁等操作的呢?这一次来分解一下。 2.事务概述(复习&a…

Vscode中使用make命令

前言 需要注意,如下操作需要进行网络代理,否则会出现安装失败的情况 安装 第一步 — 安装MingGW (1)进入官网下载 (2)下载完成之后,双击exe文件 (3)点击Install &#x…