一、前言

① TCP 与 UDP 概念

  • 在涉及到网络知识的面试中,TCP 和 UDP 是经常被提及的两个概念,它们是 OSI 模型中的运输层中的协议;
  • TCP 全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信,所谓可靠,在于 TCP 建立连接时双方需要互相确认,类似打电话,在专业术语中称为 3 次握手。
  • UDP 全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信,所谓不可靠,在于 UDP 每一次发送数据需要绑定 IP 和端口号,但是对于已经发送出去的数据来说并不去确认,也不需要类似 TCP 的三次握手的过程,由于没有了这个过程,所以其传输效率较之 TCP 来说要高许多。

② TCP 与 UDP 区别

  • 对于这两者,有一些简单且重要的区别,在面试中也经常被问到:

③ TCP 与 UDP 面试点

  • 「TCP 3 次握手的过程」,「TCP 4 次挥手的过程」等点,大家可能已经比较清楚了,在此就不多做叙述。在字节跳动的面试中还问了这么一道题:TCP 的拥塞控制原理是什么?UDP 有对应的拥塞控制功能嘛?
  • 这个问题似乎看起来比较冷门,前段时间「BBR」这个概念很火,大家都给自己的服务器跟风加上了「BBR」并感受到了传输数据效率的提升,但是也许并不是很清楚具体的原理。那么,TCP 的拥塞控制究竟是什么呢?

二、什么是 TCP 拥塞控制?

  • TCP 拥塞控制的目标是最大化利用网络上瓶颈链路的带宽。
  • 简单来说是将网络链路比喻成一根水管,如果我们希望尽可能地使用网络传输数据,方法就是给水管注水,就有如下公式:水管内的水的数量 = 水管的容积 = 水管粗细 × 水管长度
  • 对应的网络名词就是:网络内尚未被确认收到的数据包数量 = 网络链路上能容纳的数据包数量 = 链路带宽 × 往返延迟。

  • 为了保证水管不会爆管,TCP 维护一个拥塞窗口cwnd(congestion window),用来估计在一段时间内这条链路(水管中)可以承载和运输的数据(水)的数量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化,但是为了达到最大的传输效率,我们该如何知道这条水管的运送效率是多少呢?
  • 一个简单的方法就是不断增加传输的水量,直到水管破裂为止(对应到网络上就是发生丢包),用 TCP 的描述就是:只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。

三、常见的 TCP 拥塞控制算法

① Reno 算法

  • Reno 被许多教材(例如:《计算机网络——自顶向下的方法》)所介绍,适用于低延时、低带宽的网络,它将拥塞控制的过程分为四个阶段:慢启动、拥塞避免、快重传和快恢复,对应的状态如下所示:

  • 慢启动阶段思路是不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小,在没有出现丢包时每收到一个 ACK 就将拥塞窗口大小加一(单位是 MSS,最大单个报文段长度),每轮次发送窗口增加一倍,呈指数增长,若出现丢包,则将拥塞窗口减半,进入拥塞避免阶段;
  • 当窗口达到慢启动阈值或出现丢包时,进入拥塞避免阶段,窗口每轮次加一,呈线性增长;当收到对一个报文的三个重复的 ACK 时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认;
  • 快重传完成后进入快恢复阶段,将慢启动阈值修改为当前拥塞窗口值的一半,同时拥塞窗口值等于慢启动阈值,然后进入拥塞避免阶段,重复上述过程。

② BBR 算法

  • BBR 是谷歌在 2016 年提出的一种新的拥塞控制算法,已经在 Youtube 服务器和谷歌跨数据中心广域网上部署,据 Youtube 官方数据称,部署 BBR 后,在全球范围内访问 Youtube 的延迟降低了 53%,在时延较高的发展中国家,延迟降低了 80%。
  • BBR 算法不将出现丢包或时延增加作为拥塞的信号,而是认为当网络上的数据包总量大于瓶颈链路带宽和时延的乘积时才出现了拥塞,所以 BBR 也称为基于拥塞的拥塞控制算法(Congestion-Based Congestion Control),其适用网络为高带宽、高时延、有一定丢包率的长肥网络,可以有效降低传输时延,并保证较高的吞吐量,与其他两个常见算法发包速率对比如下:

  • BBR 算法周期性地探测网络的容量,交替测量一段时间内的带宽极大值和时延极小值,将其乘积作为作为拥塞窗口大小,使得拥塞窗口始的值始终与网络的容量保持一致。
  • 所以 BBR 算法解决了两个比较主要的问题:
    • 在有一定丢包率的网络链路上充分利用带宽,适合高延迟、高带宽的网络链路。
    • 降低网络链路上的 buffer 占用率,从而降低延迟,适合慢速接入网络的用户。

四、总结

  • 目前有非常多的 TCP 的拥塞控制协议,例如:
    • 基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如 Reno、Cubic 等。
    • 基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如 Vegas、FastTCP 等。
    • 基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如 BBR。
    • 基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如 Remy。
  • 从使用的角度来说,我们应该根据自身的实际情况来选择自己机器的拥塞控制协议(而不是跟风 BBR),同时对于拥塞控制原理的掌握(尤其是掌握 Reno 的控制机理和几个重要阶段)可以加强对于网络发包机制的了解,在排查问题或面对面试的时候有更好的表现。
  • 此外,拥塞控制只是 TCP 相关考点中的一个部分,还有许多的常见的高频考点可以顺带去看看,例如:
    • OSI 模型是什么?
    • 有哪些协议是基于 TCP 的,哪些是基于 UDP 的?
    • 为什么建立连接需要三次握手,而断开连接需要四次握手?
    • TCP首部长度,有哪些字段?
    • 三次握手过程中有哪些不安全性?

【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理相关推荐

  1. 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理

    一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...

  2. 【网络通信与信息安全】之深入解析从输入一个URL到页面加载完成的过程

    一.前言 从输入一个 URL,然后按下回车到显示页面,中间发生了什么?这是一道经典的面试题,不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解 ...

  3. 信息系统管理工程师复习笔记02 计算机网络通信与信息安全 原创整理

    第二章计算机网络通信与信息安全 资料根据信息系统管理工程师考试大纲进行整理,资料全部来源于信息系统管理工程师教程,亲自整理,用于自身复习,现在分享出来,欢迎指正!(从word中拿出来,排版会有点问题, ...

  4. 解析TCP连接之“三次握手”和“四次挥手”

    葡萄美酒夜光杯,欲饮琵琶马上催. 醉卧沙场君莫笑,古来征战几人回?----唐 · 王翰 · <凉州词> 前言 不管是面试别人还是被别人面试,有很大的可能会被问到TCP的"三次握手 ...

  5. 2021年网络通信与信息安全国际学术会议(ICNCIS2021)

    重要信息 大会官网:www.icncis.org 大会时间:2021年12月03日-05日 大会地点:中国三亚 首轮截稿日期:2021年9月19日 二轮截稿日期:2021年10月19日 接受/拒稿通知 ...

  6. Linux TCP拥塞控制算法原理解析

    这里只是简单梳理TCP各版本的控制原理,对于基本的变量定义,可以参考以下链接: TCP基本拥塞控制http://blog.csdn.net/sicofield/article/details/9708 ...

  7. 40张图全面解析TCP 三次握手和四次挥手

    每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 哪种语言的开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. ...

  8. 万字长文 | 全(小区局域)网最强 TCP/IP 拥塞控制总结

    来源 | 后端技术指南针 头图 | CSDN付费下载自视觉中国 先唠唠嗑 在正式开始文章技术点之前,想先聊一下我对面试中的TCP/IP问题的一些拙见,希望对盆友们有所帮助. 在招聘岗位描述中,几乎必然 ...

  9. Apache 文件解析漏洞SSRF漏洞原理介绍及代码

    Apache 文件解析漏洞 SSRF漏洞原理介绍及代码 1. Apache 环境简介 2. Apache 解析漏洞介绍 3. 解析漏洞利用演示 4.利用场景介绍 1. Apache 环境简介 ​ Ap ...

最新文章

  1. ubuntu18.04安装unity tweak tool
  2. SQL2000和SQL2005和SQL2008同时安装问题
  3. 经典C语言从入门到入坑必学最简单的代码
  4. WebRTC系列- SDP详解
  5. 计算机课的十个小游戏制作教程,腾讯内容开放平台
  6. python九宫格拼图游戏
  7. 用FSL进行VBM统计分析
  8. Microsoft Project——Project基本使用教程
  9. 专利写作技巧以及流程
  10. 用java计算_用Java写的计算器
  11. 【数据结构】图—弗洛伊德(Floyd)算法
  12. 中国首条3D刷脸地铁开通,终于理解数加加众包为啥采集人脸了
  13. 解决pytorch官网下载慢ubuntu16.04+anaconda3(python3.6)+pytorch0.4.1+cuda9.0+cudnn7.1安装指南
  14. 动手开发一个有用的 ABAP ALV 工具 - 查看指定用户的 ABAP 传输请求试读版
  15. IP核Map编译报错:Buffers of the same direction cannot beplaced in series.
  16. 有道翻译软件下载地址
  17. 【完美解决】Word已经关闭但是任务管理器中仍有进程且占用CPU
  18. BCG 对话框表格控件CBCGPGridCtrl(不包含子)
  19. .Net core--- IOC
  20. 注意!2022年下半年pets5正在报考中

热门文章

  1. 2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)
  2. Layui / WEB UI
  3. VR开发中性能问题—OculusWaitForGPU
  4. AlertView动画
  5. hdu 1443 Joseph
  6. Shell编程之变量赋值和引用
  7. 前端如何获取联通积分_2020办理深圳户口如何查询积分?怎样获取更多积分?快看这里...
  8. C++中的抽象类以及接口的区别联系
  9. POJ 2312 Battle City 优先队列+BFS
  10. 寻找数组中的第二大数