浏览器发送http请求过程分析

请求过程总体流程:
域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户.
下面以Chrome浏览器访问 www.google.com 为例按流程逐个分析:css

域名解析

  1. Chrome浏览器会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有 www.google.com 对应的条目,并且没有过时,若是有且没有过时则解析到此结束。html

    注:咱们可使用 chrome://net-internals/#dns 来进行查看Chrome自身的缓存。linux

    clipboard.png

  2. 若是浏览器自身的缓存里面没有找到对应的条目,那么Chrome会搜索操做系统自身的DNS缓存,若是找到且没有过时则中止搜索解析到此结束.nginx

    注:以Windows系统为例,能够在命令行下使用 ipconfig /displaydns 来进行查看操做系统自身的DNS缓存
    clipboard.pngchrome

  3. 若是在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,若是有则解析成功。浏览器

    clipboard.png

  4. 若是在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(通常是电信运营商提供的,也可使用像Google提供的DNS服务器)发起域名解析请求(经过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给咱们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过时,则解析成功。若是没有找到对应的条目,则有运营商的DNS代咱们的浏览器发起迭代DNS解析请求,它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),找打根域的DNS地址,就会向其发起请求(请问 www.google.com 这个域名的IP地址是多少啊?),根域发现这是一个顶级域com域的一个域名,因而就告诉运营商的DNS我不知道这个域名的IP地址,可是我知道com域的IP地址,你去找它去,因而运营商的DNS就获得了com域的IP地址,又向com域的IP地址发起了请求(请问www.google.com这个域名的IP地址是多少?),com域这台服务器告诉运营商的DNS我不知道www.google.com这个域名的IP地址,可是我知道www.google.com这个域的DNS地址,你去找它去,因而运营商的DNS又向www.google.com这个域名的DNS地址(这个通常就是由域名注册商提供的,像万网,新网等)发起请求(请问www.google.com这个域名的IP地址是多少?),这个时候www.google.com域的DNS服务器一查,诶,果然在我这里,因而就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.google.com这个域名对应的IP地址,并返回给Windows系统内核,内核又把结果返回给浏览器,终于浏览器拿到了www.google.com 对应的IP地址,该进行一步的动做了。
    运营商dns --> 根域名服务器 --> 顶级域名服务器 --> 域名注册商服务器缓存

发起TCP的3次握手

拿到域名对应的IP地址以后,User-Agent(通常是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(经常使用的有httpd,nginx等)80端口发起TCP的链接请求。这个链接请求(原始的http请求通过TCP/IP4层模型的层层封包)到达服务器端后(这中间经过各类路由设备,局域网内除外),进入到网卡,而后是进入到内核的TCP/IP协议栈(用于识别该链接请求,解封包,一层一层的剥开),还有可能要通过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终创建了TCP/IP的链接。服务器

TCP三次握手

三次握手抓包截图:多线程

图片描述
图片描述
图片描述

创建TCP链接后发起http请求

进过TCP3次握手以后,浏览器发起了http的请求,使用的http的方法 GET 方法,请求的URL是 / ,协议是HTTP/1.1google

图片描述

http请求报文格式

clipboard.png

服务器端响应http请求,浏览器获得html代码

http响应报文格式

0Z42Q020-1.png

http状态码

分类 分类描述
1** 信息,服务器收到请求,须要请求者继续执行操做
2** 成功,操做被成功接收并处理
3** 重定向,须要进一步的操做以完成请求
4** 客户端错误,请求包含语法错误或没法完成请求
5** 服务器错误,服务器在处理请求的过程当中发生了错误

浏览器解析html代码,并请求html代码中的资源

浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每一个浏览器的线程数不同),这个时候就用上keep-alive特性了,创建一次HTTP链接,能够请求多个资源,下载资源的顺序就是按照代码里的顺序,可是因为每一个资源大小不同,而浏览器又多线程请求请求资源,因此显示的顺序并不必定是代码里面的顺序。

浏览器在请求静态资源时(在未过时的状况下),向服务器端发起一个http请求(询问自从上一次修改时间到如今有没有对资源进行修改),若是服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。

详细的浏览器工做原理请看:http://kb.cnblogs.com/page/12...

浏览器对页面进行渲染呈现给用户

最后,浏览器利用本身内部的工做机制,把请求到的静态资源和html代码进行渲染,渲染以后呈现给用户。

参考文献:
一次完整的HTTP事务是怎样一个过程?
百科 - HTTP头字段

相关文章
相关标签/搜索