百度 oppo 滴滴出行 面试问题总结 阿里

本文详细介绍了DNS的域名结构、域名服务器分类以及域名解析的过程,包括递归查询和迭代查询。重点讨论了为什么DNS通常使用UDP协议而非TCP协议,从数据包效率和丢包处理的角度进行了分析。同时提及了DNS在数据长度较大时会切换到TCP进行传输的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

(百度oppo)

1.dns域名解析用的什么协议  

    

域名是分层结构,域名服务器也是对应的层级结构。 

有了域名结构,还需要有一个东西去解析域名,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。

由高向低进行层次划分,可分为以下几大类:

分类    作用

根域名服务器    最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助

顶级域名服务器    负责管理在该顶级域名服务器下注册的二级域名

权限域名服务器    负责一个区的域名解析工作

本地域名服务器    当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

注:一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区 

我们需要注意的是: 

1. 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器 

2. 每一级域名服务器都知道下级域名服务器的IP地址 

3. 为了容灾, 每一级至少设置两个或以上的域名服务器

域名解析总体可分为一下过程: 
(1) 输入域名后, 先查找自己主机对应的域名服务器,域名服务器先查找自己的数据库中的数据. 
(2) 如果没有, 就向上级域名服务器进行查找, 依次类推 
(3) 最多回溯到根域名服务器, 肯定能找到这个域名的IP地址 
(4) 域名服务器自身也会进行一些缓存, 把曾经访问过的域名和对应的IP地址缓存起来, 可以加速查找过程 
具体可描述如下: 
1. 主机先向本地域名服务器进行递归查询 
2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询 
3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址 
4. 本地域名服务器向顶级域名服务器进行查询 
5. 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的IP地址 
6. 本地域名服务器向权限服务器进行查询 
7. 权限服务器告诉本地域名服务器所查询的主机的IP地址 
8. 本地域名服务器最后把查询结果告诉主机 

 

上文我们提出了两个概念:递归查询和迭代查询 
(1)递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机 
(2)迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

通俗地说,递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完。 
迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。

          域名服务主要是基于UDP实现的:

为什么DNS适合使用UDP协议而不是TCP协议?

DNS是域名系统(Domain Name System)的缩写,主要用于解析如 www.google.com 这样的域名获取其对应的IP地址!

域名结构

为了保证域名的唯一性,因特网在命名的时候采用了层次结构的命名方式。每一个域名都是一个标号序列,用字母(A-Z、a-z,大小写等价)、数字(0-9)、和连接符(-)组成,标号序列总长度不能超过255个字符,它由点号分割成一个个的标号,每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。级别最低的域名写在左边,级别最高的域名写在右边

域名服务主要是基于UDP实现的,服务器的端口号为53

比如域名 www.360.com ,由点号分割成三个域名 www、360、com,其中 com 是顶级域名(TLD,Top Level Domain),360 是二级域名(SLD,Second Level Domain),www 是三级域名

关于域名的层次结构,如下图

很明显是一个树形结构!

域名服务器

有域名结构还不行,还需要有一个东西去解析域名。域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。由高向低进行层次划分,可以分为这么几类

根域名服务器

最高层次的域名服务器,也是最重要的域名服务器,本地域名服务器如果解析不了域名就会向根域名服务器求助

全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m。这些服务器由各种组织控制,并由ICANN(互联网名称和数字地址分配公司)授权,由于每分钟都要解析的名称数量多得令人难以置信,所以实际上每个根服务器都有镜像服务器,每个根服务器与它的镜像服务器共享同一个IP地址,中国大陆地区只有6组根服务器镜像

当你对某个根服务器发出请求时,请求会被路由到该根服务器离你最近的镜像服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和地址,如果向根服务器发出对www.360.com的请求,则根服务器时不能在它的记录文件中找到与www.360.com匹配的记录的,但它会找到com的顶级域名记录,并把负责com地址的顶级域名服务器的地址发会给请求这

顶级域名服务器

顶级域名服务器负责在该顶级域名服务器下注册的二级域名。当根域名服务器告诉查询顶级域名服务器地址时,查询者紧接着就会到顶级域名服务器进行查询

比如查询test.com,根域名服务器已经告诉了查询者com顶级域名服务器的地址,com顶级域名服务器会找到test.com的域名服务器的记录,域名服务器检查其区域文件,并发现它有与test.com相关联的区域文件。在此文件的内部,有该主机的记录。此记录说明此主机所在的IP地址,并向请求者返回最终答案

权限域名服务器

负责一个区的域名解析工作

本地域名服务器

当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的

域名解析过程

域名解析总体分为两个步骤!

第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名

第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址。从下面对jocent.me进行域名解析的报文中可以明显看出这两个步骤

注意,第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的

  • 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
  • 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
  • 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器dns.com的IP地址
  • 本地域名服务器向顶级域名服务器dns.me进行查询
  • 顶级域名服务器me告诉本地域名服务器,下一步查询权限服务器dns.jocent.com的IP地址
  • 本地域名服务器向权限域名服务器dns.jocent.me进行查询
  • 权限域名服务器dns.jocent.me告诉本地域名服务器所查询的主机的IP地址
  • 本地域名服务器最后把查询结果告诉10.74.36.90

递归查询

本机向本地域名服务器发起一次查询请求,就静待最终的结果

如果本地域名服务器无法解析,自己会以DNS客户机的身份向其他域名服务器进行查询,直到最终的IP地址告诉本机

迭代查询

本机域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询

经过上面的分析和梳理,完全可以把DNS服务器看成是一种分布式的数据库,思考DNS服务器的工作方式可以帮助自己在分布式系统的设计和开发中提供一些思路

为什么DNS更适合用UDP

使用nslookup先使用基于UDP的DNS查询 baidu.com的IP,再用基于TCP的DNS查询

这个过程使用WireShark抓包的结果是这样的

很明显使用基于UDP的DNS协议只要一个请求、一个应答就好了

而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手

明显基于TCP协议的DNS更浪费网络资源!

当然以上只是从数据包的数量以及占有网络资源的层面来进行的分析,那数据一致性层面呢?

DNS数据包不是那种大数据包,所以使用UDP不需要考虑分包,如果丢包那么就是全部丢包,如果收到了数据,那就是收到了全部数据!所以只需要考虑丢包的情况,那就算是丢包了,重新请求一次就好了。而且DNS的报文允许填入序号字段,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答是对应的哪个请求

DNS通常是基于UDP的,但当数据长度大于512字节的时候,为了保证传输质量,就会使用基于TCP的实现方式

2.垃圾回收器具体各种区别

         详见我的笔记。
3.java并包你知道哪些。具体实现    

        
4.cas如何实现原子性
5.一个2g的数据只有200m空间你怎样去重(查询重复次数最多的数字)
6.消息队列知道么(不知道)
7.什么情况下索引会比全表扫描要慢
8.计算机网络(7层模型等等……)
9.linkedhashmap
10.mysql数据库什么时侯使用索引会比全表扫描慢

(滴滴出行)

 

1.算法  数据结构(常见排序,设计模式,树)
2.数据库sql语句好好看看具体怎么写不会错
3.数据去重linkedhashmap 大量数据就分区归并
4.基本数据类型具体几个字节
5.mapredus

(阿里算法)

package test;////评测题目:
////题目:
////        给定两个字符串 source 和 target. 求 source 中最短的包含 target 中每一个字符的子串.
////
////        如果没有答案, 返回 "".
////        保证答案是唯一的.
////        target 可能包含重复的字符, 而你的答案需要包含至少相同数量的该字符.
////
////
////        样例 1:
////        输入: source = "abc", target = "ac"
////        输出: "abc"
////
////
////        样例 2:
////        输入: source = "adobecodebanc", target = "abc"
////        输出: "banc"
////        解释: "banc" 是 source 的包含 target 的每一个字符的最短的子串.
////
////        样例 3:
////        输入: source = "abc", target = "aa"
////        输出: ""
////        解释: 没有子串包含两个 'a'.
////
////        要求:
////        1. O(n) 时间复杂度
////        2. 实现语言不限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值