计算机网络八股2
计算机网络八股2
常见端口号
1. 端口 21: FTP (文件传输协议)
- 服务:FTP(File Transfer Protocol)
- 用途:FTP 用于文件的上传和下载。它通过客户端和服务器之间的连接来传输文件。
- 工作方式:FTP 默认使用 21 端口进行控制连接,数据传输通过另一个端口(通常是 20)进行。它支持匿名登录,也可以使用用户名和密码进行验证。
2. 端口 22: SSH (安全外壳协议)
- 服务:SSH(Secure Shell)
- 用途:SSH 用于加密的远程登录和远程命令执行。它提供了比 Telnet 和 rlogin 更加安全的方式来进行远程管理。
- 工作方式:SSH 使用加密技术确保数据传输的安全性,防止会话被窃取或篡改。
3. 端口 23: Telnet (远程登录服务)
- 服务:Telnet
- 用途:Telnet 用于远程登录服务,允许用户通过网络连接到远程计算机并执行命令。
- 工作方式:Telnet 默认使用 23 端口,但与 SSH 不同,它不加密数据,容易受到中间人攻击,因此现在很少使用,推荐使用 SSH 替代。
4. 端口 53: DNS (域名系统)
- 服务:DNS(Domain Name System)
- 用途:DNS 用于将域名(如 www.example.com)解析为-yh5f055knh2c/) IP 地址(如 192.168.1.1)。
- 工作方式:DNS 服务通过 UDP 协议在 53 端口上工作。客户端向 DNS 服务器发送查询请求,服务器返回相应的 IP 地址。
5. 端口 80: HTTP (超文本传输协议)
- 服务:HTTP(HyperText Transfer Protocol)
- 用途:HTTP 是用于从 Web 服务器传输网页内容到浏览器的协议。它是构建万维网的基础协议。
- 工作方式:HTTP 通常使用 TCP 连接在 80 端口上传输明文数据,因此不适合传输敏感信息。
6. 端口 443: HTTPS (超文本传输协议安全)
- 服务:HTTPS(HyperText Transfer Protocol Secure)
- 用途:HTTPS 是 HTTP 的加密版本,确保 Web 浏览器与服务器之间的数据传输是加密的,从而防止中间人攻击。
- 工作方式:HTTPS 使用 SSL/TLS 协议加密通信,通过 443 端口进行连接。
7. 端口 1080: Sockets (代理服务)
- 服务:SOCKS(Socket Secure)
- 用途:SOCKS 是一个网络协议,用于通过代理服务器进行数据转发。它可以用于绕过网络过滤,提供更为灵活的互联网访问。
- 工作方式:SOCKS5 是 SOCKS 协议的最新版本,支持 UDP 和 TCP 协议,通常通过 1080 端口运行。
8. 端口 3306: MySQL (数据库服务)
- 服务:MySQL
- 用途:MySQL 是一个开源的关系型数据库管理系统(RDBMS)。它广泛用于网站开发和企业应用程序中。
- 工作方式:MySQL 默认使用 3306 端口进行客户端与数据库之间的连接,通过 SQL 查询语言进行数据库操作。
这些端口和服务在网络通信中扮演着重要角色,不同的服务和端口提供了不同的功能,确保计算机系统的互联互通和数据交换。
状态码
HTTP 状态码概述
HTTP 状态码用于表示服务器处理请求的结果。状态码按功能分类,共分为五类:
- 1xx - 信息性状态码
表示服务器接收到请求,需要继续处理。常见的 1xx 状态码有:
- 100 Continue:服务器接收到请求,客户端应继续发送请求体。
- 101 Switching Protocols:服务器根据客户端的请求,切换协议。
- 2xx - 成功状态码
表示请求成功,服务器已处理并返回所请求的资源。常见的 2xx 状态码有:
- 200 OK:请求成功,服务器返回所请求的资源。
- 201 Created:请求成功,且服务器创建了新的资源。
- 204 No Content:请求成功,但没有返回内容。
- 3xx - 重定向状态码
表示需要客户端进一步操作才能完成请求。常见的 3xx 状态码有:
- 301 Moved Permanently:请求的资源已被永久移动到新位置。
- 302 Found(曾为 "Moved Temporarily"):请求的资源临时移动到新位置,客户端继续使用原地址。
- 304 Not Modified:资源未修改,可以使用缓存的内容。
- 4xx - 客户端错误状态码
表示客户端请求有错误,服务器无法处理。常见的 4xx 状态码有:
- 400 Bad Request:请求格式错误,服务器无法理解。
- 401 Unauthorized:请求未授权,需登录才能访问。
- 403 Forbidden:服务器拒绝请求,即使用户已认证。
- 404 Not Found:请求的资源不存在。
- 5xx - 服务器错误状态码
表示服务器发生错误,无法完成请求。常见的 5xx 状态码有:
- 500 Internal Server Error:服务器内部错误,无法处理请求。
- 502 Bad Gateway:网关服务器无法获取上游服务器的有效响应。
- 503 Service Unavailable:服务器暂时无法处理请求,通常是因为过载或维护。
301 和 302 的区别
- 301 Moved Permanently(永久移动) 说明请求的资源已经永久移动到新的 URL。此时,客户端应该使用新 URL 进行后续请求,并且搜索引擎等也会更新其索引记录。
- 302 Found(临时移动) 表示请求的资源临时性移动到新的位置,客户端仍然应该使用原地址进行后续请求,除非明确告知后续永久使用新地址。
总结:
- 1xx:需要继续操作。
- 2xx:请求成功。
- 3xx:重定向,进一步操作。
- 4xx:客户端错误。
- 5xx:服务器错误。
HTTP请求方式
HTTP协议中定义了多种请求方式,用于指示客户端请求的目的。常见的请求方式有:
- GET:用于请求检索指定的资源。GET请求不应有副作用,因此应该只用于获取数据,并且是幂等的,即多次执行相同的GET请求应该返回相同的结果,不会改变资源的状态。
- POST:用于向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。POST请求的参数通常包含在请求体中。POST请求可能会创建新的资源或修改现有资源。
- DELETE:用于删除指定的资源。
- PUT:用于替换指定的资源。如果指定的资源不存在,可以创建一个新资源。
- HEAD:类似于GET请求,但返回的响应中没有实际内容,只包含响应头部,用于检查资源的存在性或验证资源的更新时间。
- OPTIONS:用于获取服务器支持的HTTP请求方法,通常用于跨域请求的预检(CORS)请求。
- TRACE:回显服务器收到的请求,主要用于调试和测试。由于安全问题,很多服务器会禁用TRACE请求。
- CONNECT:用于在客户端和服务器之间建立一个加密的隧道,通常用于SSL/TLS代理。
HTTP的GET方法可以实现写操作吗?
从理论上讲,GET 方法可以执行写操作,但不推荐。使用GET方法进行写操作可能导致严重的安全风险,尤其是跨站请求伪造(CSRF)等问题。正确的做法是,使用POST、PUT、DELETE等方法来处理数据的修改或删除操作。
什么是幂等?
幂等(Idempotence)是一个数学概念,表示执行同一个操作多次,其效果与执行一次相同。在HTTP中,幂等方法是指不论操作执行多少次,结果都是一致的,不会改变系统的状态。
- 幂等的方法:GET、HEAD、PUT、DELETE。
- 例如,GET /pageX HTTP/1.1 是幂等的。连续多次调用相同的GET请求,客户端接收到的结果应该是一样的。
- DELETE /idX/delete
是幂等的:即使多次请求删除同一资源,最终的状态也不会发生变化。例如:
- 第一次请求:返回200(成功删除)。
- 第二次请求:返回404(已删除,资源不存在)。
- 非幂等的方法:POST。
- POST通常用于创建新资源或提交数据,重复执行POST可能导致不同的结果,因此它不是幂等的。
总结:
- 幂等操作:GET、PUT、DELETE、HEAD。
- 非幂等操作:POST。
GET 和 POST 请求的区别:
- 目的:
- GET:主要用于从服务器获取数据。它请求的数据通常是公共的,获取后不改变资源的状态。
- POST:用于向服务器提交数据,通常是用于创建或修改资源。数据被包含在请求体中,可能会改变资源的状态。
- 数据传输方式:
- GET:将数据附加在 URL
后面(通过查询字符串)。例如:
GET /search?q=apple
- POST:数据被包含在请求体中,因此不会暴露在 URL 中。
- GET:将数据附加在 URL
后面(通过查询字符串)。例如:
- 数据长度:
- GET:由于数据附加在 URL 后,URL 的长度有限制(通常为 2048 字符)。因此,适用于小量数据。
- POST:没有数据长度限制,可以提交大量的数据。数据量取决于服务器和客户端的配置。
- 缓存:
- GET:由于 GET 请求的目的是获取数据,且请求的内容通常是静态的,因此浏览器可以缓存 GET 请求的响应,以提高性能。
- POST:POST 请求的数据通常会导致服务器状态发生改变,因此不适合缓存。
- 安全性:
- GET:由于数据附加在 URL 后,容易被他人看到,可能会导致安全问题(如泄露敏感信息)。比如,URL 可以被浏览器历史记录、日志记录等方式泄露。
- POST:POST 请求的数据存放在请求体中,不会直接暴露在 URL 中,因此比 GET 更安全一些。但要注意,POST 请求并不意味着数据加密,敏感数据应该通过 HTTPS 传输。
- 幂等性:
- GET:是幂等的,即多次执行相同的 GET 请求应返回相同的结果,不会改变资源的状态。
- POST:不是幂等的,重复执行相同的 POST 请求可能导致不同的结果(如多次创建相同资源)。
- 用例:
- GET:适用于获取数据或查询资源。例如,查看网页内容、获取图片等。
- POST:适用于提交数据或提交表单,例如,用户登录、提交订单、上传文件等。
总结:
特性 | GET | POST |
---|---|---|
目的 | 获取数据 | 提交数据 |
数据位置 | 参数附加在 URL 后 | 参数包含在请求体中 |
数据大小 | 受限于 URL 长度(通常 2048 字符) | 没有大小限制 |
缓存 | 可缓存,浏览器可能缓存响应 | 不缓存 |
安全性 | 数据暴露在 URL 中,存在安全风险 | 数据包含在请求体中,相对安全一些 |
幂等性 | 是幂等的,多次请求结果相同 | 不是幂等的,多次请求结果可能不同 |
用途 | 用于请求数据(如网页、图片等) | 用于提交表单数据、创建或修改资源 |
总的来说,GET 适用于获取数据,POST 适用于提交数据或进行操作,二者的选择取决于请求的目的和数据的性质。
GET 请求的长度限制:
在 HTTP 协议中,GET 请求是通过 URL 传递数据的,而 URL 本身并没有明确的长度限制。实际上,限制 GET 请求长度 的因素是浏览器和服务器的配置。不同的浏览器和 Web 服务器对 URL 长度有不同的限制。
浏览器的 URL 长度限制:
- Internet Explorer (IE):最大支持的 URL 长度约为 2048 个字符(大约 2KB)。
- Firefox:最大支持的 URL 长度为 65536 个字符(大约 64KB)。
- Chrome:最大支持的 URL 长度为 8192 个字符(大约 8KB)。
- Safari:与 Chrome 类似,最大支持的 URL 长度为 8192 个字符。
实际影响:
- 限制原因:这些限制并不仅仅是对数据部分的限制,而是对
整个 URL 的长度限制。URL 包括了协议部分(如
http://
)、主机名、路径、查询参数等。 - 浏览器差异:不同的浏览器可能会对 URL 长度有所不同的限制,所以跨浏览器开发时,需要考虑这一差异。
- 服务器限制:除了浏览器,服务器本身也会限制请求的最大 URL 长度。对于大多数 Web 服务器(如 Apache 或 Nginx),默认的 URL 长度限制通常设置为 8KB 或 16KB,可以在服务器配置中进行调整。
为什么 GET 请求有长度限制:
- URL 传递数据的方式:由于 GET 请求通过 URL 传递数据,因此 URL 的长度必须有限制。如果数据过长,可能会导致请求失败或无法正确传递数据。
- 浏览器与服务器的兼容性:不同的浏览器和服务器对 URL 长度的处理能力不同,过长的 URL 可能会导致请求无法被正常处理。
总结:
- GET 请求的 URL 长度限制通常取决于浏览器和 Web 服务器的配置。
- 常见的限制:IE 大约 2048 字符,Firefox 和 Chrome 可以支持更多的字符,最多达到 65536 或 8192 字符。
- 注意事项:由于 GET 请求会将数据附加在 URL 中,传输大量数据时应避免使用 GET 请求,通常建议使用 POST 请求来传递较长的数据。
表格总结:
浏览器 | 最大支持 URL 长度 |
---|---|
Internet Explorer (IE) | 2048 字符 (2KB) |
Firefox | 65536 字符 (64KB) |
Chrome | 8192 字符 (8KB) |
Safari | 8192 字符 (8KB) |
因此,在开发中,如果需要传递较长的数据,最好避免使用 GET 请求,改用 POST 请求,它没有数据长度限制,适合处理大量数据。
HTTP 请求的过程与原理:
HTTP(超文本传输协议)是基于 TCP/IP 协议 的应用层协议,通常用于客户端与服务器之间的通信。HTTP 请求的过程可以分为几个主要步骤:
HTTP 请求的过程:
- DNS 解析:
- 当客户端(通常是浏览器)在地址栏输入 URL 时,首先需要将该 URL 中的域名解析成 IP 地址。客户端通过 DNS(域名系统)查询来获取服务器的 IP 地址。
- 建立 TCP 连接:
- 通过解析出的 IP 地址,客户端和服务器建立 TCP 连接。此过程包括 TCP 三次握手:客户端发送 SYN 包,服务器回应 SYN-ACK 包,最后客户端再发送 ACK 包,连接建立。
- 发送 HTTP 请求:
- 在建立好 TCP 连接后,客户端向服务器发送 HTTP 请求。请求中包含请求方法(如 GET、POST)、目标资源的路径、请求头等信息。客户端可以通过 HTTP 请求携带一些数据(如表单数据、查询参数等)。
- 服务器处理请求:
- 服务器接收到 HTTP 请求后,解析请求头、请求方法和请求路径等信息。根据请求的内容,服务器执行相应的操作(如查询数据库、处理表单数据、返回文件等)。
- 服务器返回 HTTP 响应:
- 服务器处理完请求后,返回一个 HTTP 响应。响应中包含响应代码(如 200 OK、404 Not Found)、响应头和响应体(通常是请求的资源或错误信息)。
- 浏览器渲染页面:
- 客户端(浏览器)收到 HTTP 响应后,根据响应中的内容进行渲染。比如,如果是 HTML 页面,则会解析 HTML 代码并展示页面内容;如果是图像或其他资源,则会相应地处理和显示。
- 关闭 TCP 连接:
- 一旦响应处理完毕,客户端与服务器通过 TCP 协议断开连接。这个过程通常通过 四次挥手 实现,确保连接的关闭。
HTTP 请求是同步的:
HTTP 请求遵循 客户端-服务器 模型,客户端在发送请求后必须等待服务器的响应,期间不能发送其他请求。因此,HTTP 请求过程是 同步的。客户端会在等待响应时被阻塞。
如何利用多线程进行数据下载:
为了提高下载效率,可以使用 多线程 下载技术,特别是在下载大文件时,可以通过将文件分块下载来加速过程。以下是使用多线程下载文件的基本步骤:
- 获取文件大小:
- 使用 HTTP 请求头中的 HEAD 方法,客户端可以向服务器请求文件的总大小,以便将文件分割成适合多线程下载的大小。
- 分块下载:
- 根据文件的总大小和设置的线程数,客户端将文件分成多个块,每个线程下载文件的一部分。
- 使用 HTTP 请求头的 Range
字段来指定每个线程下载的字节范围。例如,
Range: bytes=0-1023
表示下载文件的前 1024 字节。
- 多线程下载:
- 启动多个线程,每个线程负责下载一个文件块,下载完成后将文件块保存到本地指定位置。
- 合并文件:
- 多线程下载后,所有下载的文件块会合并成一个完整的文件。
📄 HTTP 报文结构详解(请求报文 + 响应报文)
HTTP 报文是浏览器和服务器之间通信的载体,主要分为两类:
- 请求报文(Request Message):浏览器发给服务器
- 响应报文(Response Message):服务器发给浏览器
一、HTTP 请求报文结构
一个 HTTP 请求报文由以下四部分组成:
1️⃣ 请求行(Request Line)
格式如下:
1 | <方法> <请求路径> <协议版本> |
示例:
1 | GET /login HTTP/1.1 |
说明:
GET
:请求方法(如 GET、POST、PUT、DELETE 等)/login
:请求的资源路径HTTP/1.1
:HTTP 协议版本
2️⃣ 请求头(Request Headers)
格式如下:
1 | 字段名: 字段值 |
示例:
1 | Host: www.example.com |
常见字段解释:
Host
:目标服务器域名和端口User-Agent
:客户端信息(浏览器/操作系统)Accept
:客户端可以处理的媒体类型(如 text/html)Content-Type
:请求体中数据的类型(如 application/json)Range
:请求资源的部分内容(如 Range: bytes=0-1023)
3️⃣ 空行(CRLF)
头部结束标志,一行空行表示头部结束,接下来是正文(如果有)。
4️⃣ 消息正文(Body,可能为空)
说明:
- GET 请求一般没有消息体
- POST、PUT 请求一般包含消息体,例如表单数据、JSON 等
示例(表单数据):
1 | username=admin&password=123456 |
二、HTTP 响应报文结构
HTTP 响应报文也由四个部分组成:
1️⃣ 状态行(Status Line)
格式如下:
1 | <协议版本> <状态码> <状态描述> |
示例:
1 | HTTP/1.1 200 OK |
说明:
- 协议版本:通常是 HTTP/1.1
- 状态码:三位数字表示结果(如 200、404、500)
- 状态描述:状态码的英文描述(如 OK、Not Found)
2️⃣ 响应头(Response Headers)
格式:
1 | 字段名: 字段值 |
示例:
1 | Content-Type: text/html |
常见字段解释:
Content-Type
:响应内容的 MIME 类型Content-Length
:响应体的字节长度Server
:服务器名称和版本Expires
:响应内容的过期时间Last-Modified
:内容的最后修改时间
3️⃣ 空行(CRLF)
响应头和响应体之间用一行空行分隔。
4️⃣ 响应正文(Body)
说明:
- 服务器返回的内容,比如 HTML 页面、JSON 数据等
- 某些响应(如 204 No Content)不包含消息体
示例:
1 | <html> |
✅ 总结对比表
项目 | 请求报文 | 响应报文 |
---|---|---|
起始行 | 请求行(方法 + 路径 + 版本) | 状态行(版本 + 状态码 + 状态描述) |
头部字段 | 请求头(Host、UA、Accept 等) | 响应头(Content-Type、Server 等) |
空行 | 分隔头和正文 | 分隔头和正文 |
消息正文 | 可选,POST 中常有 | 可选,返回的网页/数据 |
🌐 URI 和 URL 的区别详解
一、定义
✅ URI(Uniform Resource Identifier)统一资源标识符
作用:在 Web 中标识某个资源的“统一名称”或“身份标识”。
它只需要唯一标识这个资源,不一定说明在哪里,也不一定说明怎么访问它。
✅ URL(Uniform Resource Locator)统一资源定位符
作用:是 URI 的一个子集,不仅标识了资源,还指明了资源的位置和访问方式(协议)。 URL 不仅告诉你“是哪个资源”,还告诉你“在哪里”以及“怎么访问”。
二、通俗比喻
项目 | 比喻 | 说明 |
---|---|---|
URI | 身份证 | 唯一标识一个人,但不告诉你他在哪 |
URL | 家庭住址 + 开门方式 | 不仅知道是张三,还知道张三在哪、怎么找到他(比如走路、打车、打电话) |
三、自编示例
🌟 示例 1:URI(可能不包含访问方式)
1 | student:张三 |
说明:这里标识了一个叫“张三”的学生资源,但不知道怎么访问。
🌟 示例 2:URL(提供完整的访问路径)
1 | https://university.edu/students/zhangsan |
说明:这是一个标准的 URL,包含:
- 协议:
https
(表示通过 HTTPS 协议访问) - 主机名:
university.edu
- 路径:
/students/zhangsan
我们可以通过这个地址,访问到张三的学生资料页面。
四、组成结构对比
类型 | 格式结构 | 含义 |
---|---|---|
URI | scheme:[//authority]path[?query][#fragment] |
资源标识符格式 |
URL | 协议://主机/路径?查询参数#片段标识符 |
更具体的资源位置和访问方式 |
五、总结表格
对比点 | URI | URL |
---|---|---|
全称 | Uniform Resource Identifier | Uniform Resource Locator |
是否唯一标识 | ✅ 是 | ✅ 是(因为是 URI 子集) |
是否包含访问方式 | ❌ 不一定包含 | ✅ 包含(如 http、ftp、mailto) |
是否指明位置 | ❌ 不一定 | ✅ 提供资源位置 |
关系 | 更通用,父集 | 更具体,子集 |
六、额外说明:还有 URN
- URN:Uniform Resource Name,统一资源名称,仅用于标识资源,不含位置信息。
- 示例:
urn:isbn:978-7-302-13389-9
→ 标识某本图书的国际标准书号
所以我们有如下包含关系: URL ⊆ URI,**URN ⊆ URI
🌐 HTTP/1.0 vs HTTP/1.1 vs HTTP/2.0 区别详解
一、背景介绍
HTTP(HyperText Transfer Protocol)是万维网上的基础协议。随着互联网发展,为了解决性能瓶颈和资源浪费问题,HTTP 协议经历了三个关键版本的演进:
- HTTP/1.0(1996)
- HTTP/1.1(1997)
- HTTP/2.0(2015)
二、对比总览表
特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 |
---|---|---|---|
是否持久连接 | ❌ 默认短连接 | ✅ 默认长连接(Keep-Alive) | ✅ 多路复用,不再区分长短连接 |
请求并发 | ❌ 无法并发 | ❌ 有队头阻塞 | ✅ 真正并发请求(多路复用) |
编码格式 | 文本(ASCII) | 文本(ASCII) | 二进制 |
头部压缩 | ❌ 无 | ❌ 无 | ✅ 支持(HPACK 算法) |
服务端推送 | ❌ 无 | ❌ 无 | ✅ 支持 Server Push |
管道化(Pipelining) | ❌ 不支持 | ✅ 支持(但实际使用较少) | ❌ 不需要此机制,已被多路复用替代 |
状态保持 | ❌ 无 | ✅ 支持 Cache/ETag 等 | ✅ 更强(加密、压缩、复用) |
三、版本详解
✅ HTTP/1.0
无状态协议:每次请求彼此独立,服务器不会记住前一次请求的任何信息。
短连接(非持久连接):每次请求-响应后,TCP 连接即关闭。
缺点:
- 同一网页多资源(HTML + CSS + JS + 图片)需要多次建立连接,浪费带宽与延迟时间。
举例:
1
2GET /index.html
Host: example.com
✅ HTTP/1.1
- 持久连接:默认启用
Connection: keep-alive
,多个请求可复用一个 TCP 连接,降低延迟和资源浪费。 - 请求流水线(Pipelining):客户端可以并行发送多个请求,但仍需按顺序接收响应。
- 缓存机制:支持
ETag
、Cache-Control
等缓存控制字段。 - 分块传输(Chunked Transfer Encoding):可以边生成边发送内容,不用提前知道内容长度。
- 虚拟主机支持:通过
Host
头区分同 IP 下多个网站。 - 缺点:
- 仍存在 队头阻塞(Head-of-line Blocking):前一个请求未完成,后面的响应无法返回。
✅ HTTP/2.0
- 二进制分帧(Binary Framing Layer):
- 所有请求和响应都分为帧(Frame),并用流(Stream)编号,性能更高。
- 多路复用(Multiplexing):
- 同一 TCP 连接上并发多个请求/响应,互不干扰,彻底消除队头阻塞。
- 头部压缩(HPACK 算法):
- 减少冗余的请求头大小,降低网络带宽使用。
- 服务器推送(Server Push):
- 服务器可以主动发送客户端可能需要的资源,提升首屏加载速度。
- 举例(简化):
- 浏览器请求
index.html
后,服务器主动推送style.css
和script.js
,无需客户端再发请求。
- 浏览器请求
四、通俗类比
类比 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 |
---|---|---|---|
派送快递 | 每送一个快递都重新建一次路(短连接) | 送完一个快递,不拆路,继续派下一个(长连接) | 同一条路多个车道并行派快递,互不阻塞(多路复用) |
五、总结记忆口诀
“一短一长二复用,二进二压二推送。”
- HTTP/1.0:短连接
- HTTP/1.1:长连接 + 管道化
- HTTP/2.0:多路复用 + 二进制 + 头部压缩 + 服务端推送
🌐 HTTP/3 知识
一、HTTP/3 是什么?
- HTTP/3 是最新一代超文本传输协议
- 与前代最大的不同是:
- HTTP/1.1 和 HTTP/2 基于 TCP
- HTTP/3 基于 QUIC(Quick UDP Internet Connections)协议,这是一个基于 UDP 的新型传输层协议。
二、为什么从 TCP 改用 QUIC?
原因一:TCP 的队头阻塞(Head-of-line Blocking)
- 在 HTTP/2 中,虽然支持多路复用,但底层用的是 TCP。
- 一旦某个 TCP 包丢了,必须等待这个包重传,整个连接都要等,其他流也被阻塞。
- 类比:一辆货车轮胎爆了,后面所有车都堵着动不了。
原因二:TCP + TLS 握手过程复杂、慢
- 建立一个 HTTPS 连接,需要至少:
- 3 次 TCP 握手
- 1~2 次 TLS 握手
- 总共 至少 3~4 个往返时间(RTT)
三、HTTP/3 的关键特性
特性 | 描述 |
---|---|
✅ 基于 QUIC 协议 | QUIC 是运行在 UDP 之上的传输协议,替代了 TCP |
✅ 真正无队头阻塞 | 每个流独立传输,一个包丢了不会影响其他流 |
✅ 集成 TLS 加密 | 建立连接时就完成 TLS 加密握手(TLS 1.3) |
✅ 0-RTT 连接恢复 | 再次连接同一服务器时可跳过握手,几乎“秒连” |
✅ 更低延迟 | 减少了连接建立时间,对移动网络更友好 |
✅ 支持多路复用 | 和 HTTP/2 一样,也支持多路复用(更彻底) |
四、HTTP 协议版本演进图
1 | HTTP/1.0 → HTTP/1.1 → HTTP/2.0 → HTTP/3.0 |
五、QUIC vs TCP 对比
对比项 | TCP | QUIC |
---|---|---|
协议类型 | 面向连接,基于 IP | 基于 UDP,自定义连接层 |
多路复用 | 存在队头阻塞问题 | 真正无阻塞 |
加密机制 | TLS 分离,需要额外握手 | 内置 TLS 1.3,零延迟加密 |
首次连接延迟 | 高(需要多轮握手) | 更低(握手即加密) |
应用场景 | 普遍使用 | 更适合高延迟/弱网场景 |
六、当前 HTTP 协议的使用情况(数据参考:w3techs)
- 截止 2022 年初:
- HTTP/2 使用率约为 46.9%
- HTTP/3 使用率正在快速增长
- 原因是:
- 许多浏览器(Chrome、Firefox、Edge)和大型服务商(Google、Facebook、Cloudflare)已部署 HTTP/3。
- 但许多小网站/企业服务器未启用 QUIC,还在使用 HTTP/1.1 或 HTTP/2。
七、通俗类比
- TCP 就像高速公路,一旦前车出事故,后面全堵住(队头阻塞)
- QUIC 就像高空无人机快递,每架都独立飞行,互不干扰
🔗 HTTP 长连接(Keep-Alive)
一、什么是 HTTP 长连接?
- HTTP 长连接(Persistent Connection):指客户端和服务器之间,在一次 HTTP 请求响应完成后,连接不立即关闭,而是保留连接用于后续请求复用。
- 核心目的:节省 TCP 连接开销(建立/关闭代价高)。
- 也称为:HTTP Keep-Alive
二、长连接的演进版本支持
HTTP 版本 | 长连接支持情况 |
---|---|
HTTP/1.0 | 默认关闭,需要手动添加 Connection: keep-alive
才开启 |
HTTP/1.1 | 默认开启长连接,除非显式设置 Connection: close |
HTTP/2 | 默认长连接 + 支持多路复用(多个流共用一条连接) |
HTTP/3 | 基于 QUIC,天然支持多流 + 保持连接 |
三、如何开启长连接?
在 HTTP 请求头中添加字段:
1 | Connection: keep-alive |
示例:
1 | GET /index.html |
服务端响应中也应包含:
1 | Connection: keep-alive |
timeout=5
表示连接保持 5 秒max=100
表示最多处理 100 个请求后关闭
四、为什么需要长连接?
- 减少连接建立开销
- TCP 建立连接需要三次握手,关闭需要四次挥手
- 每次请求都建立/关闭连接非常浪费资源
- 提高性能
- 多个资源(如 HTML + JS + CSS + 图片)可以复用同一连接
- 避免端口资源耗尽
- 短连接会频繁占用新的端口,可能导致端口耗尽
五、HTTP 长连接的超时机制
连接不能永远保持,操作系统与服务器都会设置连接超时时间:
1. HTTP 层的 keep-alive timeout
由服务器(如 Apache/Nginx)控制,称为
KeepAliveTimeout
超时时间内若无新请求,就关闭连接
示例配置:
1
2
3KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
六、TCP 层的 Keep-Alive 机制(更底层)
长连接依赖的 TCP 连接也可能由于网络故障被“静默断开”。为避免资源浪费,TCP 有自己的 探活机制:
Linux 系统中三个关键参数:
参数 | 含义 |
---|---|
tcp_keepalive_time = 1800(秒) |
连接空闲多长时间后开始探测(默认30分钟) |
tcp_keepalive_intvl = 15(秒) |
两次探测包之间的间隔 |
tcp_keepalive_probes = 5 |
最多探测几次无响应就放弃连接 |
举例说明:
- TCP 连接空闲 30 分钟后,开始每 15 秒发送一次探测包
- 如果连续 5 次无回应,系统会关闭该连接
设置方法示例(Linux):
1 | sysctl -w net.ipv4.tcp_keepalive_time=1800 |
八、面试常问点总结 ✅
问题 | 答案 |
---|---|
长连接如何实现? | Connection: keep-alive ,HTTP/1.1 默认开启 |
和 TCP keepalive 有什么关系? | TCP keepalive 是底层机制,防止连接“死挂”,不属于 HTTP 协议内容 |
长连接是否一直存在? | 否,会在空闲超时、达到最大请求数、主动关闭时断开 |
长连接与多路复用关系? | HTTP/1.1 长连接只能串行处理,HTTP/2 支持多路复用,多个请求并发处理 |
🔐 HTTP 与 HTTPS 区别
一、基础定义
协议 | 全称 | 简要说明 |
---|---|---|
HTTP | HyperText Transfer Protocol | 超文本传输协议,明文传输 |
HTTPS | HTTP Secure / HTTP over TLS | 加密的 HTTP,基于 SSL/TLS |
二、核心区别总结(常考)
区别项 | HTTP | HTTPS |
---|---|---|
安全性 | 不安全,明文传输 | 安全,使用 TLS/SSL 加密传输 |
默认端口 | 80 |
443 |
URL 开头 | http:// |
https:// |
加密机制 | 无 | TLS:非对称 + 对称混合加密 |
证书机制 | 无 | 有,依赖 CA 签发的数字证书 |
性能开销 | 低 | 稍高(握手耗时 + 加解密运算) |
SEO | 无利好 | 对排名友好,Google 建议使用 HTTPS |
应用场景 | 普通网站 | 涉及登录、支付、隐私信息的网站 |
三、为什么需要 HTTPS?
HTTP 存在三大安全问题:
- 内容被窃听:中间人可监听通信内容(抓包分析)
- 内容被篡改:可劫持请求,替换网页、注入广告
- 身份伪造:攻击者伪装成目标服务器骗取敏感信息
✅ HTTPS 可有效解决以上三点,提供:
- 加密:内容加密传输,防监听
- 校验:内容校验,防篡改
- 认证:通过数字证书验证服务器身份,防伪造
四、HTTPS 的加密机制
HTTPS 并不是使用一种加密方式,而是两种配合使用:
1. 非对称加密(用于密钥协商)
- 服务器有一对密钥:公钥(公开)、私钥(保密)
- 客户端用公钥加密“随机对称密钥”
- 服务器用私钥解密,得出这个密钥
优点:安全传输密钥 缺点:效率低(加密慢)
2. 对称加密(用于实际通信)
- 客户端与服务器用协商出的对称密钥进行加密通信
- 加解密速度快,适合大量数据传输
五、HTTPS 建立连接的过程(握手流程)
1 | 客户端:你好,我要访问你,请把你的数字证书发给我 |
六、HTTPS 中的数字证书(SSL 证书)
内容包括:
- 网站公钥
- 证书颁发机构(CA)
- 有效期
- 域名
- 签名等
作用:
- 保证公钥属于目标网站
- 避免中间人伪造服务器身份
颁发流程:
企业申请证书 → CA 审核 → 生成证书 → 配置到服务器
七、HTTPS 的性能开销问题
- 首次连接耗时更高(TLS 握手 + 证书验证)
- 加解密有计算成本
- 可使用会话复用(Session Resumption)和 HTTP/2 多路复用 减少影响
八、HTTP → HTTPS 迁移常见问题
问题 | 解法 |
---|---|
HTTPS 证书要钱? | 有免费证书(Let’s Encrypt) |
会导致网站变慢? | 否,只影响首次握手,使用缓存、优化TLS配置可规避 |
所有资源都要 HTTPS? | 是,混合内容会被浏览器拦截 |
是否支持 HTTP/2? | 是,主流浏览器只有 HTTPS 才支持 HTTP/2 |
九、常见面试问法总结 ✅
面试问题 | 快速要点回答 |
---|---|
HTTP 和 HTTPS 区别? | 是否加密、端口、证书、安全性等 |
为什么 HTTPS 更安全? | SSL/TLS 加密 + 证书校验 |
HTTPS 是对称还是非对称? | 两者结合:协商密钥用非对称,传输数据用对称 |
HTTPS 的握手流程? | 客户端验证证书 → 生成对称密钥 → 加密通信 |
HTTPS 一定安全吗? | 证书可信、TLS 配置合理、安全防御措施完善才安全 |
🌐 HTTPS 建立连接与安全通信详解笔记
一、HTTPS 连接建立的两阶段
HTTPS 连接基于 SSL/TLS 协议,包含两个阶段:
1️⃣ 握手阶段(建立安全信道)
确保双方协商一个安全的 对称密钥,并验证服务器身份。
- 客户端 → 服务器:发起连接请求,包含支持的加密算法、TLS 版本等。
- 服务器 → 客户端:返回 数字证书(含公钥、公钥算法、证书颁发机构 CA 签名等信息)。
- 客户端验证证书:
- 检查是否被可信 CA 签发
- 检查域名是否匹配
- 检查是否在有效期内
- 客户端生成一个随机会话密钥(称为 Pre-Master Secret),并使用服务器公钥加密,发送给服务器。
- 服务器使用私钥解密,获得 Pre-Master Secret,并生成对称加密所用的 Session Key。
- 客户端和服务器确认加密参数一致,握手完成。
握手过程中的加密:非对称加密(RSA 或 ECDHE)
2️⃣ 数据传输阶段(使用对称加密)
- 使用刚刚协商的 Session Key 进行数据加密和完整性校验(HMAC)。
- 传输的内容如:HTTP 请求头、请求体、响应头、响应体,全部都被加密。
传输过程使用:对称加密(如 AES、ChaCha20)
二、HTTPS 会加密 URL 吗?
✅ 是的,但要分清楚:
部分 | 是否加密 | 说明 |
---|---|---|
URL 的路径和参数 | ✅ | 属于 HTTP 报文的一部分,会被 TLS 加密 |
域名(Host) | ❌ | 在 TLS 握手前就发送,明文暴露(用于 SNI) |
IP 地址 | ❌ | 由 DNS 查询获取,和 TLS 无关,明文传输 |
浏览器历史/服务器日志中的 URL | ❌ | 本地或服务器端保存,需额外保护(如脱敏) |
🔺结论:不要在 URL 参数中放敏感信息,如密码、token!
三、中间人攻击(MITM)
✅ 定义:
攻击者截获并修改客户端与服务器之间的通信,伪装成通信双方,以窃听或篡改信息。
🚨 场景:
- 公共 WiFi 热点(伪造 DNS 或网关)
- 安装了伪造 CA 的浏览器或手机
- 没有校验证书的客户端(如部分移动端)
🛡️ HTTPS 的防护措施:
- 使用由可信 CA 签发的数字证书
- 客户端必须验证证书合法性
- 若验证失败,浏览器会报“证书不可信”并阻止连接
四、HTTPS 是否可以抓包?
✅ 可以,但通信内容是加密的。
抓包工具无法直接看到明文,除非有以下条件之一:
抓包方法一:中间人方式 + 安装伪造 CA 证书
- 工具:Charles、Fiddler、Burp Suite 等
- 原理:
- 工具伪装为服务器签发伪造证书
- 客户端信任这个工具的证书(你手动安装了它的 CA)
- 工具解密客户端请求,转发真实请求
抓包方法二:导入浏览器私钥(Chrome Debug 模式)
用于调试用途,不适合实际环境。
🧨 注意:
正常的 HTTPS 是不能被抓到明文数据的,除非你控制客户端设备或证书信任链被破坏。
五、HTTPS 如何保证通信安全?
安全要素 | 实现机制 |
---|---|
机密性 | 对称加密(AES、ChaCha20) |
完整性 | 消息摘要(HMAC、SHA) |
身份认证 | 服务器证书(CA 签发) |
防重放 | TLS 内建序列号机制 |
防中间人 | 验证证书 + 加密密钥协商 |
六、握手流程总结图(简化版)
1 | Client Hello → Server Hello + 证书 |
七、常见面试问法总结
面试问题 | 简要回答 |
---|---|
HTTPS 是怎么建立连接的? | 先握手协商会话密钥(非对称),再用对称密钥加密传输 |
HTTPS 会加密 URL 吗? | 会加密路径和参数,不加密域名 |
什么是中间人攻击?HTTPS 如何防御? | 伪装通信双方窃取信息,HTTPS 通过证书防伪装 |
HTTPS 可以抓包吗? | 可以抓,但抓到的是加密数据;需信任伪造 CA 才能解密 |
HTTPS 安全机制有哪些? | 加密、校验、认证三位一体 |
HTTPS 会话密钥如何产生?是否安全? | 客户端生成,用公钥加密传输,私钥解密,确保只有服务器能获取 |
✅ HTTPS 客户端校验证书合法性
一、证书的由来:谁发的?
- 数字证书(Certificate) 是由受信任的 CA(Certificate Authority)证书颁发机构 签发。
- CA 的角色就像网络世界的“公安局”:
- 对申请者(如网站)的身份信息进行验证;
- 使用自己的 私钥 签发证书;
- 保证该证书的真实性、不可伪造性。
二、数字证书的内容(结构)
一个完整的数字证书一般包含如下内容:
字段 | 含义 |
---|---|
公钥 | 网站的公钥,用于加密客户端传过来的随机密钥 |
持有者信息 | 网站名称、域名、公司等 |
有效期 | 证书的开始时间和结束时间 |
颁发机构(Issuer) | 谁签发的,CA 名称 |
用途 | 证书用途,比如用于服务器身份认证、加密等 |
签名算法 | 如 SHA256WithRSA |
签名(Signature) | 用 CA 的私钥加密后的摘要,验证证书是否被篡改 |
三、CA 是如何签发证书的?
签发过程本质是生成并签名证书数据:
- CA 收到申请者(网站)的公钥等信息。
- 将这些信息(公钥、持有者、用途、有效期、颁发者)打包并
做哈希,得到一个摘要
Hash(H1)
。 - 用 CA 自己的私钥 对摘要加密,得到
Signature
(签名)。 - 最终形成一个完整的证书,交给申请者使用。
四、客户端如何验证服务器证书?
浏览器或操作系统会内置多个 受信任 CA 的公钥(称为根证书列表),验证过程如下:
✅ 校验证书合法性的完整步骤:
- 读取证书信息
- 浏览器收到服务器的证书,提取出其中的域名、颁发者、有效期、公钥、签名等字段。
- 检查域名是否匹配
- 客户端检查证书中的
CN/Common Name
或SAN
字段是否与当前访问的网站域名一致。
- 客户端检查证书中的
- 检查证书是否过期
- 校验当前时间是否在
notBefore
和notAfter
有效期之间。
- 校验当前时间是否在
- 查找颁发者 CA 是否受信任
- 在系统或浏览器的内置 CA 列表中查找是否包含该颁发者的 公钥。
- 校验签名是否匹配
- 用找到的 CA 公钥解密证书中的签名
Signature
,得到Hash(H2)
- 对证书的实际内容(除签名外)再次做哈希,得到
Hash(H1)
- 比较 H1 和 H2 是否一致:
- 如果一致 → 证书未被篡改,合法 ✅
- 如果不一致 → 签名被伪造或内容被篡改 ❌
- 用找到的 CA 公钥解密证书中的签名
🔐 图示说明(简化):
1 | 浏览器校验证书: |
五、为什么中间人不能伪造证书?
即使攻击者(中间人)伪造了证书内容:
- 他无法伪造签名,因为没有 CA 的私钥
- 浏览器在校验签名时一定会失败,提示“此证书不可信”、“连接不安全”
六、客户端验证举例(以 Chrome 浏览器为例)
Chrome 访问一个 HTTPS 网站时会自动执行上述验证流程:
- 收到证书
- 校验域名与站点一致性
- 校验有效期
- 校验签名是否由受信任 CA 签发
- 成功后显示“锁”图标,连接建立
如果失败,用户会看到如下警告页面:
1 | 您的连接不是私密连接 (Your connection is not private) |
七、常见面试总结
问题 | 答案简要 |
---|---|
客户端如何校验证书合法性? | 校验域名、时间、是否由受信 CA 签发、签名是否匹配 |
数字证书中最关键的部分是? | 公钥 + 签名(由 CA 私钥生成) |
签名是如何生成和验证的? | 对内容做 hash → 私钥加密(签名) → 公钥解密验证 |
中间人能伪造证书吗?为什么不能? | 不能。因为没有 CA 的私钥,无法生成合法签名 |
浏览器是如何识别“可信 CA”? | 浏览器/操作系统预置了多个受信任 CA 公钥(根证书) |
如果 CA 被攻破了,怎么办? | 浏览器或操作系统会更新根证书列表,吊销失效证书 |
✅ HTTP 是无状态协议
一、什么叫“无状态”?
定义: HTTP 协议是无状态(stateless)的,意思是:
每一个请求都是完全独立的,服务器在处理当前请求时不会记住这个客户端曾经发送过什么请求。
二、形象比喻理解
就像你去快餐店点餐:
- 每来一个人都重新点餐;
- 服务员不记得你上次来吃过什么;
- 你每次都得说清楚你是谁、你要点什么;
三、无状态的表现
特性 | 描述 |
---|---|
请求独立 | 每个请求都包含了服务器所需的完整信息,与之前请求无关联 |
不记录历史 | 服务器不会保存用户的登录状态、操作记录、上一个请求的上下文等 |
简单高效 | 实现简单,占用资源少,服务器处理一个请求后即可释放所有资源 |
不便于状态管理 | 比如购物车、登录状态、访问记录都不会自动保存,需要额外机制处理 |
四、无状态的影响
由于 HTTP 无状态,所以你会发现:
- 用户登录后页面跳转就“忘了登录”,需要“重新验证”。
- 网站购物车、浏览记录等都不能自动保存。
- 不能在服务器中轻松识别“这个请求来自哪个用户”。
五、怎么弥补无状态的缺陷?(状态保持机制)
✅ 1. Cookie(客户端保存)
- 浏览器保存服务端发送的
Set-Cookie
信息; - 后续每次请求自动携带这个 Cookie;
- 可以包含登录凭证、用户 ID、语言偏好等。
特点:
- 状态保存在客户端;
- 服务器仍然是无状态的,但通过 Cookie 识别用户;
- 存在安全风险(可能被伪造、窃取)。
✅ 2. Session(服务端保存)
- 登录时服务器生成一个Session ID;
- 把这个 ID 存到客户端的 Cookie;
- 服务器维护一个映射表
SessionID → 用户数据
。
特点:
- 状态保存在服务器;
- 用户每次请求通过 Session ID 找回状态;
- 更安全,但服务器压力较大。
✅ 3. Token(如 JWT)
- 登录成功后服务器生成一个加密的 Token;
- 客户端保存在 Cookie 或 LocalStorage 中;
- 每次请求携带 Token,服务器解析后获取状态。
特点:
- 状态数据由客户端保存;
- 服务器无需记录状态信息(“真正的无状态认证”);
- 适用于分布式系统、移动端等。
六、表格总结三种状态保持机制对比
特性 | Cookie | Session | Token(JWT) |
---|---|---|---|
状态存储位置 | 客户端 | 服务器 | 客户端 |
安全性 | 较低(易被盗用) | 较高(存于服务端) | 较高(有加密签名) |
跨服务支持 | 差 | 差(难以共享 Session) | 好(可跨域跨服务验证) |
扩展性 | 一般 | 差(内存或集中式存储) | 好(分布式友好) |
七、常见面试题总结
问题 | 答案简要 |
---|---|
HTTP 是无状态协议是什么意思? | 每个请求都是独立的,服务器不会保存客户端的请求状态 |
为什么 HTTP 设计成无状态? | 简单、高效、易扩展,但需要额外机制保存状态 |
无状态协议下如何记录用户状态? | 使用 Cookie、Session 或 Token |
Cookie 和 Session 的区别? | Cookie 保存在客户端,Session 保存在服务器 |
Token 比 Session 的优势? | 支持分布式、不需要服务器记录状态,更适合微服务架构 |
✅ Session 与 Cookie 的联系与区别
一、概念简介
Cookie:
- 定义:Cookie 是存储在客户端浏览器中的一小块文本数据,主要用于保存用户信息及状态。
- 存储位置:客户端浏览器。
- 工作原理:服务端向客户端发送 Cookie,客户端在后续请求中携带该 Cookie 回服务器,服务器根据 Cookie 来识别用户状态。
Session:
- 定义:Session 是指服务器与客户端之间的会话过程。服务器用来存储用户状态的数据(如用户登录信息)。
- 存储位置:服务器端。
- 工作原理:客户端发起请求时,服务器生成一个 Session,将用户状态保存在服务器上,并将 Session 的唯一标识(SessionID)发送给客户端。客户端之后每次请求都会携带这个标识,服务器通过 SessionID 来查找对应的用户状态。
二、Cookie 与 Session 的区别
特性 | Cookie | Session |
---|---|---|
存储位置 | 存储在客户端浏览器中 | 存储在服务器端 |
存储内容 | 只能保存简单的 ASCII 数据 | 可以存储任意数据类型(如对象、数组等) |
有效期 | 可设置较长有效期,长期保存 | 一般较短,客户端关闭或超时即失效 |
隐私安全性 | 存储在客户端,容易被篡改或窃取 | 存储在服务器,安全性较高 |
存储大小 | 单个 Cookie 的大小限制为 4K | 存储容量更大,受限于服务器资源 |
使用场景 | 客户端需要长期保存用户信息,如记住用户名、密码等 | 适用于短期的会话数据,如登录状态、购物车信息等 |
传输方式 | 每次请求都会自动携带至服务器 | 需要 SessionID 作为标识,在请求中传递 |
三、Cookie 与 Session 的联系
- SessionID 存储在 Cookie 中:
- 在用户第一次访问服务器时,服务器会为其生成一个 Session 并分配一个唯一的 SessionID;
- 服务器将 SessionID 返回给客户端,浏览器将其存储在 Cookie 中;
- 在之后的请求中,客户端会携带 Cookie(包含 SessionID),服务器通过该 SessionID 找到对应的 Session,识别用户状态。
四、Session 与 Cookie 的结合应用
常规流程:
- 用户第一次请求: 服务器为用户生成 Session,并生成一个 SessionID; 服务器将该 SessionID 存储到 Cookie 中并返回给客户端。
- 用户第二次请求: 客户端发送请求时自动携带 Cookie,服务器从中提取 SessionID; 服务器根据 SessionID 获取存储在服务器上的 Session 数据,从而识别用户身份。
五、分布式环境下的 Session 处理
问题:
- 在分布式架构下,负载均衡可能导致请求被路由到不同的服务器。如果不同服务器之间的 Session 数据不共享,可能会导致用户状态丢失或无法识别。
解决方案:
- 使用 Redis 或其他分布式缓存:
- 通过 Redis 等缓存系统存储 Session 数据,在多台服务器间共享用户状态。
- 基于 Cookie 的 SessionID:
- 在各服务器之间保持一致的 SessionID 标识,让所有服务器都能访问同一份 Session 数据。
六、客户端无法使用 Cookie 时的解决方法
有时候,客户端可能禁用了 Cookie(如浏览器禁用、移动客户端等),此时需要另一种方法来存储和传递 SessionID。
解决方案:
- 使用
sessionStorage
:- 将 SessionID 存储在浏览器的
sessionStorage
中(仅在当前浏览器会话中有效)。
- 将 SessionID 存储在浏览器的
- 将 SessionID 放入 URL:
- 直接将 SessionID 作为 URL
请求参数,随请求一起发送(例如:
https://example.com?sessionid=xxxx
)。
- 直接将 SessionID 作为 URL
请求参数,随请求一起发送(例如:
- 将 SessionID 放入 HTTP 请求头:
- 将 SessionID 放在请求的
Authorization
或自定义请求头中(例如:Authorization: Bearer xxxx
)。
- 将 SessionID 放在请求的
七、总结
特性 | Cookie | Session |
---|---|---|
存储位置 | 客户端(浏览器) | 服务器 |
数据类型 | ASCII 文本数据 | 任意数据类型 |
有效期 | 可设置长时间 | 短期有效(会话结束即失效) |
安全性 | 较低(容易被盗取) | 较高(存储在服务器) |
存储大小限制 | 4KB 左右 | 更大存储空间 |
适用场景 | 长期存储数据(记住我、偏好设置等) | 临时存储数据(登录状态、购物车等) |