经过使用 Connection:keep-alive 进行长链接。客户端只请求一次,可是服务器会将继续保持链接,当再次请求时,避免了从新创建链接。浏览器
在同一个TCP链接里面,客户端能够同时发送多个请求。这样就进一步改进了HTTP协议的效率。缓存
举例来讲,客户端须要请求两个资源。之前的作法是,在同一个TCP链接里面,先发送A请求,而后等待服务器作出回应,收到后再发出B请求。管道机制则是容许浏览器同时发出A请求和B请求,可是服务器仍是按照顺序,先回应A请求,完成后再回应B请求。安全
虽然1.1版容许复用TCP链接,可是同一个TCP链接里面,全部的数据通讯是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞”(Head-of-line blocking)。服务器
HTTP2使用的是二进制传送,HTTP1.X是文本(字符串)传送。cookie
你们都知道HTTP1.X使用的是明文的文本传送,而HTTP2使用的是二进制传送,二进制传送的单位是帧和流。帧组成了流,同时流还有流ID标示,经过流ID就牵扯出了第二个区别网络
HTTP2支持多路复用session
HTTP/2
中,有两个很是重要的概念,分别是帧(frame)和流(stream)。TCP
链接中能够存在多条流。换句话说,也就是能够发送多个请求,服务端能够经过帧中的标识知道属于哪一个请求。经过这个技术,能够避免 HTTP
旧版本中的队头阻塞问题,极大的提升传输性能。HTTP2头部压缩post
在 HTTP/1
中,咱们使用文本的形式传输 header
,在 header
携带 cookie 的状况下,可能每次都须要重复传输几百到几千的字节。性能
HTTP2经过gzip和compress压缩头部而后再发送,同时客户端和服务器端同时维护一张头信息表,全部字段都记录在这张表中,这样后面每次传输只须要传输表里面的索引Id就行,经过索引ID就能够知道表头的值了网站
HTTP2支持服务器推送 在 HTTP/2
中,服务端能够在客户端某个请求后,主动推送其余资源。
简单:每一个资源(好比图片、页面)都经过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url便可。
http协议的头部有一个数据类型
,经过http协议,就能够完成不一样数据类型的传输。
链接一次,就会断开,不会继续保持链接。
客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并无记住以前的状态,也就是说,服务器端没法区分客户端是否为同一我的、同一个身份。
有的时候,咱们访问网站时,网站能记住咱们的帐号,这个是经过其余的手段(好比 session)作到的,并非http协议能作到的。
请求行:请求方法、请求url、http协议及版本
请求头
常见请求头:
Accept:可接受的相应内容类型
Accept-Language:可接受的响应内容语言列表
User-Agent:浏览器的身份标识字符串
Content-Type:请求体的MIME类型 (用于POST和PUT请求中)
Content-Length:以8进制表示的请求体的长度
Connection:客户端(浏览器)想要优先使用的链接类型
Cache-Control:用来指定当前的请求/回复中的,是否使用缓存机制
Cookie
空行
请求体
状态行:http协议及版本、状态码及描述、
响应头
经常使用的响应头:
Server:服务器的名称
Content-Type:当前内容的MIME类型
Content-Length:响应消息体的长度,用8进制字节表示
Transfer-Encoding:表示实体传输给用户的编码形式
Date:此条消息被发送时的日期和时间
空行
响应体
浏览器在回退时,get不会从新请求,可是post会从新请求。
get请求会被浏览器主动缓存,而post不会。
get请求的参数,会报保留在浏览器的历史记录里,而post不会。作业务时要注意。为了防止CSRF攻击,不少公司把get统一改为了post。
get请求在url中传递的参数有大小限制,基本是2kb,不一样的浏览器略有不一样。而post没有注意。
get的参数是直接暴露在url上的,相对不安全。而post是放在请求体中的。
2XX 成功
200 OK
,表示从客户端发来的请求在服务器端被正确处理204 No content
,表示请求成功,但响应报文不含实体的主体部分205 Reset Content
,表示请求成功,但响应报文不含实体的主体部分,可是与 204
响应不一样在于要求请求方重置内容206 Partial Content
,进行范围请求3XX 重定向
301 moved permanently
,永久性重定向,表示资源已被分配了新的 URL302 found
,临时性重定向,表示资源临时被分配了新的 URL
303 see other
,表示资源存在着另外一个 URL
,应使用 GET
方法获取资源304 not modified
,表示服务器容许访问资源,但因发生请求未知足条件的状况307 temporary redirect
,临时重定向,和302
含义相似,可是指望客户端保持请求方法不变向新的地址发出请求4XX 客户端错误
400 bad request
,请求报文存在语法错误401 unauthorized
,表示发送的请求须要有经过 HTTP 认证的认证信息403 forbidden
,表示对请求资源的访问被服务器拒绝404 not found
,表示在服务器上没有找到请求的资源5XX 服务器错误
500 internal sever error
,表示服务器端在执行请求时发生了错误501 Not Implemented
,表示服务器不支持当前请求所须要的某个功能503 service unavailable
,代表服务器暂时处于超负载或正在停机维护,没法处理请求不用请求服务器,直接使用本地的缓存。
强缓存是利用 http 响应头中的**Expires
或Cache-Control
**实现的。
浏览器第一次请求一个资源时,服务器在返回该资源的同时,会把上面这两个属性放在response header中。
Expires
:服务器返回的绝对时间。Expires是http1.0提出的一个表示资源过时时间的header,它描述的是一个绝对时间,由服务器返回。 Expires 受限于本地时间,若是修改了本地时间,可能会形成缓存失效
Cache-Control
:服务器返回的相对时间。http1.1中新增的 response header。浏览器第一次请求资源以后,在接下来的相对时间以内,均可以利用本地缓存。超出这个时间以后,则不能命中缓存。从新请求时,Cache-Control
会被更新。
二者同时存在的话,Cache-Control优先级高于Expires
浏览器发现本地有资源的副本,可是不太肯定要不要使用,因而去问问服务器。
当浏览器对某个资源的请求没有命中强缓存(也就是说超出时间了),就会发一个请求到服务器,验证协商缓存是否命中。
Last-Modified
、If-Modified-Since
(1)浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上Last-Modified
这个 response header,这个header表示这该资源在服务器上的最后修改时间
(2)浏览器再次请求这个资源时,会加上If-Modified-Since
这个 request header,这个header的值就是上一次返回的Last-Modified
的值
(3)服务器收到第二次请求时,会比对浏览器传过来的If-Modified-Since
和资源在服务器上的最后修改时间Last-Modified
,判断资源是否有变化。若是没有变化则返回304 Not Modified,但不返回资源内容(此时,服务器不会返回 Last-Modified 这个 response header);若是有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header
(4)浏览器若是收到304的响应,就会从缓存中加载资源
但last-modified 存在一些缺点:
某些服务端不能获取精确的修改时间
文件修改时间改了,但文件内容却没有变
既然根据文件修改时间来决定是否缓存尚有不足,可否能够直接根据文件内容是否修改来决定缓存策略?
ETag
、If-None-Match
(1)浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上ETag
这个 response header,这个header是服务器根据当前请求的资源生成的惟一标识。这个惟一标识是一个字符串,只要资源有变化这个串就不一样,跟最后修改时间无关,因此也就很好地补充了Last-Modified
的不足。
(2)浏览器再次请求这个资源时,会加上If-None-Match
这个 request header,这个header的值就是上一次返回的ETag
的值
(3)服务器第二次请求时,会对比浏览器传过来的If-None-Match
和服务器从新生成的一个新的ETag
,判断资源是否有变化。若是没有变化则返回304 Not Modified,但不返回资源内容(此时,因为ETag从新生成过,response header中还会把这个ETag返回,即便这个ETag并没有变化)。若是有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header
(4)浏览器若是收到304的响应,就会从缓存中加载资源。
https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。
http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。
http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。