主题
HTTP
介绍
超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。
HTTP 协议工作流程
- 原始状态:客户端与服务器没有任何关系。
- 客户端向服务器发送请求,三次握手,建立连接。
- 服务器根据连接,响应数据。
- 四次挥手,断开连接,回到原始状态。
三次握手 & 四次挥手
- 三次握手:建立连接。
- 四次挥手:断开连接。

请求报文结构
- 请求行:请求方法类型 + 请求 URL + HTTP 协议版本
- 请求头
- 空行
- 请求体
响应报文结构
- 响应行:HTTP 协议版本 + 响应状态码 + 响应状态文字
- 响应头
- 空行
- 响应体
HTTP 请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。 HTTP/1.0 定义了三种请求方法: GET、HEAD、POST。 HTTP/1.1 新增了六种请求方法:PUT、PATCH、DELETE、OPTIONS、TRACE、CONNECT。 注意:这些请求方法虽然是 HTTP 协议里规定的,但是 WEB SERVICE 未必允许或支持这些方法。
| 方法 | 描述 | 安全性 | 幂等性 |
|---|---|---|---|
| GET | 请求指定的页面信息,并返回实体主体。 | 是 | 是 |
| HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。 | 是 | 是 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 | 不是 | 不是 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 | 不是 | 是 |
| PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 | 不是 | 不是 |
| DELETE | 请求服务器删除指定的页面。 | 不是 | 是 |
| OPTIONS | 允许客户端查看服务器的性能。 | - | - |
| TRACE | 回显服务器收到的请求,主要用于测试或诊断。 | - | - |
| CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 | - | - |
HTTP 状态码
HTTP 防盗链原理

qq 空间中图片,与百度贴吧中图片不允许站外引入,其原理就是服务器通过 HTTP 协议中 referer 头 来进行判断是不是本站引用,若不是本站引用就直接拦截。
HTTP 缓存
现象:基于一个前提:图片不会经常改动。在浏览器访问图片时,第一次请求,200 Ok,第二次请求时,304 Not Modified(未修改)
原因:浏览器自身有缓存功能,当第一次正常访问图片时,返回 200 OK,另外还返回图片的“签名”-- Etag。当浏览器再次访问到这个图片时,会去服务器进行“签名”的校验,如果图片没有变化,那么就直接使用缓存中的图片。这样可以减轻服务器的压力。
HTTP 的无状态性
http 无状态性,指的是客户端每次的 http 请求都是独立的,连续多次请求之间没有直接关系,服务器不会主动保留每次 http 请求的状态。 如何突破 http 无状态性的限制? 通过 cookie 来标识身份,这种方式可以突破 http 无状态性的限制。
HTTPS
SSL 握手
状态码
200 204
HTTP 状态码 301, 302, 307 和 308 都表示重定向,但它们的行为和使用场景有所不同。以下是它们的详细区别:
301 Moved Permanently(永久重定向)
- 含义:资源已被永久移动到新位置。
- 客户端行为:客户端(包括浏览器和搜索引擎)应该使用新的 URL 进行请求,并在未来的请求中继续使用该新的 URL。
- 使用场景:网站迁移到新域名、永久性 URL 改变。
302 Found(临时重定向)
- 含义:资源临时移动到新位置。
- 客户端行为:客户端应该使用新的 URL 进行本次请求,但未来的请求应继续使用原来的 URL。
- 使用场景:临时重定向,例如维护期间的页面重定向。
307 Temporary Redirect(临时重定向)
- 含义:资源临时移动到新位置,但请求方法和主体不会改变。
- 客户端行为:客户端应使用新的 URL 进行本次请求,但未来的请求应继续使用原来的 URL,并且保持请求方法不变(如 POST 请求保持为 POST)。
- 使用场景:类似于 302,但在 HTTP/1.1 中更明确地指出请求方法不变。
308 Permanent Redirect(永久重定向)
- 含义:资源已被永久移动到新位置,请求方法和主体不会改变。
- 客户端行为:客户端应该使用新的 URL 进行请求,并在未来的请求中继续使用该新的 URL,且保持请求方法不变。
- 使用场景:类似于 301,但在 HTTP/1.1 中更明确地指出请求方法不变。
对比总结
- 301 与 308:都表示永久重定向,但 308 明确请求方法不变。
- 302 与 307:都表示临时重定向,但 307 明确请求方法不变。
总的来说:
- 301 和 308 用于永久重定向,区别在于 308 保持请求方法不变。
- 302 和 307 用于临时重定向,区别在于 307 保持请求方法不变。
http 的无状态性
http 无状态性,指的是客户端每次的 http 请求都是独立的,连续多次请求之间没有直接关系,服务器不会主动保留每次 http 请求的状态。
如何突破 http 无状态性的限制?
通过 cookie 来标识身份,这种方式可以突破 http 无状态性的限制。常见问题
GET vs POST
数据传输:
- GET 一般用于从服务器获取数据。数据以查询参数的形式附加在 URL 中,通过 URL 字符串传输,可能会有长度限制。请求体为空。
- POST 一般用于向服务器提交数据。数据不会附加在 URL 中,而是放在 HTTP 请求体中。
安全性
- 由于 GET 请求数据附加在 URL 上,数据可见,不太安全。
- 由于 POST 请求不会暴露在 URL 上,相对 GET 而言更安全。不过传输过程中仍然可能被拦截,通常使用 HTTPS 进行加密处理。
缓存
- GET 请求通常可以被浏览器缓存。
- POST 请求通常会引起服务器状态更改,不容易被缓存。
