腾讯云后端15连问!(三)

chujichenxuyuan
发布于 2022-6-29 13:51
浏览
0收藏

9. B+树是不是有序?B+树和B-树的主要区别?B+树索引,一次查找过程?


B+树是有序的。

 

B+树和B-树的主要区别?

 

 •  B-树内部节点是保存数据的;而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。
 •  B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。
 •  查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束
 •  B-树中任何一个关键字出现且只出现在一个结点中,而B+树可以出现多次。


假设有这么一个SQL:

select * from Temployee where age=32;

age加个一个索引,这条SQL是如何在索引上执行的?大家可以举例子画个示意图哈,比如二级索引树,腾讯云后端15连问!(三)-鸿蒙开发者社区再画出id主键索引,我们先画出聚族索引结构图,如下:腾讯云后端15连问!(三)-鸿蒙开发者社区因此,这条 SQL 查询语句执行大概流程就是酱紫:

 

 •  搜索idx_age索引树,将磁盘块1加载到内存,由于32<37,搜索左路分支,到磁盘寻址磁盘块2。
 •  将磁盘块2加载到内存中,在内存继续遍历,找到age=32的记录,取得id = 400.
 •  拿到id=400后,回到id主键索引树。
 •  搜索id主键索引树,将磁盘块1加载内存,在内存遍历,找到了400,但是B+树索引非叶子节点是不保存数据的。索引会继续搜索400的右分支,到磁盘寻址磁盘块3.
 •  将磁盘块3加载内存,在内存遍历,找到id=400的记录,拿到R4这一行的数据,好的,大功告成。

 

10. TCP 怎么实现拥塞控制?


拥塞控制是作用于网络的,防止过多的数据包注入到网络中,避免出现网络负载过大的情况。它的目标主要是最大化利用网络上瓶颈链路的带宽。

 

实际上,拥塞控制主要有这几种常用算法

 

 •  慢启动
 •  拥塞避免
 •  拥塞发生
 •  快速恢复


慢启动算法


慢启动算法,表面意思就是,别急慢慢来。它表示TCP建立连接完成后,一开始不要发送大量的数据,而是先探测一下网络的拥塞程度。由小到大逐渐增加拥塞窗口的大小,如果没有出现丢包,每收到一个ACK,就将拥塞窗口cwnd大小就加1(单位是MSS)。每轮次发送窗口增加一倍,呈指数增长,如果出现丢包,拥塞窗口就减半,进入拥塞避免阶段。

 

 •  TCP连接完成,初始化cwnd = 1,表明可以传一个MSS单位大小的数据。
 •  每当收到一个ACK,cwnd就加一;
 •  每当过了一个RTT,cwnd就增加一倍; 呈指数让升
腾讯云后端15连问!(三)-鸿蒙开发者社区为了防止cwnd增长过大引起网络拥塞,还需设置一个慢启动阀值ssthresh(slow start threshold)状态变量。当cwnd到达该阀值后,就好像水管被关小了水龙头一样,减少拥塞状态。即当cwnd >ssthresh时,进入了拥塞避免算法。

 

拥塞避免算法


一般来说,慢启动阀值ssthresh是65535字节,cwnd到达慢启动阀值

 

 •  每收到一个ACK时,cwnd = cwnd + 1/cwnd
 •  当每过一个RTT时,cwnd = cwnd + 1


显然这是一个线性上升的算法,避免过快导致网络拥塞问题。腾讯云后端15连问!(三)-鸿蒙开发者社区拥塞发生


当网络拥塞发生丢包时,会有两种情况:

 

 •  RTO超时重传
 •  快速重传


如果是发生了RTO超时重传,就会使用拥塞发生算法

 

 •  慢启动阀值sshthresh =  cwnd /2
 •  cwnd 重置为 1
 •  进入新的慢启动过程
腾讯云后端15连问!(三)-鸿蒙开发者社区这真的是辛辛苦苦几十年,一朝回到解放前。其实还有更好的处理方式,就是快速重传。发送方收到3个连续重复的ACK时,就会快速地重传,不必等待RTO超时再重传。

腾讯云后端15连问!(三)-鸿蒙开发者社区

 image.png


慢启动阀值ssthresh 和 cwnd 变化如下:

 

 •  拥塞窗口大小 cwnd = cwnd/2
 •  慢启动阀值 ssthresh = cwnd
 •  进入快速恢复算法


快速恢复


快速重传和快速恢复算法一般同时使用。快速恢复算法认为,还有3个重复ACK收到,说明网络也没那么糟糕,所以没有必要像RTO超时那么强烈。

 

正如前面所说,进入快速恢复之前,cwnd 和 sshthresh已被更新:

- cwnd = cwnd /2
- sshthresh = cwnd

然后,真正的快速算法如下:

 

 •  cwnd = sshthresh  + 3
 •  重传重复的那几个ACK(即丢失的那几个数据包)
 •  如果再收到重复的 ACK,那么 cwnd = cwnd +1
 •  如果收到新数据的 ACK 后, cwnd = sshthresh。因为收到新数据的 ACK,表明恢复过程已经结束,可以再次进入了拥塞避免的算法了。
 

已于2022-6-29 13:51:29修改
收藏
回复
举报
回复
    相关推荐