HTTP解析

1、 TCP/IP协议族

1.1. TCP/IP协议族概念

  • 在说HTTP前,咱们先来了解一下TCP/IP协议族:不一样的硬件、操做系统之间通讯都须要一种规则,这种规则称为协议(protocal),而协议中存在各式各样的内容。从电缆的规格到IP地址的选定方法、寻找异地用户的方法、双方创建通讯的顺序,以及Web页面显示须要处理的步骤等等,像这样把与互联网相关联的协议集合起来总称为TCP/IP协议族,咱们一般使用的网络都是在TCP/IP协议族的基础上运做的,而HTTP属于它内部的一个子集。

1.2. TCP/IP协议族分层

  1. 应用层:提供应用服务,包含HTTP/DNS(域名系统)/FTP(文件传输)。
  2. 传输层:提供链接中的计算机间的数据传输(请求报文),包含TCP(传输控制协议)和UDP(用户数据报协议)。
  3. 网络层:处理网络上流动的数据包,数据包是网络传输的最小数据单位,该层规定了经过怎样的传输路线到达对方计算机,并把数据包传送给对方,包含IP(Internet Protocol)网络协议。
  4. 链路层:处理网络链接的硬件部分。

  • 利用TCP/IP协议族进行网络通讯时,会经过分层顺序与对方进行通讯。发送端从应用层往下走,客户端在应用层(HTTP协议)发出一个HTTP请求传输层把接收到的请求报文进行分割,并在各个报文上打上标记号及端口号后转发给网络层,在网络层增长做为通讯目的地的的MAC地址后转发给链路层,接收端的服务器在链路层接收到数据后从链路层往上走,走完以后才算是一个完整的HTTP请求

  • 发送端通过每层都会加上对应的首部信息,含TCP首部IP首部以太网首部,接受端则每通过一层消去一个首部。这种将数据信息包装起来的作法称为封装

1.3. 与HTTP关系密切的协议:DNS、TCP、IP

1. DNS协议

  • DNS协议位于应用层,负责将域名解析为IP地址

2. TCP协议

  • TCP协议位于传输层,提供可靠的字节流服务,它会将大快数据分割成以报文段为单位的数据包进行管理,且能确认数据最终是否送达到对方。为确保将数据准确传送至对方,采用了三次握手策略,握手过程当中使用了TCP的标志SYN(synchronize/使同步)ACK(acknowledgement/确认)

发送端首先发送一个带SYN标志的数据包给对方。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带ACK标志的数据包,表明"握手"结束。若在握手过程当中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。前端

3. IP协议

  • IP协议位于网络层,做用是把各类数据包传输给对方,而传输就须要地址,而地址则须要IP地址(勿和IP协议混淆)MAC地址(Media Access Control Address/媒体访问控制地址)IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址能够和MAC地址进行配对,IP地址可变换,但MAC地址基本上不会更改。算法

  • IP地址间的通讯依赖MAC地址,通讯基本都须要进行中转,而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时会采用ARP协议(AddressResolution Protocol/地址解析协议)ARP是一种用以解析地址的协议,根据通讯方的IP地址就能够反查出对应的MAC地址。在中转过程当中,计算机和路由器等网络设备只能获悉粗略的传输路线,这种机制称为路由选择(routing)浏览器

4. 各类协议与HTTP协议的关系

2、HTTP协议

2.1. HTTP概念

  • HTPP(HyperText Transfer Protocol)是一种超文本传输协议,或者说是一种传输规则,用于客户端和服务器,经过请求和响应的交换来达成通讯。

1. 无状态

  • HTTP无状态协议,即HTTP协议自身不具有保存以前发送过的请求或响应的功能,也就是说,没法根据以前的状态进行本次的请求处理。优势是不保存状态可减小服务器的CPU及内存资源的消耗,但同时缺点也明显,因此出现了使用Cookie来进行状态管理。缓存

  • Cookie会根据从服务器端发送的响应报文内的一个叫作Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,会去检查到底是从哪个客户端发来的链接请求,而后对比服务器上的记录,最后获得以前的状态信息。安全

  • Set-Cookie字段属性性能优化

2. 持久链接

  • HTTP协议的初始版本中,每进行一次HTTP通讯就要断开一次TCP链接。因此若是当请求的资源不少时,会形成无谓的TCP链接创建和断开,增长通讯量的开销。为解决TCP链接的问题,产生了keep-alive的方法,其特色是:只要任意一端没有明确提出断开链接,则保持 TCP链接状态(在HTTP/1.1中,全部的链接默认都是持久链接)。

  • 持久链接也是管线化成为可能,即不用等待响应便可发送下一个请求,这样就可以作到同时并行发送多个请求。

2.2. 客户端

1. 请求报文

  • 发送请求时会发送请求报文,其由请求行(含请求方法请求URI协议版本)、报文首部报文实体构成的,且报文首部报文实体以一空行(CR+LF)分隔,以下图:

1. 请求行

  1. 请求方法

经常使用:服务器

  • GET: 获取资源。
  • POST: 传输实体主体。

检测查询:网络

  • OPTIONS: 询问支持的方法或预检请求。
  • HEAD: 得到报文首部,和GET方法同样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。
  • TRACE: 追踪路径。

文件相关:前端性能

  • PUT: 传输文件。
  • DELETE: 删除文件。

安全:ide

  • CONNECT: 要求在与代理服务器通讯时创建隧道,实现用隧道协议进行TCP通讯。
  1. URI/URL
  • URI:统一资源标识符(Uniform Resource Identifier),表明一种标识。

  • URL:统一资源定位符(Uniform/Universal Resource Locator)

  • URI是资源的标识或头衔,而URL更为具体,包含了标识的同时还含有资源定位,平时咱们在浏览器地址栏内输入的就是URL,由于咱们要找到这个资源,固然你输入的也是URI,由于URL是更为具体的URI而已。

  1. 协议版本
  • HTTP/1.0

  • HTTP/1.1 (目前经常使用)

  • HTTP/2.0

2. 报文首部

  • 报文首部包含请求首部字段通用首部字段实体首部字段其余(可能包含HTTP的RFC里未定义的首部(Cookie等))

  1. 请求首部字段

Host

Host会告知服务器,请求的资源所处的互联网主机名和端口号。在HTTP/1.1规范内是惟一一个必须被包含在请求内的首部字段。

Referer

Referer会告知服务器请求的原始资源的URI

  1. 通用首部字段
  • 请求报文和响应报文两方都会使用的首部。

2.1 Cache-Control

  • 请求值:

  • 响应值:

2.2 Connection

  • 做用:

① 控制再也不转发给代理的首部字段

② 管理持久链接

HTTP/1.1版本的默认链接都是持久链接。为此,客户端会在持久链接上连续发送请求。当服务器端想明确断开链接时,则指定Connection首部字段的值为Close

2.3 Date

  • 代表建立 HTTP 报文的日期和时间

2.4 Pragma

  • PragmaHTTP/1.1以前版本的历史遗留字段,仅做为与HTTP/1.0的向后兼容而定义。Pragma: no-cache:该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求全部的中间服务器不返回缓存的资源。

2.5 Trailer

  • 首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时。

2.6 Transfer-Encoding

  • Transfer-Encoding规定了传输报文主体时采用的编码方式。

2.7 Upgrade

首部字段Upgrade用于检测HTTP协议及其余协议是否可以使用更高的版本进行通讯,其参数值能够用来指定一个彻底不一样的通讯协议。Upgrade对象仅限于客户端和邻接服务器之间。所以,使用首部字段Upgrade时,还须要额外指定Connection:Upgrade,再也不转发给代理。服务器可用101 SwitchingProtocols状态码做为响应返回。

3.8 Via

  • 为了追踪客户端与服务器之间的请求和响应报文的传输路径。

3.9 Warning

  • 告知用户一些与缓存相关的问题的警告。
  1. 实体首部字段
  • 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

Allow

  • Allow用于通知客户端可以支持Request-URI指定资源的全部HTTP方法。

Content-Location

  • Content-Location表示的是报文主体返回资源对应的URI,可能会和实际请求的对象不一样。Location是令客户端重定向至指定的URI

Content-MD5

Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程当中是否保持完整,以及确认传输到达。服务器发往客户端。

Expires

  • 资源失效日期,Cache-Control:max-age优先级更高。

3. 报文实体

在相同的IP地址下,因为虚拟主机能够寄存多个不一样主机名和域名的Web网站,所以在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI

2.3. 服务器

1. 响应报文

1. 状态行

  1. 协议版本

  2. 状态码:

状态码用于描述返回的请求结果:

  • 1XX 信息性状态码——接收的请求正在处理
  • 2XX 成功状态码——请求正常处理完毕
  • 3XX 重定向状态码——须要附加操做以完成请求
  • 4XX 客户端错误状态码——服务器没法处理请求
  • 5XX 服务端错误状态码——服务器处理请求出错

经常使用状态码:

  • 200 OK——请求成功。表示从客户端发来的请求在服务器端被正常处理了。
  • 204 No Content——请求处理成功,但没有资源可返回。即无实体返回,通常用于只需客户端往服务器发送消息。
  • 206 Partial Content——范围请求。而服务器成功执行了这部分的GET请求。

  • 301 Moved Permanently——永久重定向。该状态码表示请求的资源已被分配了新的URI,之后应使用资源如今所指的URI,当指定资源路径的最后忘记添加斜杠"/",就会产生 301 状态码。
  • 302 Found——临时重定向。URI未来还可能会变。
  • 303 See Other——该状态码表示因为请求对应的资源存在着另外一个URI,应使用GET方法定向获取请求的资源。相似302。
  • 307 Temporary Redirect——临时重定向。相似302,不会将POST变为GET,但也视浏览器而定。

当 30一、30二、303 响应状态码返回时,几乎全部的浏览器都会把POST改为GET,并删除请求报文内的主体,以后请求会自动再次发送。

  • 304 Not Modified——资源无变化,不返回实体。

  • 400 Bad Request——请求报文存在语法错误。
  • 401 Unauthorized——请求须要有经过HTTP认证。认证方式有BASIC认证(基本认证)、DIGEST认证(摘要认证)、SSL客户端认证、FormBase认证(()基于表单认证)。
  • 403 Forbidden——请求资源的访问被服务器拒绝。未得到文件系统的访问受权,访问权限出现某些问题等会产生。
  • 404 Not Found——服务器上没法找到请求的资源。

  • 500 Internal Server Error——服务器端在执行请求时发生了错误。
  • 503 Service Unavailable——服务器暂时处于超负载或正在进行停机维护,如今没法处理请求。
  1. 状态码缘由短语

2. 报文首部

  1. 响应首部字段

3. 报文实体

  • 报文实体可进行内容编码,经常使用编码有:
  1. gzip (GNU zip)
  2. compress (UNIX系统的标准压缩)
  3. deflate (zlib)
  4. identity (不进行编码)
  • 分割发送的分块传输编码:

在 HTTP 通讯过程当中,请求的编码实体资源还没有所有传输完成以前,浏览器没法显示请求页面。在传输大容量数据时,经过把数据分割成多块,可以让浏览器逐步显示页面。

2.4. 中间商

HTTP通讯时,除客户端和服务器之外,还有一些用于通讯数据转发的应用程序:代理、网关、隧道

1. 代理

  • 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。代理不改变请求URI,会直接发送给前方持有资源的目标服务器,每次经过代理服务器转发请求或响应时,会追加写入Via首部信息,会标记出通过的主机信息。

  • 缓存代理

代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就能够不从源服务器那里获取资源,而是将以前缓存的资源做为响应返回。

  • 透明代理

转发请求或响应时,不对报文作任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理

2. 网关

  • 网关是转发其余服务器通讯数据的服务器,接收从客户端发送来的请求时,它就像本身拥有资源的源服务器同样对请求进行处理。有时客户端可能都不会察觉,本身的通讯目标是一个网关。利用网关能够由HTTP请求转化为其余协议通讯。利用网关能提升通讯的安全性,由于能够在客户端与网关之间的通讯线路上加密以确保链接的安全。

3. 隧道

  • 隧道可按要求创建起一条与其余服务器的通讯线路,届时使用SSL等加密手段进行通讯。隧道的目的是确保客户端能与服务器进行安全的通讯。隧道自己不会去解析HTTP请求。请求保持原样中转给以后的服务器,隧道会在通讯双方断开链接时结束。

2.5. 缓存

  • 了解了以上各个报文字段,下面来综合理解缓存机制:

强缓存:是利用HTTP头中的ExpiresCache-Control两个字段来控制的。强缓存中,当请求再次发出时,浏览器会根据其中的ExpiresCache-Control判断目标资源是否“命中”强缓存,若命中则直接从缓存中获取资源,不会再与服务端发生通讯。

协商缓存:协商缓存依赖于服务端与浏览器之间的通讯,协商缓存机制下,浏览器须要向服务器去询问缓存的相关信息,进而判断是从新发起请求、下载完整的响应,仍是从本地获取缓存的资源。其中涉及Last-ModifieldIf-Modified-Since的配合,ETagIf-None-Match的配合。

1. Cache-Control

  • Cache-Control,这个字段在请求和响应中均可以使用,对应的值以下:
  1. 请求中使用的值:

  1. 响应中使用的值:

Cache-Control: public

  • 响应独有:缓存公有化。明确代表其余用户也可利用缓存,即浏览器和代理服务器均可进行缓存,默认值为private,但当字段中出现s-maxage时表示当前值为public

Cache-Control: private

  • 响应独有:缓存私有化。代理服务器不能对资源进行缓存。

Cache-Control: no-cache

  • 请求中含义:客户端不使用缓存资源,绕开浏览器缓存确认,直接向源服务器上进行缓存资源的确认。
  • 响应中含义:告知缓存代理在缓存资源时需向源服务器确认资源有效性后进行处理,指不缓存过时的资源。(若响应报文Cache-Control中对no-cache字段名具体指定参数值,如Cache-Control: no-cache=Location,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存)

Cache-Control: no-store

  • 请求中含义:不使用缓存,也不进行缓存确认,直接发送请求获取资源。
  • 响应中含义:告知缓存代理不能进行缓存。

Cache-Control: max-age=秒

  • 请求中含义:规定缓存通过的最大时间,若是数值未超过缓存的时间则取缓存资源。若是为0,则至关于想服务器请求资源。
  • 响应中含义:规定缓存保存的时间。

Cache-Control: s-maxage=秒

  • 响应独有:仅在代理服务器中生效(生效则忽略Expires和max-age指令),规定缓存的过时时间。

Cache-Control: max-stale=秒

  • 请求独有:指缓存过时了指定时间后依旧可以使用该缓存资源。如不指定时间,则无论过时了多久依旧使用缓存资源。

Cache-Control: min-fresh=秒

  • 请求独有:指缓存代理返回至少未通过指定时间的缓存资源。

Cache-Control: no-transform

  • 请求中含义:在缓存代理中不能改变实体的媒体类型,可防止缓存或代理压缩图片等相似操做。
  • 响应中含义:在缓存代理中不能改变实体的媒体类型,可防止缓存或代理压缩图片等相似操做。

Cache-Control: only-if-cached

  • 请求独有:只有缓存代理缓存了资源才要求其返回资源。

Cache-Control: must-revalidate

  • 响应独有:缓存代理可缓存,但必须先向源服务器确认资源有效性。会忽略请求的max-stale指令。

Cache-Control: proxy-revalidate

  • 响应独有:要求全部的缓存代理在接收到客户端带有该指令的请求返回响应以前,必须再次验证缓存的有效性。

Cache-Control: cache-extension

  • 请求中含义:扩展新指令标记。
  • 响应中含义:扩展新指令标记。

2. Expires

  • Expires: 时间戳

  • 首部字段Expires会将资源失效的日期告知客户端。缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间以前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

  • 优势:与Cache-Control同时使用,为了向下兼容。

  • 缺点:依赖本地时间。

3. Last-Modifield与If-Modified-Since的配合

Last-Modifield: 时间戳在首次请求时伴随着Response Headers返回,是一个时间戳,表示最近的一次资源改动时间:

Last-Modified: Fri, 27 Oct 2017 06:35:57 GMT
复制代码

随后咱们每次请求时,会带上一个叫If-Modified-Since的时间戳字段,它的值正是上一次Response Headers返回给它的Last-Modifield值:

If-Modified-Since: Fri, 27 Oct 2017 06:35:57 GMT
复制代码

服务器接收到这个时间戳后,会比对该时间戳和资源在服务器上的最后修改时间是否一致,从而判断资源是否发生了变化。若是发生了变化,就会返回一个完整的响应内容,并在Response Headers中添加新的Last-Modified值;不然,返回304响应,同时Response Headers不会再添加Last-Modified字段。

4. ETag与If-None-Match的配合

对于Last-Modified的使用是存在弊端的:①服务器不能正确感知文件的变化,如编辑但未修改文件,也会被当成了修改,②文件修改过快也感知不到,由于精度是秒。因此出现了ETag,由服务器为每一个资源生成的惟一的标识字符串,这个标识字符串是基于文件内容编码的,只要文件内容不一样,它们对应的ETag就是不一样的。

ETagLast-Modified相似,当首次请求时,咱们会在响应头里获取到一个最初的标识符字符串:

ETag: W/"2a3b-1602480f459"
复制代码

那么下一次请求时,请求头里就会带上一个值相同的、名为if-None-Match的字符串供服务端比对了:

If-None-Match: W/"2a3b-1602480f459"
复制代码
  • 特色:ETag优先级更高,当ETagLast-Modified同时存在时,以ETag为准。

  • 优势:精确感应文件变化。

  • 缺点:ETag的生成过程须要服务器额外付出开销,会影响服务端的性能。

5. 缓存策略

了解了以上缓存,在面对一个具体的缓存需求时,咱们到底该如何决策?

根据以上Chrome官方给出的这张策略图:①当咱们的资源内容不可复用时,直接为Cache-Control设置 no-store,拒绝一切形式的缓存;②不然考虑是否每次都须要向服务器进行缓存有效确认,若是须要,那么设 Cache-Control的值为no-cache;③不然考虑该资源是否能够被代理服务器缓存,根据其结果决定是设置为 private仍是public;④而后考虑该资源的过时时间,设置对应的max-ages-maxage值;⑤最后,配置协商缓存须要用到的EtagLast-Modified等参数。

3、HTTPS

3.1. HTTP的不足

  • ①身份被假装
  • ②报文被篡改
  • ③内容被窃听

因此针对以上问题须要进行身份验证通讯加密内容加密

HTTP协议中没有加密机制,但能够经过和SSL(Secure Socket Layer,安全套接层)TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通讯内容。与SSL组合使用的HTTP被称为HTTPS(HTTPSecure,超文本传输安全协议)

  • 一般,HTTP直接和TCP通讯。当使用SSL时,则演变成先和SSL通讯,再由SSLTCP通讯,因此HTTPS是身披SSL外壳的HTTPSSL采用一种叫作公开密钥加密(Public-key cryptography)的加密处理方式。

1. 通讯加密

公开密钥加密使用一对非对称的密钥。一把叫作私有密钥(private key),另外一把叫作公开密钥(public key)。顾名思义,私有密钥不能让其余任何人知道,而公开密钥则能够随意发布,任何人均可以得到。发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用本身的私有密钥进行解密。利用这种方式,不须要发送用来解密的私有密钥,也没必要担忧密钥被攻击者窃听而盗走。

虽然这样解决了加密的问题,但公开秘钥加密处理速度相对比较慢,因此引入了一种共享秘钥加密方式,就是通讯双方都使用相同的秘钥进行加密和解密,而使得双方安全的获得这个秘钥就须要使用上述的公开秘钥加密方式进行秘钥的传输。HTTPS就是采用共享密钥加密和公开密钥加密二者并用的混合加密机制

2. 身份验证

通讯加密方式解决了,可是如何证实公开秘钥是货真价实的呢?

  • 为了解决这个问题,可以使用由数字证书认证机构其相关机关颁发的公开密钥证书。首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份以后,会对已申请的公开密钥作数字签名,而后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一块儿公钥证书也可叫作数字证书或直接称为证书。接到证书的客户端可以使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,多数浏览器开发商发布版本时,会事先在内部植入经常使用认证机关的公开密钥,以便能将公开密钥安全地转交给客户端。

3. 内容加密

使用MD5SHA-1等散列值校验来保证报文完整性,但依旧不可靠,由于内容依旧可被篡改。

4、Web应用攻击

4.1. 主动攻击

  • 主动攻击指攻击者经过直接访问Web应用,把攻击代码传入的攻击模式。

1. SQL注入攻击

  • 如加入引号拆分字符串进而注释掉部分命令来达到破坏原命令的效果。

2. OS命令注入攻击

  • 执行非法的操做系统命令达到攻击的目的。

3. 密码破解

  • 穷举法-暴力破解法

  • 字典攻击-利用事先收集好的候选密码,通过各类组合方式后存入字典,枚举字典中的密码。

  • 措施:密码不以明文方式保存

4.2. 被动攻击

  • 被动攻击是指利用圈套策略执行攻击代码的攻击模式。

1. 跨站脚本攻击(Cross-Site Scripting,XSS)

  • 指攻击者经过植入脚本等方式进行攻击,可采起输入验证、输出转义等措施。

2. 跨站请求伪造(CSRF)

  • 指攻击者经过设置好的陷阱,强制对已完成认证的用户进行非预期的我的信息或设定信息等某些状态更新。

3. HTTP首部注入攻击

  • 指攻击者经过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。会形成设置任意Cookie信息重定向至任意URL显示任意的主体等影响。

4. 提示漏洞攻击

  • 对于不正确的错误消息处理若是处理不恰当,会成为攻击者利用的切入点。

  • 表单验证提示过于详细也会成为漏洞,应抑制模糊设定提示语。

相关参考:《图解HTTP》、《前端性能优化原理与实践》小册等

相关文章
相关标签/搜索