上一篇总结中涉及到的是输入URL的过程当中浏览器作出的一些反馈,这一篇将总结以后发生的事情。html
上一篇说到过浏览器有联想查询服务而且会根据输入内容选择搜索的方式。浏览器会去解析输入的字符串,判断是URL仍是搜索关键字,要是解析为URL则开始寻求URL对应的IP地址,不然按照搜索关键字处理交给默认搜索引擎搜索。linux
下面是参考百度百科-URL的定义给出的URL的解释web
URL:(Uniform Resource Locator)统一资源定位符是对能够从互联网上获得的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每一个文件都有一个惟一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
通俗的解释就是网络资源的地址,全部你在浏览器上加载的内容都有一个地址,这个地址就是URL。经过浏览器的开发者工具能够查看一次网页加载的时候所请求的资源,这里的每个连接都是一个URL。chrome
下面以一个去旅馆里找人的场景解释什么是URL。你要去旅馆找一我的你必须知道他住在那个房间,这时候房间号就是你要找的人对应的地址,也就是这个场景下的URL。数据库
旅馆的房间号有着特定的编码方式,有的旅馆为了图吉利会以8开头进行编码,好比1楼1号房间会以8101
的形式编码。URL编码也是这样有本身的编写规则。windows
URL的语法随访问资源和服务的协议不一样而不一样。URL的最多见的格式以下:浏览器
protocol://hostname[:port]path search 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文档上,浏览器将滚动到定义锚点的位置;在视频或音频文档上,浏览器将尝试转到锚表明的时间。值得注意的是,#后面的部分(也称为片断标识符)历来没有发送到请求的服务器。
一台服务器为何能够同时是Web服务器,也能够是FTP服务器,还能够是邮件服务器等,其中一个很重要的缘由是各类服务采用不一样的端口分别提供不一样的服务,好比:一般TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,经过不一样端口,计算机就能够与外界进行互不干扰的通讯。服务器端口数最大能够有65535个,可是实际上经常使用的端口才几十个。
根据端口号的性质划分,能够分为3类
公认端口:这类端口也常称之为"经常使用端口"。这类端口的端口号从0到1023,它们紧密绑定于一些特定的服务。
Express
启动web服务器的时候占用3000
端口。一般若是同样东西须要编码,说明这样东西并不适合传输。缘由多种多样,如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
通过以前的URL解析以后,可以知道咱们要访问的主机名,端口号以及请求资源的路径等信息,可是还有一个问题没有解决,就是去哪获取这些资源(资源的真正地址)。
举个例子,就比如你的朋友请你吃黄焖鸡米饭(URL),你知道本身的目的地是一家叫黄焖鸡米饭的店,可是你会发如今你的附近有N多家黄焖鸡米饭,你想要再具体一点,好比说“青岛市黄岛区长江西路66号中国石油大学对面的黄焖鸡大楼(IP)”。有了这个地址你能够很轻松的找到目的地。
那为何搞那么复杂,不直接使用IP地址要先搞个URL而后去进行域名解析呢?主要是IP地址在网络上用起来不方便,难于记忆,用域名(别称)方便一些。你可能记不住百度的IP地址,可是你能记住www.baidu.com
。从URL
中解析出IP地址的过程就是DNS解析。
DNS具备两层含义
有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器如下图的层次结构组织起来。
除此以外,还有一类重要的DNS,称为本地DNS服务器。严格来讲本地DNS服务器并不属于DNS服务器的层次结构,但它在整个查询的过程当中却扮演着重要的角色。
(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
在本地域名服务器上找不到
.com
域名。.com
域名的服务器上进行进一步查询,顶级域名服务器说是 .baidu
二级域名。.baidu
这个二级域名所在的权限域名服务器,去查询 www
这个三级域名的ip 地址。因此域名结构为:三级域名.二级域名.一级域名。
这里的查询过程是包含递归查询和迭代查询的,客户端主机发送给本地服务器的查询是递归查询,然后面的三个查询是迭代查询。
不是全部域名都可以查到IP的,什么缘由你懂得
并非一个域名只能对应到一个IP地址的,IP地址是链接互联网主机的一个身份证,通常一台主机只有一个IP地址,像一些大型的网站怎么可能只有一台主机,因此多个IP是必然的。经过查询有一下几种方式来解决这个问题,本身的理解有限,只列出不深究。
由.
分隔的字符串,每一部分有特定的含义。查看域名的时候习惯是从左往右读,可是应该从右往左理解,能够参考上边www.baidu.com
的解析过程。
主要能够分类两个部分TLD和标签
顶级域名提供了最多的信息。顶级域名告诉用户通用服务背后的域名。最通用的顶级域名(.com
, .org
, .net
)不须要web服务器知足严格的标准,但一些顶级域名则执行更严格的政策。好比本地的顶级域名,如.us
,.fr
,或.sh
,能够要求必须提供给定语言的服务器或者托管在指定国家。
标签都是跟随着TLD的。一个标签能够是任何东西,从一个字母到一个句子。恰好位于TLD前面的标签也被称为二级域名 (SLD)。一个域名能够有多个标签(或者说是组件),没有强制规定必需要3个标签来构成域名。例如,www.ecnu.edu.cn
是一个正确的域名。当拥有了“上级”部分(例如qq.com
),你还能够建立另外的域名 (有时被称为 "子域名") (例如 mail.qq.com
).
在Linux中可使用whois
命令查看域名信息