文章目录
从浏览器输入URL到浏览器显示页面发生了什么,这是面试中经常会被问到的题目,今天我们就详细看看每个流程执行的细节
URL解析
URL是什么
URL全名叫统一资源定位符
,uniform resource Locator,字面上来理解,它就是用来定位资源
的。相当于图书上面的标签,有了这些标签,管理员可以很快的找到相应的图书。
一个完整的URL包括以下信息
【协议
、网络(IP)地址
、端口
、资源路径
、文件名
、动态参数
】
-
协议/模式
(scheme)是从该计算机获取资源
的方式
一般有Http、Https、Ftp、File、Mailto、Telnet、News等协议,不同协议有不同的通讯内容格式,协议主要作用是告诉浏览器如何处理将要打开的文件; -
网络地址
指示该连接网络上哪一台计算机(服务器),可以是域名或者IP地址,域名或IP地址后面有时还跟一个冒号
和一个端口号
-
端口
端口号
如果地址不包含端口号,根据协议的类型会确定一个默认端口号
。端口号之于计算机就像窗口号之于银行,一家银行有多个窗口,每个窗口都有个号码,不同窗口可以负责不同的服务。端口只是一个逻辑概念,和计算机硬件没有关系。一般如果你的端口号就是默认的,那么url是不需要输入端口号的,但如果你更改了默认端口号,你就必须要在url后输入新端口号才能正常访问。例如:http协议默认端口号是80。如果你输入的url是http://www.zhihu.com:8080/ ,那表示不使用默认的端口号,而使用指定的端口号8080。如果使用的就是默认端口号那么输入http://www.zhihu.com:80 和http://www.zhihu.com是一样的。有个特殊情况有所不同,比如本地IP 127.0.0.1 其实走的是 loopback,和网卡设备没关系。 -
资源路径
指示从服务器上获取哪一项资源的等级结构路径,以斜线/分隔; -
文件名
一般是需要真正访问的文件,有时候,URL以斜杠“/”结尾,而隐藏了文件名,在这种情况下,URL引用路径中最后一个目录中的默认文件(通常对应于主页),这个文件常被称为 index.html 或 default.htm
。 -
动态参数
有时候路径后面会有以问号?
开始的参数,这一般都是用来传送对服务器上的数据库进行动态询问时所需要的参数,有时候没有,很多为了seo优化,都已处理成伪静态了。要注意区分url
和路由
的区别。
URL完整格式为:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
注意
上面讲述的URL完整内容及具体含义,实际在浏览器进行URL解析的过程中,还要对URL进行的的访问限制
,安全检测
,缓冲大小
,证书验证
等
DNS解析
这篇博客中详细介绍了DNS解析原理及过程,这里就大致介绍一下,过程中的重点概念我会标出,有些会详解介绍,有些可以自行百度
DNS解析的主要过程: 域名解析的过程是一个递归查询
,浏览器缓冲
(DNS 在各个层级都有缓存的,相应的,缓存当然有过期时间,Time to live
[TTL])、操作系统缓存
(本地硬盘的hosts文件)、路由器缓冲
、ISP DNS缓冲
、接下来的过程是一个迭代查询
,本地域名服务器不断给上层发送请求(可能要经过一次或者多次转发),本地域名服务器
、根域名服务器
、顶级域名服务器
、权限域名服务器
顺便一提,
根服务器
是互联网域名解析系统DNS中最高级别的域名服务器,全球一共13
组,每组都只有一个主根名称服务器采用同一个IP。注意不是13个,前期是个现在已经是集群了,据说已经有上千台了,好多台用于负载均衡,备份等,全球有386台根物理服务器,被编号为A到M共13个标号。中国包括台港也持有其中5组14台辅根服务器或叫镜像也可以,386台根服务器总共只使用了13个IP,因此可以抵抗针对其所进行的分布式拒绝服务攻击DDoS。具体情况可以参看维基百科的 根域名服务器 条目)
DNS递归查询和迭代查询的区别?
递归查询是以本地名称服务器为中心的,是DNS客户端和服务器之间的查询活动,递归查询的过程中“查询的递交者” 一直在更替,其结果是直接告诉DNS客户端需要查询的网站目标IP地址。
迭代查询则是DNS客户端自己为中心的,是各个服务器和服务器之间的查询活动,迭代查询的过程中“查询的递交者”一直没变化,其结果是间接告诉DNS客户端另一个DNS服务器的地址。
DNS劫持
我们在浏览网页不畅时,有一种解决方法是将DNS修改114.114.114 或者8.8.8.8 。这么做的原因是,浏览器访问期间经过的程序非常多,需要一级一级得寻找缓存,其中有一级缓存出现问题,那么访问的页面就会有偏差。我们将DNS修改成114.114.114或者8.8.8.8,让浏览器直接访问dns服务器,减少中间环节。改成这样之后浏览器就不从ISP找,而是是从谷歌DNS(8.8.8.8)或者114 DNS(114.114.114)里面找。
扩展文章
什么是DNS劫持?
什么是301重定向? 301重定向设置
根域名服务器的作用是什么?全球 13 组根域名服务器中有 10 组在美国,意味着什么?
递归和迭代的区别?
局域网IP和公网IP有啥差别?
应用层客户端发送HTTP请求
互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。分层由高到低分别为:应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端从数据链路层网上走。如图所示:
从上面的步骤中得到 IP 地址后,浏览器会开始构造一个 HTTP 请求,应用层客户端向服务器端发送的HTTP请求包括:请求报头和请求主体两个部分,其中请求报头(request header)包含了至关重要的信息,包括请求的方法(GET / POST和不常用的PUT / DELETE以及更不常用的HEAD / OPTION / TRACE,一般的浏览器只能发起 GET 或者 POST 请求)、目标url、遵循的协议(HTTP / HTTPS / FTP…),返回的信息是否需要缓存,以及客户端是否发送Cookie等信息。需要注意的是,因为 HTTP 请求是纯文本格式的,所以在 TCP 的数据段中可以直接分析 HTTP 文本的
传输层TCP传输报文
当应用层的 HTTP 请求准备好后,浏览器会在传输层发起一条到达服务器的 TCP 连接,位于传输层的TCP协议为传输报文提供可靠的字节流服务。它为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还原报文信息。TCP协议通过“三次握手”
等方法保证传输的安全可靠。“三次握手”的过程是,发送端先发送一个带有SYN
(synchronize)标志的数据包给接收端,在一定的延迟时间内等待接收的回复。接收端收到数据包后,传回一个带有SYN/ACK
标志的数据包以示传达确认信息。接收方收到后再发送一个带有ACK
标志的数据包给接收端以示握手成功。在这个过程中,如果发送端在规定延迟时间内没有收到回复则默认接收方没有收到请求,而再次发送,直到收到回复为止。
网络层IP协议查询MAC地址
IP协议的作用是把TCP分割好的各种数据包封装到IP包里面传送给接收方。而要保证确实能传到接收方还需要接收方的MAC地址,也就是物理地址才可以。IP地址和MAC地址是一一对应的关系,一个网络设备的IP地址可以更换,但是MAC地址一般是固定不变的。ARP协议可以将IP地址解析成对应的MAC地址。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,在中转的过程中需要通过下一个中转站的MAC地址来搜索下一个中转目标。
数据到达数据链路层
在找到对方的MAC地址后,已被封装好的IP包再被封装到数据链路层的数据帧结构中,将数据发送到数据链路层传输,再通过物理层的比特流送出去。这时,客户端发送请求的阶段结束。
这些分层的意义在于分工合作,数据链路层通过 CSMA/CD 协议保证了相邻两台主机之间的数据报文传递,而网络层的 IP 数据包通过不同子网之间的路由器的路由算法和路由转发,保证了互联网上两台遥远主机之间的点对点的通讯,不过这种传输是不可靠,于是可靠性就由传输层的 TCP 协议来保证,TCP 通过慢开始,乘法减小等手段来进行流量控制和拥塞避免,同时提供了两台遥远主机上进程到进程的通信,最终保证了 HTTP 的请求头能够被远方的服务器上正在监听的 HTTP 服务器进程收到,终于,数据包在跳与跳之间被拆了又封装,在子网与子网之间被转发了又转发,最后进入了服务器的操作系统的缓冲区,服务器的操作系统由此给正在被阻塞住的 accept 函数一个返回,将他唤醒。
服务器端接收数据并响应请求
这个过程涉及后端知识,诸如有MVC
、反向代理Nginx
等。返回静态资源、动态数据的请求,系统可能需要调用不同的数据API。
关闭TCP连接
TCP四次挥手
的过程
浏览器处理数据信息并渲染页面
加载DOM树,处理返回的数据,执行JS代码。更多浏览器的工作原理这里就不详述了,可以自行查询资料学习。