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. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...
随机推荐
- Apache hudi 核心功能点分析
Hudi 文中部分代码对应 0.14.0 版本 发展背景 初始的需求是Uber公司会有很多记录级别的更新场景,Hudi 在Uber 内部主要的一个场景,就是乘客打车下单和司机接单的匹配,乘客和司机分别 ...
- SaaS化开源项目之HouseKeeper云上部署实践
摘要:华为云DTSE技术专家从源码构建.应用部署到系统调测,详细解读云原生SaaS应用构建的全过程. 本文分享自华为云社区<HouseKeeper云上部署实践>,作者:华为云DTSE. H ...
- 【Ubuntu】1. 创建虚拟机
这一篇主要写了虚拟机的创建,不包含操作系统的安装,中间有些步骤没有提到的根据默认操作即可,也可以根据个人情况设置. 点击创建新的虚拟机 这一步可以选择典型安装,过程更简单些,这里我选择自定义. 在安装 ...
- 【Python基础】变量的作用域与global、nonlocal
在 Python 中,变量的作用域指的是变量可以被访问的范围.Python 中的变量作用域有两种: 局部作用域:变量在函数函数内部的时候,只能在函数内部使用.这样的变量被称为局部变量. 如果在函数内部 ...
- 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
八.可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷.对于给定的函数g(n, m),用O(g(n, m))来表示以下函数集: O(g(n, m)) = 对Ω(g(n ...
- 2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角(
2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角( ...
- vue全家桶进阶之路26:Vue.js 3.0与Vue.js 2.x 的比较和注意事项
Vue.js 3.0 是 Vue.js 框架的最新版本,于 2020 年 9 月正式发布.Vue.js 3.0 主要的改进和新特性包括: 更好的性能:Vue.js 3.0 使用了更快的虚拟 DOM 实 ...
- Django-3:创建子项目APP
django-admin startapp app01 或 python manage.py startapp app01 #app01 是app名称 PyCharm的样子:
- 2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline?
2023-06-03:redis中pipeline有什么好处,为什么要用 pipeline? 答案2023-06-03: Redis客户端执行一条命令通常包括以下四个阶段: 1.发送命令:客户端将要执 ...
- C/CPP在命令行中生成DLL文件
简单的写一个C调用DLL(动态链接库)的例子. 创建3个.c文件备用 test.c 1 #include <stdio.h> 2 3 //这里声明,表示来自dll文件. 4 extern ...