首页 >邮件操作 > 内容

面试题:浏览器输入URL之后会发生什么? —— DNS协议

2023年3月17日 21:10

写在前面
博主在字节一面的时候,面试官就问我:浏览器输入URL之后,会发生什么?
虽然博主心里知道面试官想考察的内容是对网络包传输的流程,但是当时还是答得不是很好,故决定总结一系列文章来好好讲讲网络相关知识。
此为系列第一讲,讲的内容是关于DNS协议的。

博主当时的回答

博主当时的回答是这样的
当用户输入一个URL之后,浏览器会根据HTTP/HTTPS协议将该请求逐个经过TCP/IP协议栈进行封装。在应用层除了根据HTTP/HTTPS协议添加报头之外,还会根据DNS协议去查询URL所对应的服务器,获取该服务器的IP地址。然后将该IP添加到网络包的目的IP中。之后和服务器建立TCP三次握手,之后服务器响应浏览器的请求,讲请求包发给浏览器。客户端收到请求包之后会根据请求包内的内容将资源渲染给用户。之后,如果是短链接,会进行TCP四次挥手;如果是长链接,则双方会建立相关信息维护这条链接。

今天的文章就是去讲DNS协议在这个过程中扮演了什么样的角色。

DNS服务器

在网络世界中,IP地址是唯一标识主机的DNS。但是我们在www.baidu.com其实也可以访问百度的主机啊?这是因为有DNS服务器这个网络世界的地址簿。它记录了域名和IP地址的对应关系。由于现实世界中域名的大量使用,所以DNS服务器就一定要设置成高可用、高并发和分布式的

于是,就有了以下的树状层次结构:
在这里插入图片描述

域名和DNS解析

域名本身我们都很熟悉,其是一串用点分割开的字符串。其本身是全球唯一的,需要通过专门的域名注册商才可以申请注册。为了组织全球互联网中的众多计算机,域名的一个个块被用点分开,形成分层的结构。而每个被点分开的字符串就构成了域名中的一个层级,并且位置越靠后,层级就越高。

我们拿CSDN的网址:www.csdn.net来看一下,这个字符串中,.net是顶级域名,中间的.csdn是二级域名。这里有一点要注意以下,.是所有域名的根,也就是说所有域名都以点作为后缀。比如说www.csdn.net,其实最后会被修饰成www.csdn.net.

DNS解析流程

为了提高DNS的解析效率,很多网络都会就近部署DNS缓存服务器。于是就有了以下的DNS解析流程:

  1. 主机客户端现在本地DNS缓存中查询数据,如果没有就转到第二步。
  2. 然后本地域名服务器(本地DNS)询问www.csdn.net的ip地址是多少?本地DNS就是由网络服务商,电信、移动、联通等自动分配,它通常是在网络服务商的某个机房。
  3. 本地DNS收到客户端的请求之后,会去它缓存的域名-IP对应表中查询www.csdn.net所对应的IP地址。如果找到了就返回给客户端;如果没找到就将此请求转发到根DNS服务器
  4. 根DNS服务器收到请求之后,发现后缀是.net,就将.net顶级域名服务器的地址给客户端发过去。
  5. 客户端收到地址后,就去.net顶级域名服务器上去请求。顶级域名服务器负责管理二级域名。
  6. .net顶级域名服务器收到请求之后,就将负责www.csdn.net区域的权威DNS服务器地址给客户端。
  7. 客户端收到权威DNS服务器的地址后,就去权威DNS服务器上请求IP地址,权威DNS服务器将IP返回给客户端
  8. 收到IP地址之后,客户端就可以根据IP地址访问目标服务器了

在这里插入图片描述

查看本地DNS配置

上面的DNS递归查询挺麻烦的,不过其是DNS服务器自动完成。我们要做的就是配置可用的DNS服务器。

我们可以在Linux中输入以下命令来查看我们的系统配置:

ubuntu@VM-0-2-ubuntu:~/code/Code/leetcode$ cat /etc/resolv.conf 
# This file is managed by man:systemd-resolved(8). Do not edit.## This is a dynamic resolv.conf file for connecting local clients to the# internal DNS stub resolver of systemd-resolved. This file lists all# configured search domains.## Run "systemd-resolve --status" to see details about the uplink DNS servers# currently in use.## Third party programs must not access this file directly, but only through the# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,# replace this symlink by a static file or a different symlink.## See man:systemd-resolved.service(8) for details about the supported modes of# operation for /etc/resolv.conf.nameserver 127.0.0.53options edns0

在这里,博主的系统配置的是127.0.0.53这个域名服务器。

查看域名对应的IP地址

另外,DNS服务通过资源记录的方式,来管理所有数据,其支持A、CNAME、MX、NS、PTR等多种类型的记录。比如:

  • A:把域名转换成IP地址
  • CNAME:创建别名
  • NS:该域名对应的域名服务器地址

我们可以在Linux中使用 nslookup 运行以下命令查看域名的A记录:

ubuntu@VM-0-2-ubuntu:~/code/Code/leetcode$ nslookup www.csdn.net
# 域名服务器及端口信息Server:         127.0.0.53Address:        127.0.0.53#53# 非权威查询结果Non-authoritative answer:Name:   www.csdn.netAddress: 39.106.226.142

在这上面我们最终在本地DNS缓存中查询到了www.csdn.net的IP地址,是39.106.226.142

查看DNS递归过程

前面DNS查询流程的时候,还提到了。如果没有命中缓存,DNS查询实际上是一个递归的过程

那么我们如何去查看DNS这个递归的过程呢?在Linux中我们可以使用解析工具 dig,其就提供了trace功能,可以展示递归查询的整个过程。

ubuntu@VM-0-2-ubuntu:~/code/Code/leetcode$ dig +trace +nodnssec www.csdn.com
; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> +trace +nodnssec www.csdn.com;; global options: +cmd;; Received 28 bytes from 127.0.0.53#53(127.0.0.53) in 0 ms

博主,这里就是在本地DNS缓存中查找到了www.csdn.com的IP地址。

DNS记录

实现DNS分布式数据库的所有DNS服务器共同存储着资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射,每个DNS回答报文包含了一条或多条资源记录。

资源记录RR是一个包含了下列字段的四元组:

(name,vakue,type,TTL)//TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的事件 

而其中 name 和 value 取决于type:

  • 如果type = A,则name是主机名,value是该主机名的IP地址
  • 如果type = NS,则name是域名,而value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名
  • 如果 type = CBANE,则value是别名为name的主机对应的规范主机名
  • 如果 type = MX,则value是别名为name的邮件服务器的规范主机名

如果一台DNS服务器是某特定主机名的权威DNS服务器,那么该DNS服务器会包含该主机名的类型A记录。如果DNS服务器不是某个主机名的权威DNS服务器,那么该服务器将包含一条NS记录,该记录对应于包含主机名的域;它还将包括一条类型A记录,该记录提供了在NS记录的value字段中的DNS服务器的IP地址。

而在DNS递归查询中,就会通过这些信息来获取IP地址。

DNS负载均衡

我们现在回到DNS解析流程那里,站在客户端的角度,这是一次DNS递归查询的过程。因为本地DNS会全权完成这件事情。而我们只需要等待结果罢了。但是,在这个过程中,DNS除了可以通过名称映射为IP地址,它还可以做另一件事情,就是负载均衡

例如,某个应用要访问另外一个应用,如果配置另外一个应用的IP地址,那么这个访问就是一对一的。但是当被访问的应用撑不住的时候,我们其实可以部署多个。这样在域名解析的时候,我们只要配置策略,这次返回第一个IP,下次返回第二个IP,这样就可以实现负载均衡了

一般来说,大型的架构服务需要保证高可用。为了保证高可用,我们往往会将服务部署在多个机房,每个机房都会有自己的IP地址。当用户访问某个域名的时候,这个IP地址就可以轮询访问多个数据中。如果一个数据中心因为某种原有挂了之后,只要在DNS服务器里面。将这个数据中心对应的IP地址删除,就可以实现一定的高可用。

DNS攻击与防范

DNS是一个易受攻击的目标,其主要会受到以下几种攻击:

DDOS洪泛攻击

第一种就是针对DNS服务的DDOS带宽洪泛攻击。例如,攻击者能够向每个DNS根服务器连续不断的发送大量分组,从而使大多数合法的DNS请求得不到回答(跟SYN洪泛攻击原理类似)。这样我们主机也就无法获取顶级域名服务器的IP地址。

DDOS
分布式拒绝服务器攻击(Distributed Denial of Service),是指位于多个位置的攻击者同时向一个或多个目标发起攻击;或者一个攻击者控制了多台电脑攻击一个或多个目标。

但是,这种大规模攻击带来的损害比较小,对用户上网基本没有影响。当攻击者的报文发送给服务器的时候,会被分组过滤器筛选掉,从而阻挡了这些攻击报文。此外,大多数本地DNS服务器缓存了顶级域名服务器的IP地址,使得这样的请求过程绕过DNS根服务器。

比DDOS攻击根服务器更好的攻击方式是向顶级域名服务器发送大量的DNS请求。这是因为,更难过滤指向DNS服务器的DNS请求,并且顶级域名服务器不像根服务器那样容易绕过。

利用DNS攻击

另外一种DNS攻击本质上不是针对DNS服务器的攻击,而是利用DNS基础设施去攻击其他主机。在这种攻击中,攻击者向许多权威DNS服务器发送DNS请求,每个请求都带有被攻击主机的假冒的源地址。这些DNS服务器就会向被攻击主机发送它们的回答。如果这些请求能够制作成响应比请求大得多的话,则攻击者不用产生大量的流量就能攻击目标主机。

其他攻击

DNS还会遭受其他方式的攻击。在中间人攻击中,攻击者截获来自主机的请求并返回伪造的回答。在DNS毒害攻击中,攻击者向DNS服务器发送伪造的回答,诱使服务在其缓存中保存伪造的记录。这些攻击都能将Web用户重定向到攻击者的Web站点。然而,这些攻击难以实现,因为他们要求截获分组或遏制服务器。

参考文献

[1] 刘超.趣谈网络协议.极客时间[2] 倪朋飞.Linux性能优化实战.极客时间[3] 计算机网络自顶向下的方法.第二章[4] 分布式拒绝服务攻击.百度百科


参考文章:https://blog.csdn.net/shenmingxueIT/article/details/117389594

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论