0. 前言css
输入一个网址,大概是经历了域名解析、TCP的三次握手、创建TCP链接后发起HTTP请求、服html
务器响应HTTP请求、浏览器解析html代码,同时请求html代码中的资源(如js、css、图片等)、最后浏览器对
页面进行渲染并呈现给用户。下面分别介绍一下每一个过程。chrome
1. 域名解析浏览器
以Chrome浏览器为例,Chrome会解析域名对应的IP地址。缓存
(1)Chrome浏览器会首先搜索浏览器自身的DNS缓存(可使用 chrome://net-internals/#dns 来进行查看),
浏览器自身的DNS缓存有效期比较短,且容纳有限,大概是1000条。若是自身的缓存中存在blog.csdn.net 对应的
IP地址而且没有过时,则解析成功。服务器
(2)若是(1)中未找到,那么Chrome会搜索操做系统自身的DNS缓存(能够在命令行下使用 ipconfig /displaydns
查看)。若是找到且没有过时则成功。数据结构
(3)若是(2)中未找到,那么尝试读取位于C:\Windows\System32\drivers\etc下的hosts文件,若是找到对应的IP
地址则解析成功。性能
(4)若是(3)中未找到,浏览器首先会找TCP/IP参数中设置的本地DNS服务器,并请求LDNS服务器来解析这个域名
,这台服务器通常在你的城市的某个角落,距离你不会很远,而且这台服务器的性能都很好,通常都会缓存域名解
析结果,大约80%的域名解析到这里就完成了。不然本地DNS服务器会请求根DNS服务器。spa
(5)本地DNS会把请求发至13台根DNS,根DNS服务器会返回所查询域的主域名服务器的地址(.net),
本地DNS服务器使用该IP信息联系负责.net域的这台服务器。这台负责.net域的服务器收到请求后,会返回
.net域的下一级DNS服务器地址(blog.csdn.net)给本地DNS服务器。以此类推,直至找到。操作系统
2. TCP的三次握手
这个部分正好以前整理过,能够参考NetWork——关于TCP协议的三次握手和四次挥手。
https://blog.csdn.net/qzcsu/article/details/72861891
https://blog.csdn.net/seu_calvin/article/details/52966804
3. 创建TCP链接后发起HTTP请求
TCP三次握手创建链接成功后,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,
处理完业务逻辑,最后返回一个具备标准格式的HTTP响应给客户端。
SYN 创建联机(蓝牙)
ACK 确认
SEQ 序号
3.1 HTTP请求格式
HTTP请求格式以下所示四部分组成,分别是请求行、请求头、空行、消息体,每部份内容占一行。
<request-line>
<general-headers>
<request-headers>
<entity-headers>
<empty-line>
[<message-body>]
请求行:由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、URI路径、HTTP版本号。
请求头:缓存相关信息(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)、
是否支持gzip压缩,等键值对信息。
空行。
主体:客户端发给服务端的请求数据,这部分数据并非每一个请求必须的。
经常使用的GET、POST、PUT、DELETE四种请求方式中:
(1)关于GET和DELETE将要处理的资源信息直接放在了URL中。经过"?<键值对>&<键值对>“的形式追加。
HTTP RFC规范中并无规定GET请求的URL长度,只是说明若是server没法处理太长的URI,能够经过
返回414状态码。可是大多数浏览器会讲其限制在2k-8k之间。
(2)关于POST和PUT的请求参数存储在报文的主体中。每个参数都以”--boundary值“+"属性信息"+”
空行“+"参数值"的数据结构存储。请求数据的最后以”--boundary值--“的格式结尾。
3. 2 服务器响应HTTP请求
服务器接收处理完请求后返回一个HTTP响应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、
消息体。每部份内容占一行。
<status-line>
<general-headers>
<response-headers>
<entity-headers>
<empty-line>
[<message-body>]
状态行:有HTTP协议版本号,状态码和状态说明三部分构成。
响应头:用于说明数据的一些信息,好比数据类型、内容长度等键值对。
空行。
消息体:服务端返回给客户端的HTML文本内容。或者其余格式的数据,好比:视频流、图片或者音频数据。
4 浏览器解析html代码,并请求html代码中的资源
浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器端发起一个HTTP请求,
若是服务器端返回304状态码(告诉浏览器服务器端没有修改该资源),那么浏览器会直接读取本地的该资源的缓存
文件。不然开启新线程向服务器端去请求下载。(这个时候就用上keep-alive特性了,创建一次HTTP链接,能够请求
多个资源。)
最后,浏览器利用本身内部的工做机制,把请求到的静态资源和html代码进行渲染,再呈现给用户。