详解浏览器解析一个URL的全过程
目录
1、浏览器解析url
2、DNS域名解析
3、浏览器获取端口号
4、TCP建立连接
5、发送HTTP请求
6、服务器处理请求
7、返回响应结果
8、关闭TCP连接
9、浏览器加载解析渲染
先概括一下整个过程:
首先,浏览器向本地DNS服务器发送请求,如果本地没有缓存该域名的IP地址,就需要通过递归或迭代的方式向根域名服务器、顶级域名服务器、权威域名服务器发起查询请求,直至返回一个IP地址给浏览器。然后根据该IP地址建立TCP连接,客户端发送HTTP请求,服务器返回报文,关闭TCP连接,再由浏览器进行解析渲染页面,最后TCP四次挥手结束连接(404:服务器找不到请求的页面)
应用层:DNS、HTTP、HTTPS
传输层:TCP
网络层:IP、ARP
1、浏览器解析url
浏览器会对我们输入的url进行解析,主要将其分为下部分:协议、网络地址、资源路径。其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;协议是从该计算机获取资源的方式,常见的是HTTP,HTTPS,FTP等。不同协议有不同的通讯内容格式;资源路径指示从服务器上需要获取资源的具体路径。
这里浏览器对输入的url解析为如下内容:
url:https://mp.csdn.net/mp_blog/creation/editor/119778557
协议:https
网络地址(网站名):mp.csdn.net
资源路径:/mp_blog/creation/editor/119778557
2、DNS域名解析
客户端收到你输入的域名地址后,它首先去找本地的hosts文件,检查在该文件中是否有相应的域名、IP对应关系,如果有,则向其IP地址发送请求,如果没有,再去找DNS服务器。一般用户很少去编辑修改hosts文件。
可以理解ip是你家的具体住址 如南京市建邺区吉庆家园04栋603室
DNS服务器层级如下:
DNS查询的具体步骤如下:
a、从浏览器缓存中查询。浏览器会存储一定时间的DNS记录,操作系统不会告诉浏览器每个DNS记录的保存时限,不同浏览器设置保存时限为一个固定值(不同浏览器情况不同,一般在2-30分钟)。
b、从操作系统缓存中查询。如果浏览器中没有包含想要的缓存记录,那浏览器就会发起操作系统请求,继续查询操作系统缓存
c、从路由器中查询DNS缓存。请求持续发送到你的路由,它通常会有自己的DNS缓存。
d、从ISP中查询DNS缓存。下一个被查询地方是ISP缓存DNS的服务器。
e、域名服务器迭代查询,根据返回的地址逐级向上查询。首先从root域名服务器中查询如.com域名服务器,然后逐步向前查询,.com顶级域名服务器到ruanyifeng的域名服务器。一般来说,.com级别的都已经在缓存中了,所以一般不会进行对root域名服务器的查询。下面给出一张迭代查询的图。
浏览器客户端向本地DNS服务器发送一个含有域名https://mp.csdn.net的DNS查询报文。
本地DNS服务器把查询报文转发到根DNS服务器,根DNS服务器注意到其com后缀,于是向本地DNS服务器返回comDNS服务器的IP地址。
本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其https://mp.csdn.net后缀并用负责该域名的权威DNS服务器的IP地址作为回应。
最后,本地DNS服务器将含有https://mp.csdn.net的IP地址的响应报文发送给客户端。
从客户端到本地服务器属于递归查询,而DNS服务器之间的交互属于迭代查询。
正常情况下,本地DNS服务器的缓存中已有comDNS服务器的地址,因此请求根域名服务器这一步不是必需的。
3、浏览器获取端口号
知道ip地址后,还需要端口号,这样才能知道具体在603室的哪个房间里。http协议默认端口号是80。
4、TCP建立连接
IP和端口都有了,在http消息发送前,需要建立客户端与服务器的TCP链接,也就是进行所谓的三次握手。
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,
等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,
TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP三次握手的过程如下:
a、客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
b、服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
c、客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
5、发送HTTP请求
经过三次握手之后,与服务器建立了连接后,就可以向服务器发起请求了。
6、服务器处理请求
请求到达服务器之后,接下来服务器需要响应浏览器的请求。服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。下面以静态渲染的页面为例,ajax渲染不需要在服务器做页面数据写入
7、返回响应结果
在HTTP里,有请求就会有响应,哪怕是错误信息。这里我们同样看下响应报文的组成结构:
在响应结果中都会有个一个HTTP状态码,比如我们熟知的200、301、404、500等。通过这个状态码我们可以知道服务器端的处理是否正常,并能了解具体的错误。
状态码由3位数字和原因短语组成。根据首位数字,状态码可以分为五类:
8、关闭TCP连接
为了避免服务器与客户端双方的资源占用和损耗, 当双方没有请求或响应传递时,任意一方都可以发起关闭请求。
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭(half-close)造成的。具体过程如下图所示。
(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。
注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。
9、浏览器加载解析渲染
详解浏览器解析一个URL的全过程相关推荐
- 详解浏览器打开一个页面的过程
前言:在讲解浏览器打开页面过程之前,我们先了解下浏览器进程线程,这些知识点都是必要的铺垫 线程与进程 首先要说明的就是进程与线程的关系,这个只是大概讲一下不必深入的导论,如果想在服务端方面做深入研究的 ...
- 详解浏览器缓存 前端开发必会
详解浏览器缓存 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一个数据请求来 ...
- 详解HTTP的文件上传全过程(RFC1867协议)
详解HTTP的文件上传全过程:RFC1867协议 HTTP请求头 HTTP请求体 什么是 multipart/form-data 上传文件信息的内容组成 原生Node实现客户端上传文件 原生Golan ...
- 详解Java解析XML的四种方法
http://developer.51cto.com 2009-03-31 13:12 cnlw1985 javaeye 我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...
- java cache-control_详解浏览器Cache-Control缓存策略
原来用的是 Expires 策略,浏览器可以直接从浏览器缓存读取数据,而无需再次请求,它的值对应一个 GMT,来告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求. 例如下面的例子,这是京东的首 ...
- 【计算机网络漫游】浏览器输入一个URL后发生了什么
浏览器输入一个URL之后发生了什么?这个问题一直是一个非常经典的问题,透过这个问题,我们可以从数据包的角度,自顶向下 (也可以自底向上) 地理解计算机网络各层发生的事情,同时也是一个面试的热点问题.但 ...
- 详解浏览器的事件系统
详解浏览器的事件系统 一.事件 二.事件类型 三.事件对象 四.事件流 五.注册事件 一.事件 意义:JavaScript 与 HTML 之间的交互是通过事件完成的.通俗点说事件是实现浏览器与用户交互 ...
- php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程
php解析xml方法实例详解,解析xml实例详解 本文以实例形式详细讲述了php解析xml方法.分享给大家供大家参考.具体分析如下: books.xml文件如下: Harry Potter J K. ...
- 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...
[索引页] [×××] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者:webabcd 介绍 Silverlight 2.0 ...
最新文章
- python读取xml文件报错ValueError: multi-byte encodings are not supported
- guava cache简单学习笔记
- Objective-C字符串处理的函数
- 专栏 | 基于 Jupyter 的特征工程手册:特征选择(二)
- 网络请求的基本知识《极客学院 --AFNetworking 2.x 网络解析详解--1》学习笔记...
- 阿里巴巴数据分析沙龙 杭州站圆满召开
- Jamie and Tree[CF916E]
- 怎样自动提取邮件的内容_这些最新的外贸搜索开发工具(图灵搜、谷歌搜索提取工具、易查查),你会使用吗?...
- java mongodb gridfs_查询MongoDB GridFS元数据(Java)
- 用 TigerVNC 实现 Linux 远程桌面
- 数据同步框架MS Sync Framework-不同场景使用例子和简要分析
- Python使用XGBoost
- 网络电话坐享iOS10红利 iphone7免费通话
- IDEA SpringBoot多模块项目搭建详细过程(转)
- java使用itext7生成pdf
- Xposed 之旅 -- 微信防撤回
- ActiveX控件原理及手动修改
- 原子结构示意图全部_所有原子结构示意图
- ubuntu从源码编译安装python
- matlab subs eval,【荐】MATLAB求解符号表达式数值的方法:subs函数