HTTP

学习知识要善于总结,转化为自己的知识才是最好的。最近在学HTTP,就想总结一下。

首先试想一下,我们在Web浏览器上搜索 “周杰伦”时,最终会弹出关于 “周杰伦”的所有信息。这个过程是怎么实现的呢?简单地说Wed使用了一种名为HTTP(超文本传输协议)的协议(规则的约定)作为规范,完成从客户端到服务端等一系列运作流程。

HTTP协议用于客户端和服务器端的通信。所谓客户端就是请问访问资源的一端,而服务器端就是提供资源响应的一端。但是在实际中,没有绝对的客户端和服务器端,只是相对而言的。那么客户端和服务器端是怎么进行通信交互的呢?

客户端和服务器端通过请求和响应来交换达成通信。客户端发送HTTP请求,服务器端接受请求并进行对客户端的HTTP请求的响应。请求的报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体组成。响应的报文是由协议版本,状态码(表时请求成功或者失败的数字代码),用以解释状态码的原因短语,可选的响应首部字段以及实体主体构成。

HTTP协议的原始版本是不保存状态的,即无状态的协议,因为这样可以减少服务器的CPU以及内存资源的消耗。但是问题来了,有时候我们想要登录页面,怎样才能防止每次都登录呢?这就要使用Cookie的状态的管理,使用这项技术,HTTP就可以保留状态,就有状态的属性。现在就让我们了解一下这项技术吧。

首先,当客户端向服务器端发送HTTP请求时,服务器端接受到响应,会在响应报文中添加Set-Cookie字段信息,同时也会保存Cookie,客户端接受到响应也会保存Cookie。当下次客户端再次向服务器发送请求时,客户端会自动在HTTP请求报文中添加此Cookie字段,服务器收到发送过来的Cookie,便会在本地进行查询,查询与此Cookie相匹配的记录,然后会对客户端发送此纪录。

  • 当我们访问的页面有大量数据时,比如存有大量图片或者视频。HTTP怎么解决这个问题呢?

 起初的HTTP协议版本通信就要建立TCP请求,然后断开TCP请求,会进行重复,这样会增加通信的开销。HTTP/1.1协议开发出了持久连接技术,它会保持TCP连接,知道一端提出断开TCP连接。这样会减少额外的开销和减轻服务器的负载,加快Web页面的显示速度。持久连接使得线管化(并行发送)得以实现,大大的提高了Web页面的显示速度。

  • 当我们在电脑上下载资源或者上传文件?客户端怎么和服务器端交互呢?

GET:获取资源    GET方法用来请求访问已被URI识别的资源。

POST:传输实体主体 POST方法用来传输实体的主体。

PUT:传输文件 用来上传文件给服务器端。

HEAD:获得报文首部 用来确认URI的有效性及资源更新的日期时间。

DELETE:删除文件 用来请求URI删除指定的资源。

OPTIONS:询问支持访问 用来查询请求URI指定的资源支持的方法。

TRACE:追踪路径 用来让Web服务器端将之前的请求通信返回给客户端的方法。

CONNECT:要求用赋值协议连接代理 。

  • HTTP报文:用于HTTP协议交互的信息。主要分为报文首部,报文主体。
  • HTTP报文在传输时可以进行编码提高传输效率,但是会消耗cpu的资源(编码有计算机完成)。
  • 报文主体通常情况下等于实体(有效载荷数据)主体,但是进行编码传输时,二者会不一样。
  • 当实体主体的有效载荷过大时怎么办呢?HTTP协议会采用采用压缩传输的内容编码(在实体上的编码格式,并保持实体信息原样压缩,内容编码后的实体有客户端接收并负责解码)。
  • 当传输的数据过大时怎么办呢?HTTP协议采用将传输数据切分机制,也叫做分块传输编码。每一块用十六进制进行标记,标记为1,最后一个块标记为0,这样可以保证按序接受,不会出现乱码的情况。
  • 当我们发送邮件时,为什么可以在邮件里写入文本并添加多份附件?HTTP协议采用MIME(多用途因特网邮件扩展)机制。在MIME扩展中使用一种称为多部分对象集合的方法,来容纳多份不同类型的数据,但是在HTTP报文中的首部字段里面加上Content-type.
  • 内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以语言,字符集,编码方式为基准判断响应的资源。包括的类型:服务器驱动协商,客户端驱动协商,透明协商。
  • HTTP状态码负责表示客户端HTTP请求的返回结果。

200 OK 表示从客户端发来的请求在服务器端被正常处理了。

204 No Content 表示服务器接受的请求被正常处理,但是在返回的响应报文中不含实体的主体,也就是没用有效的载荷。

206 Partial Content  客户端进行范围请求。

 

301 Moved Permanently  (永久重定性)  表示客户端请求的资源已被分配了新的URI,以后使用资源现在所指的URI。

302 Found (临时重定性)表示客户端请求的资源已被分配了新的URI,以后使用资源现在所指的URI。

303 See Other 表示请求的资源已被分了新的URI,需要采用GET方法取得资源。

304 Not Modified  表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但是发生请求未满足条件。

307 Temporary Redirect(临时重定性) 表示客户端请求的资源已被分配了新的URI,以后使用资源现在所指的URI。

 

400 Bad Request 表示客户端的请求报文中存在语法错误,服务器端不能识别。

401 Unauthorized 表示客户端请求的资源被服务器拒绝。

404 Not Found 表示客户端请求的资源在服务器上没用找到。

 

500 Internal Server Error 表示服务器端在执行请求时发生了错误。

503 Service Unavailable 表示服务器暂时处于超负载或进行停机维护。

  • HTTP通信时除了客户端和服务器以外,还有数据转发的应用程序,比如代理,网关和隧道。
  • 代理:接受客户端发送的请求后转发给服务器,不改变请求的URI。代理服务器可以缓存服务器响应的资源,会进行保存。但是有时候代理服务器缓存的资源失效怎么办呢?代理服务器会向源服务器进行缓存资源的有效性判断,如果失效,会再次从源服务器获取新的资源。

          使用代理服务器的优点:利用缓存技术可以减少网络带宽的流量。组织内部针对特定网站的访问控制,以获取访问日志为主要目的。

  • 网关:与代理的功能十分相似,但是网关可以使服务器提供非HTTP协议。

         使用网关的优点:提供通信的安全性。

  • 隧道:客户端与服务器端的安全通道。

        使用隧道的优点:通信过程中安全的传输数据。

 

  • HTTP是一种很简单的协议,但是却存在很多不足。主要的不足包括一下几个方面:

            通信使用的明文(不加密),内容可能会被窃听。

           不验证通讯方的身份,因此有可能遭伪装。

           无法证明报文的完整性,所以有可能以遭篡改。

 

  •   通信使用的明文(不加密),内容可能会被窃听。
  • HTTP不具备加密处理,所以必须加入被防止窃听的加密处理机制。加密处理机制分为通信加密和内容加密。

             通信加密:通过使用SSL(安全套接层)和TLS(安全传输协议)可以对HTTP通信进行加密。

  • 不验证通信方的身份就可能遭到伪装。主要存在下列几种:

             无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web的服务器。

            无法确定响应返回到的客户端是否是按真实意图接受响应的那个客户端。有可能是已伪装的客户端。

            无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息。只要发给特定用户通信的权限。

            无法判断请求是来自何方,出自谁手。

            即使是无意义的请求也会照单全收。无法阻止海量请求下的Dos攻击。

  • 前面讨论过SSL可以对HTTP信道进行加密,但是SSL还具有证书的手段,对通信方进行确认.。

            优点:减少个人信息泄露的危险性。

  • 无法证明报文的完整性,可能已遭篡改。

            HHTP协议无法确认通信报文的完整性,通信过程中可能遭到篡改。那么如何防止篡改呢?

  • 使用MD5和SHA-1等散列值校验的方法,以及用确认文件的数字签名的方法。
  • 上面讨论过HTTP虽然简单,但存在很多问题,所以我们加入了很多机制去处理。但是,这样会显的特别麻烦,有没有什么方法或者协议可以完全解决这些问题呢?所以我们开发出HTTPS协议(其实并非是应用层的新协议,只是HTTP通信接口部分用SSL和TSL协议代替而已),完美的解决了这些问题。
  • HTTP+加密+认证+完整性保护=HHTPS。
  • HHTPS是身披SSL的外壳的HTTP。那么SSL到底是什么呢?它为什么具有如此强大的功能呢?现在就让我们来揭开SSL神秘的面纱吧。(其实就是对报文的内容进行加密!!)

            SSL采用公开密钥加密方法。在我们了解公开密钥加密方法之前,先有必要了解一下共享密钥加密方法。加密和解密同用一个密钥的方式称为共享密钥加密。但是在发送密钥时,被窃取怎么办呢?公开密钥加密方法完美的解决了共享密钥加密方法的缺点。

            公共密钥加密方法使用非对称的密钥,一把叫做私有密钥(通信方私有的),另一把叫做公开密钥。公共密钥加密方法的原理:发送方得到接受方的公开密钥,然后对密文进行加密。接受方收到密文后,然后用自己的私人密钥对密文进行解密。

  • HTTPS采用混合加密机制。HTTPS采用共享密钥加密和公开密钥加密二者混用的加密机制。为什么要这样呢?为什么不只采用公开密钥加密机制呢?

           公开密钥加密处理起来比共享密钥加密方式更为复杂,若只使用公开密钥加密效率会很低。

  • 虽然HTTPS完美的解决了HTTP存在的问题,但是HTTPS本身也存在一些问题。

           SSL的使用会使处理速度变慢,也就是通信变慢。

           HHTPS还需要做服务器,客户端双方加密及解密处理,因此会消耗CPU和内存等硬件资源。

 

  • 确认访问用户身份的认证。为什么要存在这个呢?类比于登录QQ必须输入自己的用户名和密码。对自己的身份进行验证,不然计算机怎么知道你就是你呢?(●ˇ∀ˇ●)
  • 通常认证需要核对以下信息:

           密码:只有本人才会知道的字符串信息。

           动态令牌:仅限本人持有的设备内显示的一次性密码。

           数字证书:仅限本人(终端)持有的信息。

           生物认证:指纹和虹膜等本人的生理信息。

           IC卡牌:仅限本人持有的信息。

 

  • 学习HTTP协议最重要的是要掌握HTTP报文的结构,因此非常有必要详细的了解HTTP报文的结构。
  • HTTP报文大致由报文首部和报文主体组成。报文首部:客户端和服务器端进行交互的必要的信息。报文主体:存储用户和资源的信息。
  • HTTP报文按客户端和服务器端可分为HTTP请求报文和HTTP响应报文。HTTP请求报文由方法,URI,HTTP版本,HTTP首部字段组成。HTTP响应报文由HTTP版本,状态码,解释状态码的数字和原因短语,HTTP首部字段。
  • 我们发现HTTP请求报文和HTTP响应报文中都含有HTTP首部字段,可见其重要性。HTTP首部字段可以提供报文主体大小,所使用的语言,认证信息等内容。HTTP首部字段是由首部字段名和字段值构成的。
  • HTTP首部字段有四种字段类型:

            通用首部字段

            请求首部字段

            响应首部字段

            实体首部字段

  •    HTTP通用的首部字段

            Cache-ConTrol  操作代理服务器(缓存服务器)的缓存的工作机制。

 

          Connection首部字段具有以下两个作用:控制不再转发给代理的首部字段和管理持久连接。

          Date 创建HTTP报文的日期和时间。

          Trailer 说明在报文主体后记录的首部字段。

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

          Upgrade 检测HTTP协议及其他协议是否可使用更高的版本进行通信。

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

          Warning 告知用户一些与缓存相关的问题的警告。

  • 请求首部字段用于补充请求的附加信息,客户端信息,对响应内容相关的优先级等内容。

          Accept 通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。

          Accept-Charset 告知服务器用户代理支持的内容编码及内容编码的优先级顺序。

          Accept-Language 告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。

          Authorization 告知服务器,用户代理的认证信息。

          Expect 告知服务器,期望出现的某种特定的行为。

          From 告知服务器使用用户代理的用户的电子邮件地址。

          Host 请求的资源所处的互联网主机名和端口号。

  • 响应首部字段用于补充响应的附加信息,服务器信息,以及对客户端的附加要求。

          Accept-Ranges 告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。

          Age 告知客户端,源服务器在多久前创建了响应。

          Location 将响应接受方引导至某个与请求URI位置不同的资源。

          Proxy-Authenticate  将会把由代理服务器所要求的认证信息发送给客户端。

          Retry-After 告知客户端应该在多久之后再次发送请求。

          Server 告知客户端当前服务器上装的HTTP服务器应用程序的信息。

          Vary 对缓存进行控制。

          WWW-Authenticate 告知客户端适用于访问请求URI所指定资源的认证方案。

  • 实体首部字段补充内容的更新时间等于实体相关的信息。

          Allow 通知客户端能够支持Request-URI指定资源的所有HTTP方法。

          Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式。

          Content-Language 告知客户端,实体主体使用的自然语言。

          Content-Length 表明实体主体部分的大小。

          Content-Location 给出与报文主体部分相对应的URI,和首部字段Location不同。

          Content-MD5 检查报文主体传输过程中是否保持完整,以及确认传输到达。

          Content-Range 告知客户端作为响应返回的实体的哪个部分符合范围请求。

          Contenct-Type 说明实体主体内对象的媒体类型。

          Expires 将资源失效的日期告知客户端。

          Last-Modified 指明资源最终修改的时间。

                                                  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值