http协议
简介
本文基于阅读
图解HTTP
后做的一部分笔记,讲解了一部分的http协议知识,期间还查阅了菜鸟教程
的资料
Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web 是建立在 HTTP 协议上通信的。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
特点
HTTP 协议用于客户端和服务器端之间的通信
通过请求和响应的交换达成通信
HTTP 是不保存状态的协议
不保存状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
请求 URI 定位资源
可以使用 Cookie 的状态管理
管线化
管线化技术出现后,不用等待响应亦可直接发送下一个请求。 就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了
持久连接
只要任意一端没有明确提出断开连接,则保持 TCP 连接状态
Cookie管理状态
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的 首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一 个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前 的状态信息。
请求方式
下表源于菜鸟教程,最常用的两种方法是get和post
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
状态码
HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器端 的处理是否正常、通知出现的错误等工作。
常用状态码↓
成功2XX
状态码 | 状态码短语 | 描述 |
---|---|---|
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
重定向3XX
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确 表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区 别 |
304 | Not Modified | 该状态码表示客户端发送附带条件的请求 时,服务器端允许请求访问资源,但未满足条件的情况 |
307 | Temporary Redirect | 临时重定向。 |
客户端错误4XX
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
400 | Bad Request | 该状态码表示请求报文中存在语法错误,服务器无法理解 |
401 | Unauthorized | 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示 用 户认证失败。 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
服务器错误5XX
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
500 | Internal Server Error | 该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
注意
状态码和状况的不一致:不少返回的状态码响应都是错误的,但是用户可能察觉不到这点。 比如 Web 应用程序内部发生错误,状态码依然返回 200 OK,这种情况也经常遇到。
代理、网关、隧 道
HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发 的应用程序,例如代理、网关和隧道。它们可以配合服务器工作。 这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方 通信连接的应用程序。
Http缺点
通信使用明文(不加密),内容可能会被窃听
- TCP/IP 是可能被窃听的网络
- 加密处理防止被窃听
- 通信加密(SSL、TLS)→与 SSL组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)
- 内容的加密→由于HTTP 协议中没有加密机制,那么就对 HTTP 协议传输的内容本身加密。即把 HTTP 报文里所含的内容进行加密处理。
不验证通信方的身份就可能遭遇伪装
- 任何人都可对服务器发起请求
- 查明对手的证书
- 虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL则可以。 SSL不仅提供加密处理,而且还使用了一种被称为证书的手段, 可用于确定方。
无法证明报文完整性,可能已遭篡改
- 接收的内容可被“中间人攻击”而遭到篡改
- 防止篡改
- 虽然有使用 HTTP 协议确定报文完整性的方法,但事实上并不便捷、可靠。其中常用的是MD5和SHA-1等散列值校验的方法, 以及用来确认文件的数字签名方法。但是,用这些方法也依然无法百分百保证确认结果正确。因为 PGP 和 MD5 本身被改写的话,用户是没有办法意识到的。