文章目录
- 一、HTTP协议
-
- 2.HTTP请求报文
-
- [2.1. 请求方法](#2.1. 请求方法)
- [2.2. URL有哪些组成部分](#2.2. URL有哪些组成部分)
- [2.3. 请求头](#2.3. 请求头)
- 3.HTTP响应报文
-
- [3.1. 常见响应头](#3.1. 常见响应头)
- [3.2. 响应码](#3.2. 响应码)
- [4.HTTP1.0 、 HTTP1.1、HTTP2.0、HTTP3.0](#4.HTTP1.0 、 HTTP1.1、HTTP2.0、HTTP3.0)
- [5.当在浏览器中输入 Google.com 并且按下回车之后发生了什么?](#5.当在浏览器中输入 Google.com 并且按下回车之后发生了什么?)
- 二、HTTPS协议
-
- 1.HTTP和HTTPS协议的区别(网络歇息)
- [2. TLS/SSL的工作原理](#2. TLS/SSL的工作原理)
- [3. HTTPS是如何保证安全的?](#3. HTTPS是如何保证安全的?)
- 三、DNS协议介绍
-
- [1. DNS 协议是什么](#1. DNS 协议是什么)
- [2. TCP和UDP的区别](#2. TCP和UDP的区别)
- 四、WebSocket
-
- [1. WebSocket 如何建立连接?](#1. WebSocket 如何建立连接?)
- 2、http和WebSocket区别
一、HTTP协议
2.HTTP请求报文
HTTP 请求报文组成
- 请求行: 包含请求方法、请求的URL以及HTTP协议版本 。如
GET /index.html HTTP/1.1。 - 请求头部: 请求头部由多个键值对组成 。用于描述客户端环境、请求正文长度、期望响应格式等信息。常见的请求头 包括
Host、User-Agent、Accept、Accept-Language、Connection等。 - 空行: 请求头部和请求体之间必须有一个空行,表示请求头部结束。
- 请求包体: 请求体用于携带客户端提交的数据 ,如表单数据、文件等。通常在
POST、PUT等请求中使用。
2.1. 请求方法
- get:用于获取资源 。参数 通过URL查询字符串传递 (如
?id=123),不包含请求体 。- 适用场景:加载网页、获取数据列表、搜索接口。
- 注意 :不适合传输敏感或大量数据,因参数暴露在URL中且受长度限制 。
- post: 用于提交数据 。数据放在请求体中 。
- 适用场景:用户注册、登录、文件上传、表单提交 。
- 与GET对比 :POST更私密、可携带更多数据,但不可被缓存。
- put:用于替换或更新 整个资源。客户端需提供完整的资源表示,若资源不存在则可能创建。
- 适用场景:更新用户全部信息(如PUT /api/users/123)。
- 特点:幂等操作(多次执行结果一致)。
- delete:用于删除 指定资源。成功响应通常返回204 No Content。
- 适用场景:移除用户、删除文章 。
- 实际实现可能是"软删除"(标记为删除而非物理移除)。
- head:与GET类似,但只返回响应头,不返回响应体 。
- 适用场景:检查资源是否存在、获取文件大小或最后修改时间,节省带宽 。
- patch:用于对资源进行局部更新 ,仅修改部分字段 ,而非整体替换。
- 适用场景:修改用户昵称而不更新其他信息 。
- 对比PUT:PUT要求完整资源,PATCH更灵活高效。
2.2. URL有哪些组成部分
如:https://www.example.com:8080/path/to/resource?param1=value1¶m2=value2#section1
省略版https://www.baidu.com(浏览器会自动补全默认值)
- 协议: 指定访问资源所使用的通信协议 ,如
http、https(通过安全加密的方式传输数据,常用)、ftp等。 - 主机名: 标识资源所在的服务器 ,可以是域名 (如 www.example.com)或IP地址。 域名 便于记忆,实际访问时会通过DNS解析为IP地址。
- 端口: 指定服务器上监听的服务端口号 ,是可选项。
http默认使用80端口 ,https默认使用443端口,若使用默认端口则通常省略 - 路径: 表示资源在服务器上的具体位置,以斜杠 / 分隔层级
- 查询参数: 用于向服务器传递额外信息 ,以
?开始,多个参数用&分隔(get请求)。 - 片段标识: 以
#开头,用于定位页面内的某个锚点,不会发送到服务器。
2.3. 请求头
HTTP请求头 是客户端向服务器发送请求时附带的元数据信息,用于描述客户端环境、请求偏好和资源处理方式。
常见字段
Host(必需): 指定目标服务器的域名和端口 ,是HTTP/1.1 中唯一强制要求的请求头 。User-Agent(UA): 标识客户端类型、操作系统和浏览器版本 。服务器据此返回适配的页面(如PC端或移动端)Accept: 声明客户端可接受的内容类型 (MIME类型),如text/html、application/json(优先接收JSON格式响应) 。Content-Type: 在POST或PUT请求 中,说明请求体的数据格式 。常见值:application/json、multipart/form-data(文件上传)-
Cookie:包含服务器先前设置的会话信息,用于维持登录状态等 。 Expires:强缓存-
Cache-Control:指令缓存机制是否存储响应或重新验证 ,强缓存。如no-cache强制重新获取 。 Connection:控制连接行为 ,keep-alive表示希望复用TCP连接以提升性能 。
3.HTTP响应报文
3.1. 常见响应头
- Date :表示消息发送的时间,时间的描述格式由rfc822定义
- server:服务器名称
- Connection :浏览器与服务器之间连接的类型
- Cache-Control :控制HTTP缓存
- content-type :表示后面的文档属于什么MIME类型
3.2. 响应码
- 1xx(信息): 请求已接收,继续处理
- 2xx(成功): 请求成功处理
- 200 :最常见成功状态,表示请求已正常返回数据。
- 204 :请求成功但无内容返回 ,常用于DELETE操作
- 3xx(重定向):
- 301 :永久重定向,搜索引擎会更新索引并跳转新地址。
- 302 :临时重定向,原资源仍在,仅临时更换位置。
- 4xx(客户端错误):
- 400 :请求语法错误 ,如参数格式不正确。
- 401 :未提供有效认证信息,需登录或重新鉴权。
- 403 :服务器拒绝访问,即使已登录也可能因权限不足被拒。
- 404 :请求资源不存在 ,可能是URL拼写错误或页面已删除。
- 5xx(服务器错误):
- 500 :服务器内部错误 ,如代码异常或配置错误。
4.HTTP1.0 、 HTTP1.1、HTTP2.0、HTTP3.0
| 维度 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 | HTTP/3.0 |
|---|---|---|---|---|
| 连接方式 | 短连接 | 长连接 | 多路复用 | QUIC 流式连接 |
| 数据格式 | 纯文本 | 纯文本 | 二进制分帧 | 二进制帧(QUIC) |
| 并发能力 | 串行 | 管道化(有限) | 并行多路复用 | 真正并行独立流 |
| 头部处理 | 无压缩 | 无压缩 | HPACK 压缩 | HPACK 压缩 |
| 安全性 | 可选 | 可选 | 推荐 TLS | 强制加密(TLS 1.3) |
| 队头阻塞 | 应用层严重 | 应用层部分缓解 | 解决应用层 | 彻底解决 |
| 适用场景 | 早期静态网页 | 主流 Web 应用 | 高性能网站、API | 移动端、弱网环境 |
演进方向
| 维度 | 演进方向 |
|---|---|
| 连接方式 | 短连 → 长连 → 多路复用 → 独立流 |
| 传输协议 | TCP → TCP → TCP → QUIC (UDP) |
| 数据格式 | 文本 → 文本 → 二进制帧 → 二进制帧 |
| 性能焦点 | 基础通信 → 复用 → 并发 → 抗丢包 & 低延迟 |
| 安全 | 可选 → 可选 → 推荐 → 强制加密 |
5.当在浏览器中输入 Google.com 并且按下回车之后发生了什么?
核心流程可概括为:DNS解析 → 建立TCP连接 → SSL/TLS加密协商(HTTPS)→ 发送HTTP请求 → 服务器响应 → 浏览器解析与渲染页面 。
- URL 解析与自动补全: 你输入的 google.com 会被浏览器识别为不完整的 URL 。浏览器会自动补全协议和主机名 ,通常转换为 https://www.google.com,并默认使用 HTTPS 协议(端口 443)。
- DNS 解析(域名 → IP 地址): 浏览器首先检查本地缓存是否有 google.com 对应的 IP 地址 。若无 ,则向本地 DNS 服务器发起查询请求 ,通过递归和迭代查询 ,最终从权威 DNS 服务器获取目标 IP 地址 。谷歌在全球部署多个服务器,DNS 可能返回离你最近的 IP 地址以优化访问速度 。
- 建立 TCP 连接(三次握手): 获取 IP 地址后,浏览器通过 TCP 协议与服务器建立连接 。这个过程包括"三次握手 ":客户端发送 SYN报文 (我想连接);服务器回应 SYN-ACK报文 (我也想连接);客户端再发送 ACK报文,确认连接建立(好,连上了) 。
- TLS/SSL 加密握手(如使用 HTTPS): 由于现代网站普遍启用 HTTPS ,浏览器会与服务器进行 TLS 握手,协商加密算法、交换密钥,确保后续通信安全 。
- 发送 HTTP 请求并接收响应: 连接建立后,浏览器向服务器发送 HTTP GET 请求 。服务器处理请求后 ,返回 HTML 页面内容,可能附带 CSS、JavaScript、图片等资源文件 。
- 浏览器解析与页面渲染: 浏览器接收到 HTML 后 ,开始解析文档结构,构建 DOM 树,结合 CSS 构建渲染树,并执行 JavaScript,最终将页面呈现给你 。
- 连接关闭(四次挥手):数据传输完成后 ,TCP 连接通过"四次挥手"正常关闭,释放资源 ,这个过程:客户端发送 FIN 报文 (我发完了);服务器收到后,发送一个 ACK 报文 (回复收到);服务器处理完剩余数据后,发送 FIN 报文 (我也发完了);客户端收到后,发送 ACK 报文(服务器收到后进入 CLOSED 状态;客户端等待 2MSL 后也进入 CLOSED 状态) (拜拜)。
** 三次握手为什么不是两次?**
防止历史连接请求突然到达造成资源浪费,第三次确认可确保双方收发能力正常 。
二、HTTPS协议
1.HTTP和HTTPS协议的区别(网络歇息)
| 对比维度 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输,超文本传输协议 | 加密传输,具有安全性的SSL加密传输协议 |
| 加密机制 | 无加密 | 使用 SSL/TLS 协议进行加密 |
| 默认端口 | 80 | 443 |
| 证书要求 | 不需要证书 | 需要由CA颁发的SSL/TLS证书 |
| 连接方式 | 无状态、简单连接 | 建立前需完成TLS握手,验证身份 |
2. TLS/SSL的工作原理
TLS/SSL 是在 TCP 和应用层之间添加的安全协议层,通过"握手协商 + 加密通信"保障数据的机密性、真实性、完整性。
3. HTTPS是如何保证安全的?
HTTPS通过TLS/SSL协议构建"身份认证---密钥协商---对称加密---完整性校验"的全链路安全机制,从根本上解决数据窃听、篡改与伪造三大风险。
三、DNS协议介绍
1. DNS 协议是什么
将域名解析为IP地址 。客户端 向DNS服务器(DNS服务器有自己的IP地址)发送域名查询请求 ,DNS服务器告知 客户机Web服务器的 IP 地址。
2. TCP和UDP的区别
若你追求数据不丢不错,选 TCP;若你追求速度与实时性,能容忍少量丢包,选 UDP。(TCP求稳不求快,UDP求快不求全)
| 对比维度 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 连接方式 | 面向连接 ,传输前需三次握手 建立连接,结束后四次挥手断开 | 无连接 ,无需建立连接,直接发送数据报 |
| 可靠性 | 可靠传输 | 不可靠传输 ,不保证数据到达,可能丢包、乱序、重复 |
| 传输效率 | 较低 | 高效率 |
| 数据传输形式 | 面向字节流 | 面向数据报 |
| 头部开销 | 20-60字节, | 固定8字节 |
| 适用场景 | 网页浏览(HTTP/HTTPS)、文件传输(FTP)、邮件等 | 视频会议、直播、在线游戏、DNS查询、IoT实时上报等 |
| 支持通信模式 | 仅 点对点(一对一) | 支持 一对一、一对多、多对一、多对多 |
四、WebSocket
WebSocket = "一次握手,永久连接,双向通话"。
定义 :一种基于 TCP 的全双工通信协议 ,允许客户端与服务器在单个长连接上双向实时交换数据。
协议标识:
ws://:明文传输 ,适用于开发环境wss://:加密传输 (基于 TLS),生产环境必须使用
1. WebSocket 如何建立连接?
通过 HTTP Upgrade 请求完成握手,服务器返回 101 状态码
2、http和WebSocket区别
总结: HTTP 是"你问一次,我答一次";WebSocket 是"我们一直连着,随时都能说话"。
| 对比维度 | HTTP | WebSocket |
|---|---|---|
| 通信模式 | 单向:请求-响应 | 双向全双工,任意一方可主动发消息 |
| 连接状态 | 无状态、短连接(默认) | 有状态、长连接,连接持久保持 |
| 实时性 | 差,依赖轮询 | 强,消息即时推送 |
| 服务器主动性 | ❌ 无法主动推送 | ✅ 可主动向客户端推送数据 |
| 协议标识 | http:// 或 https:// | ws:// 或 wss://(安全版) |
| 适用场景 | 页面加载、表单提交等一次性请求 | 聊天、游戏、股票行情、实时协作等 |
具体使用
javascript
// 1. 创建连接
const socket = new WebSocket('wss://example.com/socket');
// 2. 监听事件
socket.onopen = function(event) {
console.log('连接已建立');
socket.send('Hello Server!');
};
socket.onmessage = function(event) {
console.log('收到消息:', event.data);
};
socket.onerror = function(event) {
console.error('发生错误:', event);
};
socket.onclose = function(event) {
console.log('连接关闭:', event.code, event.reason);
};
// 3. 发送与关闭
socket.send('发送数据');
socket.close(); // 可选参数: code, reason