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

前几天有童鞋留言想看一些测试开发面试中容易问到的问题 。 那么这绝对是一个经典的面试题目 , 可以很好的考察面试者对网络和协议的理解程度 , 那么废话少说 , 开始吧 。
【测试开发栈在浏览器中输入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服务器返回给浏览器客户端 。


推荐阅读