http请求过程分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Justnow_/article/details/52354406

http请求过程

   本文是参考了多篇博客,并结合自身工作中遇到的实际问题总结过后写出来的,希望能帮助到有兴趣关注这个的人
   此处以访问百度首页为例,当我们在浏览器地址栏中输入http://www.baidu.com并回车后,我们马上能看到百度的首页,虽然这个过程很短,但这背后究竟发生了什么呢?
现简要地理一下这背后的执行流程:

  • 1.域名解析
  • 2.客户端浏览器发送http请求
  • 3.服务器响应http请求,并向客户端浏览器返回html代码
  • 4.客户端浏览器得到html代码并进行解析,同时请求html代码中的所包含的资源,例如js、css样式表、图片等
  • 5.浏览器对整个页面进行渲染,并将渲染后的页面呈现给用户



下面逐一进行分析

域名解析

当我们访问www.baidu.com这个域名时,实际上浏览器不知道它是啥(浏览器事先缓存的不作考虑),浏览器真正需要的是IP地址,你给浏览器IP,它就根据这个IP去寻找对应的服务器,并尝试建立连接(所以说你在地址栏里直接输入百度对应的ip地址也是可以访问的)。那为什么浏览器最终识别了www.baidu.com并访问成功了呢?嗯,这个时候就得靠DNS了(DomainNamingSystem),说简单点,它就是一个根据域名获取对应ip的服务器。那么我们再来看看,当我们访问www.baidu.com时,域名的解析过程

  • 浏览器缓存   首先,浏览器会优先查找浏览器自身DNS缓存,如果找到了便直接利用找到的ip并建立连接(浏览器缓存DNS的时间比较短,通常是1到30分钟,且能缓存的数量有限,不同的浏览器厂商设置的初值也 有所不同)
  • 系统缓存    当浏览器缓存找不到域名对应的ip,接下来浏览器便会做一个系统调用(win系统是gethostname),于是从系统缓存中获取域名对应的ip.顺便说一下,win系统中host的设置在C:\Windows\System32\drivers\etc\hosts中,譬如你可以设置 127.0.0.1 www.baidu.com,当然你这样设置后,下次再访问www.baidu.com,那就不会再出现百度的首页了,很有可能是404(微笑脸<( ̄︶ ̄)>)
  • 路由器缓存   若是系统缓存找不到,紧接着便将查询请求发至路由器,路由器通常会有自己的缓存
  • ISP DNS缓存   当路由器缓存没找到,则转向ISP的DNS服务器,在这一步,通常是可以找到相应的缓存记录的。ISP的DNS服务器会从根域名服务器开始进行递归的搜索,从顶级域名.com服务器开始到baidu的域名服务器…

-倘若上诉的所有DNS缓存均没有找到www.baidu.com这个域名所对应的ip地址,那么浏览器自动给出错误信息,不同的浏览器返回的错误信息不一样,火狐的便显示为找不到服务器

Attention:

    在应用部署在局域网中,且并没有在域名注册商中进行注册时,局域网内的用户要通过域名访问服务器上的应用,那就必须得在本机的hosts文件中绑定相应的域名了,假如你在IP地址为172.168.0.413的服务器上部署了passport.co应用,你如果没有在hosts文件中绑定:

    172.168.0.413    passport.co

    那么,当你调passport的应用时,浏览器就可能找不到passport.co对应的ip地址(找到了也不是你想要调的那个应用),找不到ip地址就无法建立TCP连接,从而无法调用该服务。因此,对于局域网内部署的应用,要想调该应用,必须得让浏览器能解析出该应用(域名)所对应的ip地址


http请求

百度的动态页面在浏览器的缓存中会很快过期,因此,浏览器会将请求进一步发送到baidu的服务器,下面这是一个典型的http请求内容
请求及响应的主要内容

Request URL:https://www.baidu.com/
Request Method:GET
Status Code:200 OK
Remote Address:115.239.210.27:443

请求头–request header

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie:BAIDUID=6FC319C4992DD86CD6034F472D035D9F:FG=1;
BIDUPSID=6FC319C4992DD86CD6034F472D035D9F; PSTM=1472434929;
Host:www.baidu.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/52.0.2743.116 Safari/537.36

响应头–response header

**Connection:**keep-alive
**Content-Encoding:**gzip
**Content-Type:**text/html; charset=utf-8
**Date:**Mon, 29 Aug 2016 01:57:08 GMT
**Expires:**Mon, 29 Aug 2016 01:56:15 GMT
**Server:**bfe/1.0.8.14

    其中,涉及的主要过程是:浏览器向服务器发送请求,请求类型为GET(常用的是GET和POST,当然还有其它6种,如HEAD,DELETE,TRACE等),www.baidu.com的域名被解析后的ip地址为:115.239.210.27,服务运行的端口号为:443。百度的服务器在接收到请求后,发给客户端浏览器响应,status为响应码,其中200代表请求成功;响应的内容为:text/html;编码方式为:utf-8。
    对于响应的状态码,以下作简要介绍:

  • 1XX类:信息状态码,如100,101
  • 2XX类:成功状态码,如200:OK
  • 3XX类:重定向状态码
    301:永久重定向,由于地址栏中的url未变,故此种为隐藏重定向
    302:临时重定向,地址栏中的url会变为新的url
    304:Not Modified 未修改。举个栗子,譬如,当本地缓存的资源文件(如css,js,某些图片等)和请求服务器上的资源相比较时,发现并没有任何修改,那么服务器便会返回给浏览器一个304的状态码,也就是告诉浏览器,你本地有这些资源文件了,不用再请求我这边啦
  • 4XX类:访问错误状态码
    404:这是见得最多的吧,大名鼎鼎404—NOT FOUND,翻译过来就是浏览器请求的url资源并不存在
  • 5XX类:服务器端错误状态码
    500:Internal Server Error服务器内部错误
    502:Bad Gateway 网关(代理服务器)无法请求到后端服务器,也可以说代理服务器不可用
    504:Gateway Timeout 此状态码表明代理服务器可以连上后端服务器,但后端服务器在指定时间里没有给代理服务器做出响应

浏览器解析响应的html代码,并请求相应的资源

    浏览器获取到服务器返回的html代码后(response中可以看到)。我们假定返回的是baidu.html,浏览器获取到baidu.html后并不会马上进行渲染,它首先会去寻找html中的静态资源,倘若碰到js/css/image等静态资源时,浏览器便会继续请求服务器来下载该资源(服务器ip地址可能会不同,这个有可能用到cdn加速)。当浏览器中有该种类型的静态资源文件且服务器端未作修改时,会给浏览器返回304的状态码,从而浏览器会直接读取本地的缓存文件。

浏览器渲染页面

    当html中所需的资源全部加载完毕后,浏览器便开始渲染页面,用户所看的便是渲染过后的页面

猜你喜欢

转载自blog.csdn.net/Justnow_/article/details/52354406