HTTP

概述

HTTP(HyperText Transfer Protocol)即超文本传输协议,一般情况下,由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如 “HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其它信息。HTTP 是万维网的数据通信的基础。

HTTP 协议是基于 TCP 协议位于应用层(五层结构)的通信协议,TCP是位于传输层提供面向连接的可靠的数据传输服务。与 HTTP 协议位于相同层级的还有 FTP、SMTP、TELNET 等协议。

七层结构中,应用层可再划分为应用层、表示层、会话层,HTTP协议位于表示层

因为 HTTP 是基于 TCP 协议之上的协议,因此它具有 TCP 的许多特性,例如面向连接、可靠等。

  • 面向连接指的是程序在使用 TCP 协议前,需要先建立连接。
  • 可靠性指的是,通过 TCP 协议传输的数据,具有无差错、不丢失、不重复、按序到达等特点。

握手过程

建立连接

HTTP 握手的过程实际上是建立 TCP 连接完成,开始传输数据的过程。TCP 连接的建立采用 C/S 结构。由客户端(client)发起,服务端(server)响应。

  1. 初始阶段 C 和 S 都处于 CLOSED(关闭)状态;
  2. S 的 TCP 服务器进程准备接收客户进程的 TCP 请求,此时 S 的状态是 LISTEN(监听);
  3. C 主动发起 TCP 连接请求,向 S 发送报文,此时 C 的状态是 SYN-SENT(同步发送);
  4. S 接收到 C 发起的请求后,如允许连接,向 C 发送确认报文,此时 S 的状态会变为 SYN-RCVD(同步接收);
  5. C 接收到 S 发送出的回调后,还需向 S 发送确认收到报文,此时 TCP 连接建立完成,C 的状态变为 ESTABLISHED(已建立连接);
  6. S 接收到 C 的确认收到信息后,状态也变为 ESTABLISHED,整个握手过程结束,下一步进入数据传输过程。

以上过程是 三报文握手

关闭连接

与建立连接一样,关闭连接也是由 C 端主动发起的。

  1. C 和 S 都处于 ESTABLISHED(已建立连接)状态;
  2. C 向 S 发送连接释放报文段,并停止发送数据,此时 C 到 S 方向的 TCP 连接断开,进入 FIN-WAIT-1(终止等待1)状态;
  3. S 收到信号后立即发送确认,进入 CLOSE-WAIT(关闭等待) 状态:此时的 TCP 连接处于半关闭状态,C 没有数据发送给 S,但能接收来自 S 的数据;
  4. C 接收到 S 的确认后,进入 FIN-WAIT-2(终止等待2)状态,等待 S 发出的连接释放报文段;
  5. 如果 S 已经没有要向 C 发送的数据,此时 S 向 C 发送释放报文段,进入 LAST-ACK(最后确认)状态;
  6. C 收到 S 的最终确认后,还需要对此确认,发送报文后,进入 TIME-WAIT(时间等待)状态;
  7. S 接收到 C 的确认报文后,进入 CLOSE 状态;
  8. C 在发送完确认报文后,需再经过时间等待计时器设置的 2MSL 时间才会进入 CLOSE 状态,为了保证在这个时间段内确认报文已到达 S 端,也

以上过程是 四报文握手

请求方法

HTTP/1.1协议中共定义了八种方法(Method)来以不同方式操作指定的资源,它们分别是 GET HEAD POST PUT DELETE 以及 TRACE OPTIONS CONNECT,其中常用的方法是前五种。

  • GET:用来读取数据;
  • HEAD:功能和 GET 类似,不同之处在于使用 HEAD 方法时,服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据);
  • POST:用来提交数据,请求服务器进行处理(例如提交表单或者上传文件)。这个请求可能会创建新的资源或修改现有资源,或二者皆有;
  • PUT:用来更新数据;
  • DELETE:用来删除资源或数据;
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*‘来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

状态码

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息:请求已被服务器接收,继续处理
  • 2xx成功:请求已成功被服务器接收、理解、并接受
  • 3xx重定向:需要后续操作才能完成这一请求
  • 4xx请求错误:请求含有词法错误或者无法被执行
  • 5xx服务器错误:服务器在处理某个正确请求时发生错误

持久链接

在HTTP 0.9和1.0中,TCP连线在每一次请求/回应对之后关闭。在HTTP 1.1中,引入了保持连线的机制,一个连接可以重复在多个请求/回应使用。持续连线的方式可以大大减少等待时间,因为在发出第一个请求后,双方不需要重新运行TCP握手程序。

下图展示了使用多个连接和使用持久链接的对比:

使用多个连接和使用持久链接的对比

HTTPS

概念

HTTPS(HyperText Transfer Protocol Secure)即超文本传输安全协议,是一种通过计算机网络进行安全通信的传输协议。它的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

简单的说,HTTPS 比 HTTP 多了一层 SSL/TLS 加密,传输的内容经过了对称加密,使之能比 HTTP 传输更加安全。

HTTPS和HTTP的对比

SSL/TLS 是应用层的安全协议,所有运行在应用层的传输协议都可以用它(们)来进行加密。

与HTTP的差异

  • HTTP 的 UR L是由 http:// 起始与默认使用端口 80,而 HTTPS 的 URL 则是由 “https://” 起始与默认使用端口 443;
  • HTTP 不是安全的,而且攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等。HTTPS 的设计可以防止前述攻击,在正确配置时是安全的。

SSL/TLS 建立安全会话的简要过程

假设客户端 A 要访问服务器 B 的资源:

  1. 协商加密算法:A 向 B 发送 SSL/TLS 版本号和一些可选的加密算法;B 收到后选择一种支持的算法(假设是 RSA),并告知 A;
  2. 服务器鉴别:B 向 A 发送包含其 RSA 公钥数字证书,A 使用 CA 公开发布的 RSA 公钥对证书进行验证;
  3. 会话密钥计算:由 A 生成随机数,使用 B 的 RSA 公钥 加密后发送给 B,双方根据协商的算法产生共享的对称会话密钥;
  4. 安全数据传输:双方使用共享的对称会话密钥加密传输、解密读取数据,以及验证数据的完整性。

以上步骤2又称作数字签名,是非对称加密的反向使用,发送端使用自身私钥加密,接收端通过公钥解密后验证,用于接收端验证发送端是预想的发送端,避免访问到其他不安全的内容

整个过程用图示如下:

SSL建立安全会话的简要过程

隐患

HTTPS 是安全的,但不是绝对安全的。在某些情形中,被加密资源的URL可仅通过截获请求和响应的大小推得,这就可使攻击者同时知道明文(公开的静态内容)和密文(被加密过的明文),从而使选择密文攻击成为可能。

参考资料