1. 简介

HTTP是位于应用层的一个无状态的协议,默认HTTP的端口号为80,HTTPS的端口号为443。HTTP协议本身是不可靠的实现,要实现可靠地数据传输需要依靠底层的TCP协议。

2. 实现

HTTP的报文包括请求报文响应报文两种

请求报文

请求报文是浏览器向服务器发出请求的报文,由第一行的请求行和后面的首部行组成,每一行都由回车换行(\r\n)结尾,当请求的方法是POST的时候,会在首部行结尾再回车换行加上POST携带的实体数据。

请求行 \r\n
首部行 \r\n
\r\n
实体行

请求行

  • 方法字段:
    • GET(主要方法)
    • POST
    • HEAD
    • PUT
    • DELETE
  • URI字段:请求对象的标识
  • HTTP版本字段:有HTTP/1.0和HTTP/1.1两种

首部行

  • Host:要访问的主机名
  • Connection:值为keep-alive表示该连接为持续连接,为close表示非持续连接。
  • Accept: 可接受的MIME类型,即报文类型。
  • User-Agent: 用户代理, 表示请求的浏览器的类型。
  • Referer: 表示发出请求时处于哪个页面,可用做反盗链。
  • Accept-Encoding: 告诉服务器自己接受的页面编码。
  • Accept-Language: 告诉服务器自己接受的网页语言。
  • Cookie: 将服务器存储在浏览器本地的Cookie值发送给服务器,实现无状态的。HTTP协议的会话跟踪。

响应报文

请求报文是服务器向浏览器发出响应报文,由第一行的状态行、接着首部行、最后的实体行组成,每一行都由回车换行(\r\n)结尾,其中实体行就是请求的数据。

状态行 \r\n
首部行 \r\n
\r\n
实体行

状态行

  • 协议版本:有HTTP/1.0和HTTP/1.1两种
  • 状态码:
    • 200:成功。
    • 301:内容已经永久移动,浏览器会重定向到响应指定的新URI。
    • 302:内容临时移动
    • 304:内容未被修改,响应不包含内容
    • 400:请求不能被服务器理解。
    • 403:无权访问该文件。
    • 404:不能找到请求文件。
    • 500:服务器内部错误。
    • 501:服务器不支持请求的方法。
    • 505:服务器不支持请求的版本。
  • 状态信息:状态码的含义

首部行

  • Connection:值为keep-alive表示该连接为持续连接,为close表示非持续连接。
  • Date:表示报文发送的时间。
  • Server:Web服务器用来处理请求的软件信息。
  • Cache-control:缓存控制
  • ETag:响应对象的标识符
  • Last-Modfied:对象创建或者最后修改的时间。
  • Content-Encoding:Web服务器表明了自己用什么压缩方法压缩对象。
  • Content-Length:被发送的对象的字节数。
  • Content-Type:表示响应的实体行的对象类型。

缓存机制

HTTP的缓存机制是通过Cache-control字段来控制,Cache-control是一个通用首部,请求和响应的首部都可以使用,有几个常见的值:

  • private: 只允许发出请求的客户端缓存
  • public: 允许客户端和代理服务器缓存
  • max-age=x: 缓存的有效期为x秒
  • no-cache: 不直接使用缓存,使用前得向服务器发出请求验证缓存有效性
    • If-None-Match/Etag:当缓存的内容具有Etag标识,就向服务器发送含有If-None-Match字段的请求报文以判断缓存的内存是否与服务器上的内容一致,如果一致,服务器就会返回304状态的响应报文表示可以直接使用缓存,否则返回200状态含有新资源实体的响应报文。
    • If-Modified-Since/Last-Modified:当缓存的内容具有Last-Modified(最后修改时间),就向服务器发送含有If-Modified-Since字段的请求报文以判断缓存的内存在服务器上的是否改变,如果时间一致,就会返回304状态的响应表示可以直接使用缓存,否则返回200状态含有新资源实体的响应报文。
  • no-store: 所有内容都不会缓存
HTTP缓存的使用
HTTP缓存的使用

HTTPS

HTTPS中的S指的是SSL(安全套接字层)或TLS(传输层安全),TLS是基于SSL开发的。

HTTP的缺点

HTTP属于不安全的通信协议:

  • 使用明文不加密,内容容易被窃读
  • 不能验证对方身份,对方可能是一个伪装的通讯方
  • 无法验证报文的完整性,报文可能被篡改

加密算法

要解决第一个问题必须采用加密算法对报文进行加密,常见的加密算法有对称加密(AES算法,加密解密使用同一把秘钥)、非对称加密(RSA算法,加密和解密采用不同秘钥),HTTPS采用混合加密算法集合和两者的优点。由于非对称加密开销比对称加密大,所以通信过程中报文的加密采用对称加密,而非对称加密用于一开始共享秘钥的传输。

通信过程

  • 客户端发出请求报文,报文包含客户端支持的SSL协议版本、加密算法。
  • 服务器发送数字证书,数字证书可以向数字证书认证机构申请,证书包含以下内容:

    • 证书的发布机构CA
    • 证书的有效期
    • 证书所有人的名称
    • 公开秘钥
    • 签名算法
    • 数字签名(证书内容摘要值的加密结果)
  • 客户端收到证书后验证证书的合法性。数字签名是数字证书机构使用私钥进行加密的结果,得在浏览器本地可以找到对应的公钥进行解密,为了保证证书没有被篡改,客户端会根据签名算法计算出证书内容的摘要值(哈希算法),如与解密后的数字签名一致的话就证明内容没有被篡改并且对方是一个合法通信方。

  • 随后客户端产生一个pre-master secret的随机数用于对称加密,使用数字证书里的公开秘钥对随机数加密并发送给服务器。

  • 服务器收到包含共享秘钥的报文后用自己的私钥解密得到共享秘钥。