IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP保证可靠性机制确认应答与超时重传 -> 正文阅读

[网络协议]TCP保证可靠性机制确认应答与超时重传

保证可靠性机制有 确认应答(序列号/确认序号),超时重传,滑动窗口,流量控制,拥塞控制,连接管理.

这篇文章我们一探究竟确认应答超时重传.

本文参考了一些优秀的书籍->图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度.

小林coding ?小林coding

知乎牛客的文章 :?万字长文 | 23 个问题 TCP 疑难杂症全解析_技术交流_牛客网

思维导图如下 :

目录

确认应答

序列号与确认应答号

序列号

确认序号

总结确认应答机制

重传机制

超时重传

超时时间(RTO)如何设定呢???

数据包丢失的两种特殊情况

超时重传存在哪些问题呢???

快速重传

快速重传有哪些问题???

SACK 方法

D-SACK

?D-SACK的好处

确认应答

序列号与确认应答号

?TCP报头中就包括序列号和确认应答号,让我们看一些他们究竟有何用处?如何保证TCP的可靠性传输.

既然这两个是保证可靠性传输,我们再来复习一下什么是可靠性传输.

可靠性传输:可靠性传输是指发送方发送数据给接收方,接收方接收到数据和没有接收到数据,发送方是知道的.

这里举个例子:就像我们在钉钉发信息时,在消息底下就有个已读未回这样的标记,这就是可靠性传输.

序列号

  • 这里先说一说序列号有啥意义呢?

因为在发送一个信息时,TCP会将这个信息拆分成多个数据报来传输给接收方,由于在网络环境下传输不保证顺序,到接收方是有可能乱序的这样组合成的数据就是无效的数据,所以就要对发出的每个数据进行编号,当数据报到达接收方的时候就会对其接受的数据按照序号重新排序-->保证接收的数据不乱序.

其次还能根据序号进行去重,发送方连续发送同样序号的数据,这时接收方就知道这个序号的数据我已经接收到了,就会对第二次发送的重复数据报丢弃处理==>会根据序号对数据进行去重处理

  • 根据这里可能大家会有个问题,发送方怎么知道重复的,这里就需要了解D-SACK了,这个后面会讲解

SACK是TCP的一个[选项]字段,通过SACK会将已经收到的数据返回给发送刚,就可以知道接收方哪些数据收到,哪些数据没有收到,D-SACK就使用SACK来知道哪些数据是重复接收的.

接下来再来讲一讲 字节序号 / 报文段序号 / 初始序号ISN

  • 字节序号

再传输数据时会对每一个字节的数据都对其编号===>字节序号

  • 报文段序列号

比如我发送301~400的数据这就是报文段序号,意思告诉我们初始序号为301(第一个序号-第一个字节的数据),长度大小为100,最后一个字节的数据的序号为400.

  • 初始序号ISN

初始序号是指第一个字节数据的序号,会告诉我们第一个报文段是谁

  • 初始序列号 ISN 是如何随机产生的?

初始序列号ISN随着时间而定,每隔4微秒加1,每圈转4.55h,这里会有个ISN生成随机算法.

ISN = M +F : M是一个计时器,每4微秒+1,F是一个Hash算法,根据 源IP地址,源端口,目的IP地址,目的端口而定的,保证Hash算法不被轻易退出,还可以使用MD5算法. ISN根据时间计时器递增,所以基本不可能随机生成一样的ISN.

确认序号

通过确认序号,发送方就知道自己发送的数据,接收方已经接收到了==>这也是保证可靠性的核心

?确认序号告诉我们以下两点:

  • 确认序号以前的数据接收方已经接收到了
  • 发送方可以发送确认序号以后的数据1了
  • 如何区分是普通的报文还是应答的报文 ???

通过TCP报文里面的标志位ACK就可以知道.ACK标志位为1就代表是确认应答报文,为0就是普通的报文.

总结确认应答机制

当发送方发送数据时,发送方就会等待接收方发送ACK报文代表接收方已经收到数据,这个ACK报文告诉我们确认序号前面的数据接收方已经接收到了,发送方可以从确认序号以后的数据开始发送.

重传机制

超时重传

  • 超时重传能够解决什么问题

网络中可能会发生网络拥堵,就可能导致发送方在传输数据时把数据包丢了,接收方接收不到数据,发送方接收不到接收方发来的ACK,这时发送方就知道数据包丢了,所以就需要重传数据包.

超时重传就是解决在网络中传输数据时数据包丢失的情况.

  • 超时重传

发送方将数据包发送给接收方的时候数据包丢失,发送方没有接收到接收方的ACK,这时就会启动一个定时器进行等待,超过等待时间,发送方就会重传数据包.-----超时重传.

超时时间(RTO)如何设定呢???

最理想的情况下,找到一个最小时间(一般是通过对RTT进行采样然后加权平均根据公式计算得到RTO),确保ACK在这一段时间内返回.

这里如果设置的时间(RTO)过短,就会导致发送方频繁的重复发送数据包,没有必要的重传.如果设置的重传时间(RTO)过长的时候,就会导致很长的时间发送数据包,导致整体效率低下.

数据包丢失的两种特殊情况

  • 数据包丢失

如果发送方发送的数据包丢失,,超过等待时间,发送方还没有接收到接收方发送的ACK,发送方就会对数据进行重传.

  • ACK丢失

如果是ACK丢失,等待一段时间,发送方还没有接收到接收方发来的ACK,也会重传数据,这时就会导致接收方会接收到重复的数据,如果接收方接收的数据的序号是相同的,接收方就知道自己收到重复的数据了,就会将重复的数据丢弃掉.

由于发送方不知道是数据包丢失还是ACK丢失所以都会进行重传数据.

  • 重传的数据可能丢失么.

答案是可能的,如果说单次丢包的概率为10%,那么下一次丢包的概率会越来越小,所以概率会很小,但是依然会有特殊情况发生.

  • 如果重传的数据丢失了怎么办???

如果发送方重传数据之后,数据包丢失,这时发送方就会延长等待时间,等待时间2倍,4倍呈指数函数延长时间.如果重传一定次数,发送方依然还没有收到接收方的ACK,这时就会判断为网络出现异常,就会断开重新建立连接,如果还连接不上就彻底放弃连接.

超时重传存在哪些问题呢???

我们知道如果数据丢失,数据传输的效率就取决于重传的时间,超时重传的缺点就是超时周期过长,当重传的数据多次丢失时间间隔就会呈指数函数增长,会越来越慢.


所以我们就需要更快一点重传,接下来我们来看一下快速重传.

快速重传

  • ?发送1~1000的数据,接收方返回1001的ACK.
  • 当发送方发送1001~2000的数据包,但是数据包丢失了,这时接收方接着返回1001的ACK.同样的,发送方继续发送2001~3000,3001~4000,4001~5000的时候,发送方接收了三次重复的ACK1001.
  • 当发送方接收到三次相同的应答报文时,发送方就知道数据丢失了,就会重传对应的1001~2000整个数据,此时因为之前的数据(7001)我们都收到了,所以接收方返回ACK7001.

当发送方接收到三次相同的ACK,发送方就知道数据丢失,就会进行重传,重传数据包之后,接收方返回的ACK是接收数据的最后一个ACK(比如上图就返回7001).

快速重传有哪些问题???

?比如这里的1001~2000和2001~3000的数据都丢失了,这时触发快速重传,是重传一个还是重传多个报文呢?

  • 如果只重传1001对应的这个报文,这就会导致2001~3000这个数据又要继续触发快速重传,后续又要收到三次重复的ACK才能重传这个报文.
  • 如果重传1001以后的数据(也就是多个数据),那么3001~6000之间的数据包接收方已经接收到了,如果再次重发,相当于浪费资源.

如何能让发送方知道接收方哪些数据接收到了,哪些数据没有接收到呢?

SACK 方法

SACK也要确认性重传,SACK这个是在选项字段里,使用SACK,接收方就会将自己收到了哪些数据告诉发送方.这时发送方就知道接收方哪些数据接收到,哪些数据没有接收到,所以进一步就知道哪些数据丢失了,发送方会根据丢失的数据选择性的重传.

D-SACK

D-SACK就是通过使用SACK来告知发送方有哪些数据是被重复接收到的.

  • 最经典的就是ACK丢包

?这里发送两个数据包,ACK都丢失了,这时重传第一个数据包,发现返回SACK1~1000,ACK2001,这时ACK的值涵盖SACK这就说明,接收方收到的数据是重复的,这时就告诉发送方,接收方收到的数据时重复的,所以发送方这才知道原来我发送的数据包ACK丢失了.

  • 还有一种就是网络延迟

?

?D-SACK的好处

能够让发送方知道是不是ACK丢失了

能够让发送方知道是不是发生网络延迟了--->先发的包后到

能够让发送方知道是不是在网络中发送的数据包被复制了

能够让发送方知道是否超时重传时间设置的太小

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:45:01  更:2022-09-04 01:45:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 9:30:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码