输入URL到页面加载的全过程
- 域名解析
- 建立TCP连接(三次握手)
- 浏览器发送HTTP请求报文
- 服务器回复HTTP响应报文
- 浏览器将资源缓存到本地
- 释放TCP连接(四次挥手)
域名解析
通过DNS将域名解析成IP地址。在解析过程中,按照浏览器缓存、系统缓存、路由器缓存、ISP(运营商)DNS缓存、根域名服务器、顶级域名服务器、主域名服务器的顺序,逐步读取缓存,直到拿到IP地址
注意:
1、用户浏览器、操作系统都有缓存,本地域名服务器也有自己的缓存。不过缓存都有自己的时效。
2、浏览器向本地域名服务器的查询一般采用递归查询本地域名服务器向根域名服务器的查询优先采用迭代查询。(迭代查询,即本地域名服务器先从根域名服务器获取顶级域名服务器的地址,然后再向顶级域名服务器发送请求。当然也可以采用递归的形式,让根域名服务器代为向顶级域名服务器查询)
疑问:在第一次开机使用的时候,系统缓存、浏览器缓存都是空的,浏览器怎么知道本地域名服务器的地址呢?
答:用户可以在上网之前通过操作系统对DNS进行配置,输入本地网络服务提供商(ISP)给出的本地域名服务器的IP地址。
存疑:难道每到一个地方都要重新设置本地域名服务器地址?平时使用的WIFi和这有什么关系吗?
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
1、请求报文的格式
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
2、请求方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。各种请求方法如下:
(1) GET
GET请求是向服务端请求获取某个或某些资源(resource),比如查询数据库单个或list数据,服务端成功的话
,一般状态码返回200。
(2) HEAD
类似于GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
HEAD请求一般是用来获取某个资源的metadata信息,比如说某份报告的关键描述信息等。
(3) POST
POST请求是用来向服务端请求新增资源(resource),处理成功的话,服务端一般返回状态码201。
GET和POST的区别:
- get相对post是不安全的,因为get基于问号传参,数据请求被存放在URL中,而post是基于请求主体,
操作对于用户是不可见的,相对比较安全
- Get传送的数据量较小,主要是由于get基于URL进行传参,
URL的长度受浏览器和服务器的限制(http协议本身是不限制URL长度的),
post相对比较大,一般默认为不受限制
- Get限制From表单的数据集的值必须为ASCLL字符,而Post支持整个ISO10646字符集
(4) PUT
PUT请求一般是用来向服务端请求修改某个已存在的资源(resource),服务端一般返回状态码200,204等。
(5) PATCH
PATCH请求一般是对某个资源做局部修改,如个别字段。
PUT和PATCH区别:
- PUT和PATCH都是用来修改服务端某个资源的,但是PUT和PATCH修改时提交的数据是不同的
- PUT是将整个资源的信息都提交到服务端,包括修改的,未修改的都提交到服务端,
- PATCH只提交已修改的字段到服务端
(6) DELETE
DELETE请求一般是用来向服务端请求删除某个已存在的资源(resource),服务端一般返回200,202等。
(7 )CONNECT
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
(8) OPTIONS
OPTIONS请求一般是客户端向服务端判断对某个资源是否有访问权限。
(9) TRACE
回显服务器收到的请求,主要用于测试或诊断。
3、 客户端请求报文实例:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
注:HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
服务器回复HTTP响应报文
1、响应报文的格式
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
2、响应请求的首部信息
(1)Allow 服务器支持哪些请求方法(如GET、POST等)。
(2)Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。
(3)Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
(4)Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。
(5)Date 当前的GMT时间。
(6)Expires 应该在什么时候认为文档已经过期,从而不再缓存它。(用于浏览器强制缓存)
(7)Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,
该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。
(用于浏览器对比缓存)
(8)Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
(9)Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。
(10)Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
(11)Set-Cookie 设置和页面关联的Cookie。
(12)WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息。
在包含401(Unauthorized)状态行的应答中这个头是必需的.
3、服务器响应报文实例:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT //当前资源最后修改时间(下一次请求时用于判断浏览器缓存是否可用) ETag: "34aa387-d-1568eb00" //当前资源版本标识(下一次请求时用于判断浏览器缓存是否可用) Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
4、状态码的类别
1** 表示信息,服务器收到请求,需要请求者继续执行操作
2** 表示成功,操作被成功接收并处理
3** 表示重定向,需要进一步的操作以完成请求
4** 表示客户端错误,请求包含语法错误或无法完成请求
5** 表示服务器错误,服务器在处理请求的过程中发生了错误
浏览器将资源缓存到本地
1、强制缓存(优先于对比缓存)
(1)缓存命中时。
客户端发送请求到缓存数系统,缓存系统有缓存数据,且未失效(设置有有效时间)则直接返回数据。
(2)缓存没有命中。
客户端发送请求到缓存数据库,缓存数据库没有缓存数据或者缓存数据已经失效,则将向服务器发送请求,服务器返回数据以及缓存规则(数据再HTTP报文的主体部分中,而缓存规则则在HTTP报文的首部中)。客户端将数据以及缓存规则保存在缓存系统中。
(3)缓存规则
通过HTTP报文首部中的Cache-Control字段来设置缓存规则。
2、对比缓存
(1)缓存命中:
客户端发送请求给缓存系统,获取缓存数据的标识。然后客户端再向服务器发送请求报文,验证缓存表示对用的数据是否失效。服务器通知客户端缓存未失效(返回的状态码时304。此时HTTP响应报文中的主体部分为空,仅包含首部信息,大小小很多,传输也会更块。),客户端获取缓存数据
(2)缓存未命中:
客户端大发送请求到缓存系统,获取缓存数据的标识。然后客户端再向服务器发送请求报文,验证缓存表示对用的数据是否失效。服务器验证缓存已经失效,返回最新数据和缓存规则(此时的状态码是200)。客户端获取数据成功,并将最新数据以及缓存规则存取缓存系统。
(3)缓存规则
Last-Modified:服务器返回的资源最后修改的时间
If-Modified-Since:客户端验证时发送的资源最后修改的时间
Etag:服务器返回的当前版本的资源的唯一标识
If-None-Match:客户端验证时发送的资源的标识符
(前两个是一对,后两个也是一对。后面的优先级高)
4、小结:
对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5724.html