0%

计算机网络(二):详解 HTTP 协议原理

1. HTTP 的概念

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

2. HTTP 历史版本

  • HTTP 0.9

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

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

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

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

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

3. HTTP 主要特点

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

4. HTTP 请求报文

  • 请求报文的一般格式

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

    • 请求行由请求方法URL 字段HTTP 协议的版本组成,格式:Method Request-URI HTTP-Version CRLF

    • Method 表示请求方法;Request-URI 是一个统一资源标识符;HTTP-Version 表示请求的 HTTP 协议版本;CRLF 表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CRLF 字符)

    • HTTP 请求方法有 8 种,分别是 GETPOSTHEADPUTDELETETRACECONNECTOPTIONS。对于移动开发,最常用的就是 GET 和 POST

      HTTP 请求方法 含义
      GET 请求获取 Request-URI 所标识的资源
      POST 在 Request-URI 所标识的资源后附加新的数据
      HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
      PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识
      DELETE 请求服务器删除 Request-URI 所标识的资源
      TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
      CONNECT HTTP 1.1 协议中预留给能够将连接改为管道方式的代理服务器
      OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
  • 请求报头

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

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

5. 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 的网站:Github、Pornhub

8. HTTP 和 HTTPS 的区别

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

9. 参考

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