解析URL获得IP地址

导读

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

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

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

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

2.解析URL

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

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

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

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

2.1常见URL格式

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

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中一些字符的特殊含义,基本编码规则以下:

一、空格换成加号(+)
二、正斜杠(/)分隔目录和子目录
三、问号(?)分隔URL和查询
四、百分号(%)制定特殊字符
五、#号指定书签
六、&号分隔参数

若是须要在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

相关文章
相关标签/搜索