1HTTP基本概念HTTP是超文本传输??协议(HyperTextTransferProtocol)的缩写。HTTP协议(HyperTextTransferProtocol,超文本传输??协议)是一种用于将超文本从WWW服务器传输到本地浏览器的传输协议。它可以使浏览器更高效并减少网络传输。它不仅保证了计算机正确快速地传输超文本文档,而且还决定了传输文档的哪一部分,先显示哪部分内容(如文本先于图形)等。HTTP是一种应用层协议由请求和响应组成,是标准的客户端-服务器模型。HTTP是一种无状态协议。HTTP协议是一种应用层传输协议,用于客户端和服务器之间的通信。2HTTP常用方法方法说明支持版本GET获取资源GET方法用于请求URL指定的资源。服务器解析指定资源并返回响应内容1.0/1.1POST传输实体体POST方法用于传输实体体1.0/1.1PUT传输文件与FTP协议的文件上传一样,需要包含请求消息体内容中的文件,然后保存到请求URL指定的位置。不是很常用。1.0/1.1HEAD获取消息头HEAD方法与GET方法相同,只是不返回消息体。用于确认URL的有效性和资源更新的日期和时间等。1.0/1.1DELETE删除文件DELETE方法用于删除文件,与PUT方法相反。DELETE方法通过请求URL删除指定的资源。也不常用1.0/1.1OPTIONS查询支持方法OPTIONS方法用于查询为请求URL指定的资源支持方法1.1TRACE跟踪路径TRACE方法是让web服务器环回之前请求通信给客户端的方法。客户端可以使用TRACE方法查询请求发出时是如何处理和修改的。不常用,容易引起XST攻击。1.1CONNECT需要使用隧道协议连接到代理。CONNECT方法需要在与代理服务器通信时建立隧道,使用隧道协议实现TCP通信。主要使用SSL和TSL协议对通信内容进行加密,通过网络隧道传输。1.12.1OPTIONS方法详解OPTIONS请求是预检查请求,可以用来检测服务器允许的http方法。在发起跨域请求时,如果是非简单请求,出于安全考虑,当触发某些条件时,浏览器会在正式请求之前自动发起一个OPTIONS请求,即CORS预检请求.如果服务器接受了跨域请求,浏览器就会继续进行正式请求。满足以下条件为简单请求请求方式只能是GET、POST、HEADHTTP请求头限制这几个字段(Accept、Accept-Language、Content-Type、DPR、Downlink、Save-Data、Viewport-Width、Width)Content-Type:只能在application/x-www-form-urlencoded、multipart/form-data、text/plain请求中取任意XMLHttpRequestUpload对象,无需注册任何事件监听器;XMLHttpRequestUpload对象可以使用ReadableStream对象,在请求中不使用3请求报告文本和响应消息3.1请求消息一个HTTP请求消息由四部分组成:请求行、请求头、空行和请求数据。下图显示了请求消息的一般格式。1.请求行请求行分为请求方法、请求地址和协议版本三部分2.请求头请求头请求头在请求消息中添加一些附加信息,由“名称/值”对组成,每行一个是的,使用冒号分隔名称和值。常见的请求头如下:请求头描述接受可接受的响应内容类型(Content-Types)Accept-Encoding可接受的字符集Accept-Language可接受的响应内容编码方式Cache-Control用于指定当前请求/回复中,是否使用缓存机制。Connection是之前的服务器通过Set-Cookie设置的一个HTTP协议cookie(见下)。Cookie表示服务器的域名和服务器监听的端口号。如果请求的端口是相应服务的标准端口(80),则可以省略端口号。Host表示服务器的域名和服务器监听的端口号。如果请求的端口是相应服务的标准端口(80),则可以省略端口号。Referer表示浏览器之前访问过的页面,可以认为是将浏览器带到当前页面的之前访问过的页面的链接。Referer其实就是Referrer这个词,只是在RFC制定标准的时候拼错了,后来才错误的使用Referer。User-Agent浏览器的身份字符串3.请求数据的可选部分,例如GET请求没有请求数据。而一个POST方法会有一个请求体响应消息HTTP响应消息主要由状态行、响应头、空行和响应数据组成。1、状态行由3部分组成,分别是:协议版本、状态码、状态码描述。(后面会介绍状态码)2.响应头和请求头类似,在响应报文中增加了一些额外的信息。常见的响应头如下:响应头描述Access-Control-Allow-Origin指定哪些网站可以跨域源资源共享Age响应对象在代理缓存中的存在时间,以秒为单位。Cache-Control通知从服务器到客户端的所有缓存机制,表明它们是否可以缓存这个对象以及缓存的有效时间。单位是秒ConnectionExpected此连接的选项Content-Type当前内容的MIME类型Location在重定向或创建新资源时使用。Status是普通网关接口的响应头字段,用于表示当前HTTP连接的响应状态。4、响应消息与请求消息相比,多了一个“响应状态码”,用“清晰明了”的语言告诉客户端本次请求的处理结果。HTTP响应状态码由5段组成:1xx消息,一般告诉客户端请求已经收到,正在处理中,不用担心... 100Continue—服务器只收到部分请求,但是一旦服务器不拒绝请求,客户端应该继续发送请求的其余部分。 101SwitchingProtocols—服务端转换协议:服务端会根据客户端的请求,切换到另一种协议。 102Processing—由WebDAV(RFC2518)扩展的状态代码,表示处理将继续。2xx处理成功,一般表示:收到请求,明白你要什么,接受请求,处理完成等200OK:请求成功201Created:常用于POST和PUT请求,表示请求成功,新创建了一个资源。并在响应正文中返回路径。202Accepted:请求已收到,但没有响应,后面不会返回异步请求结果。该状态码适用于等待其他进程或批处理的场景。203No-AuthoritativeInformation:表示响应返回的元信息与原始服务器不同,是从本地或第三方获取的。主要用于其他资源的镜像和备份。除了前面的情况,首选是200204NoContent:请求没有返回任何数据,但是header信息有用。用户代理(浏览器)更新缓存的标头。205重置内容:告诉用户代理(浏览器)重置发送请求的文档。206ParticalContent:客户端使用Range请求头时返回该状态码。3xx重定向到别处。它让客户端再发出一个请求来完成整个过程。301永久重定向302临时重定向304NotModified:资源没有改变。4xx处理中出现错误,责任在客户端,如客户端请求不存在的资源,客户端未授权,禁止访问等。400BadRequest:Thereisaproblemwiththe服务器无法识别的请求语法。没有主机请求头域,或设置了多个主机请求头域。401UnAuthorized:客户端未授权该请求。缺少有效的身份认证凭据,一般可能是您没有登录,登录后一般可以解决问题。403Forbidden:服务器拒绝响应。权限不足。404NotFound:URL无效或URL有效但没有资源。405MethodNotAllowed:不允许请求方法Method。但是,GET和HEAD是强制方法,不能返回此状态码。406NotAcceptable:资源类型不符合服务器要求。407ProxyAuthorizationRequired:需要代理授权。408RequestTimeout:服务器关闭不再使用的连接。响应标头将具有连接:关闭。426UpgradeRequired:告诉客户端通讯协议需要升级。5xx处理过程中发生错误,责任在服务器,如服务器抛出异常、路由错误、不支持HTTP版本等。500InternalServerError:服务器内部错误,未捕获。502BadGateway:当服务器作为网关使用时,收到来自上游服务器的无效响应。503ServiceUnavailable:无法服务。通常发生在由于维护或服务过载而停机时。一般会附带一个响应头Retry-After:表示预计恢复服务的时间。504GatewayTimeout:网关超时。服务器作为网关或代理,无法及时将上游服务器的响应返回给客户端。505HttpVersionNotSupported:服务器不支持请求的HTTP版本。如果请求通过http2发送,服务器不支持http2.0,则返回此状态码。5浏览器缓存机制我们根据是否需要向服务器重新发起HTTP请求,将缓存过程分为两部分,即强制缓存和协商缓存。5.1强制缓存强制缓存是在浏览器缓存中查找请求结果,并根据结果的缓存规则决定是否使用缓存结果的过程。强制缓存主要有三种情况(暂不分析协商缓存过程),如下:如果缓存结果和缓存ID不存在,如果强制缓存无效,则直接向客户端发起请求服务器(与第一个请求一致)。如果缓存结果和缓存ID存在,但是结果已经过期,如果强制缓存无效,则使用协商缓存(暂不分析)缓存结果和缓存标识符存在,结果还没有过期,缓存强制生效,直接返回结果。当浏览器向服务器发送请求时,服务器会将缓存规则放入HTTP响应报文中,HTTP头与请求结果一起返回给浏览器,控制强制缓存的字段有Expires和Cache-Control,其中Cache-Control的优先级高于Expires2.1.2Cache-Control在HTTP/1.1中,Cache-Control是最重要的规则,主要用于控制网页缓存。主要取值是:public:所有内容都会被缓存(客户端和代理服务器都可以缓存)private:所有内容只能被客户端缓存,Cache-Control默认值为no-cache:客户端缓存内容,但是否使用缓存需要通过协商缓存来验证。no-store:所有内容都不会被缓存,即既不强制缓存也不协商缓存=xxx(xxx为数字):缓存的内容将在xxx秒后过期。5.2协商缓存协商缓存是指缓存被强制失效后,浏览器向带有缓存标识的服务器发送请求,服务器根据缓存标识决定是否使用缓存。有以下两种情况:协商缓存生效,返回304协商缓存失败,返回200和请求结果。协商缓存的标识也在响应报文的HTTP头中与请求结果一起返回给浏览器。有:Last-Modified/If-Modified-Since和Etag/If-None-Match,其中Etag/If-None-Match的优先级高于Last-Modified/If-Modified-Since。2.2.1Last-Modified/If-Modified-SinceLast-Modified是服务器响应请求时,返回资源文件在服务器上最后修改的时间。If-Modified-Since是客户端再次发起请求时,随上次请求一起返回的Last-Modified这个字段的值,告诉服务端上次请求该资源返回的最后修改时间。当服务器收到请求,发现请求头中包含If-Modified-Since字段时,就会将If-Modified-Since字段的值与资源在服务器上的最后修改时间进行比较。如果资源在服务器上的最后修改时间大于If-Modified-Since的字段值,将再次返回该资源,状态码为200;否则返回304,表示资源未更新,服务器响应请求时返回缓存文件Etag/If-None-MatchEtag。文件唯一标识If-None-Match是客户端再次发起请求时,携带上次请求返回的唯一标识Etag值,通过这个字段值。服务器收到请求后,发现请求头中包含If-None-Match,就会将If-None-Match的字段值与服务器上资源的Etag值进行比较。如果匹配则返回304,表示资源没有更新。,继续使用缓存文件;如果不一致,则重新返回资源文件,状态码为2006。与http协议相比,目前有4个版本,其中1.0和1.1版本在互联网上被广泛使用,2.0版本目前正在逐渐正在使用。它是新一代的http协议。http/0.9版本:1991,原型版本,功能简单,只有一个GET命令,只支持纯文本内容,这个版本已经过时了。http/1.0版本:1996年5月,支持缓存、MIME、method等。http/1.1版本:1997年1月,默认建立持久连接,可以和代理服务器很好的配合。还支持以管道方式同时发送多个请求,以减少线路负载,提高传输速度。http/2版本:2015年5月作为互联网标准正式发布,头部信息和数据体都是二进制的,引入了头部信息压缩机制。可以发送http1.0版本任何格式的内容,使互联网传输的不仅是文本,还可以传输图片、视频、二进制文件等文件。除了GET命令外,还介绍了POST命令和HEAD命令。http请求和响应的格式已更改。除了数据部分之外,每次通信还必须包含头部信息(HTTPheader),用于描述一些元数据。http1.1版本http1.1是目前最主流的http协议版本。自1997年发布以来,它仍然是http协议的主流版本。引入了持久连接,即TCP连接默认不关闭,无需声明Connection:keep-alive即可被多次请求复用。引入了管道机制(pipelining),即在同一个TCP连接中,客户端可以同时发送多个请求,进一步提高了HTTP协议的效率。新方法:PUT、PATCH、OPTIONS、DELETE。http协议没有状态,所有的信息都必须附在每个请求上。请求的很多字段都是重复的,浪费带宽,影响速度。http2版本为了解决1.1版本使用率低的问题,提出了HTTP/2.0版本。增加双工模式,即不仅客户端可以同时发送多个请求,服务端也可以同时处理多个请求,解决了队头拥塞问题(HTTP2.0使用多路复用技术来实现同一个连接并发处理多个请求,并发请求数比HTTP1.1大几个数量级);在HTTP请求和响应中,状态行和请求/响应头是信息字段,没有真正的数据,所以在2.0版本中,为所有信息字段创建一个表,并为每个字段创建一个索引桌子。客户端和服务端共同使用这张表,信息字段之间用索引号表示,从而避免了1.0旧版本重复繁琐的字段,并以压缩的方式传输,提高利用率。另外还增加了服务端推送的功能,即服务端在没有请求的情况下主动向客户端发送数据。二进制协议HTTP/1.1的头部信息必须是文本(ASCII编码),数据体可以是文本也可以是二进制。HTTP/2是一个完整的二进制协议,头部信息和数据体都是二进制的,统称为“帧”(frame):头部信息帧和数据帧。二进制协议的一个好处是可以定义额外的帧。HTTP/2定义了近十种框架,为未来的高级应用奠定了基础。如果用文本来实现这个功能,解析数据会变得很麻烦,二进制解析就方便多了。多路复用HTTP/2多路复用TCP连接。在一次连接中,客户端和浏览器都可以同时发送多个请求或响应,不需要按顺序一一对应,从而避免了“队列阻塞”。比如在一个TCP连接中,服务端同时收到A请求和B请求,所以先响应A请求,发现处理过程很耗时,就把处理完的部分发送出去A的请求,然后响应B的请求,完成后,发送A请求剩下的。这种双向实时通信称为多路复用。数据流向由于HTTP/2数据包是乱序发送的,同一连接中连续的数据包可能属于不同的响应。因此,数据包必须被标记以表明它属于哪个响应。HTTP/2将每个请求或响应的所有数据包称为一个数据流(stream)。每个数据流都有一个唯一的编号。发送数据包时,必须标记数据流ID,以区分它属于哪个数据流。此外,还规定客户端发送的数据流ID均为奇数,服务端发送的ID为偶数。当数据流发送到一半时,客户端和服务端都可以发送信号(RST_STREAM帧)取消数据流。在1.1版本中取消数据流的唯一方法是关闭TCP连接。也就是说,HTTP/2可以取消某个请求,同时保证TCP连接仍然打开,可以被其他请求使用。客户端还可以指定数据流的优先级。优先级越高,服务器响应越快。HeaderInformationCompressionHTTP协议没有状态,所有的信息都必须附加到每个请求中。因此,请求的很多字段都是重复的,比如Cookie、UserAgent,每次请求都必须附加完全相同的内容,这样会浪费大量带宽,影响速度。HTTP/2通过引入标头压缩对此进行了优化。一方面,头信息在发送前用gzip或compress压缩;另一方面,client和server同时维护一个header信息表,所有的字段都会存储在这个表中生成一个indexnumber,以后不会发送相同的字段,只发送indexnumber发送,提高了速度。服务器推送HTTP/2允许服务器在没有请求的情况下将资源发送给客户端,这称为服务器推送。意思是当我们向支持HTTP2.0的web服务器请求数据时,服务器会顺便推送一些客户端需要的资源给客户端,这样客户端就不会再创建连接再向客户端发送请求了服务器获取。这种方式非常适合加载静态资源。服务端推送的这些资源其实存在于客户端的某个地方,客户端可以直接从本地加载这些资源,不需要经过网络,速度自然要快很多。一个常见的场景是客户端请求一个网页,其中包含很多静态资源。一般情况下,客户端在收到网页后必须解析HTML源代码,找到静态资源,然后发送静态资源请求。实际上,服务端可以预料到客户端请求一个网页后,很可能会再次请求静态资源,所以主动将这些静态资源连同网页一起发送给客户端。服务器端推送可以将客户端需要的资源连同index.html一起发送给客户端,免去客户端重复请求的麻烦。正因为没有发起请求、建立连接等操作,静态资源通过服务器推送可以大大提高速度。7HTTPS原理HTTP问题窃听风险:通信采用明文(未加密),内容可能被窃听(第三方可能知道通信内容)冒充风险:未验证通信方身份,因此可能存在存在伪装和篡改风险:无法证明消息的完整性,所以可能被篡改HTTPS不是应用层的新协议,通常HTTP直接与TCP通信,HTTPS先与安全层通信(SSL/TLS),然后安全层与TCP层通信。SSL/TLS协议就是为了解决上述HTTP的问题而诞生的。我们来看看它是如何解决的:所有信息都是加密传输的,第三方无法窃听。配备身份验证,防止身份被盗假装有验证机制,一旦被篡改,通信双方马上就会发现,HTTPS采用对称加密和非对称加密相结合的方式传输数据,仍然采用对称加密,但是我们对对称加密密钥使用非对称加密。浏览器向服务器发送client\_random和加密方法列表。服务器接收并返回server\_random、加密方法和公钥。浏览器收到后,再生成一个随机数pre\_master,用公钥加密后发送给服务器。(密钥操作!)服务器用私钥解密加密的pre\_master。数字证书服务器需要证明自己的身份,需要使用权威机构颁发的证书。这个权威机构就是CA(CertificateAuthority),颁发的证书称为数字证书(DigitalCertificate)。对于浏览器来说,数字证书有两个作用:通过数字证书向浏览器证明服务器的身份。数字证书包含服务器公钥。与不带数字证书的HTTPS请求流程相比,服务器的以下两个主要变化并不直接。返回公钥给浏览器,但返回数字证书,公钥包含在数字证书中;浏览器端多了一个证书校验操作,证书校验通过后继续后续流程。参考https://mp.weixin.qq.com/s/GZFiDQkZleSmriiNs4E1sA
