【你问我答】说说tcp拥塞控制原理

问题描述:

请说说tcp拥塞控制原理。

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个面试中真实遇到的问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##Java工程师##面试题目#
全部评论
拥塞控制:防止过多数据注入网络,保证网络中的路由器和链路不过载。对通信连接的端点来说,只有通过通信时延的增加判断是否发生拥塞。要防止过多的数据注入到网络中,一般有四种算法:慢开始算法(TCP刚连接好时,令拥塞窗口为1,每收到一个新报文段确认时,令窗口加1,逐步增大。表现在实际中,每次加倍,直到达到初始化的阈值然后开始每次加1)、拥塞控制算法(一旦网络拥塞就从1开始,但阈值变为当前拥塞窗口值的一半)   ·另外两种算法是快重传算法(发送方连续收到三个冗余ACK直接重传,不必等待计时器)和快恢复算法(每次拥塞则阈值变为一半,但是窗口从新阈值开始直接每次加1,跳过了从1开始的过程)。 ·总体来说,流量控制中发送方的数据发送量由接收方决定,而拥塞控制中由发送方自己决定。发送方检测到超时就慢开始+拥塞避免,收到冗余ACK时则采取快重传和快恢复。但实际窗口是接收窗口和拥塞窗口的较小值。
3 回复 分享
发布于 2020-12-02 11:17
发生拥塞控制的原因:资源的需求>可用资源 作用:拥塞控制就是防止过多的数据包进入网络,这样可以使网络中的路由器或者链路不至于过载。拥塞控制的前提就是网络能够承受现有的网络负荷。 对比流量控制:拥塞控制是一个全局的过程,涉及到链路上的所有主机和路由。 流量控制往往指的是点对点通信的控制,是端对端的问题。 流量控制: (1)tcp提供了一种机制可以让发送端根据接收端的实际接收能力来控制发送的速率,具体的操作是接收端主机向发送端主机通知自己可以接收数据的大小,于是发送会发送不超过这个限度的数据,该限度大小就被称为窗口大小。 (2)TCP首部中专门有个字段用来通知窗口大小,接收主机将自己可以接收缓冲区的大小放入这个字段通知发送端。这个字段越大说明网络的吞吐量越大。 接收端 (3)接收端缓冲区一旦面临溢出,窗口大小也会随之被设置为一个更小的值发送给发送端,从而控制发送的数据量,也就说发送端主机会根据接收端主机的缓冲区大小来对发送数据的大小进行控制。 拥塞控制:计算机网络是一个共享网络,有可能因为其他主机间的通信造成网络拥堵,在网络出现拥堵时,如果突然发送一个较大的数据包可能导致整个网络的瘫痪。 拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送让自己的发送窗口=MIN(拥塞窗口,接收方的接收窗口),但是发送窗口不是一直等于拥塞窗口,在网络情况好的情况下,拥塞窗口会不断增加,发送方的窗口自然也会随着增加,但是接收方的能力有限,在发送方的窗口达到某个大小时就不在发生变化了。 发送方如果确认网络拥塞:发送方发送一些报文时,如果发送没有在规定的时间间隔内收到接收方的应答,则就可以认为网络拥塞。 拥塞避免的思路: (1)      最初让拥塞窗口按照指数级增长,这样可以提高发送数据吞吐量; (2)      当拥塞窗口大小到达慢启动门限后,该成线性增长,目的是减少拥塞窗口的增长速度; (3)      当发送端检测的网络拥塞时,立即把拥塞窗口减小为1,把慢启动门限调整为出现拥塞时拥塞窗口的一半目的是可以减少向网络中注入的数据量。 (4)      重新开始指数级增长和线性增长。
点赞 回复 分享
发布于 2020-12-01 20:45
在涉及到网络知识的面试中,TCP 和 UDP 是经常被提及的两个概念,它们是 OSI 模型中的运输层中的协议,关于 TCP 和 UDP,以下有一些简要的介绍: TCP 全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信,所谓可靠,在于 TCP 建立连接时双方需要互相确认,类似打电话,在专业术语中称为 3 次握手。 UDP 全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信,所谓不可靠,在于 UDP 每一次发送数据需要绑定 IP 和端口号,但是对于已经发送出去的数据来说并不去确认,也不需要类似 TCP 的三次握手的过程,由于没有了这个过程,所以其传输效率较之 TCP 来说要高许多。 对于这两者,有一些简单且重要的区别,在面试中也经常被问到。 什么是 TCP 拥塞控制 TCP 拥塞控制的目标是最大化利用网络上瓶颈链路的带宽。 简单来说是将网络链路比喻成一根水管,如果我们希望尽可能地使用网络传输数据,方法就是给水管注水,就有如下公式: 水管内的水的数量 = 水管的容积 = 水管粗细 × 水管长度 对应的网络名词就是: 网络内尚未被确认收到的数据包数量 = 网络链路上能容纳的数据包数量 = 链路带宽 × 往返延迟 为了保证水管不会爆管,TCP 维护一个拥塞窗口cwnd(congestion window),用来估计在一段时间内这条链路(水管中)可以承载和运输的数据(水)的数量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化,但是为了达到最大的传输效率,我们该如何知道这条水管的运送效率是多少呢? 一个简单的方法就是不断增加传输的水量,直到水管破裂为止(对应到网络上就是发生丢包),用 TCP 的描述就是: 只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入到网络中的数据包数。
点赞 回复 分享
发布于 2020-12-03 17:38

相关推荐

1. this指针是什么?它有什么作用?2. const成员函数有什么特点?如何使用?3. 如何实现一个简单的动态数组?4. enum和enum class有什么区别?5. nullptr是什么?它与NULL有何不同?6. 如何处理内存泄漏?请给出几种方法。7. 解释一下数据库的ACID特性。8. 什么是死锁?如何避免死锁?9. 解释一下链表和数组的区别。10. 什么是哈希表?它的优缺点是什么?11. 如何使用SQL进行数据查询?请给出示例。12. 什么是索引?它如何提高数据库查询性能?13. 解释一下进程和线程的区别。14. 什么是操作系统的中断机制?15. 解释一下二叉树的遍历方式。16. 如何实现一个简单的栈?17. 什么是数据库范式?请简要说明第一范式和第二范式。18. 解释一下内存管理中的堆和栈的区别。19. 什么是SQL注入?如何防止它?20. 解释一下快速排序和归并排序的基本原理。21. 什么是视图(View)?它有什么用?22. 如何使用std::vector实现动态数组?23. 什么是事务?如何实现事务的提交和回滚?24. 解释一下操作系统中的调度算法。25. 如何实现一个简单的图结构?26. 什么是外键?它的作用是什么?27. 解释一下深度优先搜索和广度优先搜索的区别。28. 什么是存储过程?它有什么优缺点?29. 如何处理数据库中的并发访问?30. 解释一下LRU缓存算法的基本原理。我面试看的是大佬的面经,链接放下边了  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
评论
2
2
分享
牛客网
牛客企业服务