用户请求网站的流程——详细分析

久未见 提交于 2020-02-20 13:07:22

        ~~~~~~~~因为想要面对一个新的开始,一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些,就不叫新的开始,而叫逃亡。 ​​​​
                                                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ————玛丽亚·杜埃尼亚斯

我们经常使用浏览器上网查询资源,看到网页从空白到丰满,这可能是一瞬间,也有可能要几秒钟或者直接弹出错误等。那么这背后的工作流程究竟是怎样的呢?接下来以访问www.baidu.com为例,进行一个流程的分析。

访问流程简述

当用户在浏览器地址中输入www.baidu.com时,需要经历如下几个流程:DNS域名解析——>建立tcp三次握手——>客户端发出http请求——>服务端发出http响应——>tcp四次挥手断开连接

DNS域名解析

DNS被称为域名解析系统,主要作用就是负责将域名解析为对应的IP地址(当然还有反向解析,即将ip解析为域名,一般很少用)。比如解析一下百度
在这里插入图片描述
在DNS解析中分为两种查找方式:递归查询和迭代查询
递归查询:由DNS客户端发起,一级一级的向上提交查询申请,直到查询结束
迭代查询:在DNS服务器之间完成,即本地DNS向上一级DNS提交查询,上级DNS并不直接返回查询结果,而是告诉DNS应该去哪儿找。
在这里插入图片描述
DNS查询过程如图所示:

  1. DNS客户端首先查询自己host表,没有则向本地DNS提交查询www.baidu.com的申请
  2. 本地DNS查找自己的缓存,没有则开始向DNS根发出查找请求
  3. 根域在查找之后向本地DNS返回了.com域的DNS服务器地址
  4. 本地DNS向.com域DNS提交查询申请
  5. .com域DNS向本地DNS返回了.baidu.com域的DNS地址
  6. 本地DNS向.baidu.com域的DNS提交查询申请
  7. .baidu.com域DNS返回查询结果给本地DNS
  8. 本地DNS接收到查询结果后,首先在本地缓存一份,然后再向客户端返回查询结果

建立tcp三次握手

ip协议定义了一套自己的地址规则,它实现了路由功能,允许某个局域网A主机向另一个局域网主机B发送信息。但是ip协议只是一个地址协议,并不保证数据包的完整。那么这个时候tcp的作用就出来了,它保证数据通信的完整性和可靠性,防止丢包。
建立连接过程

  1. 客户端首先向服务器发送一个带有syn标识和seq随机数的请求报文
  2. 服务端收到后返回一个ack,ack的值为客户端的seq+1。还包含了一个syn的标识和一个seq随机数
  3. 客户端收到服务端的回应包后,再给服务端返回一个ack,ack的值就是服务端的seq+1。到此三次握手建立完成,可以开始传送数据。

客户端发出http请求

那么到这里就开始发送http请求报文了,http请求报文中主要包括:请求行、请求头部、空行、请求主体
在这里插入图片描述
如图所示,这是访问百度时抓的一个包,空行下面是请求主体,由于是get请求,所以没有内容。
报文结构分析
请求行:包括请求方法(get、post、head、put、delete等),请求数据信息,请求http协议版本(目前主流http/1.1俗称长连接,相较1.0有个自由连接keepalived)
请求头部:主要包括服务器和客户端的版本信息,还有字符集、host,媒体、语言等类型
空行:作一个分隔,代表请求头的结束,也代表请求主体的开始
请求主体:只有post几条表单时才有

服务端发出http响应

http响应报文主要也分文4个部分:起始行、响应头部、空行、响应主体
在这里插入图片描述
如图所示,这是抓取的一个响应包。
报文分析
起始行:包括http协议版本信息、响应状态码、状况说明信息
响应头部:主要包括服务器web软件版本,服务器时间,长连接还是短连接,字符集等等
空行:与请求报文空行一样
响应主体:一般为html css js等代码信息
常见的状态码有如下几种
200 代表ok
301 永久跳转
403 没权限
404 没有这个文件
500 未知的错误
502 网关错误
503 服务器超载,停机维护
504 网关超时

tcp四次挥手断开连接

当客户端与服务端通过三次握手数据传送完毕后,就需要通过四次挥手来断开连接。
过程解析

  1. client发送一个FIN和seq随机数,client进入FIN_WALT_1状态
  2. server收到FIN后,返回一个ACK给client,ACK为client的seq+1,server进入CLOSE_WAIT状态
  3. 当server剩余数据发送完毕后,向client发送FIN和seq随机数,并进入LAST_ACK状态
  4. client收到FIN后,发送一个ACK给server,ACK值为server的seq+1。至此server进入closed状态,四次挥手完成。

网站集群内部请求分析

常见的网页资源分为三种:静态网页、动态网页、伪静态

静态网页就是没有后台数据库,不含有php、jsp、asp等程序,是不进行交互的,编写的是什么显示的就是什么。

动态的网页,提供后台数据库,支持更多的功能,比如注册,登录,订单,博客等等。动态的网页并不是独立存在于服务器上的网页文件,而是当用户请求服务器上的动态程序时,服务器解析这些程序并调用数据库来返回一个完整的网页内容。

伪静态其实就是利用了rewrite(服务器重写)技术把动态变成一个静态的网站,当我们访问一个网站的时候,它会进行一个rewrite重写,再去指向真实的地址去数据库里面找。因为搜索引擎对动态网站url中的?$等特殊符号的收录存在一定问题,所以需要利用这种技术来方便搜索引擎的收录。包括seo优化提升网站的显示排名等。

访问不同类型的网页资源,有不同的访问流程
当我们访问静态网页的时候,客户端通过http协议,下载并读取服务器上的html文件,根据html页面的链接,自上而下的请求。如果是图片的话会边下载边渲染,遇到js就会加载js,当js比较复杂加载过慢,浏览器就会等待,这个时候鼠标就会转圈,称之为js阻塞。当js加载完毕之后才会显示我们看到的网页。
当我们访问一个动态网页时,用户首先发出一个请求。服务器收到这个请求后,假设服务器使用nginx。nginx就会将请求转发给php,php就会去查询数据库,根据数据库返回的值,生成一个完整的网页内容,发送给用户,用户收到之后,也是边下载边渲染,加载js,执行完毕之后,才会显示我们看到的网页。

当服务器的访问量达到亿级PV时,访问过程又有所区别了。当我们发送http请求报文,而接收这个报文的是负载均衡器。企业中常见的负载均衡器硬件的话有F5,软件的有七层的nginx,四层的有LVS。通过负载均衡器会把这个静态请求发送到后端的静态web服务器(如apache、nginx),web服务器会把这个静态请求直接响应给客户端,但是如果这个网站架构了CDN的话,那么向客户端响应的就是这个CDN缓存服务器。如果是动态网站,就需要一个动态的web服务器(如tomcat)。动态服务器就负责这些动态的请求以及程序的解析。当然当用户访问量大,此时瓶颈就是数据库的压力了,一般采用分布式缓存memcache,redis等

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!