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 外,不允许出现单独的 CR 或 LF 字符)
HTTP 请求方法有 8 种,分别是 GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS。对于移动开发,最常用的就是 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 个或者多个请求报头,每个请求报头都包含一个字段和一个值,它们之间用英文冒号
:
分隔
- 在请求行之后会有 0 个或者多个请求报头,每个请求报头都包含一个字段和一个值,它们之间用英文冒号
请求数据
- 请求数据不在 GET 方法中使用,而在 POST 方法中使用。POST 方法适用于需要用户填写表单的场合,与请求数据相关的最常用的请求报头是 Content-Type 和 Content-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 的设计可以防止这类攻击,在正确配置时是安全的