【你问我答】说说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

相关推荐

一面 #一面# #OPPO# #oppo# 项目相关:①用户的哪些信息存到Redis中?数据库存什么?②为什么有数据库还要使用Redis?Redis有什么特殊性、不可替代性?③手机号直接放到Redis或数据库中的信息安全性怎么保证?④缓存穿透/缓存雪崩/缓存击穿问题怎么解决的?⑤Redis和数据库的一致性怎么保证的?怎么保证数据库和缓存操作的原子性?⑦怎么加索引?索引是越多越好吗?为什么?八股:①OSI七层模型和TCP四层模型?为什么有这两种模型?②计算机网络中的常见协议有哪些?③tcp和udp协议的区别?怎么通过udp实现tcp的效果?④一个网络包在公网中是如何具体从原地址传输到目的地址,这个具体的这个路由过程说一下?⑤一个数据包在局域网,它是怎么找到目的地址的?⑥假设现在公网 IP 地址走ipv4,现在这公网 IP地址不够,我们一般用什么方式去处理?⑦操作系统中进程和线程的关系?⑧知道协程吗?⑨死锁怎么避免?⑩常用的数据结构有哪些?⑩①hashmap的底层数据结构?哈希碰撞了怎么办?⑩②空间换时间了解吗?举个例子?二面 #二面# 项目:①session不共享问题怎么解决的?②怎么保证用户登录时从token查到的用户数据的信息安全性?③用返回空值+ttl解决缓存穿透时,出现查询异常(比如说网络延迟或者超时)处理异常的情况和跟查询本身是为空的这两种情况,怎么区分开?八股:①单例模式的几种实现方式?解决的是什么问题?什么场景下会使用单例模式?②hashmap怎么解决哈希碰撞的?③list可以使用for循环删除掉某些元素吗?正着删?倒着删?迭代器删可以吗?④线程池为什么要先放满阻塞队列再申请空闲线程,而不是直接创建到最大线程数?⑤get和post的区别?post为什么要先发起一个option请求?⑥http和https的区别?https是怎么加密的?⑦什么时候使用/不使用索引?表数据量小需要使用索引吗?性别字段使用索引吗?⑧唯一索引可以为空吗?普通索引可以为空吗?⑨上亿大表的深分页查询问题怎么解决?为什么越往后翻页越慢?⑩4个g的文件存手机号(可重复),不依赖任何中间件和布隆过滤器,怎么找到一个指定的手机号?2024/4/26 10/30
查看31道真题和解析
点赞 评论 收藏
转发
2 2 评论
分享
牛客网
牛客企业服务