从域名到页面 —— Web前端与后端
这个问题可归结为一个很形象的问题:
- 从你敲下www.baidu.com之后发生了什么?
从全局角度可总结为一下几点:
1,浏览器向DNS服务器查找输入URL对应的IP地址
2,DNS服务器返回网站的IP地址
3,浏览器根据IP地址与目标Web服务器在80端口上建立TCP 连接。
4,浏览器获取客户端请求页面的HTML代码。
5,浏览器在显示窗口渲染HTML文件,并进行界面控制显示
6,窗口关闭时,浏览器终止与服务器的连接
一,DNS域名解析
- 对于第1,2步的DNS域名解析,是一个服务于应用层的域名转换协议。《计算机网络—自顶向下》中对DNS有如下定义:
1) 一个由分层的DNS服务器(DNS Doimain Name System,DNS)实现 的分布式数据库。
2) 一个使得主机能够查询分布式数据库的应用层协议。 - 我们知道,用户输入的网址(域名)是IP地址的一个别名,在一个DNS内,一个域名对应一个IP地址。域名系统DNS的工作就是将域名与它的IP地址对应起来。
- DNS的工作分为以下几步:(以www.baidu.com为例)
1) 同一台用户主机上运行着DNS应用的客户端
2) 浏览器从上述URL中抽取出主机名 www.badiu.com 并将这台主机名传送给DNS应用的客户端
3) DNS 查询浏览器缓存 -> 查询系统缓存 -> 查询路由器缓存 -> 查询ISP DNS缓存。进行递归搜索,从.com顶级域名服务器到 baidu 的域名的服务器。
4) DNS 客户向服务器发送一个包含主机名的请求。
5) DNS 客户最终会收到一份回答报文,其中有对应该主机的IP地址
6) 一旦浏览器收到一份来自DNS域名服务器的该IP地址,它能够向位于该IP的80端口的HTTP服务器进程发起一个TCP连接。 - 对于其中的第3步——查询查询IP的过程中,首先查找自身缓 存,对于DNS缓存有如下解释:
共同实现DNS分布式数据库的所有DNS服务器储存了 资源记录 (Resource Record,RR),
RR提供了主机名到IP的映射,这也是为了改善时延性能并减少在因特网上到处传输的DNS报文数量。
其原理很简单:在一个请求链中,当某DNS服务器接收到一个DNS回答时,它能够将该回答中的信息缓存到本地储存器。
——《计算机网络—自顶向下》
对于其第二条——递归搜索,因为在以往的集中式设计中,客户将所有的DNS请求发往同一个DNS服务器,但对于今天用户数量巨大的因特网来说,在单一的DNS服务器上运行集中式数据库完全没有可扩展能力,因此采用了分布式数据库的设计方案:
- 一个域名服务器虽然只记录一个小的子网内的主机名和IP地址,但所有的域名服务器联合起来工作,就能将全网内的域名与它们的IP地址对应起来。这也就意味着,如果一个域名服务器无法找到某个请求域名所对应的IP地址,他就会向其他域名服务器发出请求进行寻找。
1) 根DNS域名服务器:在因特网上有13个根域名服务器,
2) 顶级域DNS服务器:如 com,org,net,edu,gov等以及所有国家 的顶级域名。
3) 权威DNS服务器:在因特网上具有公共可访问主机的域名。
二,HTML文件的获取与显示
对于上面的第3步——TCP连接的建立就跳过。
- HTML文件的请求
分析HTML文件的请求的过程其实就是分析HTTP通信的过程,在浏览器通过DNS获取到了域名对应的IP地址后,会立即给Web服务器发送一个HTTP请求:
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent: Wget/1.12 (linux-gun)
Host: www.baidu.com
Connection: close
- GET请求声明了客户端想要获取的该网址上的某一个html文件。close表示短连接,发送之后立即关闭。
请求中还包含浏览器储存的该域名的cookies,在不同的请求中,cookies是与跟踪一个网站状态相匹配的键值,cookies会储存登录用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式储存爱客户机里,每次请求时发送给服务器。
接下来服务器会发送一个HTML响应:
HTTP/1.0 200 OK
Server: BWS/1.0
Connect-Length: 8024
Connect-Type: text/html;charset =gbk
Set-Cookies: ............................
Via: 1.0 localhost (squid/3.0 STABLE18)
服务器回复200 OK表示请求成功,Connect-Type: text/html表示让浏览器将该响应以HTML形式呈现,而不是以文形式下载它。
接下来会对这个HTML文件进行解析并呈现出来。
所以综上所述,可以将开头的步骤细化一下:
1,浏览器获得URL对应的请求,向操作系统请求该URL对应的IP地址
2,操作系统查询DNS(首先查询本地host文件,没有则查询网络)获得对应的IP地址
3,浏览器发送TCP连接的请求向IP地址对应的服务器(带SYN表示的数据包)
4,服务器收到TCP连接的请求后,回复可以连接请求(带有SYN/ACK标志的数据包)
5,浏览器收到回传的数据,确认OK后,还会向服务端发送数据(带ACK标志的数据包),表示三次握手结束。
6,三次握手成功以后,浏览器和服务器端开始TCP连接形式传输数据包。
7,服务器传给浏览器所需要的资源数据
8,浏览器获得数据,渲染王永强然后呈现给用户。