HTTP相关知识
HTTP协议的特点
无连接、无状态、简单快速、灵活
HTTP的连接方式
非持久连接
每个请求/应答 客户和服务器都要新建一个连接,完成之后立即断开连接
持久连接(keep-alive)
持久连接使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,避免重新建立连接。
非流水线
一请求一响应
流水线(管线化)
将多个 HTTP 请求整批发送,在发送过程中不用等待对方响应。管线化不会影响响应到来的顺序,仅HTTP/1.1支持
HTTP报文
请求报文:请求行、首部行(请求头)、空行、请求体。
响应报文:状态行、首部行(响应头)、空行、响应体。
HTTP方法
-
GET
:获取资源 -
POST
:传输资源 -
PUT
:更新资源 -
DELETE
:删除资源 -
HEAD
:获得报文首部
GET 和 POST 请求
HTTP
协议中的两种发送请求的方法。本质上就是TCP
连接,并无差别。但是由于HTTP
的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
不同:
-
get
一般用于查询操作,post
一般用于提交操作。 -
get
参数通过url传递,post
放在request body中。 -
get
请求在url中传递的参数是有长度限制的,而post
没有。 -
get
比post
更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。post
易于防止CSRF -
get
请求参数会被完整保留在浏览历史记录里,而post
中的参数不会被保留。 -
get
请求只能进行url编码,而post
支持多种编码方式 -
get
请求会浏览器主动cache,而post
不会,除非手动设置。 -
get
产生一个TCP数据包;post
产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header
和data
一并发送出去,服务器响应200
(返回数据);而对于POST,浏览器先发送header
,服务器响应100 continue
,浏览器再发送data
,服务器响应200 ok
(返回数据)。
OPTIONS
OPTIONS请求旨在发送一种“探测”请求以确定针对某个目标地址的请求必须具有怎样的约束(比如应该采用怎样的HTTP方法以及自定义的请求报头),然后根据其约束发送真正的请求。比如针对“跨域资源”的预检(Preflight)请求采用的HTTP方法就是OPTIONS。
与之对应的状态码为:204
.
HTTP 状态码
-
1xx
: 表示通知消息。表示请求已接收,继续处理 -
2xx
: 表示成功。表示请求已被成功接收-
200
: 请求成功,已经正常处理完毕 -
204
: 当只需要知道响应成功或失败的情况,可以用204来代替200,减少多余的数据传输。
-
-
3xx
:表示重定向。-
301
:永久性重定向。所请求的页面已经转移至新的url -
302
:临时性重定向。所请求的页面已经临时转移至新的url -
304
:请求被重定向到客户端本地缓存。
-
-
4xx
: 表示客户端差错。请求有语法错误或请求无法实现-
400
:客户端请求存在语法错误。 -
401
:客户端请求没有经过授权。 -
403
:客户端的请求被服务器拒绝。 -
404
:客户端请求的URL在服务器端不存在。
-
-
5xx
表示服务器差错。服务器未能实现合法的请求-
500
:服务端永久错误。
-
301 和 302 的区别
实施301后,新网址完全继承旧网址,旧网址的排名等完全清零;
实施302后,对旧网址没有影响,但新网址不会有排名。
HTTP头部信息
常见请求头
Content-Type:
设置请求体的MIME类型(适用POST和PUT请求)
默认为text/plain。提交表单必须设置为:
Content-Type: application/x-www-form-urlencoded;
使用表单上传文件时:
Content-Type: multipart/form-data;
附:
ajax中
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
在nodejs中使用body-parser
对post请求体进行解析。
使用示例:
let bodyParser = require('koa-bodyparser');
app.use(bodyParser());
cookie:设置服务器使用Set-Cookie发送的http cookie
缓存相关(协商缓存):
- If-Modified-Since
该值为服务器之前返回的 Last-Modify。允许服务端返回304 Not Modified。
- If-None-Match
该值为服务器之前返回的 ETag。
服务器根据浏览器上送的If-Modified-Since 和 If-None-Match 值来判断是否命中缓存。
常见响应头
Content-Type:设置响应体的MIME类型
Set-Cookie :设置HTTP Cookie
Status:设置HTTP响应状态
缓存相关
强缓存
设置响应体缓存的过期时间。在此时间之前,即命中缓存。
- expires:绝对时间
- Cache-Control:相对时间
协商缓存
- Last-Modify
浏览器第一次请求资源的时候,服务器返回的 header 中会加上 Last-Modify,标识该资源最后修改的时间。如果命中缓存,则返回 304,并且不会返回资源内容,并且不会返回 Last-Modify。
- ETag
ETag 可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。即使这个 ETag 跟之前的没有变化。服务器返回的 header 中还是会把这个 ETag 返回。
HTTP协议版本
HTTP 1.x/0.9
HTTP 0.9
仅支持GET
请求,服务器只能回应HTML格式字符串。
HTTP 1.0
增加POST
,HEAD
。非持久化连接
HTTP 1.0中实现持久化连接需加上Keep-Aliveheader
。
HTTP 1.1(目前应用)
增加PUT
、PATCH
、OPTIONS
、DELETE
。可以持久化连接
HTTP 2.0(最新)
简介:
HTTP/2(超文本传输协议第2版,最初命名为HTTP2.0),是HTTP协议的第二个主要版本。主要基于SPDY协议。
SPDY协议
SPDY(Speedy,意为“更快”)。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。
特点:
二进制传输、多路复用、头部压缩、服务器可以主动向客户端发送资源、更安全。
HTTP1.x的缺点
- 基于文本的方式传输数据存在很多缺陷。
- HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
- 请求报文与响应报文首部信息冗余量大。
- 数据未压缩,导致数据的传输量大。
- 单向请求,只能由客户端发起。
来对比一下HTTP2.0到底比HTTP1.x快了多少。链接地址
HTTP2.0的特点
二进制传输(核心)
HTTP2.0中引入了新的编码机制,在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码。其中HTTP1.x
的首部信息会被封装到Headers帧
,而Request Body
则封装到Data帧
。
多路复用
在HTTP1.0中,因为浏览器限制了同一个域名下的请求数量,当页面需要请求很多资源的时候,队头阻塞会导致在达到最大请求时,资源需要等待其他资源请求完成后才能继续发送。
在HTTP2.0的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了队头阻塞的问题,同时也提高了网络速度的利用率。
头部压缩
在HTTP1.0中,我们使用文本的形式传输header,在header中携带cookie的话,每次都需要重复传输几百到几千的字节,这着实是一笔不小的开销。
在HTTP2.0中,我们使用了HPACK
(HTTP2头部压缩算法)压缩格式对传输的header进行编码,减少了header的大小。并在两端维护了索引表
,用于记录出现过的header,后面在传输过程中就可以传输已经记录过的header的键名,对端收到数据后就可以通过键名找到对应的值。
服务器Push
采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间。在浏览器兼容的情况下也可以使用prefetch。
更安全
HTTP2.0使用了TLS
的拓展ALPN
做为协议升级,除此之外,HTTP2.0对TLS
的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。
HTTP与HTTPS
HTTPS
是安全的 HTTP
。HTTP
协议中的内容都是明文传输,HTTPS
的目的是将这些内容加密,确保信息传输安全。最后一个字母 S 指的是 SSL/TLS
协议,它位于 HTTP 协议与 TCP/IP 协议中间。
HTTP默认端口号:80。HTTPS默认端口号:443
HTTPS的特点:
内容加密:采用混合加密技术,中间者无法直接查看明文内容
验证身份:通过证书认证客户端访问的是自己的服务器
保护数据完整性:防止传输的内容被中间人冒充或者篡改
HTTPS连接建立的过程
- 在使用HTTPS是需要保证服务端配置正确了对应的安全证书
- 客户端发送请求到服务端
- 服务端返回公钥和证书到客户端
- 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
- 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密
- 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
- SSL加密建立
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。