toFrankie / blog

种一棵树,最好的时间是十年前。其次,是现在。
20 stars 1 forks source link

三、HTTP 协议 #207

Open toFrankie opened 1 year ago

toFrankie commented 1 year ago

上一篇介绍了:HTTP Content-Type 详解

什么是 HTTP 协议?

HTTP,全称是 HyperText Transfer Protocol,中文叫做超文本传输协议。它是一种用于分布式、协作式和超媒体信息系统的应用层协议。

一系列发布的 RFC 中,最著名的是 1999 年 6 月公布的 RFC 2616,定义了 HTTP 协议中现今广泛使用的一个版本 HTTP/1.1。直到 HTTP/2 于 2015 年 5 月的 RFC 7540 正式发布,取代了 HTTP/1.1 成为 HTTP 的实现标准。

HTTP 协议概述

HTTP 是一个客户端(用户)和服务器端(网站)请求和应答的标准(TCP)。 通过使用网页浏览器、网络爬虫或者其他工具,客户端发起一个 HTTP 请求到服务器上指定的端口(默认端口为 80),我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储这一些资源,比如 HTML文件、图像等,我们称这个应答服务器为源服务器(origin server)。在用户代理程序和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

尽管 TCP/IP 协议是互联网上最流行的应用,但在 HTTP 协议中,并没有规定必须使用它或者他支持的层。事实上,HTTP 可以在任何互联网协议上,或者其他网络上实现。HTTP 假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此,也就是其在 TCP/IP 协议族使用 TCP 作为其传输层。

通常,由 HTTP 客户端发起一个 请求,创建一个到服务器指定端口(默认为 80)的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如 “HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误信息、或者其他信息。

HTTP 工作原理

HTTP 协议定义 Web 客户端如何从 Web 服务器请求 Web 页面,以及服务器如何把 Web 页面传送给客户端。HTTP 协议采用了“请求/响应模型”。

客户端想服务器发送一个请求报文,请求报文包含了请求方法、URL协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或错误代码、服务器信息、响应头部和响应数据。

HTTP 报文可以分为两类:请求报文(request message)和响应报文(response message),两者的基本报文结构相同。

请求报文的格式:

<method> <request-URL> <version>
<headers>

<entiry-body>

响应报文格式:

<version> <status> <reason-phrase>
<headers>

<entity-body>

报文对应表示:

// method: 客户端希望服务器对资源执行的动作。是一个单独的词,比如 GET、HEAD 或 POST;
// request-URL: 命名了所请求的资源,或者 URL 路径组件的完整 URL
// version: 报文所使用的 HTTP 版本,格式:HTTP/<major>.<minor>,主版本号和次版本号都是整数
// headers: 首部,可以有零个或多个首部,毎个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个 CRLF。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始
// entity-body: 主体部分,包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时报文是已一个 CRLF 结束的。

// 注意:请求行、响应行的每个字段都是由“空格符”进行分割的。

HTTP 请求/响应的步骤:

  1. 客户端连接到 Web 服务器 一个 HTTP 客户端。通常是浏览器,与 Web 服务器的 HTTP 端(默认为 80)建立一个 TCP 套接字连接。如:http://www.baidu.com

  2. 发送 HTTP 请求 通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文包括请求行、请求头部、空行和请求数据 4 部分组成。

  3. 服务器接受请求并返回 HTTP 响应 Web 服务器解析请求,定位请求资源。服务器将资源副本写到 TCP 套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据 4 部分组成。

  4. 释放 TCP 连接 如果 connect 模式为 close,则服务器阻断关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接;如果 connection 模式为 keepalive,则该连接会保持一段时间,在改时间内可以继续接收请求。

  5. 客户端浏览器解析 HTML 内容。 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码,然后解析每一个响应头,响应头告知以下为若干字节的 HTML 文档和文档的字符集。客户端浏览器读取响应数据 HTML,根据 HTML 语法堆砌进行格式化,并在浏览器窗口中显示。

一个经典问题:在浏览器地址栏键入 URL,按下回车之后会经历什么?

  1. 浏览器向 DNS 服务器请求解析该 URL 中域名对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
  3. 服务器发出读取文件的HTTP请求(URL 中域名后面部分对应的文件),该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
  5. 释放 TCP 连接;
  6. 浏览器将 HTML 文档渲染并显示内容;

HTTP 1.1 提供了八种方法来以不同方式操作指定的资源

GET:获取资源 POST:传输实体主体 PUT:传输文件 HEAD:获取报文首部 DELETE:删除文件 OPTIONS:询问支持的方法 TRACE:追踪路径 CONNECT:要求用隧道协议连接代理

注意:

  1. 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码 405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码 501(Not Implemented)。
  2. HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如 PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源。
  3. GET 提交的数据大小有限制(因为浏览器对 URL 的长度有限制),而 POST 方法提交的数据没有限制.

状态码

HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端处理是否正常、通知出现的错误等工作。HTTP 状态码被分成了“五”大类,不同的类型代表不同类别的状态码。

状态码 类别 原因短语
1XX Information(信息性状态码) 表示接收的请求正在处理
2XX Success(成功状态码) 表示请求正常处理完毕
3XX Redirection(重定向状态码) 表示需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 表示服务器无法处理请求
5XX Server Error(服务器错误码) 表示服务器处理请求出错

更具体的状态码:

参考文章

下一篇:Ajax 之 GET、POST 请求方式

The end.