# HTTP协议 **Repository Path**: zhou__jian/http-protocol ## Basic Information - **Project Name**: HTTP协议 - **Description**: 超文本传输协议 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HTTP协议 ## 概述 http协议 (Hyper Text Transger Protocol -- 超文本传输协议) 是用于传输超媒体文档(HTML等)的应用层协议 为 Web浏览器与 Web 服务器之间的通信而设计,遵循客户端-服务端模型。 ** 注意事项:** - HTTP 是无连接:限制每次连接只处理一个请求。服务器处理完用户的请求,并收到客户的应答后,就断开连接。这种方式节省传输时间 - HTTP是媒体独立的:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。 - HTTP 是无状态的:HTTP协议是无状态协议,对事务没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,需要重传,这样会导致传送数据量增大。 尽管通常基于 TCP/IP 层,但它可以在任何可靠的传输层上使用,也就是说,该协议不会像 UDP 那样静默的丢失消息 ## HTTP 的组件系统 ### 客户端 (user-agent) 任何能够为用户发起行为的工具,通常是指浏览器 ### Web服务的 由 Web Server 来服务并提供客户端所请求的文档。 Server 只是虚拟意义上的机器,可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机发起请求来获取资源 ### 代理 (Proxies) HTTP消息表现在应用层上的被称为代理,代理既可以是表现得透明,也可以不透明(‘改变请求’会通过她们) 作用 - 缓存 可以是公开的也可以是私有的,像浏览器的 - 过滤 像反病毒扫描,家长控制 - 负载均衡 让多个服务器服务不同的请求 - 认证 对不同的资源进行权限管理 - 日志记录 允许存储历史消息 ## 消息结构 ### 客户端请求消息 (requests) - 请求行 (request line) + 一个 HTTP 方法(GET,PUT,POST等),描述要执行的动作 + 请求目标 通常是一个 URL,或者是协议端口和域名的绝对路径 - 一个句对路径,末尾跟上一个 '?' 和查询字符串。主要被 GET,POST,HEAD 和 OPTIONS 方法所使用 ```` POST / HTTP/1.1 GET /background.png HTTP/1.0 HEAD /test.html?query=alibaba HTTP/1.1 OPTIONS /anypage.html HTTP/1.0 ```` - 绝对形式,一个完整的 URL 主要在 GET 方法连接到代理时使用 ```` GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1 ```` - 由域名和端口组成的URL,仅在 CONNECT 建立HTTP 隧道时使用 ```` CONNECT developer.mozilla.org:80 HTTP/1.1 ```` - 星号形式(*),配合 OPTIONS 方法使用,代表整个服务器 ```` OPTIONS * HTTP/1.1 ```` + 协议版本 定义了剩余的报文结构,作为对期望的响应版本的指示符 - 请求头部 (header) + 头部字段名:值 - 请求数据 请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据) + Single-resource bodies,由一个单文件组成。该类型 body 由两个 header 定义: Content-Type 和 Content-Length. + Multiple-resource bodies,由多部分 body 组成,每一部分包含不同的信息位。通常是和 HTML Forms 连系在一起。 ### 服务器响应消息 (responses) - 状态行 + 协议版本 + 状态码 + 状态文本 ```` HTTP/1.1 200 OK ```` - 消息头 ```` Data: Sat,31 Dec 2005 23:00:00 GMT Content-Type: text/html;charset=ISO-8859-1 Content-Length: 122 ```` + Allow 服务器支持哪些请求方法 + Content-Encoding 文档编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型 + Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据 + Content-Type 表示后面的文档属于什么 MINI类型 + Date 当前的 GMT 时间 + Expires 因该在什么时候认为文档已经过期,从而不再缓存 + Last-Modified 文档最后改动时间 + Location 表示客户到哪里去提取文档 + Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。 + Server 服务器名字 + Set-Cookie 设置页面关联的 Cookie + WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的 - 响应正文 具有状态码 (如 201 或 204) 的响应,通常不会有响应正文的 + Single-resource bodies,由已知长度的单个文件组成。该类型 body 由两个 header 定义:Content-Type 和 Content-Length。 + Single-resource bodies,由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked 来使用 chunks 编码。 + Multiple-resource bodies,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。 ### HTTP/2 帧 - HTTP/1.x 性能缺点 + Header 不像body 不会被压缩 + 两个报文之间的 header 通常非常相似,但她们仍然在连接中重复传输 + 无法复用 HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用 (multiplexing) 的过程,它允许更有效的底层 TCP 连接 ## 请求方法 - GET 请求一个指定资源的表示形式,应用于获取数据 - HREAD 请求一个与 GET 请求的响应相同的响应,但没有响应体 - POST 用于将实体提交到指定的资源,通常导致服务器上的状态码变化或副作用 - PUT 用请求有效载荷替换目标资源的所有当前表示 - DELETE 删除指定的资源 - CONNECT 建立一个到有目标资源标识的服务器的隧道 - OPTIONS 描述目标资源的通信选项 - TRACE 沿着到目标资源的路径执行一个消息环回测试 - PATCH 对资源应用部分修改 ## 状态码 浏览器接收并显示网页前,此网页所在的服务器会回一个包含 HTTP状态码的信息头,用以响应浏览器的请求 ### 分类 分类 | 描述 -----|---- 1** | 服务器接收请求,需要继续执行操作 2** | 成功,操作被成功接收并处理 3** | 重定向,需要进一步的操作以完成要求 4** | 客户端错误,请求包含语法错误或无法完成请求 5** | 服务器错误,服务器在处理请求过程中发送了错误 ### 状态码明细列表 状态码|英文名称|描述 ----|----|---- 100| Continue | 继续。客户端因继续请求 101| Switching-Protocols| 切换协议 服务器根据客户端的请求切换协议。只能切换到更高级的协议 | 200 | OK | 请求成功,一般用于 GET与 POST请求 201 | Created | 已创建,成功请求并创建新的资源 202 | Accepted | 已接受。已经接收请求,但未处理完成 203 | Non-Authoritative Information |非授权信息,请求成功,但返回的 meta信息不在原始的服务器,而是一个副本 204 | No Content | 无内容,服务器处理成功,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 205 | Reset Content | 重置内容。服务器处理成功,客户端应重置文档视图 206 | Partial Content | 部分内容,服务器成功处理部分 GET 请求 | 300 | Multiple Choices | 多种选择,请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于客户端选择 301 | Moved Permanently | 永久移动。请求的资源被永久移动到新的 URI,返回信息回包括新的URI,浏览器回自动定向到新的URI。 302 | Found | 临时移动。 303 | See Other | 查看其他地址 304 | Not Modified | 未修改。所请求的资源未修改,会返回此码,不会返回任何资源 305 | Use Proxy | 使用代理 307 | Temporary | 临时重定向,与 302类似,使用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 Time-out | 超时 409 | Conflict | 服务器处理请求时发生冲突,完成 PUT请求时可能会返回此码。 410 | Gone | 客户端请求的资源不存在 411 | Length Required | 服务器无法处理客户端发送的不带 Content-Length 的请求信息 412 | Precondition Failed | 客户端请求信息的先决条件错误 413| Request Entity Too Large | 请求实体多大,服务器无法处理 414 | Request-URL Too Laege | 请求的 URI过长,服务器无法处理 415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 416 | Requested range | 客户端请求的范围无效 417 | Expectation Failed | 服务器无法满足 Expect 的请求头信息 | 500 | Internal Server Error | 服务器内部错误 501 | Not Implemented | 服务器不支持请求的功能 502 | Bad Gateway | 无效相应 503 | Service Unavailable | 超载或系统维护,暂时无法处理客户端请求 504 | Gateway Time-out | 未及时从远端服务器获取请求 505 | HTTP Version Not supported | 不支持请求的协议版本 ## HTTP Content-Type Content-type (内容类型),一般指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,从而决定浏览器以什么形式、编码读取该文件。 ** 语法格式:** ```` Content-Type: text/html;charset=utf-8 Content-Type: multipart/form-data;boundary=something ```` ### 常见媒体格式类型: - text/HTML HTML格式 - text/plain 纯文本格式 - text/xml XML格式 - image/gif gif图片格式 - image/jpeg jpg图片格式 - image/png png图片格式 **以application开头的媒体格式类型:** - application/xhtml+xml XHTML格式 - application/xml XML数据格式 - application/atom+xml Atom XML聚合格式 - application/json JSON数据格式 - application/pdf pdf格式 - application/msword Word文档格式 - application/octet-stream 二进制流数据(常见的文件下载) - application/x-www-form-urlencoded 表单默认的提交数据格式 **文件上传媒体格式:** - multipart/form-data 表单中进行文件上传时使用的格式 [Content-type 对照表](https://www.runoob.com/http/http-content-type.html)