上一篇文章中讲述了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如何实现可靠传输、流量控制、拥塞控制的更多相关文章

  1. TCP可靠传输和拥塞控制

    1.TCP的可靠传输 tcp的可靠传输主要靠 来自接收方的确认报文 和 超时重传. 发出报文,计时器开始计时,在规定超时时间内未收到确认报文则重新发送. 注意:发送报文都留一个副本,如果收到确认报文就 ...

  2. TCP如何保证可靠传输(转)

    TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接.这篇博客,我们就重点讨论一下TCP协议如何确保传输的可靠性的. 确保传输可靠性的方式TCP协议保证数据传输可靠性的方式主要有: 校验和 序列 ...

  3. TCP如何保证可靠传输

    TCP 协议如何保证可靠传输   一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节 ...

  4. TCP怎样保证可靠传输

    TCP的可靠性保证 TCP主要提供了检验和,序列号/确认应答,超时重传,最大消息长度,滑动窗口控制等方法实现了可靠性传输. 检验和 通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错 ...

  5. 面试问题之计算机网络:TCP如何保证数据可靠传输

    转载于:https://blog.csdn.net/liuchenxia8/article/details/80428157 TCP协议传输的特点主要就是面向字节流.传输可靠.面向连接. TCP保证数 ...

  6. 如何用 UDP 实现可靠传输?

    作者:小林coding 计算机八股文刷题网站:https://xiaolincoding.com 大家好,我是小林. 我记得之前在群里看到,有位读者字节一面的时候被问到:「如何基于 UDP 协议实现可 ...

  7. UDP可靠传输那些事

    有空来论坛走走,发现讨论udp可靠传输又热了起来,有人认为udp高效率,有人认为udp丢包重传机制容易控制,还有朋友搞极限测试,当然也有人推销自己的东西,这里写一点我个人的看法. udp可靠传输其实非 ...

  8. 【校招面试 之 网络】第2题 TCP的可靠传输、流量控制、滑动窗口

    1.可靠传输 (1)三次握手 TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接: (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_S ...

  9. 深入浅出图解【计算机网络】 之 【TCP可靠传输的实现2: 超时重传+拥塞控制】

    [前言]上一篇文章介绍了关于TCP的基础知识,以及建立(释放)连接和滑动窗口的概念. 本篇文章将延续上一篇的思路,继续介绍TCP实现可靠传输的机制. 超时重传 上一篇文章里介绍过TCP采用停止等待协议 ...

  10. TCP可靠传输及流量控制实现原理

    一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...

随机推荐

  1. 【Vue2】编程式路由导航

    在Vue Router中,除了使用 创建 a 标签来定义导航链接之外,还可以使用Vue Router通过编写代码来实现导航. 他提供的三个实例方法:router.push.router.replace ...

  2. .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...

  3. 2022-07-19:f(i) : i的所有因子,每个因子都平方之后,累加起来。 比如f(10) = 1平方 + 2平方 + 5平方 + 10平方 = 1 + 4 + 25 + 100 = 130。

    2022-07-19:f(i) : i的所有因子,每个因子都平方之后,累加起来. 比如f(10) = 1平方 + 2平方 + 5平方 + 10平方 = 1 + 4 + 25 + 100 = 130. ...

  4. vue全家桶进阶之路6:Vue的安装以及js引入

    1.安装 注意:Vue 不支持 IE8 及以下版本 创建一个文件夹用于下载引入Vue D:\BaiduSyncdisk\vue2 按照最新版本的Vue npm install vue 创建完成后便可以 ...

  5. 脱离 Spring 苦海,Solon v2.3.0 发布

    Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...

  6. 【python基础】复杂数据类型-列表类型(排序/长度/遍历)

    1.列表数据元素排序 在创建的列表中,数据元素的排列顺序常常是无法预测的.这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息.有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调 ...

  7. PE 结构的三种地址

    三种地址   (一)VA(虚拟地址):PE 文件被 Windows 加载到内存后的地址.   (二) RVA(相对虚拟地址):PE 文件虚拟地址相对于映射基地址(对于 EXE 文件来说,映射基地址是 ...

  8. uniapp主题切换功能的第一种实现方式(scss变量+vuex)

    随着用户端体验的不断提升,很多应用在上线的时候都要求做不同的主题,最基本的就是白天与夜间主题. 就像b站app主题切换,像这样的 uniapp因为能轻松实现多端发布而得到很多开发者的青睐,但每个端的实 ...

  9. WPF中有中心点的slider滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...

  10. 在 Istio 服务网格内连接外部 MySQL 数据库

    为了方便理解,以 Istio 官方提供的 Bookinfo 应用示例为例,利用 ratings 服务外部 MySQL 数据库. Bookinfo应用的架构图如下: 其中,包含四个单独的微服务: pro ...