浅谈HTTP

来源:互联网 发布:nginx lua 开发环境 编辑:程序博客网 时间:2024/04/30 10:58

最近看了《图解HTTP》,遂做一些笔记。


HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。
特点:

  • 通过请求和响应的交换达成通信
  • HTTP 是不保存状态的协议
  • HTTP 协议使用 URI 定位互联网上的资源
  • 持久连接,不需要等待就能直接发送下一个响应
  • 使用 Cookie 管理状态

HTTP请求报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端的HTTP 报文叫做请求报文,响应端的叫做响应报文
报文的结构如下:

这里写图片描述

  • 报文首部:服务端或客户端的响应或请求的内容和属性。
  • 报文主体:应该发送的数据。

请求报文和响应报文之间略有不同(上:请求报文;下:响应报文):
这里写图片描述

报文首部又可以分为:

  • 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本。

  • 状态行:包含表明响应结果的状态码,原因短语和 HTTP 版本。

  • 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。

具体的报文结构如下,上图为请求报文,下图为响应报文:
这里写图片描述


HTTP 状态码

响应报文中状态行中的状态码用来表示客户端 HTTP 请求的返回结果、标记服务器端的处理是否正常通知出现的错误等工作。一句话:状态码告知从服务器端返回的请求结果

状态码以 3 位数字和原因短语组成,如上图中的200 OK。
状态码的类别如下:
这里写图片描述

  • 2XX:响应结果表明请求被正常处理了。204 No Content表示请求正常处理,但是没有响应的资源;206 Partial Content 表示请求正常处理,但是响应一部分资源。

  • 3XX:响应结果表明浏览器需要执行某些特殊的处理以正确处理请
    求,也就是常说的重定向。301 Moved Permanently,表示请求的资源已永久被分配了新的 URI;302 Found表示请求的资源暂时被分配了新的 URI。

  • 4XX:响应结果表明客户端发生了错误。400 Bad Request码表示请求报文中存在语法错误;403 Forbidden表明对请求资源的访问被服务器拒绝了;我们最常见的404 Not Found,表明服务器上无法找到请求的资源。

  • 5XX:响应结果表明服务器本身发生错误。500 Internal Server Error表明服务器端在执行请求时发生了错误;503 Service Unavailable表明服务器暂时处于超负载或正在进行停机维护,现在无法
    处理请求。


HTTP 首部

从上面文章我们知道,HTTP 协议的请求和响应报文中必定包含 HTTP 首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分
隔,例如:Content-Type: text/html
HTTP 首部字段根据实际用途被分为以下 4 种类型:

  • 通用首部字段
  • 请求首部字段
  • 响应首部字段
  • 实体首部字段

HTTP/1.1 规范定义了如下 47 种首部字段。

  • 通用首部字段:

这里写图片描述

  • 请求首部字段:

这里写图片描述

  • 响应首部字段:

这里写图片描述

  • 实体首部字段:

这里写图片描述

虽然HTTP 是不保存状态的协议,但是通过Cookie可以记录客户端和服务端之间通信的状态。
原理:用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前发放的Cookie

为 Cookie 服务的首部字段如下:

这里写图片描述

  • Set-Cookie:服务器准备开始管理客户端的状态时,会事先告给客户端知各种信息。如:
Set-Cookie: name=value; expires=Tue, 05 Jul 2011 07:26:31

各个字段具体含义如下:
这里写图片描述

  • Cookie:首部字段 Cookie 会告知服务器,请求中包含从服务器接收到的 Cookie。例如: Cookie: status=enable。

ps:所有图片来源于《图解HTTP》。


HTTPS

在讲HTTPS之前 我们需要知道,在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题,具体如下:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

通信使用明文(不加密),内容可能会被窃听:首先TCP/IP 是可能被窃听的网络,互联网中的所有数据都不是个人私有的,所以不排除某个环节中会遭到恶意窥视行为。其次,如果内容不加密,那么信息就会被其他恶意对象很容易的捕获,我们可以通过SSL和TLS的组合将HTTP通信加密。

不验证通信方的身份就可能遭遇伪装:在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应,这就会存在各种隐患,就好像你不知对方是谁,就把自己的银行账户密码传递给对方了。解决办法就是取得对方的身份以后再通信,而SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定方(证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的)。

无法证明报文的完整性,所以有可能已遭篡改:HTTP 协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。换句话说,没有任何办法确认,发出的请求 / 响应和接收到的请求 / 响应是前后相同的。解决办法是:使用MD5 和 SHA-1 等散列值校验的方法,以及用来确认文件的数字签名方法来确保报文的完整性。

知道了HTTP的不安全的缺点之后,就可以介绍HTTPS了。
HTTPS=HTTP+ 加密 + 认证 + 完整性保护,也就是HTTPS是安全的HTTP,HTTPS 并非是应用层的一种新协议,它只是 HTTP 通信接口部分用SSL和 TLS协议代替而已。

HTTP 直接和 TCP 通信。当使用 SSL时,则演变成先和 SSL通信,再由 SSL和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披SSL协议这层外壳的 HTTP

这里写图片描述

采用 SSL后,HTTP 就拥有了 HTTPS 的加密、证书和完整性保护这些功能。此时的HTTP才是安全可靠的。


HTTPS通信过程

与HTTP的通信不同,HTTPS的通信过程更加复杂。
这里写图片描述

  1. 客户端通过发送 Client Hello 报文开始 SSL通信,报文里面含有客户端SSL支持的信息。
  2. 服务器可进行 SSL通信时,会以 Server Hello 报文作为应答。告诉客户端服务端支持的SSL。
  3. 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
  4. 服务器发送 Server Hello Done 报文通知客户端,表示最初的SSL通信结束。
  5. 客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-mastersecret 的随机密码串。
  6. 接着客户端继续发送 Change Cipher Spec 报文,告诉服务端以后的通信会采用 Pre-master secret 密钥加密。
  7. 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。
  8. 服务端发送Change Cipher Spec报文
  9. 服务端发送Finished报文。
  10. SSL连接建立,开始HTTP的通信。

总结上面的过程:
1.客户端发起https请求,请求里面包含了客服端的SSL信息。
2.服务端接收请求以后,选择合适的加密协议,并且返回给客户端自己的安全证书和公开密钥。
3.客户端解析服务端的安全证书,如果证书有效,则告诉服务端传输的信息将以某种方式加密。
4.服务端用私有密钥解密数据,返回使用公共加密的数据给客户端。
5.客户端使用公共密钥解密数据。
6.SSL通信建立。

你必须知道的
HTTP是应用层上的协议。
HTTP之间通过HTTP报文通信,HTTP响应和请求的报文结构略有不同。
响应报文的状态码有哪些?
常见的HTTP首部有哪些?
HTTPS是什么?它是如何实现的?
HTTPS的通信过程?

PS:文章中所以图片都来自《图解HTTP》