HTTP(HyperText Transfer Protocol)
HTTP(超文本传输协议)是一种无状态的、应用层协议,用于在客户端和服务器之间传输超文本数据(如 HTML 页面)。HTTP 是 Web 服务的核心协议,支撑着网页浏览、文件传输、API 调用等大量互联网服务。它通过请求-响应模型传输数据,即客户端发送请求,服务器返回响应。
HTTP 的基本特性:
- 无状态性:HTTP 协议本身是无状态的,意味着每个请求都是独立的,服务器不会记住前一个请求的状态或客户端的信息。每次请求都是一个全新的会话。每次请求的状态、身份验证等需要在请求中重新传递(例如通过 Cookies 或 Session)。
- 无连接性:HTTP 是无连接的协议,意味着每个请求和响应之后,连接都会关闭。如果客户端要发送另一个请求,它必须重新建立连接。在 HTTP/1.1 中,可以通过长连接(Keep-Alive)复用连接,提高效率。
- 基于请求/响应模型:客户端(通常是浏览器)向服务器发送 HTTP 请求,服务器根据请求返回 HTTP 响应。请求和响应的格式都很简洁,以文本形式传输数据。
- 支持多种数据类型:HTTP 支持不同格式的数据传输,如文本(HTML)、图像(JPG、PNG)、音频、视频以及其他文件类型(JSON、XML)。
- 无加密:HTTP 本身是明文传输的,没有加密机制,所有的数据(包括密码、敏感信息等)都是直接以明文形式传输,容易受到中间人攻击、窃听等风险。
HTTP 请求和响应的组成
HTTP 请求(Request)
HTTP 请求由三部分组成:
- 请求行:包含请求方法、URL 和 HTTP 版本。例如:GET:HTTP 方法,表示请求数据。/index.html:请求的资源(URL)。HTTP/1.1:HTTP 版本。
- 请求头(Headers):包含请求的元信息,如浏览器类型、客户端信息、接受的数据类型等。常见的请求头包括:User-Agent:客户端的浏览器或设备信息。Accept:客户端能够处理的数据类型。Host:请求的目标主机名。Cookie:请求的 Cookies 信息。
- 请求体(Body):在 POST 或 PUT 请求中,包含要提交的数据,如表单数据、文件上传等。对于 GET 请求通常没有请求体。
HTTP 响应(Response)
HTTP 响应由三部分组成:
- 响应行:包含 HTTP 版本、状态码和状态消息。例如:HTTP/1.1:HTTP 版本。200:状态码,表示请求成功。OK:状态消息,描述响应状态。
- 响应头(Headers):包含响应的元信息,如服务器类型、响应数据的类型、缓存策略等。常见的响应头包括:Content-Type:返回的数据类型(如 text/html, application/json)。Content-Length:响应体的大小(字节数)。Set-Cookie:设置 Cookies 信息。
- 响应体(Body):实际返回的数据,如 HTML 页面、图片、JSON 数据等。
常见的 HTTP 方法(Request Methods)
- GET:用于请求指定的资源。GET 请求只用于数据读取,不修改数据。请求的参数通常包含在 URL 中。
- POST:用于向服务器发送数据,例如提交表单、上传文件等。POST 请求将数据放在请求体中。
- PUT:用于更新指定的资源,通常用于修改现有资源。
- DELETE:用于删除指定的资源。
- HEAD:类似于 GET 请求,但不返回响应体,仅返回响应头,用于获取响应的元数据。
- OPTIONS:用于查询支持的 HTTP 方法或其他元数据,通常用于跨域请求的预检(CORS)。
- PATCH:用于部分更新资源,与 PUT 不同,PATCH 请求只修改资源的一部分。
常见的 HTTP 状态码
HTTP 状态码是服务器返回的三位数字,表示请求的处理结果。常见的状态码如下:
1xx 信息性状态码:
- 100 Continue:客户端可以继续发送请求数据。
- 101 Switching Protocols:服务器已接受协议切换请求。
2xx 成功状态码:
- 200 OK:请求成功,返回所请求的数据。
- 201 Created:请求成功,并且创建了新的资源。
- 204 No Content:请求成功,但没有返回任何数据。
3xx 重定向状态码:
- 301 Moved Permanently:请求的资源已永久移动到新 URL。
- 302 Found:请求的资源临时被移动到另一个位置。
- 304 Not Modified:客户端缓存的资源未被修改,可以使用缓存的版本。
4xx 客户端错误状态码:
- 400 Bad Request:请求无效,服务器无法理解请求。
- 401 Unauthorized:需要身份验证。
- 403 Forbidden:服务器拒绝请求,客户端无权访问。
- 404 Not Found:请求的资源不存在。
5xx 服务器错误状态码:
- 500 Internal Server Error:服务器内部错误,无法处理请求。
- 502 Bad Gateway:网关或代理服务器收到无效响应。
- 503 Service Unavailable:服务器暂时无法处理请求,通常是因为过载或维护。
- 504 Gateway Timeout:网关或代理服务器超时。
HTTP/1.0 vs HTTP/1.1 vs HTTP/2
- HTTP/1.0:每个请求都需要建立一个新的连接,效率较低,且没有支持持久连接。不支持管道化(Pipeline),即请求和响应必须按顺序处理。
- HTTP/1.1:引入了持久连接(Keep-Alive),同一连接可以处理多个请求,减少了建立连接的时间。支持请求管道化(但由于“队头阻塞”问题,实际使用较少)。支持分块传输编码和缓存控制。
- HTTP/2:改进了 HTTP 的性能,使用二进制协议代替文本协议,使得数据传输更加高效。支持多路复用(Multiplexing),即同一连接上可以并发多个请求和响应,减少了延迟。支持服务器推送(Server Push),允许服务器主动向客户端发送资源。引入头部压缩(HPACK),减少了 HTTP 头部的开销。
HTTP 的安全性问题
由于 HTTP 是明文传输的,存在一些安全隐患,如:
- 中间人攻击(MITM):攻击者可以通过拦截 HTTP 请求,窃取或篡改数据,导致敏感信息泄露(如密码、个人信息等)。
- 数据篡改:由于没有加密机制,攻击者可以修改传输的数据,例如修改传输的网页内容、恶意代码等。
- 隐私泄露:HTTP 协议不会加密用户的数据,敏感信息如账号密码、信用卡信息等容易被窃取。