在浏览器中输入URL地址并回车后都发生了什么?

前几天有童鞋留言想看一些测试开发面试中容易问到的问题 。 那么这绝对是一个经典的面试题目 , 可以很好的考察面试者对网络和协议的理解程度 , 那么废话少说 , 开始吧 。
1.解析URL
要解析URL , 肯定先要了解URL的结构(这个在之前的接口自动化测试系列有分享过 , 有兴趣的可以去翻翻历史文章) , 这里就直接给出一个标准的URL结构:http://www.baidu.com:80/news/index.html?uid=5&sid=24618&page=1#tab1简单解释一下 , 80端口默认可以不显示 , “?”到“#”之间跟着参数 , 多个参数使用“&”连接 , “#”后面跟着锚(常见的锚如页签tab) 。 当在浏览器中输入URL后 , 浏览器首先对拿到的URL进行识别 , 抽取出域名字段 , 然后进行域名解析 。 2.域名解析
域名解析也叫DNS解析 , DNS实际上就是一个域名和服务器IP对应的数据库 , 由于IP地址通常都难以记住 , 但机器间交互却只认IP地址 , 于是聪明的人类就发明了域名 , 让域名与IP地址之间一一对应 , 它们之间的转换工作称为域名解析 , 域名解析需要由专门的域名解析服务器来完成 , 整个过程是自动进行的 。 在进行DNS解析时 , 会经历以下步骤:
查询浏览器缓存(浏览器会缓存之前拿到的DNS2-30分钟时间) , 如果没有找到就进行下一步;
检查系统缓存:检查hosts文件 , 这个文件保存了一些以前访问过的网站的域名和IP的数据 。 它就像是一个本地的数据库 。 如果找到就可以直接获取目标主机的IP地址了 。 没有找到的话 , 需要进行下一步去检查路由器缓存;
检查路由器缓存:路由器有自己的DNS缓存 , 可能就包括了这在查询的内容;如果没有 , 要查询网络运营服务商的DNS缓存;
查询ISPDNS缓存:ISP服务商DNS缓存(本地服务器缓存)那里可能有相关的内容 , 如果还不行的话 , 需要进一步的递归查询;
递归查询:从根域名服务器到顶级域名服务器再到极限域名服务器依次搜索哦对应目标域名的IP 。
借一张网图来直观表达一下这个过程:
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
通过以上的系列查找 , 就可以获取到域名对应的IP了 。 接下来就是向该IP地址定位的HTTP服务器发起TCP连接 。 3.浏览器与服务器建立TCP连接
浏览器(客户端)与目标服务器需要建立TCP连接 , 这样才能通信 , 这就需要涉及到TCP连接经典的“三次握手”过程了 。 过程如下:
第一次握手:客户端向服务器端发送请求(SYN=1)等待服务器确认;
第二次握手:服务器收到请求并确认 , 回复一个指令(SYN=1 , ACK=1);
第三次握手:客户端收到服务器的回复指令并返回确认(ACK=1) 。
也找一张网图来直观表示一下这一过程:
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
通过三次握手 , 就成功建立了客户端和服务器之间的连接 , 那么客户端就可以愉快的和服务器之间发起请求和传输数据了 。 4.浏览器发送HTTP请求
又要回到第一步的URL解析部分了 , 之前URL解析除了域名还有后面的参数等信息 , 那么这一环节就需要用到这个信息了 。 这里我们看一下请求报文的头部信息(chrome浏览器按下F12):
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
我们可以看到请求行包含了请求方法、URI、HTTP版本 。 首部字段传递重要信息 , 包括请求首部字段、通用首部字段和实体首部字段 。 我们可以从报文中看到发出的请求的具体信息 。 具体每个首部字段的作用 , 这里就不做进一步阐述 。 5.服务器处理请求并响应
浏览器发起了请求 , 那么正常情况下服务器就会处理请求 , 并给出对应的响应 。 服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求 , 诸如Apache、Ngnix、IIS等 。 web服务器解析用户请求 , 知道了需要调度哪些资源文件 , 再通过相应的这些资源文件处理用户请求和参数 , 并调用数据库信息 , 最后将结果通过web服务器返回给浏览器客户端 。
毫无疑问 , 有请求肯定就会有响应 , 哪怕是错误的请求也会有对应的响应 , 响应报文中包含了HTTP状态码 , 它可以直观的表达这次请求的结果 , 简单列举一下:
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
老规矩 , 也找一张图来表示一下这个请求-响应过程:
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
6.关闭TCP连接
为了通信前面客户端与服务端有建立TCP连接 , 那么同样的为了避免服务器与客户端双方的资源占用和损耗 , 当双方没有请求或响应传递时 , 任意一方都可以发起关闭请求(长连接的情况这里暂时不考虑) 。 与创建TCP连接的3次握手类似 , 关闭TCP连接 , 需要4次握手 。
在浏览器中输入URL地址并回车后都发生了什么?
文章图片
上图可以这么理解:客户端:“兄dei , 我这边没数据要传了 , 咱关闭连接吧 。 ”服务端:“收到 , 我看看我这边有木有数据了 。 ”服务端:“兄dei , 我这边也没数据要传你了 , 咱可以关闭连接了 。 ”客户端:“OK 。 ”7.浏览器渲染页面
数据返回回来了 , 那么浏览器就需要将响应结果展示出来 , 这就是一个页面渲染的过程 。 准确地说 , 浏览器需要加载解析的不仅仅是HTML , 还包括CSS、JS 。 以及还要加载图片、视频等其他媒体资源 。 这个过程涉及较深的前端知识 , 就不做过多的深入介绍 , 大家知道浏览器最后需要布局渲染才会生成我们最终看到的页面就行了 。
【在浏览器中输入URL地址并回车后都发生了什么?】ok , 这就是整个过程了 , 面试时真正能讲全讲到点的也不是那么容易 , 大家可以仔细看看 , 慢慢消化一下 , 将这个流程印在自己的脑海中……


    推荐阅读