TCP如何实现可靠传输、流量控制、拥塞控制
上一篇文章中讲述了TCP首部的存储的数据,这一篇来聊聊这些数据帮助TCP实现一些特性。
可靠传输
TCP传输会保障数据的可靠和完整,如果数据传输过程丢失了,会重新传输。
保障的第一种协议方式是 停止等待ARQ协议,发送一条数据,收到确认消息之后再发送第二条数据,如果等待了一定的时候还没有收到确认消息,则重新发送刚刚那条数据。
此时接收方可能存在相同的数据,那么它会丢弃重复数据,并重传确认的消息。发送方也有可能因为确认消息超过了设定的重传时间,而收到多条确认消息。
停止等待ARQ协议简单,但信道的利用率低,每次要等到确认才会发送下一条数据。那有没有办法提升信道的利用率,一次多传些数据呢?
连续ARQ和滑动窗口协议提供了解决方案,在接收方和发送方分别存在缓存区域,数据发送或确认后,窗口滑动到下一片区域。
其中发送缓存暂存发送应用程序传给发送方TCP准备发送的数据及TCP已发送但尚未收到确认的数据,接收缓存暂存按需到达的、但尚未被接收应用程序读取的数据及未按序到达的数据。
发送方将多条数据按一定时间间隔发送,接收方确认该次传递数据的最后一条,发送方收到确认的请求之后,窗口滑动到下一批次需要发送请求的范围。
那么如果在发送过程中存在数据丢失的请求呢,比如M1-M4的数据,其中M3丢失了,此时接收方会发送确认M2的数据,发送方会重新发送M3和M4。
但M4是被接收方正常接收的,无需再重复发送,这时候需要用到选择确认ACK,这部分的数据保存在TCP首部的选项部分,接收方通过它告知发送方,需要重传的内容,比如M3丢失,那么范围值就会少了M3这部分,发送方通过TCP首部得知只需要重传M3。
使用连续ARQ、滑动窗口协议和选择确认ACK保障TCP的可靠传输。
流量控制
如果接收方的缓存区满了,而发送方仍然不停的发送数据,这样接收方只能将收到的数据包丢掉,这样造成了极大的网络资源浪费,流量控制就是为了避免这样的问题出现。
通过确认报文中TCP首部的窗口属性,来限制发送方的发送速率,数据发送越大,缓存区内可存储的范围越小,那么窗口的大小也会发生变化。
如果发送方接收到的窗口大小为0,那么发送方就会停止发送,但它同时会开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小还是为0,则发送方再次刷新启动定时器,这样当接收方的缓存区有空余时,发送方就可以继续发送数据。
流量控制是点对点通信量的控制,是接收端控制发送端的问题,抑制发送端的发送速率,以便接收端来得及接收。但当网络设备过多,即使限制了每个设备的发送数据大小,仍然可能链路过载,这时候需要一个全局性的通信控制。
拥塞控制
拥塞控制,防止过多的数据注入到网络中,避免网络中的路由器或链路过载。实际中的拥塞控制并不会任由吞吐量稳步到达负载的最大值,然后在顶峰保持,而是指数增长到一定值后缓存上升。
因为当负载总量为1000时,最大能达到可能就800、900,当达到300左右就会轻度拥塞(丢包),达到800就会到达拥塞顶部,再持续输出吞吐量降低,如果没有拥塞控制,可能会丢包严重最后死锁。
在了解拥塞控制的方法前,首先要知道几个名词
- MSS(Maxium segment size) 每个段最大的数据部分大小,建立连接时确认,存在选项属性中,首部共计32字节,发送方和接收方可能不一样,取最小值
- cwnd(congestion window) 拥塞窗口,在发送方,根据网络情况而定,比如5000
- rwnd(receive window) 接收窗口,在接受方,告诉发送方所有段加起来的总和,比如3000
- swnd(send window) 发送窗口,取拥塞窗口和接收窗口的最小值,此时为3000
- swnd = min(cwnd, rwnd)
拥塞控制的算法有四种,慢开始(slow start)、拥塞避免(congestion avoidance)、
快速重传(fast retransmit)、快速恢复(fast recovery)。
慢开始:刚开始发的很慢,比如rwnd为3000,mss为100,一次最多可以发30个段,但cwnd不会发这么多,而是从100到200,到400再到800,指数增加。
拥塞避免:拥塞窗口(cwnd)缓慢增大,以免网络过早出现拥塞。
- 加法增大 --- 慢开始有一个阈值ssthresh(slow start threshold),比如cwnd为2400,阈值1600,那么当拥塞窗口达到1600以后,就不指数增长,而是以线性增加(每次加一点)
- 乘法减小 --- 当网络拥塞(发送方发了很多数据但没有收到接收方确认)时,将ssthresh减为拥塞窗口的一半(1200),【与此同时,执行慢开始算法,cwnd恢复初始值(100)】(旧版本)
- 如果网络频繁拥塞,ssthresh值会下降得很快,因为不断的减半
快速重传:接收方收到错误顺序的数据时,比如m1、m2都成功确认,m3丢失,m4发送成功,此时会重复确认m2、发送方收到三个连续的m2重复确认,立刻重传m3,在此之前使用的是超时重传(等待一定的时间没有收到确认的报文再重传)。
快速恢复:当网络拥塞,ssthresh减为拥塞峰值的一半时,拥塞窗口给(cwmd)不恢复到初始值,直接从ssthresh减半后的阈值1200开始,再加法增大。
这四个算法形成了TCP的拥塞控制,初始发送请求使用慢开始,线性增长阈值后,开启加法增大到拥塞窗口的值后,减法减小将阈值减小为拥塞窗口的一半,如果此时再使用慢开始从初始值开始,发送数据会比较小,快速恢复在从图标5处,直接从阈值开始,增加发送窗口数据。
TCP协议通过可靠传输、流量控制、拥塞控制保障数据的完整、网络的顺畅。TCP还有一个非常重要的属性,连接管理,它是如何建立连接和断开连接呢?敬请期待我下一篇文章~
以上就是关于 TCP如何实现可靠传输、流量控制、拥塞控制
的内容 , 更多有关 前端
、网络协议
的内容可以参考我其它的博文,持续更新中~
TCP如何实现可靠传输、流量控制、拥塞控制的更多相关文章
- TCP可靠传输和拥塞控制
1.TCP的可靠传输 tcp的可靠传输主要靠 来自接收方的确认报文 和 超时重传. 发出报文,计时器开始计时,在规定超时时间内未收到确认报文则重新发送. 注意:发送报文都留一个副本,如果收到确认报文就 ...
- TCP如何保证可靠传输(转)
TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有: 校验和 序列 ...
- TCP如何保证可靠传输
TCP 协议如何保证可靠传输 一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...
- TCP怎样保证可靠传输
TCP的可靠性保证 TCP主要提供了检验和,序列号/确认应答,超时重传,最大消息长度,滑动窗口控制等方法实现了可靠性传输. 检验和 通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错 ...
- 面试问题之计算机网络:TCP如何保证数据可靠传输
转载于:https://blog.csdn.net/liuchenxia8/article/details/80428157 TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接. TCP保证数 ...
- 如何用 UDP 实现可靠传输?
作者:小林coding 计算机八股文刷题网站:https://xiaolincoding.com 大家好,我是小林. 我记得之前在群里看到,有位读者字节一面的时候被问到:「如何基于 UDP 协议实现可 ...
- UDP可靠传输那些事
有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...
- 【校招面试 之 网络】第2题 TCP的可靠传输、流量控制、滑动窗口
1.可靠传输 (1)三次握手 TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接: (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_S ...
- 深入浅出图解【计算机网络】 之 【TCP可靠传输的实现2: 超时重传+拥塞控制】
[前言]上一篇文章介绍了关于TCP的基础知识,以及建立(释放)连接和滑动窗口的概念. 本篇文章将延续上一篇的思路,继续介绍TCP实现可靠传输的机制. 超时重传 上一篇文章里介绍过TCP采用停止等待协议 ...
- TCP可靠传输及流量控制实现原理
一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...
随机推荐
- 分享一个提高运维效率的 Python 脚本
哈喽大家好我是咸鱼,今天给大家分享一个能够提升运维效率的 python 脚本 咸鱼平常在工作当中通常会接触到下面类似的场景: 容灾切换的时候批量对机器上的配置文件内容进行修改替换 对机器批量替换某个文 ...
- springMVC中注解
其中常见注解: 1.@RequestMapping:用于请求url路径,可用于类和方法上,用于类上,则表示类中所有响应请求的方法都是以该路径作为父路径. 2.@RequestBody:注解实现接收 h ...
- 2020-08-18:介绍下MR过程?
福哥答案2020-08-18:[来自[MapReduce执行过程及运行原理详解] 答案](https://www.panziye.com/bigdata/625.html)MapReduce执行的4个 ...
- C# 中的“智能枚举”:如何在枚举中增加行为
目录 枚举的基本用法回顾 枚举常见的设计模式运用 介绍 智能枚举 代码示例 业务应用 小结 枚举的基本用法回顾 以下是一个常见的 C# 枚举(enum)的示例: enum Weekday { Mond ...
- Pyhton F字符串引起的invalid syntax
事发现场 偶然运行到之前写的爬虫,发现运行不了,报错invalid syntax,于是来找bug 报错截图: 原因: 这样用法称之为 f-string f-string,亦称为格式化字符串常量(for ...
- AcWing 3729. 改变数组元素
给定一个空数组 V 和一个整数数组 a1,a2,-,an. 现在要对数组 V进行 n次操作. 第 i次操作的具体流程如下: 从数组 V尾部插入整数 0. 2.将位于数组 V末尾的 ai 个元素都 ...
- 对promise的简单理解
随着ES6的推行它的许多新特性受到了广大开发者的好评,比如promise,为什么使用这个promise呢,他具体能帮我们做些啥? 其实从字面意思上来理解promise就是承诺,比如:你命令你的手下本月 ...
- 高级程序员和新手小白程序员区别你是那个等级看解决bug速度
IT入门深似海 ,程序员行业,我觉得是最难做的.加不完的班,熬不完的夜. 和产品经理,扯不清,理还乱的宿命关系 一直都在 新需求-做项目-解决问题-解决bug-新需求 好像一直都是这么一个循环.(哈哈 ...
- 在 Linux 和 Windows 下源码安装 Perl
Perl 是一种功能丰富的计算机程序语言,运行在超过 100 种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发.在生物信息分析领域,Perl 主要是做数据预处理.文本处理 ...
- Linux下程序时间消耗监控与统计
良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产 ...