DNS查询服务器的基本流程,能画出图更好,并说明为什么DNS查询为什么不直接从单一服务器查询ip,而是要经过多次查询,多次查询不会增加开销么(即DNS多级查询的优点)?
- 用户发起请求:
- 用户在浏览器中输入一个域名(如
www.example.com
)。 - 浏览器将该请求发送到本地DNS解析器(通常位于用户的操作系统中)。
- 本地DNS解析器查询本地缓存:
- 本地DNS解析器首先检查其缓存中是否已有该域名的IP地址。
- 如果缓存中有有效的记录,则直接返回IP地址,流程结束。
- 查询递归DNS服务器:
- 如果本地缓存中没有记录,本地DNS解析器将请求转发给递归DNS服务器(通常由用户的ISP提供)。
- 递归DNS服务器也会检查其缓存,并在缓存未命中时进行递归查询。
- 递归DNS服务器查询根DNS服务器:
- 递归DNS服务器向根DNS服务器发送查询请求。
- 根DNS服务器不会直接返回IP地址,而是返回顶级域(如
.com
)的权威DNS服务器的地址。 - 查询顶级域名(TLD)DNS服务器:
- 递归DNS服务器根据根DNS服务器的回应,向TLD DNS服务器(如
.com
的权威DNS服务器)发送查询请求。 - TLD DNS服务器返回该域名的权威DNS服务器的地址。
- 查询权威DNS服务器:
- 递归DNS服务器向权威DNS服务器发送查询请求。
- 权威DNS服务器返回该域名的最终IP地址。
- 返回IP地址给用户:
- 递归DNS服务器将获得的IP地址缓存,并返回给本地DNS解析器。
- 本地DNS解析器再将IP地址返回给用户的浏览器。
- 浏览器向IP地址发送请求:
- 浏览器使用获得的IP地址与目标服务器建立连接,并请求网页内容。
使用多级查询的优点:
分布式架构提高可靠性和性能:
- 避免单点故障:如果DNS仅依赖单一服务器,当该服务器故障时,所有域名解析请求将无法完成。通过分布式架构,可以避免这种情况,提高系统的可靠性。
- 负载均衡:将查询请求分布到多个服务器上,可以有效分散负载,避免单个服务器过载,从而提高整体性能。
2. 缓存提高效率:
- 递归查询中的缓存:递归DNS服务器会缓存查询结果,这意味着后续相同的查询请求可以直接从缓存中获取,无需再次进行全程查询,显著减少查询时间和负载。
- 浏览器和操作系统缓存:本地缓存也能减少网络请求次数,加快域名解析速度。
3. 逐级查询优化管理:
- 分层结构便于管理:DNS采用层级结构(根、TLD、权威服务器),便于管理和更新。例如,根服务器只需知道TLD服务器的地址,而TLD服务器只需知道其下域名的权威服务器地址。
- 安全性:分层查询可以提高系统的安全性和抗攻击能力。攻击者难以同时攻击所有层级的服务器,从而提高系统的安全性。
4. 全球范围内的可扩展性:
- 地域分布:DNS服务器分布在全球各地,能够更快响应用户的查询请求。根服务器和TLD服务器的地理分布使得查询请求可以在用户所在区域得到快速处理,减少网络延迟。
https的加密与认证过程
- 客户端发起连接请求:
-
- 客户端向服务器发送连接请求,请求建立安全连接。这个请求是明文的 HTTP 请求,但是以
https://
开头的 URL。
- 客户端向服务器发送连接请求,请求建立安全连接。这个请求是明文的 HTTP 请求,但是以
- 服务器发送数字证书:
-
- 服务器收到客户端的连接请求后,会将自己的数字证书发送给客户端。数字证书中包含了服务器的公钥以及相关的信息。
- 客户端验证证书:
-
- 客户端收到服务器的证书后,会验证证书的有效性。这包括验证证书是否由可信任的证书颁发机构(CA)签发,证书是否在有效期内,以及服务器的域名是否与证书中的域名匹配等。
- 客户端生成对称密钥:
-
- 如果服务器的证书验证通过,客户端会生成一个对称密钥(称为会话密钥),用于后续的数据加密和解密过程。
- 客户端使用服务器公钥加密对称密钥:
-
- 客户端使用服务器的公钥加密生成的对称密钥,并将其发送给服务器。这个过程是使用非对称加密算法,确保只有服务器持有的私钥可以解密这个对称密钥。
- 服务器解密对称密钥:
-
- 服务器收到客户端发送的加密密钥后,使用自己的私钥对其进行解密,得到对称密钥。
- 建立安全连接:
-
- 客户端和服务器都拥有了相同的对称密钥,它们可以使用对称密钥进行加密和解密。
- 之后的通信过程中,客户端和服务器使用对称密钥进行数据加密和解密,保障通信的安全性。
- 客户端发送加密请求:
-
- 客户端发送加密请求,包括需要访问的资源等信息。这些请求数据在传输过程中会使用对称密钥进行加密。
- 服务器处理请求并返回加密响应:
-
- 服务器接收到客户端的请求后,进行相应的处理,并将响应数据使用对称密钥进行加密后返回给客户端。
- 客户端解密响应:
-
- 客户端接收到服务器的加密响应后,使用对称密钥进行解密,得到原始的响应数据。
TCP和UDP的主要区别是什么
需要从不同的角度来回答
参考:
- 连接
-
- TCP: 面向连接的传输层协议,传输数据前需建立连接。
- UDP: 无需连接,即时传输数据。
- 服务对象
-
- TCP: 一对一的服务,一条连接只有两个端点。
- UDP: 支持一对一、一对多、多对多的交互通信。
- 可靠性
-
- TCP: 可靠交付数据,无差错、不丢失、不重复、按序到达。
- UDP: 尽最大努力交付,不保证可靠交付数据,但可基于UDP实现可靠传输协议(如QUIC)。
- 拥塞控制、流量控制
-
- TCP: 有拥塞控制和流量控制机制,保证传输安全性。
- UDP: 没有拥塞控制,即使网络拥堵也不会调整发送速率。
- 首部开销
-
- TCP: 首部长度较长,可变(最少20字节,选项字段增加)。
- UDP: 固定8字节,开销较小。
- 传输方式
-
- TCP: 流式传输,无边界,保证顺序和可靠性。
- UDP: 每个包独立发送,有边界,可能丢包和乱序。
- 分片处理
-
- TCP: 大数据分片在传输层,丢失时只需传输丢失的分片。
- UDP: 大数据分片在IP层,接收后在IP层组装,再传输给传输层。
TCP 和 UDP 应用场景:
- TCP: FTP文件传输,HTTP/HTTPS等需要可靠数据传输的场景。
- UDP: DNS、SNMP等少量数据通信,视频、音频流传输,广播通信等。
(这些点都可以展开来说)
GET和POST请求的区别
语义
- GET: 请求指定的资源,请求参数以查询字符串形式附加在URL后面,长度限制较为严格。
- POST: 向指定资源提交数据,数据包含在请求体中,可以传输大量数据,且格式不限于ASCII字符。
安全性
- GET: 请求参数暴露在URL中,可能被浏览器缓存、历史记录等记录和存储,不适合传输敏感信息。
- POST: 请求参数在请求体中,不会被浏览器缓存或保存,更适合传输敏感信息。
数据类型
- GET: 参数仅支持ASCII字符,长度限制(通常在几千字节以内),不适合传输大数据。
- POST: 无数据类型限制,适合传输大数据和复杂数据类型(如文件上传)。
幂等性( 幂等性指的是同一请求的重复执行不会产生不同的结果)
- GET: 幂等,多次请求同一URL返回相同结果。
- POST: 非幂等,多次请求可能产生不同的结果(如提交订单)。
缓存处理
- GET: 可以被缓存,浏览器可以直接使用缓存数据。
- POST: 默认不会被缓存,需要服务器指定缓存策略。
使用场景
- GET: 用于请求数据、查询操作,对请求结果的幂等性要求较高的场景。
- POST: 用于提交表单、上传文件、进行状态变更等需要发送数据的场景。
什么是跨域,什么情况下会发生跨域,有什么解决办法
跨域指的是在浏览器中运行的脚本试图访问不同源(即不同的域、协议或端口)的资源时所遇到的安全限制问题。具体来说,浏览器出于安全考虑,限制了来自不同源的页面间的互操作性,防止恶意网站利用用户登录状态等进行跨站攻击。
跨域问题通常在以下情况下会出现:
- 不同的协议:比如从
http://example.com
发送请求到https://api.example.com
。 - 不同的域名:比如从
http://example.com
发送请求到http://api.anotherdomain.com
。 - 不同的端口:比如从
http://example.com:3000
发送请求到http://example.com:4000
。
解决方案:
CORS(跨域资源共享):
- 服务器端设置响应头:在服务端的响应中添加
Access-Control-Allow-Origin
头部,指定允许访问的源。例如:Access-Control-Allow-Origin: *
表示允许所有源访问。
JSONP(JSON with Padding):
- JSONP 是一种通过动态创建
<script>
标签来加载包含 JSON 数据的响应的方法。由于<script>
标签不受同源策略限制,可以用来绕过跨域问题。不过使用 JSONP 需要注意安全性问题和仅适用于 GET 请求的限制。
Nginx代理:
- 使用Nginx作为代理服务器和用户交互,用户就只需要在80端口上进行交互就可以了,这样就避免了跨域问题。