| |
|
开发:
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 疑难杂症全解析_技术交流_牛客网 思维导图如下 : 目录 确认应答序列号与确认应答号?TCP报头中就包括序列号和确认应答号,让我们看一些他们究竟有何用处?如何保证TCP的可靠性传输. 既然这两个是保证可靠性传输,我们再来复习一下什么是可靠性传输. 可靠性传输:可靠性传输是指发送方发送数据给接收方,接收方接收到数据和没有接收到数据,发送方是知道的.
序列号
因为在发送一个信息时,TCP会将这个信息拆分成多个数据报来传输给接收方,由于在网络环境下传输不保证顺序,到接收方是有可能乱序的这样组合成的数据就是无效的数据,所以就要对发出的每个数据进行编号,当数据报到达接收方的时候就会对其接受的数据按照序号重新排序-->保证接收的数据不乱序. 其次还能根据序号进行去重,发送方连续发送同样序号的数据,这时接收方就知道这个序号的数据我已经接收到了,就会对第二次发送的重复数据报丢弃处理==>会根据序号对数据进行去重处理
接下来再来讲一讲 字节序号 / 报文段序号 / 初始序号ISN
确认序号通过确认序号,发送方就知道自己发送的数据,接收方已经接收到了==>这也是保证可靠性的核心
通过TCP报文里面的标志位ACK就可以知道.ACK标志位为1就代表是确认应答报文,为0就是普通的报文. 总结确认应答机制当发送方发送数据时,发送方就会等待接收方发送ACK报文代表接收方已经收到数据,这个ACK报文告诉我们确认序号前面的数据接收方已经接收到了,发送方可以从确认序号以后的数据开始发送. 重传机制超时重传
网络中可能会发生网络拥堵,就可能导致发送方在传输数据时把数据包丢了,接收方接收不到数据,发送方接收不到接收方发来的ACK,这时发送方就知道数据包丢了,所以就需要重传数据包. 超时重传就是解决在网络中传输数据时数据包丢失的情况.
发送方将数据包发送给接收方的时候数据包丢失,发送方没有接收到接收方的ACK,这时就会启动一个定时器进行等待,超过等待时间,发送方就会重传数据包.-----超时重传. 超时时间(RTO)如何设定呢???最理想的情况下,找到一个最小时间(一般是通过对RTT进行采样然后加权平均根据公式计算得到RTO),确保ACK在这一段时间内返回. 这里如果设置的时间(RTO)过短,就会导致发送方频繁的重复发送数据包,没有必要的重传.如果设置的重传时间(RTO)过长的时候,就会导致很长的时间发送数据包,导致整体效率低下. 数据包丢失的两种特殊情况
如果发送方发送的数据包丢失,,超过等待时间,发送方还没有接收到接收方发送的ACK,发送方就会对数据进行重传.
如果是ACK丢失,等待一段时间,发送方还没有接收到接收方发来的ACK,也会重传数据,这时就会导致接收方会接收到重复的数据,如果接收方接收的数据的序号是相同的,接收方就知道自己收到重复的数据了,就会将重复的数据丢弃掉. 由于发送方不知道是数据包丢失还是ACK丢失所以都会进行重传数据.
答案是可能的,如果说单次丢包的概率为10%,那么下一次丢包的概率会越来越小,所以概率会很小,但是依然会有特殊情况发生.
如果发送方重传数据之后,数据包丢失,这时发送方就会延长等待时间,等待时间2倍,4倍呈指数函数延长时间.如果重传一定次数,发送方依然还没有收到接收方的ACK,这时就会判断为网络出现异常,就会断开重新建立连接,如果还连接不上就彻底放弃连接. 超时重传存在哪些问题呢???我们知道如果数据丢失,数据传输的效率就取决于重传的时间,超时重传的缺点就是超时周期过长,当重传的数据多次丢失时间间隔就会呈指数函数增长,会越来越慢. 所以我们就需要更快一点重传,接下来我们来看一下快速重传. 快速重传
当发送方接收到三次相同的ACK,发送方就知道数据丢失,就会进行重传,重传数据包之后,接收方返回的ACK是接收数据的最后一个ACK(比如上图就返回7001). 快速重传有哪些问题???
如何能让发送方知道接收方哪些数据接收到了,哪些数据没有接收到呢? SACK 方法SACK也要确认性重传,SACK这个是在选项字段里,使用SACK,接收方就会将自己收到了哪些数据告诉发送方.这时发送方就知道接收方哪些数据接收到,哪些数据没有接收到,所以进一步就知道哪些数据丢失了,发送方会根据丢失的数据选择性的重传. D-SACKD-SACK就是通过使用SACK来告知发送方有哪些数据是被重复接收到的.
?这里发送两个数据包,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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年12日历 | -2024/12/28 20:54:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |