解析URL得到IP地址

导读

上一篇总结中涉及到的是输入URL的过程中浏览器做出的一些反馈,这一篇将总结之后发生的事情。

  • 浏览器判断是URL还是搜索关键字
  • 解析URL
  • DNS解析获得IP地址
  • 多IP域名DNS查询解决方案
  • 什么是域名(补充内容)

1.浏览器判断是URL还是搜索关键字

上一篇说到过浏览器有联想查询服务并且会根据输入内容选择搜索的方式。浏览器会去解析输入的字符串,判断是URL还是搜索关键字,要是解析为URL则开始寻求URL对应的IP地址,否则按照搜索关键字处理交给默认搜索引擎搜索。

2.解析URL

下面是参考百度百科-URL的定义给出的URL的解释

URL:(Uniform Resource Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

通俗的解释就是网络资源的地址,所有你在浏览器上加载的内容都有一个地址,这个地址就是URL。通过浏览器的开发者工具可以查看一次网页加载的时候所请求的资源,这里的每一个链接都是一个URL。

下面以一个去旅馆里找人的场景解释什么是URL。你要去旅馆找一个人你必须知道他住在那个房间,这时候房间号就是你要找的人对应的地址,也就是这个场景下的URL

2.1常见URL格式

旅馆的房间号有着特定的编码方式,有的旅馆为了图吉利会以8开头进行编码,比如1楼1号房间会以8101的形式编码。URL编码也是这样有自己的编写规则。

URL的语法随访问资源和服务的协议不同而不同。URL的最常见的格式如下:

 protocol://hostname[:port]path search hash
  • protocol(协议)表示访问资源和服务的协议。例如http,ftp,mailto和file等。
  • hostname(主机名)表示资源所在主机的完全限定域名,例如www.baidu.com。
  • port(端口)表示协议使用的TCP端口号,具体的端口号是可选的,省略端口号时前面的冒号也要省略,即表示采用"最著名的端口"。HTTP协议的常用端口为80,一般采用默认省略的模式。
  • path(路径)表示资源的目录/文件路径名。
  • search查找元素表示URL中传递的查询字符串。
  • hash散列符元素表示指定的文件偏移量,包括散列符(#)加上该文件偏移量相关的位置点名。

一个URL由不同的部分组成,其中一些是必须的,而另一些是可选的。让我们以下面这个URL为例看看其中最重要的部分:

http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
  • http:// 是协议。它表明了浏览器必须使用何种协议。它通常都是HTTP协议或是HTTP协议的安全版,即HTTPS。Web需要它们二者之一,但浏览器也知道如何处理其他协议,比如mailto:(打开邮件客户端)或者 ftp`:(处理文件传输)。

  • www.example.com 是域名。 它表明正在请求哪个Web服务器。或者,可以直接使用IP地址, 但是因为它不太方便,所以它不经常在网络上使用。.

  • :80 是端口。 它表示用于访问Web服务器上的资源的技术“门”。如果Web服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)来授予其资源的访问权限,则通常会被忽略。否则是强制性的。下面章节会有对端口号知识的补充。

  • /path/to/myfile.html 是网络服务器上资源的路径。在Web的早期阶段,像这样的路径表示Web服务器上的物理文件位置。如今,它主要是由没有任何物理现实的Web服务器处理的抽象。

  • ?key1=value1&key2=value2 是提供给网络服务器的额外参数。 这些参数是用 & 符号分隔的键/值对列表。在返回资源之前,Web服务器可以使用这些参数来执行额外的操作。每个Web服务器都有自己关于参数的规则,唯一可靠的方式来知道特定Web服务器是否处理参数是通过询问Web服务器所有者。

  • #SomewhereInTheDocument 是资源本身的另一部分的锚点. 锚点表示资源中的一种“书签”,给浏览器显示位于该“加书签”位置的内容的方向。例如,在HTML文档上,浏览器将滚动到定义锚点的位置;在视频或音频文档上,浏览器将尝试转到锚代表的时间。值得注意的是,#后面的部分(也称为片段标识符)从来没有发送到请求的服务器。

2.2 端口号知识小补充

一台服务器为什么可以同时是Web服务器,也可以是FTP服务器,还可以是邮件服务器等,其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,通过不同端口,计算机就可以与外界进行互不干扰的通信。服务器端口数最大可以有65535个,但是实际上常用的端口才几十个。

根据端口号的性质划分,可以分为3类

  • 公认端口:这类端口也常称之为"常用端口"。这类端口的端口号从0到1023,它们紧密绑定于一些特定的服务。

    • HTTP:80
    • FTP:21
    • Telent:23
    • SMTP:25
    • POP3:110
  • 注册端口:端口号从1024到49151。它们松散地绑定于一些服务。比如Express启动web服务器的时候占用3000端口。
  • 动态和/或私有端口:端口号从49152到65535。理论上,不应把常用服务分配在这些端口上。实际上,有些较为特殊的程序,特别是一些木马程序就非常喜欢用这些端口,因为这些端口常常不被引起注意,容易隐蔽。

2.3 URL编码

通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。所以需要对非ASCII码进行编码,这也便于后续的DNS查询。

网址URL中常见特殊字符转义编码

字符 - URL编码值

空格 - %20

" - %22

# - %23

% - %25

& - %26

( - %28

) - %29

+ - %2B

, - %2C

/ - %2F

: - %3A

; - %3B

< - %3C

= - %3D

> - %3E

? - %3F

@ - %40

- %5C

| - %7C

URL特殊字符转义,URL中一些字符的特殊含义,基本编码规则如下:

1、空格换成加号(+)
2、正斜杠(/)分隔目录和子目录
3、问号(?)分隔URL和查询
4、百分号(%)制定特殊字符
5、#号指定书签
6、&号分隔参数

如果需要在URL中用到,需要将这些特殊字符换成相应的十六进制的值
+ %2B
/ %2F
? %3F
% %25
# %23
& %26

3. DNS解析获得IP地址

经过之前的URL解析之后,能够知道我们要访问的主机名,端口号以及请求资源的路径等信息,但是还有一个问题没有解决,就是去哪获取这些资源(资源的真正地址)。

举个例子,就好比你的朋友请你吃黄焖鸡米饭(URL),你知道自己的目的地是一家叫黄焖鸡米饭的店,但是你会发现在你的附近有N多家黄焖鸡米饭,你想要再具体一点,比如说“青岛市黄岛区长江西路66号中国石油大学对面的黄焖鸡大楼(IP)”。有了这个地址你可以很轻松的找到目的地。

那为什么搞那么复杂,不直接使用IP地址要先搞个URL然后去进行域名解析呢?主要是IP地址在网络上用起来不方便,难于记忆,用域名(别称)方便一些。你可能记不住百度的IP地址,但是你能记住www.baidu.com。从URL中解析出IP地址的过程就是DNS解析。

3.1什么是DNS

DNS具有两层含义

  • 一个由分层的DNS服务器实现的分布式数据库;
  • 一个允许主机查询分布式数据库的应用层协议。

有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。

除此之外,还有一类重要的DNS,称为本地DNS服务器。严格来说本地DNS服务器并不属于DNS服务器的层次结构,但它在整个查询的过程中却扮演着重要的角色。

3.2解析IP地址查找的顺序

(1)首先查找的是浏览器的DNS缓存

浏览器会缓存DNS记录一段时间。所以浏览器会先去查自己的缓存,要是域名在缓存中有记录则使用缓存中的IP进行下一步处理。要是没有则进行下一步查找。对于chrome可以使用chrome://net-internals/#dns查看当前缓存的DNS,不同浏览器保存的时间长短不一。

(2)查询系统缓存

如果浏览器缓存中没有,浏览器会去查找系统中记录的DNS信息。首先检查域名是否在本地 hosts 里,再查系统本地缓存的其他DNS 记录。

hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联“ 数据库 ”。

查看windows的dns缓存的命令ipconfig /displaydns,linux如果启用了nscd 服务,才有dns 缓存,否则是没有dns缓存的

(3)查路由器缓存

如果在系统缓存里面还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息(缓存你上过的网站,所以有时路由器需要进行DNS刷新)

(4) ISP DNS缓存

如果本地路由器还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商,所谓的电信网,联通网和移动网),ISP也会有相应的ISP DNS服务器。

会跑到这里进行查询是因为你没有改动过”网络中心”的”ipv4”的DNS地址,万恶的运营商可以改动这个DNS服务器,换句话说他们可以让你的浏览器跳转到他们设定的页面上,这也就是人尽皆知的DNS和HTTP劫持。我们也可以自行修改DNS服务器来防止DNS被ISP污染。

这里也分享一个小技巧,在校园网环境下更改ipv6的DNS可以轻松的浏览YouTube等网站,传送门

PS:这里通过发送DNS查询报文给ISP也是很有深度的,首先你要知道ISP的IP地址。如果 DNS 服务器和我们的主机在同一个子网内,需要对 DNS 服务器进行 ARP查询;如果 DNS 服务器和我们的主机在不同的子网,则会对默认网关进行查询。ARP请求部分之后再详细的补充。

(5)递归DNS查询

如果在ISP DNS服务器还没有查到的话,那么就要进行DNS递归查询了。假设我需要www.baidu.com的IP

首先,浏览器所在的主机向本地DNS服务器发送一个含有百度域名的DNS查询报文。本地DNS服务器把查询报文转发到根DNS服务器,该根DNS服务器注意到其com后缀并向本地DNS服务器返回com的顶级域名服务器的IP地址。该本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其www.baidu.com后缀并用负责该域名的权威DNS服务器的IP地址作为回应。最后,本地域名服务器将含有www.baidu.com的IP地址的响应报文发送给客户端主机。

www.baidu.com在本地域名服务器上找不到

  1. 这时候本地域名服务器就会到根域名服务器查找,根域名服务器说这个是一个.com域名。
  2. 然后本地域名服务器就跑到管理.com域名的服务器上进行进一步查询,顶级域名服务器说是 .baidu二级域名。
  3. 最后本地域名服务器再跑到管理 .baidu这个二级域名所在的权限域名服务器,去查询 www这个三级域名的ip 地址。

所以域名结构为:三级域名.二级域名.一级域名。

这里的查询过程是包含递归查询和迭代查询的,客户端主机发送给本地服务器的查询是递归查询,而后面的三个查询是迭代查询。

不是所有域名都能够查到IP的,什么原因你懂得

4.多IP域名DNS查询解决方案

并不是一个域名只能对应到一个IP地址的,IP地址是连接互联网主机的一个身份证,一般一台主机只有一个IP地址,像一些大型的网站怎么可能只有一台主机,所以多个IP是必然的。通过查询有一下几种方式来解决这个问题,自己的理解有限,只列出不深究。

  1. 循环DNS —— 单个域名、多个IP列表循环应对DNS查询
  2. 负载均衡器 —— 一个特定IP的负载均衡服务器(例如:反向代理服务器)负责监听请求并转发给后面的多个服务器集群的某一个,实现多个服务器负载均衡。 而且现在很多云服务都有提供负载均衡服务,比如AWS 的 ELB。
  3. 地理DNS —— 根据用户所处地理位置,返回不同的IP(应用:CDN)
  4. anycast —— 一个IP地址映射多个物理主机的路由技术

5.什么域名(补充内容)

5.1域名的组成

.分隔的字符串,每一部分有特定的含义。查看域名的时候习惯是从左往右读,但是应该从右往左理解,可以参考上边www.baidu.com的解析过程。

主要可以分类两个部分TLD和标签

  • TLD(Top-Level Domain,顶级域名)

顶级域名提供了最多的信息。顶级域名告诉用户通用服务背后的域名。最通用的顶级域名(.com, .org, .net)不需要web服务器满足严格的标准,但一些顶级域名则执行更严格的政策。比如本地的顶级域名,如.us.fr,或.sh,可以要求必须提供给定语言的服务器或者托管在指定国家。

  • 标签 (或者说是组件)

标签都是跟随着TLD的。一个标签可以是任何东西,从一个字母到一个句子。刚好位于TLD前面的标签也被称为二级域名 (SLD)。一个域名可以有多个标签(或者说是组件),没有强制规定必须要3个标签来构成域名。例如,www.ecnu.edu.cn是一个正确的域名。当拥有了“上级”部分(例如qq.com),你还可以创建另外的域名 (有时被称为 "子域名") (例如 mail.qq.com).

在Linux中可以使用whois命令查看域名信息

Reference

你可能感兴趣的:(随笔)