摘要:本文详细介绍了HTTP/HTTPS协议的详细知识,能为编程入门打下基础,也可以作为程序员的参考手册。 1. HTTP1.1 定义和历史HTTP(HyperText Transfer Protocol超文本传输协议),是WWW(World Wide Web,万维网)的传输协议,是TCP/IP模型的应用层协议,负责Web浏览器和Web服务器之间传输超文本信息(Hypertext),超文本信息可以描述超媒体( Hypermedia),而超媒体包括文本、图形、视频、音频等多媒体(Multimedia)信息,这些信息以web页面(Web Page)为单位,他们之间通过超链接(Hyperlink)相互连接。 HTTP发展历史如下: 1989年,英国科学家蒂姆伯纳斯李,万维网发明者,创建单行 HTTP 协议。 1991年,蒂姆伯纳斯李创建的单行 HTTP 协议被命名为HTTP/0.9,支持连接、断开连接、请求和响应。 1996年,HTTP/1.0 发布,支持GET,Head,和POST。 1997年,HTTP/1.1 ( RFC 2068 ) 发布,这是HTTP 的第一个标准化版本,也是目前广泛使用的版本,支持OPTIONS,GET,HEAD,POST,PUT,DELETE,和TRACE。 2015年,HTTP/2发布,支持对流量的并行化、优先化和流量控制。 2021年,HTTP/3草案发布,支持QUIC,QUIC是2012年谷歌基于UDP开发的新协议。 1.2 功能特点HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。下图来自网上,是HTTP协议的概况。 1.3交互流程HTTP1.0采用普通交互流程,多次交互才能完成信息传输,如下: - Web浏览器(注:用户代理程序包括web浏览器、爬虫等,以下仅仅提Web浏览器)与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
- 通过TCP套接字,Web浏览器向Web服务器发送请求报文,请求报文由请求行、请求头部、空行和请求数据等组成。
- Web服务器接受请求
- Web服务器解析请求,并处理请求。
- Web服务器发送响应报文,响应报文由状态行、响应头部、空行和响应数据4部分组成。
- Web服务器主动关闭TCP连接,Web浏览器释放TCP连接,除非显式指定keepalive(注:1.0默认使用短连接,但是可以指定使用长连接)。
- Web浏览器解析HTML内容。
- Web浏览器首先解析状态,查看表明请求是否成功的状态代码。
- Web浏览器继续解析每一个响应头。
- Web浏览器继续读取响应数据HTML,根据HTML的语法对其进行格式化,并在Web浏览器窗口中显示。
HTTP1.1交互流程如下: - Web浏览器与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
- 通过TCP套接字,Web浏览器向Web服务器发送请求报文,请求报文由请求行、请求头部、空行和请求数据等组成。
- Web服务器接受请求
- Web服务器解析请求,并处理请求。
- Web服务器发送响应报文,响应报文由状态行、响应头部、空行和响应数据4部分组成。
- Web浏览器解析HTML内容。
- Web浏览器首先解析状态,查看表明请求是否成功的状态代码。
- Web浏览器继续解析每一个响应头。
- Web浏览器继续读取响应数据HTML,根据HTML的语法对其进行格式化,并在Web浏览器窗口中显示。
- Web浏览器和Web服务器协调进行连接管理工作,默认采用持久连接,因此web浏览器继续发送请求。(注:1.1支持短连接, 长连接, 和 流水线)
下图是1.0和1.1 GET交互流程的对比: 1.4长连接(持久连接)HTTP1.1采用长连接(持久连接HTTP Persistent Connections),也称为 HTTP keep-alive 或 HTTP connection reuse,只要任意一端没有明确提出断开连接,则保持TCP连接状态,其交互流程如下(来自网上): 上图的“客户端”实际上就是Web浏览器,或者定制的特殊Web浏览器,上图的“服务器”就是Web服务器,“建立TCP连接”包括三个子步骤,“断开TCP连接”包括四个子步骤。 1.5管线化长连接使得多数请求以管线化(pipelining)方式发送成为可能,HTTP1.1支持管线化传输。管线化技术支持并行发送多个请求。如下图(来自网上): 2.HTTPS2.1定义和历史HTTPS是基于SSL/TLS改造HTTP的新协议,全称是Hypertext Transfer Protocol Secure,意思是安全的超文本传输协议,通过传输加密和身份认证保证了传输过程的安全性。 如下图,HTTPS增加了安全层,因此HTTPS的发展历史实际上是SSL/TLS的发展历史。 SSL/TLS发展历史: 1990年,网景公司推出私有SSL协议,用于保护WWW的通讯安全。 1994年,SSL2标准发布,缺点较多。 1995年,SSL3标准发布,相比SSL2,SSL3完全重新设计,一直沿用至今。 1999年,TLS 1.0问世。SSL更名为TLS。 2006年,TLS 1.1发布,仅仅修复了一些关键的安全问题. 2008年,TLS 1.2发布。添加了对已验证加密的支持,并且基本上删除了协议说明中所有硬编码的安全基元,使协议完全弹性化。 2.3交互流程HTTPS在HTTP基础上增加了数字签名和非对称加解密功能,其交互图如下(来自网上): 2.2 报文协议HTTP报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。下图是一个具体HTTP报文例子: 3.HTTP请求类型4.HTTP状态码4.1 分类4.2 详细清单代码 | 消息 | 描述 | 100 | Continue | 只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求。 | 101 | Switching Protocols | 服务器切换协议。 | 200 | OK | 请求成功。 | 201 | Created | 该请求是完整的,并创建一个新的资源。 | 202 | Accepted | 该请求被接受处理,但是该处理是不完整的。 | 203 | Non-authoritative Information | 请求已经成功被响应,与200 (OK)相比,经过了拥有转换功能的 proxy (代理服务器)的修改。 | 204 | No Content | 请求已经成功,客户端客户不需要离开当前页面。默认情况下 204 响应是可缓存的。一个 ETag 标头包含在此类响应中。 使用惯例是,在 PUT 请求中进行资源更新,但是不需要改变当前展示给用户的页面,那么返回 204。如果创建了资源,则返回 201 。如果应将页面更改为新更新的页面,则应改用 200 。 | 205 | Reset Content | 通知客户端重置文档视图,比如清空表单内容、重置 canvas 状态或者刷新用户界面 | 206 | Partial Content | 请求已成功,并且主体包含所请求的数据区间,该数据区间是在请求的 Range 首部指定的。 如果只包含一个数据区间,那么整个响应的 Content-Type 首部的值为所请求的文件的类型,同时包含 Content-Range 首部。 如果包含多个数据区间,那么整个响应的 Content-Type 首部的值为 multipart/byteranges ,其中一个片段对应一个数据区间,并提供 Content-Range和 Content-Type 描述信息。 | 300 | Multiple Choices | 链接列表。用户可以选择一个链接,进入到该位置。最多五个地址。 | 301 | Moved Permanently | 所请求的页面已经转移到一个新的 URL。 | 302 | Found | 所请求的页面已经临时转移到一个新的 URL。 | 303 | See Other | 所请求的页面可以在另一个不同的 URL 下被找到。 | 304 | Not Modified | 无需再次传输请求的内容,也就是说可以使用缓存的内容。这通常是在一些安全的方法(safe),例如GET 或HEAD 或在请求中附带了头部信息: If-None-Match 或If-Modified-Since。 | 305 | Use Proxy | 被请求的资源必须通过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。 RFC2068中没有明确305响应,这为了重定向一个单独的请求,而且只能被原始服务器建立,否则可能导致严重的安全后果。 | 306 | Unused | 在以前的版本中使用该代码。现在已不再使用它,但代码仍被保留。 | 307 | Temporary Redirect | 所请求的页面已经临时转移到一个新的 URL。 | 308 | Temporary Redirect | 重定向的响应状态码,说明请求的资源已经被永久的移动到了由 Location 首部指定的 URL 上。浏览器会进行重定向,同时搜索引擎也会更新其链接(SEO :链接汁被传递到了新的 URL)。 在重定向过程中,请求方法和消息主体不会发生改变,然而在返回 301 的情况下,请求方法有时候会被客户端错误地修改为 GET 方法。 | 400 | Bad Request | 服务器不理解请求。 | 401 | Unauthorized | 所请求的页面需要用户名和密码。 | 402 | Payment Required | 您还不能使用该代码。 | 403 | Forbidden | 禁止访问所请求的页面。 | 404 | Not Found | 服务器无法找到所请求的页面。. | 405 | Method Not Allowed | 在请求中指定的方法是不允许的。 | 406 | Not Acceptable | 服务器只生成一个不被客户端接受的响应。 | 407 | Proxy Authentication Required | 在请求送达之前,您必须使用代理服务器的验证。 | 408 | Request Timeout | 请求需要的时间比服务器能够等待的时间长,超时。 | 409 | Conflict | 请求因为冲突无法完成。 | 410 | Gone | 所请求的页面不再可用。 | 411 | Length Required | 'Content-Length' 未定义。服务器无法处理客户端发送的不带 Content-Length 的请求信息。 | 412 | Precondition Failed | 请求中给出的先决条件被服务器评估为 false。 | 413 | Request Entity Too Large | 服务器不接受该请求,因为请求实体过大。 | 414 | Request-url Too Long | 服务器不接受该请求,因为 URL 太长。当您转换一个 'post' 请求为一个带有长的查询信息的 'get' 请求时发生。 | 415 | Unsupported Media Type | 服务器不接受该请求,因为媒体类型不被支持。 | 416 | Range Not Satisfiable | 服务器无法处理所请求的数据区间。最常见的情况是所请求的数据区间不在文件范围之内,也就是说,Range 首部的值,虽然从语法上来说是没问题的,但是从语义上来说却没有意义。 416 响应报文包含一个 Content-Range 首部,提示无法满足的数据区间(用星号*表示),后面紧跟着一个“/”,再后面是当前资源的长度。例如:Content-Range: */12777 遇到这一错误状态码时,浏览器一般有两种策略:要么终止操作(例如,一项中断的下载操作被认为是不可恢复的),要么再次请求整个文件。 | 417 | Expectation Failed | 客户端错误,意味着服务器无法满足 Expect 请求消息头中的期望条件。 | 418 | I'm a teapot | 服务器拒绝冲泡咖啡,因为它是个茶壶。 该错误是超文本咖啡壶控制协议的参考,和 1998 年愚人节的玩笑。 | 422 | Unprocessable Entity | 服务器理解请求实体的内容类型,并且请求实体的语法是正确的,但是服务器无法处理所包含的指令。 | 425 | Too Early | 服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被“重放”,从而造成潜在的重放攻击。 | 426 | Upgrade Required | 服务器拒绝处理客户端使用当前协议发送的请求,但是可以接受其使用升级后的协议发送的请求。 服务器会在响应中使用 Upgrade 首部来指定要求的协议。 | 428 | Precondition Required | 表示服务器端要求发送条件请求。 一般的,这种情况意味着必要的条件首部——如 If-Match ——的缺失。. 当一个条件首部的值不能匹配服务器端的状态的时候,应答的状态码应该是 412Precondition Failed,前置条件验证失败。 | 429 | Too Many Requests | 表示在一定的时间内用户发送了太多的请求,即超出了“频次限制”。 在响应中,可以提供一个 Retry-After 首部来提示用户需要等待多长时间之后再发送新的请求。 | 431 | Request Header Fields Too Large | 表示由于请求中的首部字段的值过大,服务器拒绝接受客户端的请求。客户端可以在缩减首部字段的体积后再次发送请求。 该响应码可以用于首部总体体积过大的情况,也可以用于单个首部体积过大的情况。 这种错误不应该出现于经过良好测试的投入使用的系统当中,而是更多出现于测试新系统的时候 | 451 | Unavailable For Legal Reasons | (因法律原因不可用)服务器由于法律原因,无法提供客户端请求的资源,例如可能会导致法律诉讼的页面。 | 500 | Internal Server Error | 未完成的请求。服务器遇到了一个意外的情况。 | 501 | Not Implemented | 未完成的请求。服务器不支持所需的功能。 | 502 | Bad Gateway | 未完成的请求。服务器从上游服务器收到无效响应。 | 503 | Service Unavailable | 未完成的请求。服务器暂时超载或死机。 | 504 | Gateway Timeout | 网关超时。 | 505 | HTTP Version Not Supported | 服务器不支持'HTTP协议'版本。 | 506 | Variant Also Negotiates | 内部服务器配置错误,其中所选变量/变元自身被配置为参与内容协商,因此并不是合适的协商端点 | 507 | Insufficient Storage | 服务器不能存储相关内容 | 508 | Loop Detected | 服务器中断一个操作,因为它在处理具有“Depth: infinity”的请求时遇到了一个无限循环 | 509 | Not Extended | 在HTTP扩展框架协议中 ,一个客户端可以发送一个包含扩展声明的请求,该声明描述了要使用的扩展。如果服务器接收到这样的请求,但是请求不支持任何所描述的扩展,那么服务器将使用510状态码进行响应。 |
5.首部字段HTTP/1.1种规定了47种首部字段: 5.1通用首部字段5.2请求首部字段5.3响应首部字段5.4实体首部字段5.5其他首部字段Cookie、Set-Cookie、Content-Disposition、Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade etc... 6.参考资料(1)HTTP https://wiki.developer.mozilla.org/zh-CN/docs/Web/HTTP (2)rfc2616-http1.1协议英文版.pdf
|