一、http版本
1. http1.1
1.1 持久连接
通过使用 Connection:keep-alive 进行长连接。客户端只请求一次,但是服务器会将继续保持连接,当再次请求时,避免了重新建立连接。
1.2 管道机制(pipelining)
在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。
举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
1.3 对头阻塞问题(Head-of-line blocking)
虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为“队头堵塞”(Head-of-line blocking)。
2. http2与http1.1的区别(优点)
-
HTTP2使用的是二进制传送,HTTP1.X是文本(字符串)传送。
大家都知道HTTP1.X使用的是明文的文本传送,而HTTP2使用的是二进制传送,二进制传送的单位是帧和流。帧组成了流,同时流还有流ID标示,通过流ID就牵扯出了第二个区别
-
HTTP2支持多路复用
- 在
HTTP/2中,有两个非常重要的概念,分别是帧(frame)和流(stream)。 - 帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
- 多路复用,就是在一个
TCP连接中可以存在多条流。换句话说,也就是可以发送多个请求,服务端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免HTTP旧版本中的队头阻塞问题,极大的提高传输性能。
- 在
-
HTTP2头部压缩
在
HTTP/1中,我们使用文本的形式传输header,在header携带 cookie 的情况下,可能每次都需要重复传输几百到几千的字节。HTTP2通过gzip和compress压缩头部然后再发送,同时客户端和服务器端同时维护一张头信息表,所有字段都记录在这张表中,这样后面每次传输只需要传输表里面的索引Id就行,通过索引ID就可以知道表头的值了
-
HTTP2支持服务器推送 在
HTTP/2中,服务端可以在客户端某个请求后,主动推送其他资源。
二、http协议的主要特点
1. 简单快速
简单:每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url即可。
2. 灵活
http协议的头部有一个数据类型,通过http协议,就可以完成不同数据类型的传输。
3. 无连接
连接一次,就会断开,不会继续保持连接。
4. 无状态
客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。
有的时候,我们访问网站时,网站能记住我们的账号,这个是通过其他的手段(比如 session)做到的,并不是http协议能做到的。
三、http报文的组成部分
1. 请求报文
-
请求行:请求方法、请求url、http协议及版本
-
请求头
常见请求头:
Accept:可接受的相应内容类型
Accept-Language:可接受的响应内容语言列表
User-Agent:浏览器的身份标识字符串
Content-Type:请求体的MIME类型 (用于POST和PUT请求中)
Content-Length:以8进制表示的请求体的长度
Connection:客户端(浏览器)想要优先使用的连接类型
Cache-Control:用来指定当前的请求/回复中的,是否使用缓存机制
Cookie
-
空行
-
请求体
2. 响应报文
-
状态行:http协议及版本、状态码及描述、
-
响应头
常用的响应头:
Server:服务器的名称
Content-Type:当前内容的MIME类型
Content-Length:响应消息体的长度,用8进制字节表示
Transfer-Encoding:表示实体传输给用户的编码形式
Date:此条消息被发送时的日期和时间
-
空行
-
响应体
四、http方法
1. 常用方法
- GET:获取资源
- POST:传输资源
- put:更新资源
- DELETE:删除资源
- HEAD:获得报文首部
2. get和post区别
-
浏览器在回退时,get不会重新请求,但是post会重新请求。
-
get请求会被浏览器主动缓存,而post不会。
-
get请求的参数,会报保留在浏览器的历史记录里,而post不会。做业务时要注意。为了防止CSRF攻击,很多公司把get统一改成了post。
-
get请求在url中传递的参数有大小限制,基本是2kb,不同的浏览器略有不同。而post没有注意。
-
get的参数是直接暴露在url上的,相对不安全。而post是放在请求体中的。
五、http状态码
2XX 成功
200 OK,表示从客户端发来的请求在服务器端被正确处理204 No content,表示请求成功,但响应报文不含实体的主体部分205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与204响应不同在于要求请求方重置内容206 Partial Content,进行范围请求
3XX 重定向
301 moved permanently,永久性重定向,表示资源已被分配了新的 URL302 found,临时性重定向,表示资源临时被分配了新的URL303 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缓存
1. 强缓存
不用请求服务器,直接使用本地的缓存。
强缓存是利用 http 响应头中的**Expires或Cache-Control**实现的。
浏览器第一次请求一个资源时,服务器在返回该资源的同时,会把上面这两个属性放在response header中。
Expires:服务器返回的绝对时间。
Expires是http1.0提出的一个表示资源过期时间的header,它描述的是一个绝对时间,由服务器返回。 Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效
Cache-Control:服务器返回的相对时间。
http1.1中新增的 response header。浏览器第一次请求资源之后,在接下来的相对时间之内,都可以利用本地缓存。超出这个时间之后,则不能命中缓存。重新请求时,Cache-Control会被更新。
两者同时存在的话,Cache-Control优先级高于Expires
2. 协商缓存
浏览器发现本地有资源的副本,但是不太确定要不要使用,于是去问问服务器。
当浏览器对某个资源的请求没有命中强缓存(也就是说超出时间了),就会发一个请求到服务器,验证协商缓存是否命中。
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的响应,就会从缓存中加载资源。
七、http和https区别
-
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
-
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
-
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。