计算机网络

本文最后更新于 2 分钟前,文中所描述的信息可能已发生改变。

基础

OSI 模型

OSI 模型是一个分层的网络通信模型,共有七层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。它们的职能如下:

  • 应用层,负责给应用程序提供统一的接口;
  • 表示层,负责把数据转换成兼容另一个系统能识别的格式;
  • 会话层,负责建立、管理和终止表示层实体之间的通信会话;
  • 传输层,负责端到端的数据传输;
  • 网络层,负责数据的路由、转发、分片;
  • 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
  • 物理层,负责在物理网络中传输数据帧;
TCP/IP 模型

TCP/IP 模型共有四层,分别是应用层、传输层、网络层和数据链路层。它们的职能如下:

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、DNS、FTP 等;
  • 传输层,负责端到端的通信,比如 TCP、UDP 等;
  • 网络层,负责网络包的封装、分片、路由、转发,比如 IP、ICMP 等;
  • 网络接口层,负责网络包在物理网络中的传输,比如网络包的封帧、 MAC 寻址、差错检测,以及通过网卡传输网络帧等;

HTTP

HTTP 与 HTTPS 的区别?
  • 端口号:HTTP 默认是 80,HTTPS 默认是 443。
  • URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://
  • 安全性和资源消耗:HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
HTTP 建立连接的过程(访问网页的全过程)?
  1. 在浏览器中输入指定网页的 URL。
  2. 浏览器通过 DNS 协议,获取域名对应的 IP 地址。
  3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
  4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
  5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
  6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
  7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
HTTPS 的加密方式?

HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

  • 非对称加密:用于密钥交换。在这种加密模式下,有一对密钥,分别是公钥和私钥。公钥可以公开,用于加密信息;私钥必须保密,用于解密信息。非对称加密安全性高,但处理速度相对较慢。
  • 对称加密:用于数据传输。对称加密使用同一把密钥进行数据的加密和解密,处理速度快,但密钥的分发是个问题。HTTPS 中,对称加密的密钥是在安全的环境下通过非对称加密交换的。
服务器流量扛不住了做扩容操作,域名解析的 IP 会如何变动?

负载均衡:

  • 域名解析到一个 负载均衡器(如 Nginx、LVS、SLB) 的公网 IP;
  • 负载均衡器再将请求分发到后端的多台服务器;
  • 客户端始终只访问同一个域名,无需感知后端服务器扩容或缩容。

DNS 轮询:

  • 一个域名可以配置多个 A 记录,每个 A 记录对应一台服务器的 IP;
  • DNS 解析时会轮询返回其中一个 IP,客户端随机访问不同服务器;
  • 缺点: DNS 缓存时间较长,扩容/缩容生效不够及时,调度粒度较粗。

CDN:

  • 域名解析到 CDN 厂商提供的节点 IP
  • 用户请求会先到达离自己最近的 CDN 节点,再由 CDN 回源到服务器集群;
  • 优点: 适合静态资源分发、跨地域加速、缓解源站压力。

TCP

三次握手

四次挥手

如何解决粘包?

粘包问题是由于 TCP 协议的特性造成的,TCP 是一个面向字节流的协议,它并不关心数据的边界,只是把数据当成一个连续的字节流来处理。 粘包的问题出现在不知道一个用户消息的边界在哪,如果知道了边界在哪,接受方就可以通过边界划分出有效的用户消息。

解决粘包的方法有:

  • 通过消息长度来划分消息边界;
  • 通过特殊字符来划分消息边界,比如换行符、分号等;
  • 通过自定义消息结构来划分消息边界,比如在消息头中添加消息长度字段等;

操作系统的 TCP 协议栈主要负责:

  • 维护连接状态,TCP 连接的建立和断开;
  • 按顺序接受和发送数据包;
  • 自动重传丢失的数据包;
  • 合并 TCP 段,放到内核的 socket 缓冲区;
为什么是三次握手?不是两次、四次?

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能够帮助双方同步初始化序列号。序列号不能保证数据包不重复、不丢弃和按序传输。

不使用两次握手四次握手的原因:

  • 两次握手:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
  • 四次握手:三次握手已经是理论上最少可靠连接建立的次数,所以不需要使用更多的通信次数。
cookie 和 session 的区别

Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

材料计算常用资源