第五季-青训营笔试题回顾版

155 阅读10分钟

单选题

1、QUIC协议基于哪种传输层协议

答:QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网[传输层协议] QUIC(Quick UDP Internet Connection)是Google提出的一个基于UDP的传输协议,因其高效的传输效率和多路并发的能力,已经成为下一代互联网协议HTTP/3的底层传输协议。除了应用于Web领域,它的优势同样适用于一些通用的需要低延迟、高吞吐特性的传输场景。

2、在MTU=1500字节的以太网中,TCP报文的最大载荷为多少字节?

答: MTU这个概念是指数据帧中有效载荷的最大长度,不包括帧首部的长度。所以: TCP报文的有效载荷=1500B-20B(IP数据报文首部)-20B(TCP报文首部)=1460B

3、使用什么命令查看网络是连通?

  1. netstat
  2. ping
  3. nbtstat

4、https加密是在那一层

答:https加密是在传输层。这层的功能包括是否选择 差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。

5、某云厂商拥有售卖虚拟机的服务,该服务属于以下哪种云概念

注解1:IaaS(Infrastructure as a service – 基础设施即服务)

用户可以在云服务提供商提供的基础设施上部署和运行任何软件,包括操作系统和应用软件。 用户没有权限管理和访问底层的基础设施,如服务器、交换机、硬盘等,但是有权管理操作系统、存储内容,可以安装管理应用程序,甚至是有权管理网络组件。简单的说用户使用IaaS,有权管理操作系统之上的一切功能。我们常见的IaaS服务有虚拟机、虚拟网络、以及存储。

PaaS(Platform as a service – 平台即服务)PaaS给用户提供的能力是使用由云服务提供商支持的编程语言、库、服务以及开发工具来创建、开发应用程序并部署在相关的基础设施上。常见的PaaS服务有数据库服务、web应用以及容器服务。成熟的PaaS服务会简化开发人员,提供完备的PC端和移动端软件开发套件(SDK),拥有丰富的开发环境(Inteli、Eclipse、VS等),完全可托管的数据库服务,可配置式的应用程序构建,支持多语言的开发,面向应用市场。

SaaS(Software as a Service – 软件即服务):SaaS给用户提供的能力是使用在云基础架构上运行的云服务提供商的应用程序。可以通过轻量的客户端接口(诸如web浏览器(例如,基于web的电子邮件))或程序接口从各种客户端设备访问应用程序。 用户无需管理或控制底层云基础架构,包括网络,服务器,操作系统,存储甚至单独的应用程序功能,可能的例外是有限的用户特定应用程序配置设置。类似的服务有:各类的网盘(Dropbox、百度网盘等),JIRA,GitLab等服务。而这些应用的提供者不仅仅是云服务提供商,还有众多的第三方提供商(ISV: independent software provider)。 答: 虚拟机是属于 IaaS 基础设施即服务

6、虚拟内存大小是有限制的

虚存的实际容量由CPU的地址长和外存的容量决定,当CPU的地址长度能表示的大小远远大于外存容量时,虚存的实际容量为内存和外存容量之和;当外存容量远大于CPU字长能表示的大小时,虚存的实际容量由CPU字长决定。一般情况下,CPU的地址长度能表示的大小都大于外存容量。

虚存容量不是无限的,最大容量受内存和外存可利用的总容量限制,虚存实际容量受计算机总线地址结构限制。

7、关于Raft分布式共识算法协议: Raft定义:是一个达成分布式一致性的协议 raft的角色定义:

  • 1.follower
  • 2.candidate
  • 3.leader

Raft 算法的选举步骤-见详细链接

参考链接[关于Raft协议的理解](【阿里二面面试题】说说你对 Raft 算法的理解?)

Raft Log是单调递增的。

8、go 使用的垃圾回收算法: 标记-清除

常用的垃圾回收算法

  1. 引用计数(reference counting):如Python
  2. 标记-清扫(mark & sweep):如golang
  3. 复制收集(copy and collection):目前许多商业虚拟机都采用这种垃圾回收算法

对上述标记、清扫流程改进,三色标记法[。](golang 垃圾回收-三色标记法(白话版))

9、程序输出结果:

image.png

image.png

10、以下哪个不是TCP三次握手所处的状态?

TCP的三次握手--建立连接过程:

在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。因为TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户,而而被动等待连接建立的应用进程叫做服务器。
用三次握手建立TCP连接的流程图如下:

image.png

第一次握手: 客户端执行connect函数,向服务器发送连接请求报文段,这时TCP报文首部的同步位SYN=1(SYN -synchronization同步),seq(序号)=x .这时==客户端进入SYN_SENT(同步已发送)==状态,等待服务器的确认。

第二次握手: 服务器收到请求报文段后,如果同意建立连接,则向A发送确认,在确认报文段中SYN=1,ACK=1(ACK就是开启 确认的意思),合在一起就是确认同步。这时服务器就进入了SYN_RCVD(同步收到)状态,客户端进入ESTABLISHED状态

第三次握手: 客户端在收到服务器的确认过后,还要给服务器给出确认,确认报文段将ACK置1.TCP连接已经建立服务器都进入ESTABLISHED状态。完成三次握手,随后客户端与服务器之间就可以传输数据了。

三次握手的结果就是服务器知道了客户端发送数据的序列号,客户端也知道了服务器发送数据的序列号,并且双方都知道彼此知道了。

TCP关闭连接的过程- 四次挥手

image.png

第一次挥手:

客户端进程先向TCP发出链接释放报文段,并停止再发送数据,主动关闭TCP连接。连接释放报文段首部FIN=1(FIN就是关闭连接的意思)。客户端进入FIN_WAIT_1状态

第二次挥手

服务器收到连接释放报文段后即发出确认,把确认报文段首部ACK置1。然后服务器S进入CLOSE_WAIT(等待关闭)状态。客户端C收到服务器S的确认后,就进入FIN_WAIT_2(终止等待2)状态,等待服务器发出的连接释放报文段

此时的TCP连接处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端仍要接收。也就是说,从服务器到客户端这个方向的连接并没有关闭,这个状态可能会持续一些时间。

第三次挥手

若服务端S已经没有要向客户端C发送的数据,其应用进程就通知TCP释放连接,这时服务端S发出的连接释放报文段必须使FIN=1,。这时服务端S就进入LAST_ACK(最后确认)状态,等待C的确认。

第四次挥手
客户端C在收到服务端S的连接释放报文段后,必须对此发出-确认(ACK=1)。在确认报文段中把ACK置1。然后客户端进入到TIME_WAIT(时间等待)状态
注意!!!

  • 现在TCP连接还没有释放掉,必须经过时间等待计时器设置的2MSL后,A才进入CLOSE状态。MSL叫做最长报文段寿命,即报文段存活最长时间。
  • 服务器收到客户端的确认报文段过后就会进入close状态。服务器在撤销相应的传输控制块TCB后,就结束了这次的TCP连接,B结束TCP连接的时间要比客户端早一些。

多选题

11、以下哪种属于Redis持久化的方式?

image.png

Redis提供了两种方式:RDB方式和AOF方式。

1、RDB方式

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时,Redis会自动将内存中所有的数据生成一份副本并存储在硬盘中,这个过程被称为“快照”。“快照”,就类似于拍照,摁下快门那一刻,所定格的照片,就称为“快照”。 2、AOF方式

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照之后更改的所有数据。为了降低因进程中止导致的数据丢失风险,可以使用AOF方式实现数据持久化。

AOF持久化是以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,文件中可以看到详细的操作记录。

12、在数据库隔离级别中。Read Committed 隔离级别下,不能避免的问题是:

image.png

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他买单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…

分析:这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。

四种隔离级别可能导致的问题:

  1. Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大;
  2. REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。
  3. READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。
  4. Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。

image.png

13、netfilter五个hook点分别是

  • NF_INET_PRE_ROUTING
  • NF_INET_LOCAL_IN
  • NF_INET_FORWARD
  • NF_INET_LOCAL_OUT
  • NF_INET_POST_ROUTING

14、互联网接入系统内的负载均衡系统可以解决那些问题?

  1. 横向扩容
  2. 服务容灾

编程题

15、T1.旋转数组最大值

image.png

C++ 直接循环判断

#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f

const int N= 5e5+10;
int n,a[N];

int main() {
//输入第一个n
    cin>>n;
    int ans =-INF;
//循环输入n 个数
    for (int i=0;i<n;++i) {
        cin>>a[i];
        ans =max(ans,a[i]);
    }
    cout<<ans<<endl;
    return 0;
}

go的直接


import (
	"fmt"
)
// 功能函数findMax
func findMax(arr []int) int {
	if len(arr) == 1 {
		return arr[0]
	}
	if arr[0] > arr[1] {
		arr[1] = arr[0]
	}
	return findMax(arr[1:])
}

func main() {
	var n int
	//fmt.Println("Enter the length of the array:")
	fmt.Scanln(&n)

	arr := make([]int, n)

	//fmt.Println("Enter the array elements:")
	for i := 0; i < n; i++ {
		fmt.Scan(&arr[i])
	}

	max := findMax(arr)
	fmt.Println(max)
}