什么是http
HTTP 就是超文本传输协议,详细的说的话:HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
什么是https
HTTPS 就是超文本传输安全协议,经由http通信,利用ssl建立安全通道,加密数据包
基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
1、说说你对http的理解
1)首先用户端与服务器需要建立连接。
2)建立连接后,用户端发送一个请求给服务器
3)服务器接到请求后,给予相应的响应信息,
4)用户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后用户端与服务器断开连接。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议
2、说说HTTPS和HTTP的区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
HTTP的请求:
HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
响应:
HTTP之状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
301 Moved Permanently //永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found // 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other //查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified //未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy //使用代理。所请求的资源必须通过代理访问
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
一个页面从url敲如地址到页面显示的全过程
1、浏览器地址栏输入url
2、浏览器会先查看浏览器缓存--系统缓存--路由缓存,如有存在缓存,就直接显示。如果没有,接着第三步
3、域名解析(DNS)获取相应的ip
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手
5、握手成功,浏览器向服务器发送http请求,请求数据包
6、服务器请求数据,将数据返回到浏览器
7、浏览器接收响应,读取页面内容,解析html源码,生成DOm树
8、解析css样式、浏览器渲染,js交互
9、请求页面中需要的js脚本和图片或者样式表
https://www.jianshu.com/p/98fd03784cef
HTTP缓存控制
浏览器缓存也包含很多内容: HTTP缓存、indexDB、cookie、localstorage等等。我们这里只讨论HTTP缓存
游览器缓存分类
浏览器缓存分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:
1、浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。(强缓存)
2、如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。(协商缓存)
3、如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。(新的请求)
强缓存
命中强缓存时,浏览器并不会将请求发送给服务器。在Chrome的开发者工具中看到http的返回码是200。但是在Size列会显示为(memory cache).
强缓存是利用http的响应头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。
Expires
缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。也就是说,Expires=max-age +请求时间需要和Last-modified结合使用。但在上面我们提到过,cache-control的优先级更高。Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
该字段会返回一个时间,比如Expires:Thu,31 Dec 203723:59:59GMT。这个时间代表着这个资源的失效时间,也就是说在2037年12月31日23点59分59秒之前都是有效的,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当客户端本地时间被修改以后,因为客户端和服务器的时间会不相同,就会导致缓存混乱。于是发展出了Cache-Control。
Cache-Control
Cache-Control是一个相对时间,例如cache-Control:3600,代表着资源的有效期是3600秒。由于是相对时间,并且都是与客户端时间比较,所以服务器与客户端时间偏差也不会导致问题。
Cache-Control与Expires可以在服务端配置同时启用或者启用任意一个,同时启用的时候Cache-Control优先级高。
Cache-Control可以由多个字段组合而成,主要有以下几个取值:
- 1、max-age 指定一个时间长度,在这个时间段内缓存是有效的,单位是s。例如设置Cache-Control:max-age=31536000,也就是说缓存有效期为(31536000/ 24/ 60*60)天,第一次访问这个资源的时候,服务器端也返回了Expires字段,并且过期时间是一年后。
在没有禁用缓存并且没有超过有效时间的情况下,再次访问这个资源就命中了缓存,不会向服务器请求资源而是直接从浏览器缓存中取。
- 2、s-maxage 同max-age,覆盖max-age、Expires,但仅适用于共享缓存,在私有缓存中被忽略。
- 3、public 表明响应可以被任何对象(发送请求的客户端、代理服务器等等)缓存。
- 4、private 表明响应只能被单个用户(可能是操作系统用户、浏览器用户)缓存,是非共享的,不能被代理服务器缓存。
- 5、no-cache 强制所有缓存了该响应的用户,在使用已缓存的数据前,发送带验证器的请求到服务器。不是字面意思上的不缓存。
- 6、no-store 禁止缓存,每次请求都要向服务器重新获取数据。
协商缓存
若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的 Last-Modify/lf-Modify-Since或Etag/lf-None-Match 来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。
协商缓存具体是协商了什么?
Last-Modify/lf-Modify-Since
浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 203723:59:59 GMT。
当浏览器再次请求该资源时,发送的请求头中会包含lf-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到lf-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。
如果命中缓存,则返回http304,并且不会返回资源内容,并且不会返回Last-Modify。由于对比的服务端时间,所以客户端与服务端时间差距不会导致问题。但是有时候通过最后修改时间来判断资源是否修改还是不太准确(资源变化了最后修改时间也可以一致)。于是出现了ETag/lf-None-Match。
Etag/lf-None-Match
与Last-Modify/lf-Modify-Since不同的是,Etag/lf-None-Match返回的是一个校验码
(ETag: entity tag)。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化*。ETag值的变更则说明资源状态已经被修改。服务器根据浏览器上发送的lIf-None-Match值来判断是否命中缓存。