文章目录
我们经常通过浏览器访问各大网站,比如www.baidu.com,但是当我们在浏览器中输入www.baidu.com之后,敲下回车 后,浏览器背后到底发生了什么呢?我们又是如何看到百度首页的呢?
本文以www.baidu.com这个网站为例作说明
浏览器背后大致可以分为以下几个步骤:
- 浏览器分析超链接中的url
- 浏览器向dns服务器请求解析网址www.baidu.com对应的IP地址
- dns将解析出的IP地址返回浏览器
- 浏览器与服务器通过三次握手建立tcp连接
- 浏览器向服务器发送HTTP请求报文
- 服务器处理请求并返回HTTP响应报文,将百度的HTML文件返回给浏览器
- 浏览器执行百度的HTML文件,解析渲染页面,将百度的首页展现出来
- 通过四次挥手,浏览器和服务器断开TCP连接
第一步:浏览器解析url
浏览器会对我们输入的url进行解析,主要将其分为下部分:协议、网络地址、资源路径。
其中协议是从该计算机获取资源的方式,常见的是HTTP,HTTPS,FTP等。网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;
例如URL:https://tieba.baidu.com/f?kw=分析&fr=fenter&prequery=浏览器分析超链接中的url
- 协议:https
- 网络地址:tieba.baidu.com
- 资源路径:f?kw=分析&fr=fenter&prequery=浏览器分析超链接中的url
第二步:DNS域名解析
DNS(Domain Name Service)即域名服务。域名是由"主机名+域名"。一个域名可以对应多个主机,并且域名是全球唯一的。
为什么要进行域名解析呢?
域名虽然更易被用户所接受和使用,但计算机只能识别纯数字构成的IP地址,不能直接读取域名。因此要想达到访问效果,就需要将域名翻译成IP地址。而DNS域名解析承担的就是这种翻译效果。
域名分为根域、顶级域、一级域、二级域等组成,其构造为一个树状图。
DNS域名解析过程
- 客户端首先查看浏览器缓存,看有没有该域名对应的IP地址
- 如果没有的话,查看本地host文件,看有没有该域名对应的IP地址
- 如果没有的话,客户端向本地域名服务器进行递归查询,查询该域名对应的IP地址
- 如果还是没有的话,本地域名服务器向根域名服务器进行迭代查询,根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器
- 本地域名服务器再向顶级域名服务器查询,顶级域名服务器要么给出所要查询的IP地址,要么告诉本地服务器下一步应该向哪一个权限域名服务器进行查询
- 本地域名服务器向权限域名服务器进行查询,然后得到了所要解析的IP地址
- 本地域名服务器将该域名和对应的IP地址写入自身缓存,然后将解析的IP地址返回给客户端
大致流程可以表示为下图:
递归查询和迭代查询的区别
- DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。
- DNS递归名称解析: 在DNS递归名称解析中,当所配置的本地名称服务器解析不了时,后面的查询工作是由本地名称服务器替代DNS客户端进行的(以“本地名称服务器”为中心),只需要本地名称服务器向DNS客户端返回最终的查询结果即可。
- DNS迭代名称解析:(或者叫“迭代查询”)的所有查询工作全部是DNS客户端自己进行(以“DNS客户端”自己为中心)。在条件之一满足时就会采用迭代名称解析方式:
- 在查询本地名称服务器时,如果客户端的请求报文中没有申请使用递归查询,即在DNS请求报头部的RD字段没有置1。相当于说“你都没有主动要求我为你进行递归查询,我当然不会为你工作了”。
- 客户端在DNS请求报文中申请使用的是递归查询(也就是RD字段置1了),但在所配置的本地名称服务器上是禁用递归查询(DNS服务器一般默认支持递归查询的),即在应答DNS报文头部的RA字段置0。
第三步:DNS将解析了的域名返回给浏览器
第四步:浏览器与服务器建立三次握手
详细步骤可查看TCP三次握手的具体内容 TCP三次握手四次挥手
第五步:浏览器向服务器发送HTTP请求报文
浏览器与服务器建立连接之后,便可以传送数据了。浏览器先向服务器发送一个请求报文,报文的格式如下:
- 请求行:方法、URL、版本
-
- 常见的方法有:GET、POST、PUT、DELETE等
- 常见的版本有:HTTP1.0、HTTP1.1、HTTP2.0等
- 首部行:用来说明浏览器、服务器或报文主体的一些信息的首部字段
常见的首部字段有:
-
- Connection:连接,可分为长连接和连接断开
-
- Host:服务器IP或者域名
-
- User-Agent:浏览器的相关信息(包括浏览器内核、版本等)
-
- Accept-Language:浏览器能够识别的语言
-
- cookie:是一个可选字段–》携带的信息
- 实体主体:Entity body
第六步:服务器给浏览器发送HTTP响应报文以及百度首页的HTML文件
服务器给浏览器发送的响应报文格式如下:
- 状态行:其中最重要的是状态码,状态码可以告知浏览器的请求是否成功,以及一些常见的报错信息。HTTP状态码一共有5种类型,1开头的表示请求正在处理,2开头的表示请求正常处理完毕,3开头的表示重定向,需要进行后续操作才能完成请求,4开头的表示客户端请求报文错误,5开头的表示服务器端错误
常见的状态码有:- 200表示请求成功
- 301表示永久重定向
- 302表示临时重定向
- 403表示服务器禁止访问
- 404表示资源未找到
- 502 bad gateway 表示网关错误,一般是指代理服务器后端的真实服务器节点配置出错或者宕机了
- 504 gateway time-out 表示网关超时,一般是指真实服务器处于过载状态,目前处理的请求报文过多
- 首部行:用来说明浏览器、服务器或报文主体的一些信息的首部字段
常见的首部字段有:
-
- Date:响应时间
-
- Server:服务器名称
-
- Content-type:内容的类型
- 实体主体
第七步:浏览器渲染HTML页面
你可能会发现,同一个网站,使用的浏览器不同,打开之后的呈现效果也可能会有细微的差别。这并不是网页源代码的问题,服务器给所有浏览器返回的都是同一个HTML页面,但是不同浏览器背后的渲染机制不同,所以最终呈现的效果也会有所不同
第八步:浏览器和服务器四次挥手,断开连接
此处的详细步骤可参考TCP四次挥手的内容:TCP三次握手四次挥手
本文某些图片内容来自网上查找,如有侵权,请联系我删除!