本文最后更新于 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 建立连接的过程(访问网页的全过程)?
- 在浏览器中输入指定网页的 URL。
- 浏览器通过 DNS 协议,获取域名对应的 IP 地址。
- 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
- 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
- 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
- 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
- 浏览器在不需要和服务器通信时,可以主动关闭 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
cookie 和 session 的区别
Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。