TCP拥塞控制简单理解

2023-11-09

1.TCP的控制机制

  • 序号

TCP通过序号可以实现一下几个功能:

1.确认应答处理。发送端收到接收端的确认应答,可以得知某些数据包被接收端接收了

2.顺序控制。接收端可以利用序号对接收到的报文进行排序

3.重发控制。如果发送端没有收到确认应答,那么就会进行数据重发

4.重复控制。如果接收到多次收到同一个序号的报文,则选择不接受该报文

  • 超时重传

超时重传是TCP确保可靠性的一部分机制,它的作用是对丢失的报文进行重发。

超时重传的规则如下:

如果接收端发送了一个报文之后,一定时间后并没有收到确认应答,则说明发送的报文丢失,进行重传。

这个时间间隔不是固定的,而是根据RTT(报文的往返时间)确定的,通常超时时间间隔会设置的比RTT稍微大一些。

  • 连接管理

TCP通过三次握手建立连接、四次挥手断开连接。 

  • TCP以段为单位发送数据

虽然TCP是面向字节流的协议,但这并不意味着它的报文长度没有限制。

TCP的报文长度(段大小)通常为MSS(最大消息长度)。MSS的确认过程如下:

MSS在TCP三次握手时确定。

因为通信的两端可能所处的网络不同,所以MTU也不同(最大传输单元),所以传输层发送的数据最好不要超过MTU,否则就会触发IP层的分片和重组机制(这个机制是不好的)。

所以在TCP三次握手时,通信双方交换自己的MTU,发送端选择两个MTU当中的最小值作为MSS,所以传输层的每一个报文的最大长度不能超过MSS。

  • 滑动窗口

滑动窗口提高了TCP的传输效率和速度。

它的原理如下:

发送端发送一个报文后需要等待确认应答的到来,如果这个时间段内什么也不做那将是一种资源浪费。所以TCP提供了滑动窗口的机制,使得在等待确认应答的事件段内能够发送其他的报文。

  • 流量控制

流量控制可以避免网络资源浪费。流量控制与滑动窗口配合使用。

它的使用机制如下:

上面提到了滑动窗口,它的功能是利用等待确认应答的时间来发送更多的数据。那么发送多少数据就是由流量控制机制来控制的。

在TCP通信中,无论是什么TCP报文,都会带有接收端的接收窗口大小。发送端根据这个接收窗口大小来确认滑动窗口的大小,从而保证发送端发送的数据接收端一定能接收,从而避免网络资源浪费(发送的数据接收端接收不了而丢弃掉,不就是浪费网络资源了么)。

  • 拥塞控制

本篇文章的主题,马上开始介绍。

2.拥塞控制

拥塞控制主要解决网络拥堵的问题。因为在真实的网络通信当中,有非常多的主机在同时使用网络,但是其中的某一主机并不知道其他主机发送了多少数据,如果当前主机一次性发送了海量的数据,则非常有可能造成网络崩溃甚至是瘫痪。

那么TCP就提供了拥塞控制的机制来避免这样的情况发生。 

拥塞控制当中有一个概念叫做拥塞窗口,简单理解成是跟滑动窗口一样的东西。

数据发送的大小取决于拥塞窗口和滑动窗口的最小值。

试想这么一种情况,连接刚建立,那么接受端的接收窗口是非常大的,那么发送端会一次性发接收窗口大小那么多的数据吗?当然不可能啦,突然发送非常大的数据会造成什么影响上面已经介绍过了。

所以拥塞控制当中有一个叫做慢启动的机制,它的作用就是让TCP慢慢的发送数据。它的规则如下:

一开始的拥塞窗口为1MSS,也就是一开始只能发送1MSS数据大小的报文。随后每收到一个确认应答,拥塞窗口的大小就+1。

举个例子,一开始发送一个报文,收到一个确认应答,那么拥塞窗口就扩大为2MSS。随后发送两个报文,收到两个确认应答,然后拥塞窗口扩大为4MSS。随后发送四个报文,收到四个确认应答,然后拥塞窗口扩大为8MSS......以此类推。

从上面的规则来看,发送端能发送的数据呈指数级增长(但是要注意实际发送的数据为min(拥塞窗口,接收端窗口))。

发送的数据越多越容易造成网络拥堵,随机出现丢包的现象,最后触发超时重传。触发超时重传之后,可以得到慢启动阈值,这个阈值就是当前一次性发送的数据大小(假设为8MSS)。

因为发生了超时重传,那么慢启动阈值就会减半,即从8MSS降低为4MSS。然后又开始慢启动发送数据。

这里补充一条规则,即当拥塞窗口的大小超过了慢启动阈值,数据的发送只能呈线性增长。这个过程叫拥塞避免。

当前的慢启动阈值为4MSS,拥塞窗口为1MSS,所以它会重复上面的慢启动过程。直到拥塞窗口大于等于慢启动阈值,然后进入拥塞避免状态,发送的数据大小只能线性地、慢慢地增长。那么随着数据发送的慢慢增多,可能会出现一小部分的丢包现象,这个时候接收端会发送3次重复的确认应答以通知发送端有数据丢包了。

但是因为丢包的数据仅仅是一小部分,所以慢启动阈值又会减半。但是因为是接收到3次重复的确认应答,没有触发超时重传,所以拥塞窗口被设置为慢启动阈值+3。然后开始拥塞避免、发送数据。这个过程叫做高速重传

如果在数据发送的过程中,又接收到了3次重复的确认应答,那么就继续做上面的动作。如果触发了超时重传机制,那么就要重新设置慢启动阈值,慢启动阈值就是触发超时重传的拥塞窗口大小的一半,然后又开始慢启动。

可以画一幅图来描述拥塞控制的过程:

简单的总结这个过程,连接刚建立之后不能直接发送大量数据,而是通过慢启动由少到多的发送数据,最后会因为发送过量数据而导致超时重传,可以得出慢启动阈值应当设置为引发超时重传的拥塞窗口的一半,然后进行慢启动,然后当拥塞窗口超过慢启动阈值的时候进入拥塞避免,随后如果收到了重复的确认应答就会触发高速重传,高速重传会重置慢启动阈值但是不会执行慢启动。

拥塞控制有点像发送端在慢慢吞噬整个网络一样,如果吞噬失败了就从头再来。

3.总结

TCP依靠序号、确认应答、滑动窗口、超时重传、流量控制等手段来确保通信过程的可靠性(可靠性就是确保数据的完整、按序、准确)。

拥塞窗口主要解决网络的问题,但正是因为TCP提供了拥塞控制的机制,即保证网络是正常工作的,所以拥塞控制也是保证可靠性的手段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP拥塞控制简单理解 的相关文章

随机推荐

  • 第十章 MyBatis与Spring的整合

    单选题 1 进行MyBatis与Spring的整合配置文件编写时 不包括有 7分 A db properties B applicationContext xml C mybatis config xml D springmvc confi
  • 跨域请求避免OPTIONS请求(预检请求)

    有时候前后端分离域名不一致 会造成跨域请求 而跨域请求有时候会自动发起两次请求 第一次为预检请求 即OPTIONS请求 一般来说使用 application json 的 post 请求是必然会带入OPTIONS请求 OPTIONS请求也被
  • flex布局中align-items 和align-content的区别

    参考资料 http stackoverflow com questions 31250174 css flexbox difference between align items and align content 看了很多翻译的技术文档
  • 王佩丰excel学习笔记(三):第七——十讲

    目录 第七讲 第八讲 第九讲 第十讲 第七讲 excel连接文本 各种基础运算 相对引用与绝对引用 利用 按F4可以快速加美元号 但我电脑不行 函数 sum average rank 要排谁 排名的区域 这节总体简单 第八讲 if 判断条件
  • 自动劫持root密码

    前言 1 暴力破解sshd服务密码 2 自动劫持root密码并转发密码到邮箱 实战 自动劫持root密码并转发密码到邮箱 1 自动劫持root密码 2 把存密码的文件转发到邮箱 上传软件 rz 0x06 openssh 5 9p1 patc
  • 学习笔记-Matlab算法篇-插值算法

    插值算法 01拉格朗日多项式插值 进而得到拉格朗日多项式 Matlab求解 matlab中没有自带的求解函数 需要自行实现 function f Language x y x0 syms t if length x length y n l
  • 《王道》数据结构之绪论(一)

    数据结构入门之绪论 一 大纲 一 数据结构 1 1 基本概念 1 2 数据结构三要素 1 2 1 逻辑结构 1 2 2 物理结构 1 2 3 数据运算 二 算法 2 1 基本概念 2 1 1 五个特性 2 1 2 优秀算法的标准 2 2 算
  • 高防服务器和高防CDN

    现如今无论是高防服务器还是高防CDN的应用都十分广泛 但是大家对高防服务器和 高防CDN的作用理解的都比较模糊 因为无论是百度还是论坛等地方搜索的话都会弹出一 大堆高防服务器和高防CDN的连接导致大家想了解高防服务器和高防CDN的欲望下降甚
  • java 打印map后的输出

    java 打印map后的输出 syso直接打印parameters map类型 输出 password Ljava lang String 1080882d username Ljava lang String 69504d30 表示一维数
  • QT 创建使用动态库

    一 创建并编译库 创建项目 选择Library下的C Library 2 选择shared library 3 此时创建的项目的 pro文件如下 QT gui TEMPLATE lib DEFINES Data LIBRARY DEFINE
  • 看看Android的触摸事件分发

    当我们的手指从触摸屏幕上的各种View 开始到这个点击事件的结束到底经历了什么 我们来简单分析下 之所以是简单分析 是因为这里完全不涉及hal层 事件类型 触摸事件会有三种类型 int action MotionEventCompat ge
  • 硬件设计——外围电路(晶振电路)

    硬件设计之晶振电路 为什么要用晶振 晶振电路由何组成 晶振电路中其电容的作用 在日常的电路设计中 我们经常会用到晶振电路 所以我们就要首先先提一下什么是晶振 这样才能理解晶振电路 为什么要用晶振 晶振的作用是为系统提供基本的时钟信号 通常一
  • 基于金融大数据的特征提取与趋势预测系统(一)2021-06-30

    项目分工和项目需求初步了解 在本项目的分工中我负责的是前端展示部分 前端展示的两个部分 1 登陆及注册 实现用户登陆本系统 以及注册成为用户的功能 以保证用户在使用本系统时的安全性 2 股票可视化模块 数据可视化主要旨在借助于图形化手段 清
  • TypeScript的数组和元组

    数组 在TypeScript中数组的定义与JavaScript中别无二致 但是JavaScript中的数组具有很大灵活性 即数组内可以存储任意类型数据 那么在TypeScript中能不能做到呢 答案是肯定的 const arr string
  • Java学习笔记17——多态与抽象

    多态与抽象 多态 多态是什么 多态的前提和体现 多态中成员访问的特点 多态的好处和弊端 多态中的转型 分类 抽象类 什么是抽象类 抽象的关键字 抽象类的特点 抽象类的成员特点 多态 多态是什么 多态是同一个对象 在不同时刻表现出来的不同形态
  • 【华为机试刷题笔记】HJ41-称砝码

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 数据范围 每组输入数据满足 1
  • 自学Python爬虫学到什么程度?就可以去找工作了?

    确立目标 了解需求 首先我们要先定位自己的目标 当然我们先以爬虫工程师来做个说明 去招聘网上看看需求都有哪些 直接做个拉勾网爬虫 结果了 仔细看看 我们可以得出以下几点 1 python 不是唯一可以做爬虫的 很多语言都可以 尤其是 jav
  • 从零开发区块链应用(七)--gin框架参数获取

    文章目录 一 获取query参数 二 获取form表单参数 三 获取JSON参数 四 获取path参数 五 参数绑定 一 获取query参数 query指的是URL 后面携带的参数 例如user info username 张三 passw
  • 大白话Java版 TCP Socket编程案例 清晰明了

    最近学习网络的过程中 了解到了应用借助socket接口在tcp上建立连接 发送请求的过程 遂做个记录 文章目录 整体流程 服务端 1 创建套接字绑定端口 2 等待接收请求 4 获取请求 ConnectSocket建立 6 读请求并处理 8
  • TCP拥塞控制简单理解

    1 TCP的控制机制 序号 TCP通过序号可以实现一下几个功能 1 确认应答处理 发送端收到接收端的确认应答 可以得知某些数据包被接收端接收了 2 顺序控制 接收端可以利用序号对接收到的报文进行排序 3 重发控制 如果发送端没有收到确认应答