浅谈HTTP

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


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

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

HTTP请求报文

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

浅谈HTTP_第1张图片

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

请求报文和响应报文之间略有不同(上:请求报文;下:响应报文):
浅谈HTTP_第2张图片

报文首部又可以分为:

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

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

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

具体的报文结构如下,上图为请求报文,下图为响应报文:
浅谈HTTP_第3张图片


HTTP 状态码

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

状态码以 3 位数字和原因短语组成,如上图中的200 OK。
状态码的类别如下:
浅谈HTTP_第4张图片

  • 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_第5张图片

  • 请求首部字段:

浅谈HTTP_第6张图片

  • 响应首部字段:

浅谈HTTP_第7张图片

  • 实体首部字段:

浅谈HTTP_第8张图片

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

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

浅谈HTTP_第9张图片

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

各个字段具体含义如下:
浅谈HTTP_第10张图片

  • 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

浅谈HTTP_第11张图片

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


HTTPS通信过程

与HTTP的通信不同,HTTPS的通信过程更加复杂。
浅谈HTTP_第12张图片

  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》

你可能感兴趣的:(计算机网络基础,http,https)