常见面试题
# 计算机网络
# 计算机网络模型
计算机网络的七层模型以及各层作用(OSI七层模型)
- 应用层:网络应用
- 为人类用户或者其他应用进程提供网络应用服务
- FTP、SMTP、HTTP、DNS
- 表示层:允许应用解释传输的数据,e.g,加密,压缩,机器相关的表示转换
- 会话层:数据交换的同步,检查点,恢复
- 运输层:主机之间的数据传输
- 在网络层提供的端到端的通信基础上,细分为进程到进程,将不可靠的通信变成可靠的通信
- TCP,UDP
- 网络层:为数据报从源到目的选择路由
- 主机与主机之间的通信,端到端通信,不可靠
- IP,路由协议
- 链路层:相邻网络节点间的数据传输
- 2个相邻2点的通信,点到点通信,可靠或不可靠
- 点对对协议PPP,802.11(WiFi),Ethernet
- 物理层:在线路上传送bit
Internet协议栈(TCP/IP五层模型)
- 应用层:网络应用
- 为人类用户或者其他应用进程提供网络应用服务
- FTP、SMTP、HTTP、DNS
- 运输层:主机之间的数据传输
- 在网络层提供的端到端的通信基础上,细分为进程到进程,将不可靠的通信变成可靠的通信
- TCP,UDP
- 网络层:为数据报从源到目的选择路由
- 主机与主机之间的通信,端到端通信,不可靠
- IP,路由协议
- 链路层:相邻网络节点间的数据传输
- 2个相邻2点的通信,点到点通信,可靠或不可靠
- 点对对协议PPP,802.11(WiFi),Ethernet
- 物理层:在线路上传送bit
# 应用层
# HTTP和HTTPS
# HTTP和HTTPS的区别
- HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是的Web的核心,最初主要用于Web页面的HTML的发送和接收。由两个程序实现:一个客户端程序和一个服务器程序。
- 缺点:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
- 无状态。
- 基于TCP。
- 使用80端口。
- 缺点:
- HTTPS:HTTP是以安全为目标的HTTP通道,是HTTP的安全版。
- HTTP+加密+认证+完整性保护=HTTPS
- HTTP的安全基础是SSL。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通信提供安全支持。
- 优点(弥补了HTTP的缺点):
- 数据保密性
- 身份校验安全性
- 数据完整性
- 缺点:
- 握手阶段时间较长,较慢。一种是指通信慢。另一种是指由于大量消耗 CPU及内存等资源,导致处理速度变慢
- 连接缓存不如 HTTP 高效,会增加数据开销,甚至已有的安全措施也会因此而受到影响。
- 安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用。
- SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗。【支持SNI(Server Name Indication)的服务,如nginx可以实现一个IP绑定多个证书】
- SNI,即服务器名称指示,是TLS协议的扩展。它指示在“握手”过程开始时浏览器正在联系哪个主机名;允许服务器为多个站点安全地托管多个SSL证书,多个网站存在于同一IP地址上。
- 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL 交互次数将占用一定的计算资源和服务器成本;SSL证书通常需要花钱购买,且需要定期更换。
- HTTPS 协议的加密范围也比较有限。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。
- 使用443端口。
# HTPPS的加密过程,HTTPS的建立连接过程
步骤1:客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
步骤2:服务器可以进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤3:之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
步骤4:最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。
步骤5:SSL第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中的一种被称为 Pre-master secret 的随机密码串。
步骤6:接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
步骤7:客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
步骤8:服务器同样发送 Change Cipher Spec 报文。
步骤9:服务器同样发送 Finished 报文。
步骤10:服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
步骤 11: 应用层协议通信,即发送 HTTP 响应。
步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
在以上流程中,应用层发送数据时会附加一种叫做 MAC(Message Authentication Code)的报文摘要。MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。
下面是对整个流程的图解。图中说明了从仅使用服务器端的公开密钥证书(服务器证书)建立 HTTPS 通信的整个过程。
# HTTPS中数据传输时对称加密还是非对称加密
HTTPS 在内容传输的加密上使用的是对称加密(客户端生成的Pre-master secret),非对称加密只作用在证书验证阶段(公开密钥证书)。
# HTTPS解决了什么问题,怎么解决的
- 数据保密性
- 身份校验安全性
- 数据完整性
参考:https://juejin.cn/post/6844904089495535624
# HTTP是长连接还是短连接
非持久HTTP
- 最多只有一个对象在TCP连接上发送
- 下载多个对象需要多个TCP连接
- HTTP/1.0使用非持久连接
持久HTTP
- 多个对象可以在一个(客户端和服务器之间)TCP连接上传输
- HTTP/1.1默认使用持久连接
# HTTP和RPC
# RPC
远程过程调用(RPC,Remote Procedure Call)是一种进程间通信技术,用于基于客户端-服务器的应用程序。它也称为子程序调用或函数调用。
客户端有一个请求消息,RPC 将其翻译并发送到服务器。此请求可能是对远程服务器的过程或函数调用。当服务器接收到请求时,它会将所需的响应发送回客户端。客户端在服务器处理调用时被阻塞,只有在服务器完成后才恢复执行。
远程过程调用中的事件顺序如下:
- 客户端存根由客户端调用。
- 客户端存根进行系统调用以将消息发送到服务器并将参数放入消息中。
- 消息由客户端的操作系统从客户端发送到服务器。
- 服务器操作系统将消息传递给服务器存根。
- 服务器存根从消息中删除参数。
- 然后,服务器存根调用服务器过程。
如图:
RPC 的优点:
- 远程过程调用支持面向过程和面向线程的模型。
- RPC 的内部消息传递机制对用户是隐藏的。
- 在远程过程调用中,重新编写和重新开发代码的工作量是最小的。
- 远程过程调用可以在分布式环境中使用,也可以在本地环境中使用。
- RPC 省略了许多协议层以提高性能。
RPC 的缺点:
- 远程过程调用是一个可以以不同方式实现的概念。这不是一个标准。
- RPC 对硬件架构没有灵活性。它仅基于交互。
- 由于远程过程调用,成本增加。
# HTTP
HTTP中文名为超文本传输协议(HTTP,HyperText Transfer Protocol),是的Web的核心,最初主要用于Web页面的HTML的发送和接收。由两个程序实现:一个客户端程序和一个服务器程序。
# RPC和HTTP的区别
RPC(远程过程调用 ) 不是协议,是一种进程间通信技术;而HTTP是一种协议。RPC 的通信可以用 HTTP 协议,也可以自定义协议,是不做约束的。
参考:
- https://www.tutorialspoint.com/remote-procedure-call-rpc
- https://stackoverflow.com/questions/18351516/comparison-between-http-and-rpc
# DNS
DNS解析过程
# 一个URL到页面加载全过程
访问一个网站的流程?访问一个网址会发生什么?整个过程有多少个连接?
# DNS什么时候用TCP,什么时候用UDP
DNS名字服务器使用 UDP/TCP 53端口,这意味着DNS均支持UDP和TCP协议。那么什么时候使用UDP,什么时候使用TCP呢?
响应的长度超过512字节时使用TCP:当名字解析器发出一个查询请求,并且返回响应中的 TC(删减标志)比特被设置为 1时,它就意味着响应的长度超过了 512 个字节,而仅返回前 512 个字节。在遇到这种情况时,名字解析器通常使用TCP重发原来的查询请求,它将允许返回的响应超过 512 个字节(UDP数据报的最大长度问题)。既然 TCP 能将用户的数据流分为一些报文段,它就能用多个报文段来传送任意长度的用户数据。
辅助服务器同步主服务器数据时使用TCP:当一个域的辅助名字服务器在启动时,将从该域的主名字服务器执行区域传送。我们也说过辅助服务器将定时(通常是 3小时)向主服务器进行查询以便了解主服务器数据是否发生变动。如果有变动,将执行一次区域传送。区域传送将使用 TCP,因为这里传送的数 据远比一个查询或响应多得多。
既然 DNS 主要使用 UDP,无论是名字解析器还是名字服务器都必须自己处理超时和重传。此外,不像其他的使用 UDP 的 Internet应用(TFTP、BOOTP和SNMP),大部分操作集中在局域网上,DNS查询和响应通常经过广域网。分组丢失率和往返时间的不确定性在广域网上比局域网上更大。这样对于 DNS 客户程序,一个好的重传和超时程序就显得更重要了。
# 负载均衡
# 负载均衡的作用
负载平衡旨在优化资源使用、最大化吞吐量、最小化响应时间并避免任何单个资源的过载。使用具有负载平衡的多个组件而不是单个组件可以通过冗余提高可靠性和可用性。
参考:
- https://www.getambassador.io/docs/envoy/latest/concepts/modernlb/
- https://juejin.cn/post/6970950695117651976
- https://blog.csdn.net/qq_44691484/article/details/107445705
- https://www.yisu.com/news/id_409.html
- https://zhuanlan.zhihu.com/p/39575765
# 负载均衡的实现
负载均衡可通过专用的硬件和软件实现。
# 怎么保证主从复制?为什么主从复制?你是怎么想的?
# 服务端发送四段响应数据,如何保证这四段数据有序,不丢失
# 传输层
# TCP和UDP的区别,优缺点
- TCP UDP深挖 场景使用 特定场景下的选择
# TCP
- 三次握手的流程(三次握手为什么是三次,两次四次行不行)、四次挥手(第四次挥手不进行会有什么问题)
- TCP在第三次握手时,服务器没有接收到客户端的ACK,此时服务器怎么办
- TCP协议的包结构了解么,各个字段及其作用都说一下
- 滑动窗口(窗口内是什么数据)
- TCP拥塞控制与流量控制实现,拥塞控制详细流程
- TCP 怎么保证有序传输的,讲下TCP 的快速重传和拥塞机制
- TCP time_wait状态,这个状态出现在什么地方,有什么用
- 使用TCP时,数据丢了怎么办
- TCP粘包问题怎么处理
# UDP
- UDP怎么保证可靠?设计一个基于udp差不多可靠的算法,怎么设计?
- 在游戏中,当我们使用UDP去支持很高流量场景时,但又不想出现丢包的情况,你会怎么去处理呢?
- 弱网下网络请求的处理策略?结合直播场景
参考:
- 《计算机网络 自顶向下方法》第七版
- 《图解HTTP》