2.1域名规范和解析流程
目录介绍
- 01.域名是什么东西
- 1.1 看一些案例
- 1.2 认识网络域名
- 1.3 什么是uri
- 1.4 什么是url
- 1.5 uri和url关系
- 1.6 案例题目思考
- 02.域名如何解析
- 2.1 域名由谁解析
- 2.2 域名解析过程
- 2.3 解析域名流程
- 2.4 本地缓存域名
- 03.DNS概念了解
- 3.1 DNS基础概念
- 3.2 DNS是干什么
- 3.3 DNS服务器说明
- 3.4 DNS域名系统原理
- 3.5 DNS查询算法
01.域名是什么东西
1.1 看一些案例
1.2 认识网络域名
- 来看一下看新闻,购物的域名
- http://qq.com 这个是看新闻域名
- https://taobao.com 这个是购物的域名
- 看看下面的链接,说一下哪些是uri,哪些是url
- https://github.com/yangchong211/LifeHelper 这个是url
- http://localhost:8080/index.html 这个是url
1.3 什么是uri
- URI全称是Uniform Resource Identifier,也就是统一资源标识符,它是一种采用特定的语法标识一个资源的字符串表示。
- URI所标识的资源可能是服务器上的一个文件,也可能是一个邮件地址、图书、主机名等。
- 简单记为:URI是标识一个资源的字符串(这里先不必纠结标识的目标资源到底是什么,因为使用者一般不会见到资源的实体),从服务器接收到的只是资源的一种字节表示(二进制序列,从网络流中读取)。
- 通用URI的格式如下:
- scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
image
- URI一般由三部组成
- ①访问资源的命名机制
- ②存放资源的主机名
- ③资源自身的名称,由路径表示,着重强调于资源。
1.4 什么是url
- URL全称是Uniform Resource Location,也就是统一资源位置。
- 实际上,URL就是一种特殊的URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以通过它来获取URL对应的资源。
- URL所表示的网络资源位置通常包括用于访问服务器的协议(如http、ftp等)、服务器的主机名或者IP地址、以及资源文件在该服务器上的路径。
- 典型的URL例如http://localhost/myProject/index.html,它指示本地服务器的myProject目录下有一个名为index.html的文档,这个文档可以通过http协议访问
- 实际上,URL不一定是指服务器中的真实的物理路径,因为我们一般在服务器中部署应用,如Servlet应用,URL访问的很可能是应用的接口,至于最终映射到什么资源可以由应用自身决定。
- URL(Uniform Resource Locator,统一资源定位符)的格式
- 通常而言,我们所熟悉的 URL 的常见定义格式为:
scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor] > scheme //有我们很熟悉的http、https、ftp以及著名的ed2k,迅雷的thunder等。 > host //HTTP服务器的IP地址或者域名 > port# //HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/ > path //访问资源的路径 > url-params //所带参数 > query-string //发送给http服务器的数据 > anchor //锚点定位
- 格式属性介绍
- protocol:URL中的协议(protocol)是相应于URI中的模式(schema)的另一个叫法。URL中,协议部分可以是file、ftp、http、https、magnet、telnet或者其他定制协议字符串(但是不包括urn)。
- userInfo:URL中的用户信息(userInfo)是服务器的登录信息,这部分信息是可选的。如果这部分信息存在,一般会包含一个用户名,极少情况下会包含一个口令。实际上URL携带用户信息是不安全的。
- port:URL中的端口号(port)是指服务器中应用的运行端口,默认端口为80,此部分信息是可选的(也就如果不指定端口号就使用默认端口80)。
- path:URL中的路径(path)用于表示服务器上的一个特定的目录(其实说一个特定的文件也可以),这个特定的目录不一定是物理目录,也有可能是逻辑目录。这一点很容易说明,一般不可能把服务器上面的目录直接公开让所有人访问,服务器上面跑的一般是Web(Java的话一般是Servlet)应用,路径指向的实际数据来源甚至很大可能是在其他服务器上的MySQL中的查询结果。
- query:查询参数(query)一般是一个字符串,它表示URL中向服务器提供的附加参数,一般只使用在http协议的URL中,其中包含了表单数据,来源于用户的输入,表示形式是key1=value1&key2=value2&keyn=valuen。
- fragment:片段(fragment)表示远程服务器资源的某个特定的部分。假如服务器资源是一个HTML文档,此片段标识符将制定为该HTML文档的一个锚(Anchor)。如果远程资源是一个XML文档,那么这个片段标识符是一个XPointer。
- URL类中提供对应的方法分别是:
//解析一个url Uri uri = Uri.parse(url); // 完整的url信息 String urlStr = uri.toString(); Log.e( "UrlUtils","url: " + urlStr); // scheme部分 String scheme = uri.getScheme(); Log.e( "UrlUtils","scheme: " + scheme); // host部分 String host = uri.getHost(); Log.e( "UrlUtils","host: " + host); //port部分 int port = uri.getPort(); Log.e( "UrlUtils","port: " + port); // 访问路劲 String path = uri.getPath(); Log.e( "UrlUtils","path: " + path); List<String> pathSegments = uri.getPathSegments(); Log.e( "UrlUtils","pathSegments: " + pathSegments.toString()); // Query部分 String query = uri.getQuery(); Log.e( "UrlUtils","query: " + query); //获取此URI的解码权限部分。对于服务器地址,权限的结构如下:Examples: "google.com", "bob@google.com:80" String authority = uri.getAuthority(); Log.e( "UrlUtils","authority: " + authority); //从权限获取已解码的用户信息。例如,如果权限为“任何人@google.com”,此方法将返回“任何人”。 String userInfo = uri.getUserInfo(); Log.e( "UrlUtils","userInfo: " + userInfo); //UrlUtils: url: https://m.dev.haowumc.com/app/financialManagement //UrlUtils: scheme: https //UrlUtils: host: m.dev.haowumc.com //UrlUtils: port: -1 //UrlUtils: path: /app/financialManagement //UrlUtils: pathSegments: [app, financialManagement] //UrlUtils: query: null //UrlUtils: authority: m.dev.haowumc.com //UrlUtils: userInfo: null
1.5 uri和url关系
- URI和URL的关系:
- URL是一种特殊的URI,是URI包括URL。
- URI属于URL更高层次的抽象,一种字符串文本标准。就是说,URI属于父类,而URL属于URI的子类。URL是URI的一个子集。URI还有一个子类URN-统一资源名称。
- 二者的区别在于
- URI 表示请求服务器的路径,定义这么一个资源。
- URL 同时说明要如何访问这个资源(http://)。
1.6 案例题目思考
02.域名如何解析
2.1 域名由谁解析
- 域名解析是由域名系统(DNS)来完成的。
- DNS是一个分布式的系统,用于将域名转换为相应的IP地址,以便在互联网上进行访问。
- 当您在浏览器中输入一个域名时,浏览器会向本地计算机或网络中的DNS解析器发送一个查询请求。如果本地解析器缓存了该域名的IP地址,则会直接返回结果。否则,本地解析器会向根域名服务器发送查询请求。
2.2 域名解析过程
- 域名解析是什么呢?
- 浏览器只知道名字是“www.taobao.com”,但是不知道具体的地点,所以不知道应该如何访问。
- 于是,它打开地址簿去查找。可以使用一般的地址簿协议DNS去查找,还可以使用另一种更加精准的地址簿查找协议HTTPDNS。
- 域名解析得到ip地址
- 无论用哪一种方法查找,最终都会得到这个地址:108.114.138.24,这也就是所说的域名解析。这个是IP地址,是互联网世界的“门牌号”。
2.3 解析域名流程
- 解析域名是将域名转换为相应的IP地址的过程,以便在互联网上进行访问。以下是解析域名的一般流程:
- 发起解析请求:当您在浏览器中输入一个域名时,浏览器会向本地计算机或网络中的DNS解析器发送一个解析请求。
- 查询本地缓存:本地解析器首先会检查自己的缓存,看是否已经解析过该域名。如果有缓存记录并且尚未过期,解析器会直接返回缓存的IP地址。
- 向根域名服务器查询:如果本地解析器没有缓存记录或缓存已过期,它会向根域名服务器发送查询请求。根域名服务器是DNS系统的顶级服务器,它存储了顶级域名(如.com、.org、.net等)的DNS服务器地址。
- 顶级域名服务器查询:根域名服务器会告诉本地解析器,该域名的顶级域名服务器的地址。本地解析器接着会向该顶级域名服务器发送查询请求。
- 权威域名服务器查询:顶级域名服务器会告诉本地解析器,该域名的权威域名服务器的地址。本地解析器接着会向该权威域名服务器发送查询请求。
- 返回IP地址:权威域名服务器会返回与该域名相关的IP地址。本地解析器将结果返回给浏览器,使其能够建立与该域名对应的服务器的连接。
- 缓存结果:本地解析器会将解析结果缓存起来,以便下次查询时可以直接返回结果,提高解析速度。
2.4 本地缓存域名
- 域名解析的本地缓存由操作系统的DNS解析器管理。
- 这些解析器会将解析过的域名和其对应的IP地址存储在内存中,以便在后续的解析请求中快速返回结果。
- 对于常见的Web浏览器,它们也会维护自己的DNS缓存。这些浏览器会在本地缓存中存储最近解析过的域名和其对应的IP地址,以提高访问速度。
- 请注意,本地缓存的存储时间是有限的,通常在几分钟到几小时之间。过期的缓存会被清除,并且在下一次解析请求时需要重新查询DNS服务器。
03.DNS概念了解
3.1 DNS基础概念
- 什么是DNS?
- DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。
- 域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在Internet上域名与IP地址之间是一一对应的,DNS就是进行域名解析的服务器。
- DNS命名用于Internet等TCP/IP网络中,通过用户友好的名称查找计算机和服务。DNS是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库。
3.2 DNS是干什么
- DNS的概念,DNS用途是干什么的?
- 域名解析,www.xxx.com转换成ip,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的ip数串
- DNS协议运行在UDP协议之上,使用端口号53
3.3 DNS服务器说明
- DNS服务器
- 在网络世界,也是这样的。你肯定记得住网站的名称,但是很难记住网站的 IP 地址,因而也需要一个地址簿,就是DNS 服务器。
- 由此可见,DNS 在日常生活中多么重要。每个人上网,都需要访问它,但是同时,这对它来讲也是非常大的挑战。一旦它出了故障,整个互联网都将瘫痪。
- 另外,上网的人分布在全世界各地,如果大家都去同一个地方访问某一台服务器,时延将会非常大。因而,DNS服务器,一定要设置成高可用、高并发和分布式的。
- DNS服务器的几种分类,大概可以分成这几类
- 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址
- 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
- 权威 DNS 服务器 :返回相应主机的 IP 地址
3.4 DNS域名系统原理
- 思考一下
- 根DNS,顶级DNS服务器在美国,假设如果实行网络封杀,关闭了对内这些DNS服务器,会出现什么问题。
- 什么是DNS域名系统,可以简单描述其工作原理是怎么实现的?
- 当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:指定的DNS域名,指定的查询类型,DNS域名的指定类别。基于UDP服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。
- 1)客户机向其本地域名服务器发出DNS请求报文
- 2)本地域名服务器收到请求后,查询本地缓存,假设没有该记录,则以DNS客户的身份向根域名服务器发出解析请求
- 3)根域名服务器收到请求后,判断该域名所属域,将对应的顶级域名服务器的IP地址返回给本地域名服务器
- 4)本地域名服务器向顶级域名服务器发出解析请求报文
- 5)顶级域名服务器收到请求后,将所对应的授权域名服务器的IP地址返回给本地域名服务器
- 6)本地域名服务器向授权域名服务器发起解析请求报文
- 7)授权域名服务器收到请求后,将查询结果返回给本地域名服务器
- 8)本地域名服务器将查询结果保存到本地缓存,同时返回给客户机
3.5 DNS查询算法
- DNS查询的实现算法是什么,说一下你的理解?
- 主机解析域名的顺序
- 浏览器缓存
- 找本机的hosts文件
- 路由缓存
- 找DNS服务器(本地域名、顶级域名、根域名)
- 迭代查询、递归查询
- 主机解析域名的顺序
- 如何在浏览器中查看域名解析缓存?
- 待完善
- 如何在本地hosts文件中查看域名解析缓存?
- 待完善
05.DNS解析流程分析说明
- 为了提高 DNS 的解析性能,很多网络都会就近部署 DNS 缓存服务器。于是,就有了以下的 DNS 解析流程。
- 1.电脑客户端会发出一个 DNS 请求,问 www.163.com 的 IP 是啥啊,并发给本地域名服务器 (本地DNS)。那本地域名服务器 (本地 DNS) 是什么呢?如果是通过 DHCP 配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房。
- 2.本地 DNS 收到来自客户端的请求。你可以想象这台服务器上缓存了一张域名与之对应 IP 地址的大表格。如果能找到 www.163.com,它直接就返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大,能告诉我 www.163.com 的 IP 地址吗?”根域名服务器是最高层次的,全球共有 13 套。它不直接用于域名解析,但能指明一条道路。
- 3.根 DNS 收到来自本地 DNS 的请求,发现后缀是 .com,说:“哦,www.163.com 啊,这个域名是由.com 区域管理,我给你它的顶级域名服务器的地址,你去问问它吧。”
- 4.本地 DNS 转向问顶级域名服务器:“老二,你能告诉我 www.163.com 的 IP 地址吗?”顶级域名服务器就是大名鼎鼎的比如 .com、.net、 .org 这些一级域名,它负责管理二级域名,比如163.com,所以它能提供一条更清晰的方向。
- 5.顶级域名服务器说:“我给你负责 www.163.com 区域的权威 DNS 服务器的地址,你去问它应该能问到。”
- 6.本地 DNS 转向问权威 DNS 服务器:“您好,www.163.com 对应的 IP 是啥呀?”163.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 7.权限 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
- 8.本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
- DNS解析流程图
image
06.DNS的负载均衡是什么
- 站在客户端角度,这是一次DNS 递归查询过程
- 因为本地 DNS 全权为它效劳,它只要坐等结果即可。在这个过程中,DNS 除了可以通过名称映射为 IP地址,它还可以做另外一件事,就是负载均衡。
- 以访问“外婆家”为例
- 它可能有很多地址,因为它在杭州可以有很多家。所以,如果一个人想去吃“外婆家”,他可以就近找一家店,而不用大家都去同一家,这就是负载均衡。
- DNS 首先可以做内部负载均衡。
- 例如,一个应用要访问数据库,在这个应用里面应该配置这个数据库的 IP 地址,还是应该配置这个数据库的域名呢?
- 显然应该配置域名,因为一旦这个数据库,因为某种原因,换到了另外一台机器上,而如果有多个应用都配置了这台数据库的话,一换IP地址,就需要将这些应用全部修改一遍。但是如果配置了域名,则只要在 DNS 服务器里,将域名映射为新的 IP 地址,这个工作就完成了,大大简化了运维。
- 在这个基础上可以再进一步。例如,某个应用要访问另外一个应用,如果配置另外一个应用的 IP地址,那么这个访问就是一对一的。但是当被访问的应用撑不住的时候,我们其实可以部署多个。但是,访问它的应用,如何在多个之间进行负载均衡?只要配置成为域名就可以了。在域名解析的时候,我们只要配置策略,这次返回第一个 IP,下次返回第二个 IP,就可以实现负载均衡了。
- DNS还可以做全局负载均衡。
- 为了保证我们的应用高可用,往往会部署在多个机房,每个地方都会有自己的 IP 地址。当用户访问某个域名的时候,这个 IP 地址可以轮询访问多个数据中心。
- 如果一个数据中心因为某种原因挂了,只要在DNS 服务器里面,将这个数据中心对应的 IP 地址删除,就可以实现一定的高可用。
- 另外,我们肯定希望北京的用户访问北京的数据中心,上海的用户访问上海的数据中心,这样,客户体验就会非常好,访问速度就会超快。这就是全局负载均衡的概念。
07.解析ip地址就能通信吗
- 当网络包到达一个城关的时候,可以通过路由表得到下一个城关的IP 地址,直接通过 IP 地址找就可以了,为什么还要通过本地的 MAC 地址呢?
- 1.mac地址是唯一的,为什么可以修改?想想身份证,身份证号是唯一的,不能改变的,但是可以造价。mac地址全球唯一,它是固化在网卡里的。网卡毕竟是个硬件,需要软件支持,既操作系统识别。重点来了,操作系统识别出来的mac地址是可以更改的,它只不过是一个字符串。我们常说的修改mac指的是修改电脑中记录的既注册表中的记录。
- 2.有了mac地址为什么还要有ip地址。举个例子,身份证号是你的唯一标识,不会重复,一落户就有(网卡一出厂就有mac)。现在我要和你通信(写信给你),地址用你的姓名+身份证,信能送到你手上吗?明显不能!身份证号前六位能定位你出生的县。mac地址前几位也可以定位生产厂家。但是你出生后会离开这个县(哪怕在这个县,也不能具体找到你)。所以一般写个人信息就要有出生地和现居地址了。博客
08.MAC地址在通信中作用
8.1 MAC地址的概念
- MAC是唯一的吗
- 理论上是不变,因为是出厂时被厂家烧在网卡上的,但是可以在网络中虚拟和伪造假的mac地址。应该没有谁为了蹭网去做那么复杂的事情,所以自己无线路由器上如果带了过滤的功能就用起来吧。
- 数据链路上只要知道了对方的MAC地址不是就可以发送数据了吗?为什么还要IP地址?
- 一、MAC地址就好比一个人的身份证,有了身份证,你就能知道这个人在哪吗?我们需要利用IP地址来确定这个人的所在区域,在局域网中,可以使用本地的MAC地址进行通信。
- 二、到达目标机器的局域网之后,ip就没有用了,此时需要利用MAC地址来确定目标机器。因为局域网的IP对应的机器是不固定的 ,所以,在局域网中使用IP寻址是不严谨的。
- 三、假定MAC地址就是广播地址,那么所有接受过MAC包的路由器都会把这个消息进行转发,因此目标机器会收到很多重复的包(因为各个接受过该包的路由器都将其转发)。(为了防止上述现象的发生,目前路由器可以做到不转发那些将MAC地址作为广播地址的IP数据包)
- 四、如果不使用IP地址,那么就需要维护一个极其庞大的MAC地址表,在查找目的机器的时候,就需要向全世界发送数据包,可想而知会造成多大的网络流量。
- MAC与IP区别,不同的特点主要有:
- 对于网络上的某一设备,如一台计算机或一台路由器,其IP地址是基于网络拓扑设计出的,同一台设备或计算机上,改动IP地址是很容易的(但必须唯一),而MAC则是生产厂商烧录好的,一般不能改动。我们可以根据需要给一台主机指定任意的IP地址,如我们可以给局域网上的某台计算机分配IP地址为192.168.0.112 ,也可以将它改成192.168.0.200。而任一网络设备(如网卡,路由器)一旦生产出来以后,其MAC地址不可由本地连接内的配置进行修改。如果一个计算机的网卡坏了,在更换网卡之后,该计算机的MAC地址就变了。
- 长度不同。IP地址为32位,MAC地址为48位。博客
- 分配依据不同。IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。
- 寻址协议层不同。IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP根据目的IP地址,找到中间节点的MAC地址,通过中间节点传送,从而最终到达目的网络)。
8.2 获取MAC地址
- 代码获取MAC地址,代码如下所示
/* * 物理地址是48位,别和ipv6搞错了 */ public class LOCALMAC { public static void main(String[] args) throws UnknownHostException, SocketException { //得到IP InetAddress ia = InetAddress.getLocalHost(); System.out.println(ia); getLocalMac(ia); } private static void getLocalMac(InetAddress ia) throws SocketException { ////获得网络接口对象(即网卡),并得到mac地址,mac地址存在于一个byte数组中。 byte[] mac = NetworkInterface.getByInetAddress(ia).getHardwareAddress(); System.out.println("小杨逗比,mac数组长度:"+mac.length); StringBuffer sb = new StringBuffer(""); for(int i=0; i<mac.length; i++) { if(i!=0) { sb.append("-"); } //mac[i] & 0xFF 是为了把byte转化为正整数 int temp = mac[i]&0xff; String str = Integer.toHexString(temp); System.out.println("每8位:"+str); if(str.length()==1) { sb.append("0"+str); }else { sb.append(str); } } System.out.println("小杨逗比本机MAC地址:"+sb.toString().toUpperCase()); } }
- 命令行获取MAC地址
- 在cmd 命令行中,我们可以通过 nbtstat -a [IP]命令就可以获取到MAC地址
- 获取不到的问题
- 网线没连接好,先看看能否ping通
- 是否在策略组设置了禁止外部访问获取的权限
- 是否防火墙拦截
- 是否中病毒,或者有防水坝系统等拦截
08.总结一下
- DNS 是网络世界的地址簿
- 可以通过域名查地址,因为域名服务器是按照树状结构组织的,因而域名查找是使用递归的方法,并通过缓存的方式增强性能;
- 在域名和 IP 的映射过程中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡,也可以根据地址和运营商做全局的负载均衡。