计算机网络系列(三):详解 HTTP 协议原理

1. HTTP 概念?

答:

  • HTTP 全称:HyperText Transfer Protocol,即超文本传输协议
  • 是一种用于分布式、协作式和超文本信息系统的应用层协议HTTP 是万维网的数据通信的基础。

2. HTTP 历史版本:

答:

  • HTTP 0.91991 年发布的第一个版本,只有一个命令 GET,服务器只能回应 HTML 格式的字符串。
  • HTTP 1.0

    • 19965 月发布的版本,内容量大大增加。除了 GET 命令,还引入了 POST 命令和 HEAD 命令。HTTP 请求和回应的格式除了数据部分,每次通信都必须包括头信息,用来描述一些元数据。
    • 为了提高系统的效率,HTTP 1.0 规定客户端与服务器只保持短暂的连接,每次请求都要建立一个 TCP 连接,请求处理后立即断开连接,且每次连接都是无记忆的
    • TCP 连接建立需要三次握手,是很耗费时间的一个过程,所以 HTTP 1.0 的版本较差。
  • HTTP 1.1

    • 1997 年发布的版本,进一步完善了 HTTP 协议,直到现在还是最流行的版本。
    • 最主要的改进就是引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用。
    • 还引入了管道机制(pipelining,即在同一个 TCP 连接里面,客户端可以同时发送多个请求。进一步提高了客户端的效率,但服务端还是要顺序执行的。
    • 图例:

      HTTP 1.1

  • HTTP 2

    • 2015 年新发布的版本,SPDY 协议的主要特性也在此版本中,SPDY 协议是 2009Google 为了解决 HTTP 1.1 效率不高的问题而自行研发的协议。
    • HTTP 2 采用了多路复用,即在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。
    • 采用多路复用的前提是 HTTP 2 进行了二进制分帧,即 HTTP 2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。这个负责拆分、组装请求和二进制帧的一层就叫做二进制分帧层。
    • 还有一些其他的优化,比如 Header 压缩服务端推送(服务端提前将信息发送到客户端的缓存)等。
    • 图例:

      HTTP 2

  • HTTP 3

    • 根据国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)消息,HTTP-over-QUIC 实验性协议将被命名为 HTTP 3,并有望成为 HTTP 协议的第三个正式版本。
    • QUIC,即:Quick UDP Internet ConnectionsGoogle 推出的一个项目,旨在降低基于 TCP 通讯的 Web 延迟,QUIC 非常类似 TCP+TLS+SPDY,但是基于 UDP 实现的
    • HTTP 3 使用 UDP 代替了 TCPUDP 是一个非连接的协议,传输数据之前源端和终端不建立连接。UDP 信息包的标题很短,对系统资源的要求比 TCP 要低,并且 UDP 是使用最大努力交付,即不保证可靠交付
    • 这种基于 QUICHTTP 协议未来发展如何,目前只能拭目以待了。
    • 图例:

      HTTP 3

  • 各版本对比

    各版本对比

3. HTTP 主要特点?

答:

  • 支持 C/S (客户端/服务器)模式。
  • 简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GETHEADPOST,每种方法规定了客户端与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
  • 灵活HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
  • 无连接:限制每次连接只处理一个请求。服务器处理完客户端的请求,并受到客户端的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态HTTP 协议是无状态(stateless)协议,无状态是指协议不回忆前面请求的连接或结果。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大;另一方面,在服务器不需要先前信息时它的应答速度就较快。
  • HTTP URL 的格式:
    • http://host[":"port][abs_path].
    • http 表示要通过 HTTP 协议来定位网络资源;host 表示合法的 Internet 主机域名或者 IP 地址;port 指定一个端口号,为空则使用默认端口 80abs_path 指定请求资源的 URIWeb 上任意的可用资源)。HTTP 有两种报文,分别是请求报文和相应报文。

4. HTTP 请求报文?

答:

  • 请求报文的一般格式:

    • HTTP 报文是面向文本的,报文中的每个字段都是一些 ASCII 码串,各个字段的长度是不确定的。
    • 一般一个 HTTP 请求报文由请求行请求报头空行请求数据 4 个部分组成。
    • 图例:

      HTTP 请求报文格式

  • 请求行

    • 请求行由请求方法URL 字段HTTP 协议的版本组成,格式:Method Request-URI HTTP-Version CRLF
    • Method 表示请求方法;Request-URI 是一个统一资源标识符;HTTP-Version 表示请求的 HTTP 协议版本;CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CRLF 字符)。
    • HTTP 请求方法有 8 种,分别是 GETPOSTHEADPUTDELETETRACECONNECTOPTIONS。对于移动开发,最常用的就是 GETPOST 了。
      • GET:请求获取 Request-URI 所标识的资源。
      • POST:在 Request-URI 所标识的资源后附加新的数据。
      • HEAD:请求获取由 Request-URI 所标识的资源的响应消息报头
      • PUT:请求服务器存储一个资源,并用 Request-URI 作为其标识。
      • DELETE:请求服务器删除 Request-URI 所标识的资源。
      • TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
      • CONNECTHTTP 1.1 协议中预留给能够将连接改为管道方式的代理服务器。
      • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
  • 请求报头

    • 在请求行之后会有 0 个或者多个请求报头,每个请求报头都包含一个字段和一个值,它们之间用英文冒号 : 分隔
  • 请求数据

    • 请求数据不在 GET 方法中使用,而在 POST 方法中使用POST 方法适用于需要用户填写表单的场合,与请求数据相关的最常用的请求报头是 Content-TypeContent-Length

5. HTTP 响应报文?

答:

  • 响应报文的一般格式:

    • HTTP 的响应报文由状态行响应报头空行响应正文组成。
    • 响应正文是服务器返回的资源的内容。
    • 图例:

      HTTP 响应报文格式

  • 状态行

    • 状态行的格式:HTTP-Version Status-Code Reason-Phrase CRLF
    • HTTP-Version 表示服务器 HTTP 协议的版本;Status-Code 表示服务器发回的响应状态码;Reason-Phrase 表示状态码的文本描述。状态码由 3 位数字组成,第一个数字定义了响应的类别,后两个数字没有分类的作用。状态码有以下 5 种可能取值:

      • 100~199:指示信息,收到请求,需要请求者继续执行操作。
      • 200~299请求成功,请求已被成功接收并处理。
      • 300~399重定向,要完成请求必须进行更进一步的操作。
      • 400~499客户端错误,请求有语法错误或请求无法实现。
      • 500~599服务器错误,服务器不能实现合法的请求。
    • 常见的状态码如下

      • 200 OK:客户端请求成功。
      • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
      • 401 Unauthorized:请求未经授权,这个状态码必须和 WWW-Authenticate 报头域一起使用。
      • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
      • 500 Internal Server Error:服务器内部错误,无法完成请求。
      • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

6. HTTP 消息报头?

答:消息报头分为通用报头、请求报头、响应报头、实体报头等。消息报头由键值对组成,每行一对,关键字和值用英文冒号 : 分隔。

  • 通用报头:它既可以出现在请求报头,也可以出现在响应报头。比如:

    • Date:表示消息产生的日期和时间。
    • Connection:允许发送指定连接的选项。例如指定连接是连续的;或者指定 close 选项,通知服务器:在响应完成后,关闭连接。
    • Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。
  • 请求报头:请求报头通知服务器关于客户端请求的信息,典型的有:

    • Host:请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机。
    • User-Agent:发送请求的浏览器类型、操作系统等信息。
    • Accept:客户端可识别的内容类型列表,用于指定客户端接收哪些类型的信息。
    • Accept-Encoding:客户端可识别的数据编码。
    • Accept-Language:表示浏览器所支持的语言类型。
    • Connection:允许客户端和服务器指定与请求/响应连接有关的选项。例如,这时为 Keep-Alive 则表示保持连接。
    • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
  • 响应报头:用于服务器传递自身信息的响应,常见的有:

    • Location:用于重定向接受者到一个新的位置,常用在更换域名的时候。
    • Server:包含服务器用来处理请求的系统信息,与 User-Agent 请求报头是相对应的。
  • 实体报头:用来定义被传送资源的信息,其既可用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的有:

    • Content-Type:发送给接受者的实体正文的媒体类型。
    • Content-Length:实体正文的长度。
    • Content-Lenguage:描述资源所用的自然语言。
    • Content-Encoding:实体报头被用作媒体类型的修饰符。它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得 Content-Type 报头域中所引用的媒体类型,必须采用相应的解码机制。
    • Last-Modified:实体报头用于指示资源的最后修改日期和时间。
    • Expires:实体报头给出响应过期的日期和时间。

7. HTTPS 协议?

答:

  • HTTPS 的全称是:HyperText Transfer Protocol Secure,即超文本传输安全协议
  • HTTPS 经由 HTTP 通信,但利用 SSL/TLS 来加密数据包。
  • 使用 HTTPS 的网站:GithubPornhub 等。

8. HTTP 和 HTTPS 的区别?

答:

  • HTTPHTTPS 是两个不同的协议。
  • HTTPURL 是由 http:// 起始,默认使用端口 80HTTPSURL 则是由 https:// 起始,默认使用端口 443
  • HTTP 是不安全的,攻击者可以通过监听和中间人攻击等手段获取敏感信息;HTTPS 的设计可以防止这类攻击,在正确配置时是安全的。

9. 参考

-------------本文结束感谢您的阅读-------------