文章目录

一、综合型

1.1 简述 OSI 的七层模型

  • 应用层:提供各种应用软件。常用的协议有:
    • DNS(域名系统)
    • HTTP(超文本传输协议)
    • FTP(文件传输协议)
    • SMTP(邮件传输协议——发邮件)
    • POP3/IMAP(邮件传输协议——收邮件)
  • 表示层:提供数据表示。
  • 会话层:提供会话支持。
  • 传输层:提供端到端的数据传输。常用的协议有:
    • TCP:可靠的,面向连接的,基于字节流的传输协议(TCP报文段
    • UDP:不可靠的,面向无连接的,基于报文的传输协议(UDP数据报
  • 网络层:提供网络路由支持。常用的协议有:
    • IP(网络之间互连的协议)【定义数据传输的格式、数据的传输方式】(
    • RIP(路由信息协议)【确定到目标地址的路由距离】
    • ARP(地址解析协议)【将 IP 地址解析为物理地址】
    • RARP(反向地址解析协议)【为物理地址申请 IP 地址】
  • 数据链路层:在不可靠的物理介质上提供可靠的传输。常用的协议有:
    • CSMA/CD(载波监听多点接入/碰撞检测协议)(
    • PPP(点对点协议)
  • 物理层:负责数据的传输。(比特流

1.2 从浏览器中输入 url 到浏览器显示 html 页面,一共发生了哪些操作

  1. 客户端进行域名解析,将 url 解析为对应的 IP 地址
  2. 客户端与服务器建立 TCP 连接
  3. 客户端发送 http 请求
  4. 服务器响应 http 请求,向客户端发送 html 代码
  5. 客户端接收 html 代码,向服务器请求 html 中的资源(例如 css,图片,视频等等)
  6. 服务器将这些资源发送给客户端
  7. 客户端进行渲染然后显示页面

1.3 为什么服务器需要缓存这一功能,如何实现?

  1. 缓解服务器压力【让代理服务器进行缓存】
  2. 降低客户端获取资源的延迟【让客户端浏览器进行缓存】

1.4 TCP 与 HTTP 相关

【参考来源:可能会搞砸你的面试:你知道一个TCP连接上能发起多少个HTTP请求吗?

1.4.1 现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

  默认情况下 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免。

1.4.2 一个 TCP 连接可以对应几个 HTTP 请求?

  1. 短链接 —— 1 个
  2. 长连接 —— 多个

1.4.3 一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?

  在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。

  在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行

1.4.4 在 HTTP/1.1 中,如何提高页面加载效率?

  1. 使用长连接
  2. 建立多个 TCP 连接

1.4.5 为什么有的时候刷新页面不需要重新建立 SSL 连接?

  在保存连接的情况下,TCP 不需要重新建立,SSL 自然也可以用之前的

1.4.6 浏览器对同一 Host 建立 TCP 连接到数量有没有限制?

  有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接,不同的浏览器可能不一样。这样做的好处是可以并发的请求资源,减少用户的等待时间,同时又不会过多的占用网络资源。

二、应用层

2.1 DNS 相关

2.1.1 介绍一下 DNS 的工作原理

  DNS 是域名系统,负责将域名解析为对应的 IP 地址,工作流程如下:

  1. 客户端先本地(先浏览器,再操作系统)查询是否存在对应映射缓存,如果命中,则直接映射为对应 IP 地址。
  2. 本地缓存未命中,则向本地域名服务器进行请求,如果命中,则返回对应的 IP 地址。
  3. 本地域名服务器未命中,则
    【如果查询主体是对应的域名服务器,则是递归查询,如果查询主体是本地域名服务器,则是迭代查询
    • 根域名服务器进行请求根域名服务器返回顶级域名服务器的地址
    • 顶级域名服务器请求,顶级域名服务器返回权威域名服务器地址
    • 权威域名服务器请求,权威域名服务器返回对应的 IP 地址。
  4. 本地域名服务器将 IP 地址返回给客户端。

2.1.2 为什么 DNS 既用 TCP 又用 UDP ?

  1. DNS 在区域传送时使用 TCP,在解析域名时使用 UDP
  2. 之所以在区域传送时使用 TCP,是因为:
    • 区域传送要求可靠性
    • 区域传送的要传输数据量大
  3. 之所以在解析域名时使用 UDP,是因为:
    • UDP 快

区域传送:就是从主 DNS 复制数据到辅 DNS】

2.1.3 DNS 负载均衡策略是什么?

  在 DNS 服务器会为一个主机名配置多个IP地址,如果收到多个DNS查询,会按照顺序返回不同的IP地址,将客户端的访问引导到不同的主机上去,从而使得客户端访问不同的服务器,达到负载均衡的目的。

2.2 HTTP 相关

2.2.1 HTTP 和 HTTPS 的区别

  1. HTTP 是明文传输数据的,比较不安全;HTTPS 使用 SSL 进行加密传输和身份认证,比较安全;
  2. HTTP 使用的端口是 80 ,而 HTTPS 是 443

SSL/TLS 是用非对称密钥进行数据加密,私钥存放在服务器,公钥有服务器发送给客户端

  • 对称加密:加密和解密使用相同密钥的加密方法。
    • 加密解密速度快,
    • 但是难以安全传递密钥
  • 非对称加密:使用一对密钥:公钥和私钥。公钥可以公开分享,用于加密数据;私钥必须保密,用于解密数据。
    • 可以安全的传输密钥
    • 加密和解密速度较慢

【实际中可以采用 非对称密钥 加密 对称密钥 进行对称密钥的安全传输,后续就可以采用对称密钥进行加密解密】

2.2.2 HTTPS 是如何保证数据传输是安全的,整体的流程是什么?(SSL/TCL 的工作流程)(SSL/TCL 四次握手)

【参考来源:SSL/TLS 1.2 握手交互过程

  1. 客户端向服务器发起 SSL 连接请求,发送的数据包括:
    • 客户端支持的协议
    • 客户端支持的加密算法
    • 一个随机数(用于后面生成会话密钥)
    • 客户端支持的压缩算法
  2. 服务器响应请求,确定使用的协议和加密算法,并发送消息。发送的数据包括
    • 确定使用的协议
    • 确定使用的加密算法
    • 第二个随机数
    • 数字证书,里面包含公钥
  3. 客户端接收消息,验证证书的合法性,生成随机数,利用三个随机数生成会话密钥,并发送消息。发送的数据包括
    • 第 3 个随机数(使用公钥进行加密)(RSA)
    • 发送的客户端的公钥(ECDHE)【可以利用双方公钥和自己的私钥确定第三个随机数】
  4. 服务器响应,使用私钥进行解密,利用三个随机数生成会话密钥。
  5. 后续双方使用会话密钥(对称性密钥)进行加密传输。

【其中,1-4步其实就是 SSL/TCL 四次握手】

2.2.2.1 如何保证公钥不被篡改

  将公钥放在数字证书中,只要数字证书可信,那公钥就可信。

2.2.2.2 公钥加密计算量大,如何优化

  用非对称性密钥来传输对称性密钥,后续传输数据使用对称性密钥。

2.2.3 HTTP 长连接和短连接的区别

  • 长连接:客户端建立 TCP 连接后,客户端和服务器可以多次进行 HTTP 操作,直到关闭连接为止。【HTTP/1.1 默认使用长连接】
  • 短链接:客户端建立 TCP 连接后,客户端和服务器进行一次 HTTP 请求就关闭连接。【HTTP/1.0 默认使用短连接】

2.2.4 HTTP 请求和响应报文有哪些主要字段?

  • 请求报文
    • 请求行:请求方法、url 、协议版本
    • 请求头:Host(服务器域名)、Accept(可以接受的数据格式)、Connection(是否保存连接)
    • 空行:表示请求头结束
    • 请求体:POST 和 PUT 发送的数据
  • 响应报文
    • 状态行:协议版本、状态码、状态信息【200〜299的状态码表示成功,300〜399的状态码指资源重定向,400〜499的状态码指客户端请求出错,500〜599的状态码指服务端出错
    • 响应头:数据长度、数据格式、压缩方式
    • 空行:表示响应头结束
    • 响应体:服务器实际发送的数据
2.2.4.1 HTTP 中的缓存字段(Cache-Control)有哪些取值,代表什么意思?
  • private:私有字段,表示缓存只能被单独用户使用,一般存在用户的浏览器
  • public:公有字段,表示缓存可以共用,一般存在代理服务器

2.2.5 HTTP 的请求方法有哪些 ?

【参考来源:HTTP 请求方法

类别 方法 描述
POST 向服务器发送数据以创建新资源。常用于提交表单数据或上传文件。发送的数据包含在请求体中。【多次执行可能会创建多个相同的资源,不是幂等的】
PUT 向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源。与 POST 不同,PUT 通常是幂等的,即多次执行相同的 PUT 请求不会产生不同的结果。
DELETE 从服务器删除指定的资源。请求中包含要删除的资源标识符。
PATCH 对资源进行部分修改。与 PUT 类似,但 PATCH 只更改部分数据而不是替换整个资源。
GET 从服务器获取资源。用于请求数据而不对数据进行更改。
HEAD 类似于 GET,但服务器只返回响应的头部,不返回实际数据。用于检查资源的元数据(例如,检查资源是否存在,查看响应的头部信息)。
OPTIONS 返回服务器支持的 HTTP 方法。用于检查服务器支持哪些请求方法,通常用于跨域资源共享(CORS)的预检请求。
TRACE 回显服务器收到的请求,主要用于诊断。客户端可以查看请求在服务器中的处理路径。
其他 CONNECT 建立一个到服务器的隧道,通常用于 HTTPS 连接。客户端可以通过该隧道发送加密的数据。
2.2.5.1 GET 和 POST 的区别
  1. GET 是获取资源,POST 是修改资源
  2. GET 将请求参数放在 url 上,用 ?分割 url 和参数,多个参数用 & 分割;POST 将参数放在请求体中;
  3. GET 提交参数会受到 url 长度的限制;POST 不会;
2.2.5.2 POST 比 GET 更安全?

  从用户视角来说,POST 将参数放在请求体中,用户看不到参数,看起来比较安全。但是,从传输角度来说,两者是一致的,如果使用 HTTP ,两者都是明文传输的,都不安全。要想安全传输,可以使用 HTTPS 协议。

2.2.5.3 GET 参数写法是固定的吗?

  不是,只是目前主流常用的是用 ?分割 url 和参数列表,用 & 分割各个参数,实际上我们可以自己定义参数写法,只要服务器可以解析出来就行。

2.2.5.4 GET 方法长度限制是怎么回事?

  HTTP 协议没有限制 URL 和 Body 的长度,限制长度一般是浏览器和服务器的原因,主要是出于性能和安全考虑,较短的 URL 传输时占用的带宽小,解析也比较快,同时也可以有效防止恶意构造长 URL 攻击。

2.2.5.5 POST 方法会产生两个数据包,你了解吗?

  有些文章说 POST 方法会先发送 Head ,收到 100-continue 后,才会发送 Body ,这实际上是浏览器或者框架制定的行为,HTTP 协议中没有这项规则。

2.2.6 Session 和 Cookie 相关

2.2.6.1 什么是 Cookie ?有什么用?

  Cookie 是服务器发送到浏览器并保持在用户本地的一小块数据,用来标识用户。因为 HTTP 协议是无状态的,对于需要登录的网站,每次刷新或者进入其他页面都需要重新输入账号和密码,这对于用户来说是不可接受了,引入 Cookie 后,每次发送请求都会带上 Cookie 中的数据,这样服务器就可以识别用户。

  1. 会话管理
  2. 个性化设置
  3. 用户行为跟踪
2.2.6.2 什么是 Session ?介绍一下 Session 的工作原理

  Session是一项会话管理技术,主要是在无状态的HTTP协议下,帮助服务器端记录和跟踪用户的状态信息。

  1. 客户端发送用户名和密码给服务器
  2. 服务器验证成功后,将用户信息存放到 Session 中,并返回 Session ID 给客户端
  3. 客户端接收到 Session ID 后,将其存放到 Cookie 中,后续发送消息都带上 Session ID
  4. 服务器收到消息后,根据相应的 Session ID 获取到用户信息,并进行相应操作
2.2.6.3 Cookie 和 Session 的区别
  1. Cookie 是存放在客户端的浏览器中,Session 是存放在服务器中
  2. Cookie 每次都需要发送用户信息,而 Session 每次发送 Session ID ,相比之下,Session 占用的带宽小,也比较安全
  3. Cookie 只能存放 ASCLL 编码的数据,而 Session 可以存放任意类型的数据

三、传输层

3.1 端口号相关

3.1.1 端口号有效范围是多少?

  0-65535,其中 0-1023 是知名端口号,比如 HTTP(80),HTTPS(443)。1024-65535 是动态端口号。

3.2 TCP 相关

3.2.1 TCP 三次握手(TCP建立连接的过程)

  1. 客户端请求建立 TCP 连接,服务器响应(第一次握手)
    【客户端确定:客户端发送能力正常】【客户端从 close 到 SYN_send 状态】
    【服务器确定:客户端发送能力正常、服务器接收能力正常】【服务器处于 listen 状态】
    • SYN = 1
    • seq = x
  2. 服务器发送报文,客户端接收(第二次握手)
    【服务器确定:客户端发送能力正常、服务器接收能力正常、服务器发送能力正常】【服务器从 listen 到 SYN_receive 状态】
    【客户端确定:客户端发送能力正常、客户端接收能力正常、服务器发送能力正常、服务器接收能力正常】【客户端从 SYN_send 到 Established 状态】
    • SYN = 1
    • seq = y
    • ACK = 1
    • ack = x + 1
  3. 客户端发送报文,服务器接收(第三次握手)
    【服务器确定:客户端发送能力正常、服务器接收能力正常、服务器发送能力正常、客户端接收能力正常】【服务器从 SYN_receive 到 Established 状态】
    【客户端确定:客户端发送能力正常、客户端接收能力正常、服务器发送能力正常、服务器接收能力正常】【客户端处于 Established 状态】
    • seq = x + 1
    • ACK = 1
    • ack = y + 1

3.2.2 TCP 四次挥手 (TCP 释放连接的过程)

【四次挥手的原因是,客户端和服务器不一定会同时发送完数据,如果刚好同时发送完数据,则第二次挥手和第三次挥手可以合并】

  1. 客户端请求关闭 TCP 连接,服务器接收(第一次挥手)
    【客户端确定:客户端要关闭】【客户端从 Established 到 FIN_WAIT1 状态】
    【服务器确定:客户端要关闭】【服务器从 Established 到 CLOSE_WAIT 状态】
    • FIN = 1
    • seq = x
  2. 服务器回复确认报文(第二次挥手)
    【客户端确定:客户端要关闭、服务器知道客户端要关闭】【客户端从 FIN_WAIT1 到 FIN_WAIT2 状态】
    【服务器确定:客户端要关闭】【服务器处于 CLOSE_WAIT 状态】
    • ACK = 1
    • seq = y
    • ack = x + 1
  3. 服务器请求关闭 TCP 连接,客户端接收(第三次挥手)
    【客户端确定:客户端要关闭、服务器知道客户端要关闭、服务器要关闭】【客户端从 FIN_WAIT2 到 TIME_WAIT 状态】
    【服务器确定:客户端要关闭、服务器要关闭】【服务器从 CLOSE_WAIT 到 LAST_ACK 状态】
    • FIN = 1
    • ACK = 1
    • seq = z
    • ack = x + 1
  4. 客户端回复确认报文(第四次挥手)
    【客户端确定:客户端要关闭、服务器知道客户端要关闭、服务器要关闭】【客户端等待 2 MSL 时间后从 TIME_WAIT 到 CLOSE 状态】
    【服务器确定:客户端要关闭、服务器要关闭、客户端知道服务器要关闭】【服务器从 LAST_ACK 到 CLOSE 状态】
    • ACK = 1
    • seq = x + 1
    • ack = z + 1

3.2.3 TCP 拥塞控制算法

  1. 慢启动
  2. 拥塞避免
  3. 拥塞发生
  4. 快恢复

3.2.4 介绍一下什么是 TCP 粘包和拆包?如何防止?

【参考来源:面试题:聊聊TCP的粘包、拆包以及解决方案

  因为TCP是面向流,没有边界,而操作系统在发送TCP数据时,会通过缓冲区来进行优化。

  • 如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP则会将多个请求合并为一个请求进行发送,这就形成了粘包问题。
  • 如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP就会将其拆分为多次发送,这就是拆包

解决方案:【目的都是为了确定包的边界】

  • 将每个包都封装成固定的长度
  • 在每个包的末尾使用固定的分隔符
  • 将消息分为头部和消息体,头部中保存整个消息的长度,只有读取到足够长度的消息之后才算是读到了一个完整的消息;
  • 通过自定义协议

3.3 UDP 相关

四、网络层

4.1 IP 相关

4.2 RIP 相关

4.3 ARP 相关

4.4 RARP 相关

4.4.1 什么是 RARP ,介绍一下其工作原理?

RARP 是方向地址解析协议,它与 ARP 工作方式相反,它为物理地址申请 IP 地址。

  1. 主机读取 MAC 地址,广播发送 RARP 数据包
  2. RARP 服务器收到请求,为其分配 IP 地址,发送响应消息
  3. 主机从响应消息中获取到 IP 地址,后续使用该 IP 地址进行通信

五、链路层

六、物理层

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐