1.什么是负载均衡?如何实现负载均衡?

负载均衡:工作负载(如用户请求、数据流量等)合理地分配到多个服务器,以优化资源利用率、提高系统性能、增强系统的可靠性和可用性,避免单个服务器过载

  • (硬件/软件)负载均衡器:根据负载情况/预定的规则,来将请求转发到后端服务器。
  • DNS负载均衡:一个域名可以解析为多个 IP 地址DNS 服务器会根据一定的策略(如轮询)返回不同的 IP
    • 分配策略:
      • 轮询: 按顺序依次分配请求到服务器。01
      • 加权轮询: 根据服务器的性能设置权重,性能高的服务器分配更多请求。
      • 最少连接(适合长连接场景): 将请求分配给当前连接数最少的服务器。
      • 哈希算法(适合需要会话保持的场景): 根据请求的某些特征(如 IP 地址、会话 ID)进行哈希计算,确保相同特征的请求总是分配到同一台服务器。

2.介绍一下ping命令的原理

ping是用于测试网络中主机间是否可达的工具。其基于ICMP协议网络层,与IP协议配合使用,为IP协议提供了错误报告和控制机制

ICMP协议:

image-20250420142751949

image-20250420142832876

ping命令的过程:

  • 命令发起: 输入 ping 命令

  • 域名解析(DNS)

  • 构造 ICMP 请求报文: ping 命令会构造一个 ICMP Echo Request 报文

    • 类型字段:值为 8,表示这是一个 “Echo Request” 报文。

    • 标识符和序列号:用于区分不同的请求和响应。

  • 发送 ICMP 请求: 构造好的 ICMP 请求报文被封装到 IP 数据包中,并通过网络发送到目标主机。

  • 目标主机接收并响应: 当目标主机接收到 ICMP Echo Request 报文后,会检查报文的有效性。生成一个 ICMP Echo Reply 报文作为响应。

    • 类型字段:值为 0,表示这是一个 “Echo Reply” 报文。
    • 原始请求中的标识符和序列号会被复制到响应中。
  • 计算往返时间

  • 重复发送多个请求,统计结果

Request Timed Out的原因:

  • 防火墙限制:某些服务器可能会配置防火墙规则,禁止 ICMP 流量,导致 ping 无法成功。
  • 目标不可达:如果目标主机不在线、防火墙阻止了 ICMP 流量,或者网络路径中断,ping 将无法收到回应,显示超时

3.网络层协议和传输层协议的区别

传输层协议:提供端口号,实现的是不同主机上进程间的通信。端口号主要用于区分同一台主机上的不同进程。

网络层协议:提供IP地址,实现的是不同主机间的通信

4.HTTPS的原理?

  • 客户端请求:尝试访问一个 HTTPS 网址时,客户端(浏览器)会发起一个到服务器 443 端口(HTTPS 的默认端口)的连接请求

  • 服务器响应: 服务器会向客户端发送其数字证书,证书包含了公钥服务器信息(如域名)、有效期以及证书颁发者的信息等。

  • 客户端解析证书并对其进行验证:

    • 如果证书不是可信机构颁布,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信
    • 如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥。然后客户端还会生成一个随机码 KEY,并使用公钥将其加密
  • 客户端发送对称密钥:客户端把加密后的随机码 KEY 发送给服务器,作为后面对称加密的密钥。

  • 服务器解密:服务器在收到随机码 KEY 之后会使用私钥B将其解密。

  • 使用对称密钥进行通信:服务器使用密钥 (随机码 KEY)对数据进行对称加密并发送给客户端,客户端使用相同的密钥 (随机码 KEY)解密数据。

5.二层转发的工作原理

二层转发:数据链路层进行的数据包转发过程。

  • 学习(维护一个MAC地址表):当交换机接收到一个数据帧时,它会检查源MAC地址,并记录下这个地址与接收此帧的端口之间的对应关系。

  • 转发/过滤:一旦建立了MAC地址表,每当交换机收到一个目标为特定MAC地址的数据帧时,它就会查找其MAC地址表,找到对应的出端口并将帧直接转发到那个端口。如果目标MAC地址不在表中,或者帧的目标是一个广播地址,则交换机会将该帧泛洪(flooding)至除接收端口外的所有其他端口,以确保能够到达目标设备。

  • 老化:为了适应网络拓扑的变化,交换机会定期更新MAC地址表中的条目。如果一段时间内没有收到来自某个MAC地址的数据帧,交换机会删除相应的条目,以便释放空间给新的条目。

6.IPv4地址划分

分类地址:

  • A类:第一个字节表示网络部分,后面三个字节表示主机部分。范围:0.0.0.0 - 127.255.255.255。默认子网掩码:/8或255.0.0.0。
  • B类:前两个字节表示网络部分,后两个字节表示主机部分。范围:128.0.0.0 - 191.255.255.255。默认子网掩码:/16或255.255.0.0。
  • C类:前三字节表示网络部分,最后一个字节表示主机部分。范围:192.0.0.0 - 223.255.255.255。默认子网掩码:/24或255.255.255.0。
  • D类:用于多播(即一对多的通信)。范围:224.0.0.0 - 239.255.255.255。
  • E类:保留用于实验和研究。范围:240.0.0.0 - 255.255.255.255。

子网掩码的作用:子网掩码中值为1的部分对应的IP地址位属于网络号,值为0的部分对应的IP地址位属于主机号。

7.网络层多跳是什么?

网络层的“多跳”:是指数据包从源节点到达目的节点的过程中,需要经过多个中间节点(路由器)进行转发的过程。每经过一个中间节点即视为一跳,因此当数据包从源地址到目标地址需通过若干个这样的中间节点时,就称为多跳传输。

IP 地址的分层结构:路由器根据目标 IP 地址的网络部分逐步靠近目标,而不是直接送达。

8.HTTP2的头部压缩HPACK的工作原理

静态表:HPACK 预定义了一个静态表,其中包含了一些常见的 HTTP 头部字段及其值(如 :method: GET:status: 200 等)。如果请求或响应中使用了这些字段,可以直接用静态表中的索引代替,从而减少传输的数据量。

动态表:动态表是由客户端和服务器在通信过程中动态维护的一个共享表。当一个新的头部字段首次出现时,它会被添加到动态表中,并分配一个唯一的索引值。后续的请求或响应可以使用这个索引来引用该字段,避免重复传输完整字段。

差量编码:如果某个头部字段的值发生了变化(例如 Cookie 的内容略有不同),HPACK 只传输发生变化的部分,而不是重新发送整个字段。这种方式进一步减少了数据量。

霍夫曼编码:对于未被静态表或动态表覆盖的头部字段,HPACK 使用霍夫曼编码对字段名和字段值进行压缩。霍夫曼编码是一种基于频率的无损压缩算法,能够显著减少字符串的长度。

在 HTTP/2 中,HPACK 压缩算法会显著减少重复的 Cookie 数据传输:

1
2
3
4
5
6
7
8
9
10
11
12
第一次请求:
GET /page1 HTTP/2
:method: GET
:path: /page1
:authority: example.com
cookie: sessionId=abc123; userId=456; theme=dark
第二次请求:
GET /page2 HTTP/2
:method: GET
:path: /page2
:authority: example.com
cookie: 62; theme=light

9.常见TCP的连接状态有哪些?

LISTEN: 服务器端处于等待客户端发起连接请求的状态。

SYN_SENT: 客户端socket执行CONNECT连接,发送SYN包,进入此状态。

SYN_RECV:服务端收到SYN包并发送服务端SYN包,进入此状态。

ESTABLISH:表示连接建立。客户端发送了最后⼀个ACK包后进入此状态,服务端接收到ACK包后进入此状态。

FIN_WAIT_1: 主动关闭方(通常是客户端或服务器中的一方)已经发送了FIN(结束)报文段,等待对方的ACK确认或者同时带有ACK的FIN报文。

FIN_WAIT_2: 主动关闭方收到了对方的ACK确认,但还在等待对方发送FIN报文来完成关闭过程。

CLOSE_WAIT:被动关闭方已经接收到对方的FIN报文,并发送了ACK确认,正在等待应用程序调用close()函数来发出自己的FIN。

TIME_WAIT: 主动关闭方在收到对方的FIN报文并发送了ACK确认后进入此状态,主要是为了确保对方有足够的时间收到ACK报文。