HTTP 详解

HTTP 缓存

 

前提

浏览器通过网络下载各种各样的资源,例如 HTML、CSS、JavaScript、图片、视频、音频、字体等等,这是浏览器工作过程的第一步,也是非常耗时的一步。其实,很多静态文件,如 HTML 文本、图片等,这些资源不经常发生变化,完全可以储存在客户端( 保存到本地磁盘中 ),以便下次使用。因此,浏览器引入了资源缓存机制,也叫 HTTP 缓存机制。

基本概念

HTTP 缓存的基本思想是在客户端建立一个资源的缓存池( 以下简称资源池 ),所有对资源的请求都会优先获取缓存中的信息,以决定是否需要向服务器提出资源请求。

示意图:

查询方式

资源的唯一性是通过 URL 来标记的,因此从资源池中查询资源的关键字就是 URL。如果两个资源有不同的 URL,但它们的内容完全一样,也会被认为是两个不同的资源。

生命周期

由于磁盘存储的空间是有限的,因此,资源池会清除那些“最近最少使用”的资源。

强制缓存

在已缓存的资源未失效( 未过期 )的情况下,不会向服务器发送请求,会直接从资源池中读取资源。

资源未失效示意图:

资源已失效示意图:

缓存规则

对于强制缓存而言,响应头中有两个字段标明了它的缓存规则,一个是 Expires,另一个是 Cache-Control。

Expires

Expires 的值包含具体的日期和时间,是服务器返回的资源到期时间, 即在此时间之前,可以直接从资源池中读取资源,无需再次请求服务器。

例子:

Expires: Wed, 31 Jul 2019 02:58:24 GMT

Cache-Control

Cache-Control 可以被用于请求和响应头中,组合使用多种指令来指定缓存机制。下面列举了比较常用的指令:

  • private:资源只可以被客户端缓存,Cache-Control 的默认值。
  • public:资源可以被客户端和代理服务器缓存。
  • max-age=t :客户端缓存的资源将在 t 秒后失效。
  • no-cache:需要使用对比缓存来验证资源( 下面会详细介绍 )。
  • no-store:不缓存任何资源。

private 和 public 的区别在于是否允许中间节点( 即代理服务器 )进行资源缓存,如果 Cache-Control 值设置为 public:

客户端 <--> 代理服务器 <--> 服务器

中间的代理服务器可以缓存资源,如果下一次再请求同一资源,代理服务器就可以直接把自己缓存的资源返回给客户端,而无需再请求服务器。但如果 Cache-Control 值设置为 private,表明资源只能被当前用户在客户端缓存,属于私有缓存,不能作为共享缓存( 代理服务器缓存的资源可以共享 )。

例子:

Cache-Control: max-age=31536000

例子中,Cache-Control 仅指定了 max-age,所以默认为 private,缓存时间为 31536000 秒( 365天 )。也就是说,在 365 天内再次请求该资源时,都会直接使用资源池中的资源。

Expires 与 Cache-Control 同时出现

Expires 属于 HTTP/1.0 的产物,而 Cache-Control 属于 HTTP/1.1 的产物,如果服务器同时设置了 Expires 与 Cache-Control,那么以更先进的 Cache-Control 为准。在某些不支持 HTTP/1.1 的环境中,Expires 才能发挥作用,现阶段只是一种兼任性的写法。

强制缓存的弊端

强制缓存的判定标准,主要依据来自于是否超出某个时间或者某个时间段,而不关心服务器端资源是否已经更新,这可能会导致加载的资源早已不是服务器端最新的内容。

对比缓存( 协商缓存 )

针对强制缓存的弊端,对比缓存需要进行资源比对来判断是否可以使用缓存。


客户端第一次请求资源时,服务器会将缓存标识与资源一起返回给客户端,客户端将二者备份至资源池中。当再次请求相同资源时( 此时,强制缓存期限已到,缓存资源还在 ),客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行验证,如果验证结果为未更新,服务器会返回 304 状态码,通知客户端可以继续使用缓存资源。


有一点需要特别注意:对比缓存的优先级低于强制缓存,因此只有在强制缓存失效后,客户端才会携带缓存标识向服务器发起请求。

资源未更新示意图:

资源已更新示意图:

缓存规则

不同于强制缓存,对比缓存最重要的是缓存标识的传递。缓存标识在请求头和响应头之间进行传递,具体方式可以分为以下两组:

Last-Modified / If-Modified-Since

当我们第一次发出请求时,Last-Modified 由服务器返回,通知客户端,该资源的最后修改时间。当我们再次请求该资源时,If-Modified-Since 由客户端发送,其保存了 Last-Modified 的值。服务器收到请求后,将 If-Modified-Since 的值与被请求资源的最后修改时间进行比对。若资源的最后修改时间大于 If-Modified-Since 的值,说明资源被修改过,则返回状态码 200 以及最新资源;若资源的最后修改时间小于或等于 If-Modified-Since 的值,说明资源无修改,则返回状态码 304,通知客户端继续使用缓存资源。

例子:

//第二次发出请求时,请求头内容
If-Modified-Since: Mon, 23 Jul 2018 08:29:29 GMT

//第二次发出请求时,响应头内容
Last-Modified: Mon, 23 Jul 2018 08:29:29 GMT

//此时,状态码应该为:
Status Code: 304 Not Modified

ETag / If-None-Match

当我们第一次发出请求时,ETag 由服务器返回,其值为该资源的标签。当我们再次请求该资源时,If-None-Match 由客户端发送,其保存了 ETag 的值。服务器收到请求后,将 If-None-Match 的值与被请求资源的标签进行比对。若资源的标签不等于 If-None-Match 的值,说明资源被修改过,则返回状态码 200 以及最新资源;若资源的标签等于 If-None-Match 的值,说明资源无修改,则返回状态码 304,通知客户端继续使用缓存资源。
ETag / If-None-Match 组合的优先级高于 Last-Modified / If-Modified-Since 组合。

例子:

//第二次发出请求时,请求头内容
If-None-Match: W/"5ce-164c641f628"

//第二次发出请求时,响应头内容
ETag: W/"5ce-164c641f628"

//此时,状态码应该为:
Status Code: 304 Not Modified

应用缓存机制

结合以上强制缓存和对比缓存的内容,我们可以大概绘制一份浏览器使用缓存的流程图:

如有错误,欢迎指正,本人不胜感激。

作者:为爱心太软

链接:https://www.imooc.com/article/288760

来源:慕课网

本文首次发布于慕课网 ,转载请注明出处,谢谢合作

 

 

HTTP协议详解  

https://mp.weixin.qq.com/s/Skyh7KRbbu6jrdO4pUCJDQ

爬虫又称网络爬虫,所以在讲解爬虫之前,我们有必要了解一下什么是网络?网络是由若干节点和连接这些节点的链路构成,然后网络与网络之间所串连成的庞大网络叫做互联网,而我们今天要讲的HTTP(HyperText Transfer Protocol 超文本传输协议)是互联网上应用最为广泛的一种网络协议,它是由万维网协会(World Wide Web Consortium)制定发布。

 

文章主要以一次HTTP请求的整个过程来讲解(DNS解析不讲):HTTP起源、TCP/IP协议、建立TCP连接、客户端请求、服务端响应、断开TCP连接,文章最后还捎带讲了与HTTP相关知识。文章较长,建议收藏或转发后阅读!

 

 

一、简介

 

1. 起源

今天我们能够在网络中畅游,都得益于一位计算机科学家蒂姆·伯纳斯·李的构想。1991年8月6日,蒂姆·伯纳斯·李在位于欧洲粒子物理研究所(CERN)的NeXT计算机上,正式公开运行世界上第一个Web网站(http://info.cern.ch ),建立起基本的互联网基础概念和技术体系,由此开启了网络信息时代的序幕。


伯纳斯·李的提案包含了网络的基本概念并逐步建立了所有必要的工具:

  • 提出HTTP (Hypertext Transfer Protocol) 超文本传输协议,允许用户通过单击超链接访问资源;

  • 提出使用HTML超文本标记语言(Hypertext Markup Language)作为创建网页的标准;

  • 创建了统一资源定位器URL (Uniform Resource Locator)作为网站地址系统,就是沿用至今的http://www URL格式;

  • 创建第一个Web浏览器,称为万维网浏览器,这也是一个Web编辑器;

  • 创建第一个Web服务器(http://info.cern.ch)以及描述项目本身的第一个Web页面。

 

2. 特点

HTTP 协议一共有五大特点:

 

  • 支持客户/服务器模式。

  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。

  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。

  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  • 无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息(Cookie和Session孕育而生,后期再讲)。

 

 

二、TCP/IP协议

 

 

我们经常听到一句话就是:HTTP是一个基于TCP/IP协议簇来传递数据。

 

如何理解上面那句话?我们来看看TCP/IP四层模型就明白了。

从上图我们可以清晰的看到HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是一个基于TCP/IP协议簇来传递数据。

 

同样我们可以看到ping走的ICMP协议,这也就是为什么有时候我们开vps可以上网,但是ping google却ping不通的原因,因为走的是不同的协议。

 

那TCP/IP协议簇大致是如何工作的,我们再来看看下图:

我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

 

 

三、建立TCP连接

 

 

我们知道了TCP/IP协议簇大致的工作原理之后,我们来看看HTTP是如何建立连接的。

 

1.TCP包头信息

前面咱们讲过HTTP是一个基于TCP/IP协议簇来传递数据,所以这HTTP建立连接也就是建立TCP连接,TCP如何建立连接,一起来看看TCP包信息结构吧。

 


TCP报文包=TCP头信息+TCP数据体,而在TCP头信息中包含了6种控制位(上图红色框中),这六种标志位就代表着TCP连接的状态:

URG:紧急数据(urgent data)—这是一条紧急信息

ACK:确认已收到

PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据

RST:表示要求对方重新建立连接

SYN:表示请求建立一个连接

FIN:表示通知对方本端要关闭连接了

 

2.建立连接过程

了解了TCP包头信息之后,我们就可以正式看看TCP建立连接的三次握手了。

 

三次握手讲解:

  • 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)

  • 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)

  • 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)

 

面试官:为什么http建立连接需要三次握手,不是两次或四次
答:三次是最少的安全次数,两次不安全,四次浪费资源

 

 

四、客户端请求

 

客户端与服务器连接上了之后,客户端就可以开始向服务器请求资源,就可以开始发送HTTP请求了。

 

1.HTTP请求报文结构

我们之前说过TCP报文包=TCP头信息+TCP数据体,TCP头信息我们已经讲了,现在来讲TCP数据体,也就是我们的HTTP请求报文。

 

2.HTTP请求实例

来看看实际的HTTP请求例子:

 

①是请求方法,HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT

②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL

③是协议名称及版本号

④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息

⑤是报文体,它将一个页面表单中的组件值通过

param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于

“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

 

请求头参数非常多,我就不一一说明,只说明两个低级的反扒参数:

  • User-Agent:客户端使用的操作系统和浏览器的名称和版本,有些网站会限制请求浏览器

  • Referer:先前网页的地址,表示此请求来自哪里,有些网站会限制请求来源

 

 

五、服务端响应

 

服务器在收到客户端请求处理完需要响应并返回给客户端,而HTTP响应报文结构与请求结构体一致。

 

1.HTTP响应报文结构

 

 

2.HTTP响应实例

 

3.响应状态码

响应报文中我们重点关注下:服务器的响应状态码,面试也很容易问到,下面只列出分类,详细状态码自行上网查找了解。

 

 

 

六、断开连接

 

在服务器响应完毕后,一次会话就结束了,请问这时候连接会断开吗?

 

1.长短连接

是否断开我们需要区分HTTP版本:

  • 在HTTP/1.0版本的时候,客户端与服务器完成一个请求/响应之后,会将之前建立的TCP连接断开,下次请求的时候又要重新建立TCP连接,这也被称为短连接

  • 在HTTP1.0发布仅半年后(1997年1月) ,HTTP/1.1版本发布并带来一个新的功能:在客户端与服务器完成一次请求/响应之后,允许不断开TCP连接,这意味着下次请求就直接使用这个TCP连接而不再需要重新握手建立新连接,这也被称为长连接

 

注意:长连接是指一次TCP连接允许多次HTTP会话,HTTP永远都是一次请求/响应,会话结束,HTTP本身不存在长连接之说。

 

早在1999年HTTP1.1就推广普及,所以现在浏览器在请求时请求头中都会携带一个参数:Connection:keep-alive,这表示浏览器要求与服务器建立长连接,而服务器也可以设置是否愿意建立长连接。

 

2.长连接优缺点

对于服务器来说建立长连接有优点也有缺点:

  • 优点:当网站中有大量静态资源(图片、css、js等)就可以开启长连接,这也几张图片就可以通过一次TCP连接发送。

  • 缺点:当客户端请求一次时候不在请求,而服务器却开着长连接资源被占用着,这是严重浪费资源。

 

所以是否开启长连接,长连接时间都需要根据网站自身来合理设置。

 

ps:大家不要小看这一个TCP连接,在一次客户端HTTP完整的请求中(DNS寻址、建立TCP连接、请求、等待、解析网页、断开TCP连接)建立TCP连接占用的时间比还是很大的。

 

3.断开连接过程

在建立TCP连接时是三次握手,而断开TCP连接是四次挥手!

 


在前面讲TCP/IP协议时我们说过标志位:FIN表示通知对方本端要关闭连接了,**那断开连接为何需要四次挥手呢?**这里给大家的课后作业,可以在留言中给出你的理解,看看是否正确。

 

 

七、题外话

 

1.面试必考题:http三次握手、四次挥手

 

面试官:为何建立连接需要三次握手而关闭连接却需要四次挥手。给大家的课后作业,在留言中给出你的见解!

 

2.http2.0

 

HTTP/1.1已经为我们服务了20年,而HTTP/2.0其实在2015就发布了,但是还没有推广开来,关于HTTP/2.0新特性大家也可以去网上查阅相关资料

 

3.http&rpc

因为http响应慢、请求头体积大等缺点,所以在微服务时代,大家都使用rpc来调用服务,rpc相关概念感兴趣同学自行网上学习。

 

4.http&https

http还有两个很大的缺点就是明文且不能保证完整性,所以目前会渐渐被HTTPS代替。

 

转载自 https://mp.weixin.qq.com/s/Skyh7KRbbu6jrdO4pUCJDQ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值