# 自己经历的面试问题总结

### 面试问题一： 说下虚拟机和容器区别

* 共同点都是在硬件和操作系统之上，虚拟机是完整操作系统，docker是应用容器引擎，是对进程的虚拟，基于操作系统之上虚拟
* 从启动方面，容器是秒级，虚拟机是分钟级
* 从资源方面，docker是在操作系统级别上虚拟，与内核交互，损耗低
* 从硬件方面，docker运行的镜像比虚拟机多，对系统利用率高
* 从隔离方面，docker属于进程级别隔离，隔离较弱，虚拟机是系统级别隔离
* 从安全方面，docker安全性较弱，docker的root用户和宿主机一样，一旦普通用户提升到root权限，可能会造成灾难性操作
* 从管理方面，dcoker集中和管理工具不成熟
* 从高可用和恢复行，docker可以对业务的快速部署和扩容伸缩
* 从交付方面，虚拟机可以通过镜像实现环境交付一致性，但docker只记录容器构建过程

### 面试问题二： 说下K8S与Docker区别

* Docker是开源应用容器引擎
* K8s是开源的容器集群管理系统

### 面试问题四： prometheus如何收集监控数据

> 通过各种 exporter 采集主机数据， 然后prometheus会采用http协议周期性的去export暴露的地址拉取监控样本数据

### 面试问题五：操作系统启动流程

*
  1. 内核引导， bios自建，加载硬盘
*
  2. 运行 init， 确定运行级别
*
  3. 系统初始化
*
  4. 建立终端
*
  5. 进入系统登录界面

### 面试问题六：OSI七层模型

* 物理层
* 数据链路层
* 网络层
* 传输层
* 会话层
* 表示层
* 应用层

### 面试问题六： TCP与UDP协议不同

* TCP 可靠面向有连接，常用于点对点，安全性高
* UDP 高速面向无连接，常用于点对面，安全性低

### 面试问题七： 三次握手和四次断开过程

* 第一次握手： 建立连接时，客户端发送syn(syn=j)包到服务器，客户端并进入SYS\_SENT状态，等待服务器确认；
* 第二次握手： 服务器收到syn包，确认客户的syn(ack=j+1)，同时自己也发送一个syn(syn=k)包，既SYN+ACK包，服务器进入SYN\_RECV状态
* 第三次握手： 客户端收到服务器SYN+ACK包，向服务器发送确认包ACK(ack=k+1),此包发送完毕，客户端和服务器端进入ESTABLISHED状态，完成三次握手

### 面试问题八：为什么连接的时候是三次握手，关闭的时候却是四次握手？

> 关闭的时候，服务端回回复ACK报文，收到了断开请求，但不会立即关闭，需要服务端把所有的报文发送完，才会发送 FIN 报文

### 面试问题九：为什么不能用两次握手进行连接

> 两次握手让彼此知道对方是谁，第三次是确实准备好

### 面试问题十：如果已经建立了连接，但是客户端突然出现故障了怎么办？

> 服务端会有TCP计时器，默认2个小时，如果两个小时没有收到客户端发送的数据，服务器会发送默认10次的探测报文，如果没有反应，会认为客户端故障，关闭连接
