最近看了《图解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 种首部字段。
- 通用首部字段:
- 请求首部字段:
- 响应首部字段:
- 实体首部字段:
为 Cookie 服务的首部字段
虽然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的通信过程更加复杂。
- 客户端通过发送 Client Hello 报文开始 SSL通信,报文里面含有客户端SSL支持的信息。
- 服务器可进行 SSL通信时,会以 Server Hello 报文作为应答。告诉客户端服务端支持的SSL。
- 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。
- 服务器发送 Server Hello Done 报文通知客户端,表示最初的SSL通信结束。
- 客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-mastersecret 的随机密码串。
- 接着客户端继续发送 Change Cipher Spec 报文,告诉服务端以后的通信会采用 Pre-master secret 密钥加密。
- 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。
- 服务端发送Change Cipher Spec报文
- 服务端发送Finished报文。
- SSL连接建立,开始HTTP的通信。
总结上面的过程:
1.客户端发起https请求,请求里面包含了客服端的SSL信息。
2.服务端接收请求以后,选择合适的加密协议,并且返回给客户端自己的安全证书和公开密钥。
3.客户端解析服务端的安全证书,如果证书有效,则告诉服务端传输的信息将以某种方式加密。
4.服务端用私有密钥解密数据,返回使用公共加密的数据给客户端。
5.客户端使用公共密钥解密数据。
6.SSL通信建立。
你必须知道的:
HTTP是应用层上的协议。
HTTP之间通过HTTP报文通信,HTTP响应和请求的报文结构略有不同。
响应报文的状态码有哪些?
常见的HTTP首部有哪些?
HTTPS是什么?它是如何实现的?
HTTPS的通信过程?