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. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...
随机推荐
- 如何通过C#/VB.NET代码将PowerPoint转换为HTML
利用PowerPoint可以很方便的呈现多媒体信息,且信息形式多媒体化,表现力强.但难免在某些情况下我们会需要将PowerPoint转换为HTML格式.因为HTML文档能独立于各种操作系统平台(如Un ...
- Keepalived 高可用
Keepalived 高可用 什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的. 高可用通常使用的软件 keep ...
- Django4全栈进阶之路16 项目实战(用户管理):user_list.html用户列表画面设计
首先在template模板文件夹中新建account子文件夹,用于存放用户管理相关模块页面. 下面开始正式的设计: 1.模块代码设计 {% extends 'base.html' %} {% bloc ...
- MC我的世界模拟城市模拟大都sim-u常见问题总结
title: 常见问题 date: 2022-08-22 09:58:01 permalink: /course/2 sidebar: auto article: true copyright: tr ...
- 使用 ChatGPT 的 7 个技巧 | Prompt Engineering 学习笔记
概述 前段时间在 DeepLearning 学了一门大火的 Prompt 的课程,吴恩达本人授课,讲的通俗易懂,感觉受益匪浅,因此在这里总结分享一下我的学习笔记. 为什么要学习 Prompt ? 因为 ...
- hw面试常见中间件漏洞
apache漏洞 未知扩展名解析漏洞 漏洞原理:Apache对文件名后缀的识别是从后往前进行的,当遇到不认识的后缀时,继续往前,直到识别 影响版本:使用module模式与php结合的所有版本,apac ...
- React基本引入和JSX语法
1.1 React介绍 1.1.1. 官网 英文官网:https://reactjs.org/ 中文官网: https://react.docschina.org/ 1.1.2. 介绍描述 用于动态构 ...
- Java 字符串反转,举例:键盘录入”abc”输出结果:”cba”
代码如下: public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out. ...
- 一文读懂什么是AIGC?
目录 AIGC概念 AIGC发展历史 在早期萌芽阶段(1950s~1990s) 在沉淀累积阶段(1990s~2010s) 在快速发展阶段(2010s~至今) ChatGPT AIGC能做什么? 电子商 ...
- 如何使用libavfilter库给输入文件input.yuv添加视频滤镜?
一.视频滤镜初始化 本次代码实现的是给输入视频文件添加水平翻转滤镜,在视频滤镜初始化部分我们可以分为以下几步进行: 1.创建滤镜图结构 视频滤镜功能最核心的结构为滤镜图结构,即AVFilterGrap ...