Http技术研讨
1 概述
1.1 定义
HTTP协议是HyperText Transfer Protocol(超文本传输协议)的缩写,是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议,用于分发、协作超文本信息系统。
1.2 版本
目前主要有Http1.0、Http1.1、Http2.0版本,Http3.0版本处于草稿状态。
1.3 标准性
由World Wide Web Consortium (W3C)和 Internet Engineering Task Force (IETF)联合发布了一系列的RFC,RFC 1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1。
1.4 其它
2 协议规范
2.1 协议内容
2.1.1 HTTP 版本(HTTP Version)
HTTP 采用主从(<major>.<minor>)数字形式来表示版本。例如 1.0,1.1,20。
2.1.2 统一资源标识
2.1.3 Connection
一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
在http1.1,request和reponse头中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。
在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。
2.1.4 消息:Message
HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
2.1.5 请求:Request
一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号。
2.1.6 响应:Response
一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
2.1.7 资源:Resource
由URI标识的网络数据对象或服务。
2.1.8 实体:Entity
数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
2.1.9 客户机:Client
一个为发送请求目的而建立连接的应用程序。
2.1.10 用户代理:UserAgent
初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
2.1.11 服务器:Server
一个接受连接并对请求返回信息的应用程序。
2.1.12 源服务器:Originserver
是一个给定资源可以在其上驻留或被创建的服务器。
2.1.13 代理:Proxy
一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
2.1.14 网关:Gateway
一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
2.1.15 通道:Tunnel
是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
2.1.16 缓存:Cache
反应信息的局域存储。
2.2 HTTP状态码
返回结果的状态码
1XX 表示服务器已经接收了客户端请求,客户端可继续发送请求
2XX 请求正常处理完毕
3XX 需要进行附加操作以完成请求
4XX 表示客户端的请求有非法内容
5XX 服务器处理请求出错
2.3 HTTP请求方法
方法 说明 支持版本
GET 获取资源 1.0、1.1、2.0、3.0
POST 传输实体主体 1.0、1.1、2.0、3.0
PUT 传输文件 1.0、1.1、2.0、3.0
HEAD 获得报文首部 1.0、1.1、2.0、3.0
DELETE 删除文件 1.0、1.1、2.0、3.0
OPTIONS 询问支持的方法 1.0、1.1、2.0、3.0
TRACE 追踪路径 1.1、2.0、3.0
CONNECT 要求用隧道协议连接代理 1.1、2.0、3.0
LINK 建立与资源之间的联系 1.0
UNLINK 断开连接关系 1.0
3 协议实现
3.1 版本选择
3.2 实现机理
3.2.1 请求响应模型
HTTP协议是客户端发起请求,服务器回送响应。见下图:
这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
3.2.2 工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端。
3.3 HTTP/2.0改进
多路复用
HTTP/2.0 使用多路复用技术,同一个 TCP 连接可以处理多个请求。
首部压缩
HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。
服务端推送
HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
二进制格式
HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
3.4 HTTP/3.0版本的改进
减少 TCP 三次握手及 TLS 握手时间
改进的拥塞控制
避免队头阻塞的多路复用
连接迁移
前向纠错
3.5 Apache Http Client 和 Apache Http Core 版本5
Apache Http Client版本5将支持 http2.0协议