code学习

HTTP和HTTPS协议详细介绍

作者:夜阑卧听风吹雨F

摘要:本文详细介绍了HTTP/HTTPS协议的详细知识,能为编程入门打下基础,也可以作为程序员的参考手册。

1. HTTP

1.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协议的概况。

HTTP和HTTPS协议详细介绍

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交互流程的对比:

HTTP和HTTPS协议详细介绍

1.4长连接(持久连接)

HTTP1.1采用长连接(持久连接HTTP Persistent Connections),也称为 HTTP keep-alive 或 HTTP connection reuse,只要任意一端没有明确提出断开连接,则保持TCP连接状态,其交互流程如下(来自网上):

HTTP和HTTPS协议详细介绍

上图的“客户端”实际上就是Web浏览器,或者定制的特殊Web浏览器,上图的“服务器”就是Web服务器,“建立TCP连接”包括三个子步骤,“断开TCP连接”包括四个子步骤。

1.5管线化

长连接使得多数请求以管线化(pipelining)方式发送成为可能,HTTP1.1支持管线化传输。管线化技术支持并行发送多个请求。如下图(来自网上):

HTTP和HTTPS协议详细介绍

2.HTTPS

2.1定义和历史

HTTPS是基于SSL/TLS改造HTTP的新协议,全称是Hypertext Transfer Protocol Secure,意思是安全的超文本传输协议,通过传输加密和身份认证保证了传输过程的安全性。

如下图,HTTPS增加了安全层,因此HTTPS的发展历史实际上是SSL/TLS的发展历史。

HTTP和HTTPS协议详细介绍

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基础上增加了数字签名和非对称加解密功能,其交互图如下(来自网上):

HTTP和HTTPS协议详细介绍

2.2 报文协议

HTTP报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。下图是一个具体HTTP报文例子:

HTTP和HTTPS协议详细介绍

3.HTTP请求类型

HTTP和HTTPS协议详细介绍

4.HTTP状态码

4.1 分类

HTTP和HTTPS协议详细介绍

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通用首部字段

HTTP和HTTPS协议详细介绍

5.2请求首部字段

HTTP和HTTPS协议详细介绍

5.3响应首部字段

HTTP和HTTPS协议详细介绍

5.4实体首部字段

HTTP和HTTPS协议详细介绍

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

链接:https://pan.baidu.com/s/1AikXvY3Gdnku-1S3thjYdQ

提取码:4sxf

(3)(中文完整版)-HTTP-协议1.1.pdf

链接:https://pan.baidu.com/s/15Biw39TT1r6_eAAsfOoTYQ

提取码:37w3