一,认识HTTP/1.0 部分
超文本传输协议: (HyperText Transfer Protocol)。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。HTTP请求报文是由三部分组成: 请求行, 请求头和请求体。
(1),请求行 及 响应行
// 举个例子
1请求行. METHODS (请求方法) /ALEX/login.html(请求URL) HTTP/1.1 (协议及版本)
2响应行. STATUS CODE (状态码) Reason-Phrase(状态码说明) HTTP/1.1 (协议及版本)
(2),请求头(Headers)及 响应头,两者区别不大
若干个属性及属性值,服务端据此可以获取客户端信息。
常见的属性,属性值及代表的意思
* Accept: 'text/plain, text/html, application/json' // 指定客户端能够接收的内容类型
* Accept-Charset: 'xxx' //浏览器可以接受的字符编码
Accept-Encoding: 'gzip, compress' // 指定浏览器可以支持的web服务返回内容的压缩类型
Accpet-Language: 'en, zh, zh-CN' // 浏览可器接受的语言
Accept-Ranges: 'bytes' //可以请求网页实体的一个或者多个子范围字段
Authorization: 'sdfgvqw3f' // 授权证书
** Access-Contorl-Allow-Credentials(证书,ke dun笑死): 'true' //是否可以将对请求的响应暴露给页面即允许客户端携带验证信息(Cookies, authorization headers / TLS client certificates)
** Access-Control-Allow-Headers: '*' // 被允许的请求头
** Access-Control-Allow-Methods: '*' // 被允许的强求方法
** Access-Control-Allow-Origin:'*' //
请求资源是否被共享即跨域请求
** Access-Control-Max-Age: 'xx' //这个响应头表示 preflight request (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息) 可以被缓存多久。
** Access-Control-Expose-Headers:{ // 哪些首部可以作为响应的一部分暴露给外部, 以下为默认值
Cache-Contorl, // 强缓存,设置一个相对最新资源更新时间的过期时间
Content-Language,
Content-Type, // 实体头部用于指示资源的MIME类型
Expires, // 强缓存,设置过期时间
Last-Modified, // 资源最新的更新时间
Pragma, // 缓存优先级最高的
}
Access-Control-Request-Headers: 'xxx' // 出现于 (预检请求)中,用于通知服务器在真正的请求中会采用哪些请求头。
Access-Control-Request-Method: 'xx' // 出现于(预检请求)中,用于通知服务器在真正的请求中会采用哪种 HTTP 方法。因为预检请求所使用的方法总是 OPTIONS ,与实际请求所使用的方法不一样,所以这个请求头是必要的。
Content-Type: {
text/html for normal web pages
text/plain for plain text
text/css for Cascading Style Sheets
text/javascript for scripts
application/octet-stream meaning "download this file"
application/x-java-applet for Java applets
application/pdf for PDF documents
}
** Cache-Control: 'no-cache' // 指定缓存时间相对时间段
Connection: 'close' // 是否需要持久连接, http1.1默认持久连接
** Cookie: 'xxxxxxx' // 客户端与服务端通信缩存储的信息
Content-Length: '12344' // 请求内容的长度
Date: 'xxx' // 请求发送的时间
Expect: '100-continue' // 请求的特定的服务器行为
From: 'xxxx' // 发出请求的用户的email
Host: 'xxxx' // 指定请求的服务器的域名和端口
If-Match: 'xxx' // 只有请求内容与实体相匹配才有效
** IF-None-Match: 'xxx' // 如果返回304,参数为服务器先前发送的Etag作比较,会忽略If-Modified-Since
** If-Modified-Since: 'xxx' // 服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200(即记录最后一次服务器资源更新的时间,与当前资源更新时间最比较)。否则返回304(即内容没有修改,使用缓存内容)
** Pragma: 'no-cache' // 用来包含实现特定指令
Referer: 'xxx' // 网页的来源
Upgrade: 'xx' // 向服务器知道某种传输协议以便服务器进行转换
User-Agent: 'xxx' // 包含用户发出请求的用户信息
(3),请求体(一般在POST, PUT, PATCH(RFC 5789) 请求中出现)及 响应体
请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度。形式:
- 任意类型,服务器不会去解析,请求体的处理需要自己解析,如POST JSON
- url的query中, 多个键值对之间用&连接 如:k1=v1&k2=v2..., 配合Content-type: 'application/x-www-form-urlencoded;charset=UTF-8'
- 区分是否被当成文件的关键是Content-Disposition是否包含filename,因为文件有不同的类型,所以还要使用Content-Type指示文件的类型,如果不知道是什么类型取值可以为application/octet-stream表示该文件是个二进制文件,如果不是文件则Content-Type可以省略。例如:文件上传配合Content-Type:'multipart/form-data; boundary={boundary}'
表单或者模拟表单 指的就是第二种和第三种(multipart/form-data)
(4),http请求行之请求方法
- GET 请求指定页面信息,返回数据。
- HEAD 类似GET,不返回实体,获取报头。
- POST 提交指定资源进行处理。
- PUT 从客户端向服务器传送的数据取代指定的文档内容。
- DELETE 请求服务器删除指定的内容。
- CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务端性能。一般在预检请求时会发送,是否允许请求等。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- PATCH 对PUT方法的补充,用来对已知资源的补充。
GET 和 POST 区别:
- GET: 后退/刷新 无害。POST: 数据会被重新提交
- GET: 可以被收藏为书签。POST: 不可以被收藏为书签
- GET: 能被缓存。POST: 不能被缓存
- GET: 编码格式application/x-www-form-urlencoded,请求参数如:url?k1=v1&k2=v2...形式。POST: 编码格式application/x-www-form-urlencoded或multipart/form-data,为二进制数据使用多重编码。
- GET: 对数据长度的限制,应该请求数据是放在url上的(url最大2048个字节)。POST: 无限制。
- GET: 只允许ASCII字符。POST: 无限制。
- GET: 安全性差,参数可见,对所有人可见。POST: 安全性高,参数不可见。
二,建立TCP连接(传输层)
通过TCP协议, 能够更加稳定的将数据传递到目的地, 指定客户端与服务器之前怎么进行通信。客户端发起请求,对于https来说要先验证SSL, 上面有提到, 然后在进行TCP建立,打通客户端服务端交互通道,实现数据交互。
- 握手一:客户端发送请求报文,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。
- 握手二:服务端接收到报文段后,如果同意建立连接,则向客户端发送确认消息,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),TCP服务器进程进入SYN-RCVD(同步收到)状态。
- 握手三:TCP客户接收到服务端确认信息后,要向服务端给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,TCP客户进入ESTABLISHED(已建立连接)。 当服务端收到TCP客户的确认后,也进入ESTABLISHED状态。则TCP建立成功,开始数据交互。
TCP 传输的可靠性,可以用一句话归结:每收到对方数据,就发送 ACK 进行确定,发送方发送后没有收到 ACK 就隔一段时间重发。
三,认识HTTPS
首先HTTPS请求是基于HTTP的,也就是基于TCP的,所以先得建立TCP三次握手。在额外的加入SSL验证。
(1),加密算法
- 对称加密:有流式、分组两种,加密和解密都是使用的同一个密钥。(常见DES, 3DES, AES)
- 非对称加密:加密解密的密钥是不同的,有公钥(公开),密钥(私有),性能低,但安全性高,数据长度有限制。
- 哈希算法:将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。
- 数字签名:签名就是在信息的后面再加上一段内容(信息经过hash后的值),可以证明信息没有被修改过。hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
(2),验证SSL证书阶段 (此时TCP连接已建立)
证书:每个服务器都要向CA机构申请自己的证书,CA机构会将其设置为受信任的,全球信任,支持所有浏览器的SSL证书是不需要再客户端安装的,在服务器端安装好即可正常使用,但是如果你的SSL证书不是支持所有浏览器的,或者是自签证书,那么要想正常访问,客户端还是需要装证书的。客户端证书(存放在操作系统中)包含内容(证书发布机构,证书有效期,公钥,证书所有制,签名 ...)。私钥存在于服务端。
- 客户端发起HTTPS请求时, 服务端发送SSL证书给客户端。
- 客户端接收并读取SSL证书,一一验证证书的信息。
- 客户端开始查找操作系统中已内置的受信任的证书颁发机构CA,检验服务端发来的证书颁发机构CA,若是受信任则继续,否则报错。
- 若一致,那么客户端就会从操作系统中取出颁发者CA公钥,然后对签名进行解密。
- 客户端使用相同的hash算法计算出服务端发来的证书的hash值,与签名中的hash做对比,若一致则继续,若不一致则报错。
(3),客户端与服务端验证SSL通信阶段
- 证书验证成功后,客户端告诉服务端我要用对称加密来进行数据传输。
- 服务端接收到信息并回应客户端,说OK。
- 读取公钥,对请求内容进行加密,然后发送给服务端,服务端接收后解密。
- 客户端接收服务端已加密的响应的内容。
四,HTTP和HTTPS的区别
- HTTP没有SSL验证。HTTPS协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议,可确保数据发送到正确的客户机和服务器。
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- HTTP的连接很简单,是无状态的。HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
五,HTTP1.x的缺点
- 连接无法复用:连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对大量小文件请求影响较大(没有达到最大窗口请求就被终止)。
- 传输数据时,每次都需要重新建立连接,增加延迟。
- 虽然加入keep-alive可以复用一部分连接,但域名分片等情况下仍然需要建立多个connection,耗费资源,给服务器带来性能压力。
- Head-Of-Line Blocking(HOLB):导致带宽无法被充分利用,以及后续健康请求被阻塞。HOLB是指一系列包(package)因为第一个包被阻塞;当页面中需要请求很多资源的时候,HOLB(队头阻塞)会导致在达到最大请求数量时,剩余的资源需要等待其他资源请求完成后才能发起请求。
- 协议开销大:在使用时,header里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量。单向请求,只能由客户端发起。
- 安全因素:在传输数据时,所有传输的内容都是明文(文本),客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性
六,认识HTTP 2.0
- 简单来说,HTTP/2(超文本传输协议第2版,最初命名为HTTP2.0),是HTTP协议的第二个主要版本。HTTP/2是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。
- SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,==通过压缩、多路复用和优先级等技术==,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。
(1),特点
- 二进制传输
HTTP2.0中所有加强性能的核心是二进制传输,引入了新的编码机制,所有传输的数据都会被分割,HTTP1.x 采用文本。
- 多路复用
HTTP2.0中,有两个概念非常重要:帧(frame)和流(stream),流是多个帧组成的数据流。==所谓多路复用,即在一个TCP连接中存在多个流(即可复用tcp),即可以同时发送多个请求,对端可以通过帧中的表示知道该帧属于哪个请求。在客户端,这些帧乱序发送,到对端后再根据每个帧首部的流标识符重新组装。通过该技术,可以避免HTTP旧版本的队头阻塞问题,极大提高传输性能==。
- Header 压缩
HTTP1.X 中使用文本形式传输header,在header中携带cookie过大,消耗资源。
- 服务器PUSH
服务端可以在客户端某个请求后,主动推送其他资源。
- 更安全
使用了tls的拓展ALPN做为协议升级,除此之外,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法。