第19天:HTTP协议基础
今日目标
- 理解HTTP协议的工作原理
- 掌握HTTP请求和响应格式
- 学习HTTP方法和状态码
- 了解HTTP头部字段
- 理解Cookie和Session机制
- 学习HTTP版本演进
- 实现简单的HTTP服务器
1. HTTP协议概述
1.1 什么是HTTP?
HTTP(HyperText Transfer Protocol):
HTTP = 超文本传输协议
生活类比:
HTTP就像邮寄系统:
1. 你写信(HTTP请求)
2. 邮递员送信(网络传输)
3. 收信人回复(HTTP响应)
4. 邮递员送回回信(网络传输)
特点:
- 文本协议(可读性强)
- 无状态(每次请求独立)
- 客户端-服务器模型
- 基于TCP(可靠传输)
HTTP的位置:
应用层协议栈:
┌────────────────────────────┐
│ 应用程序(浏览器、APP) │
├────────────────────────────┤
│ HTTP(应用层协议) │
├────────────────────────────┤
│ TCP(传输层协议) │
├────────────────────────────┤
│ IP(网络层协议) │
├────────────────────────────┤
│ 物理层 │
└────────────────────────────┘
1.2 HTTP工作流程
基本流程:
客户端(浏览器) 服务器
1. DNS解析
www.example.com → 93.184.216.34
2. 建立TCP连接
─────────────────────────>
三次握手
<─────────────────────────
3. 发送HTTP请求
GET /index.html HTTP/1.1
Host: www.example.com
─────────────────────────>
4. 服务器处理请求
- 解析请求
- 查找资源
- 生成响应
5. 返回HTTP响应
<─────────────────────────
HTTP/1.1 200 OK
Content-Type: text/html
<html>...</html>
6. 关闭连接(HTTP/1.0)
或保持连接(HTTP/1.1)
详细步骤:
1. 用户输入URL:http://www.example.com/index.html
2. 浏览器解析URL:
- 协议:http
- 主机:www.example.com
- 端口:80(默认)
- 路径:/index.html
3. DNS查询:
- 查询www.example.com的IP地址
- 得到:93.184.216.34
4. 建立TCP连接:
- 连接到 93.184.216.34:80
- 三次握手
5. 发送HTTP请求:
- 请求行:GET /index.html HTTP/1.1
- 请求头:Host, User-Agent等
- 空行
- 请求体(如果有)
6. 服务器处理:
- 解析请求
- 找到/index.html文件
- 读取文件内容
7. 发送HTTP响应:
- 状态行:HTTP/1.1 200 OK
- 响应头:Content-Type, Content-Length等
- 空行
- 响应体(HTML内容)
8. 浏览器渲染:
- 解析HTML
- 加载CSS、JavaScript、图片等
- 渲染页面
1.3 HTTP特点
无状态(Stateless):
特点:
服务器不会记住之前的请求
生活类比:
你每次去银行取钱,柜员都不认识你
每次都要重新验证身份
问题:
- 无法识别用户
- 无法保持登录状态
解决方案:
- Cookie
- Session
- Token
明文传输:
优点:
✅ 易于调试
✅ 中间设备可以缓存
✅ 简单直观
缺点:
❌ 不安全(可被窃听)
❌ 敏感信息暴露
解决方案:
使用HTTPS(HTTP + TLS/SSL)
请求-响应模式:
特点:
- 客户端主动发起请求
- 服务器被动响应
- 一个请求对应一个响应
限制:
- 服务器无法主动推送
- 实时性较差
解决方案:
- 长轮询(Long Polling)
- WebSocket
- Server-Sent Events (SSE)
2. HTTP请求格式
2.1 请求格式概览
完整的HTTP请求:
GET /index.html HTTP/1.1 ← 请求行
Host: www.example.com ← 请求头
User-Agent: Mozilla/5.0 ← 请求头
Accept: text/html ← 请求头
Connection: keep-alive ← 请求头
← 空行(CRLF)
[请求体,如果有的话] ← 请求体
结构:
┌────────────────────────────────┐
│ 请求行(Request Line) │
├────────────────────────────────┤
│ 请求头(Request Headers) │
│ ... │
├────────────────────────────────┤
│ 空行(CRLF) │
├────────────────────────────────┤
│ 请求体(Request Body) │
│ (可选,GET请求通常没有) │
└────────────────────────────────┘
2.2 请求行
格式:
方法 URI HTTP版本
示例:
GET /index.html HTTP/1.1
POST /api/login HTTP/1.1
PUT /api/users/123 HTTP/1.1
组成部分:
1. 方法(Method)
- GET:获取资源
- POST:提交数据
- PUT:更新资源
- DELETE:删除资源
- HEAD:获取头部
- OPTIONS:查询支持的方法
- TRACE:追踪请求
- CONNECT:建立隧道
2. URI(统一资源标识符)
- 路径:/index.html
- 查询参数:?name=Alice&age=20
- 片段:#section1(不发送到服务器)
3. HTTP版本
- HTTP/1.0:早期版本
- HTTP/1.1:当前主流
- HTTP/2:二进制协议
- HTTP/3:基于QUIC
2.3 请求头
常用请求头:
Host: www.example.com
- 指定服务器域名(必需)
- HTTP/1.1要求必须有
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
- 客户端信息(浏览器、操作系统)
Accept: text/html,application/json
- 客户端可接受的内容类型
Accept-Encoding: gzip, deflate, br
- 客户端支持的压缩格式
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
- 客户端首选语言
Connection: keep-alive
- 连接管理
- keep-alive:保持连接
- close:关闭连接
Content-Type: application/json
- 请求体的MIME类型
Content-Length: 123
- 请求体的长度(字节)
Cookie: session_id=abc123; user=Alice
- 发送Cookie给服务器
Authorization: Bearer eyJhbGc...
- 身份认证信息
Referer: https://www.google.com/
- 来源页面(从哪个页面跳转)
Cache-Control: no-cache
- 缓存控制
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
- 条件请求(只在修改后才返回)
2.4 请求体
何时有请求体:
有请求体的方法:
- POST:提交表单、上传文件
- PUT:更新资源
- PATCH:部分更新
没有请求体的方法:
- GET:通过URL传参
- DELETE:通常不需要
- HEAD:只要头部
常见Content-Type:
1. application/x-www-form-urlencoded(表单默认)
Content-Type: application/x-www-form-urlencoded
请求体:
name=Alice&age=20&email=alice@example.com
2. application/json(API常用)
Content-Type: application/json
请求体:
{
"name": "Alice",
"age": 20,
"email": "alice@example.com"
}
3. multipart/form-data(文件上传)
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
请求体:
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="photo.jpg"
Content-Type: image/jpeg
[二进制文件内容]
------WebKitFormBoundary--
4. text/plain(纯文本)
Content-Type: text/plain
请求体:
Hello, this is plain text.
5. application/xml(XML数据)
Content-Type: application/xml
请求体:
<?xml version="1.0"?>
<user>
<name>Alice</name>
<age>20</age>
</user>
3. HTTP响应格式
3.1 响应格式概览
完整的HTTP响应:
HTTP/1.1 200 OK ← 状态行
Content-Type: text/html ← 响应头
Content-Length: 1234 ← 响应头
Date: Mon, 15 Jan 2024 10:00:00 GMT ← 响应头
Server: nginx/1.18.0 ← 响应头
← 空行(CRLF)
<html> ← 响应体
<body>Hello World</body>
</html>
结构:
┌────────────────────────────────┐
│ 状态行(Status Line) │
├────────────────────────────────┤
│ 响应头(Response Headers) │
│ ... │
├────────────────────────────────┤
│ 空行(CRLF) │
├────────────────────────────────┤
│ 响应体(Response Body) │
└────────────────────────────────┘
3.2 状态行
格式:
HTTP版本 状态码 状态描述
示例:
HTTP/1.1 200 OK
HTTP/1.1 404 Not Found
HTTP/1.1 500 Internal Server Error
3.3 状态码
状态码分类:
┌─────────┬──────────────────┬────────────────────┐
│ 类别 │ 范围 │ 含义 │
├─────────┼──────────────────┼────────────────────┤
│ 1xx │ 100-199 │ 信息性响应 │
│ 2xx │ 200-299 │ 成功 │
│ 3xx │ 300-399 │ 重定向 │
│ 4xx │ 400-499 │ 客户端错误 │
│ 5xx │ 500-599 │ 服务器错误 │
└─────────┴──────────────────┴────────────────────┘
1xx 信息性响应:
100 Continue
- 客户端应继续发送请求体
- 用于大文件上传前的确认
101 Switching Protocols
- 切换协议(如WebSocket升级)
2xx 成功:
200 OK
- 请求成功
- 最常见的成功状态码
201 Created
- 资源已创建
- 常用于POST请求创建新资源
202 Accepted
- 请求已接受,但处理未完成
- 用于异步处理
204 No Content
- 成功,但无内容返回
- 常用于DELETE请求
206 Partial Content
- 部分内容
- 用于断点续传
3xx 重定向:
301 Moved Permanently
- 永久重定向
- 搜索引擎会更新索引
- 示例:http → https
302 Found(临时重定向)
- 临时重定向
- 原URL仍然有效
303 See Other
- 查看其他位置
- POST请求后重定向到GET
304 Not Modified
- 资源未修改
- 可使用缓存
307 Temporary Redirect
- 临时重定向(保持请求方法)
308 Permanent Redirect
- 永久重定向(保持请求方法)
4xx 客户端错误:
400 Bad Request
- 请求格式错误
- 参数错误
401 Unauthorized
- 未认证
- 需要登录
403 Forbidden
- 禁止访问
- 已认证但无权限
404 Not Found
- 资源不存在
- 最常见的错误
405 Method Not Allowed
- 不支持的HTTP方法
408 Request Timeout
- 请求超时
409 Conflict
- 资源冲突
- 如重复创建
413 Payload Too Large
- 请求体过大
414 URI Too Long
- URL过长
415 Unsupported Media Type
- 不支持的Content-Type
429 Too Many Requests
- 请求过于频繁
- 限流
5xx 服务器错误:
500 Internal Server Error
- 服务器内部错误
- 最常见的服务器错误
501 Not Implemented
- 功能未实现
502 Bad Gateway
- 网关错误
- 上游服务器返回无效响应
503 Service Unavailable
- 服务不可用
- 服务器过载或维护
504 Gateway Timeout
- 网关超时
- 上游服务器超时
505 HTTP Version Not Supported
- HTTP版本不支持
3.4 响应头
常用响应头:
Content-Type: text/html; charset=utf-8
- 响应体的MIME类型
Content-Length: 1234
- 响应体的长度(字节)
Content-Encoding: gzip
- 响应体的压缩方式
Date: Mon, 15 Jan 2024 10:00:00 GMT
- 响应时间
Server: nginx/1.18.0
- 服务器软件信息
Set-Cookie: session_id=abc123; Path=/; HttpOnly
- 设置Cookie
Location: https://www.example.com/new-url
- 重定向目标URL
Cache-Control: max-age=3600
- 缓存控制
Expires: Wed, 21 Oct 2025 07:28:00 GMT
- 过期时间
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
- 资源版本标识
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
- 最后修改时间
Access-Control-Allow-Origin: *
- CORS跨域控制
Connection: keep-alive
- 连接管理
Transfer-Encoding: chunked
- 分块传输编码
Vary: Accept-Encoding
- 缓存变化因素
3.5 响应体
常见Content-Type:
text/html - HTML页面
text/plain - 纯文本
text/css - CSS样式表
text/javascript - JavaScript代码
application/json - JSON数据
application/xml - XML数据
application/pdf - PDF文件
application/zip - ZIP压缩包
application/octet-stream - 二进制流(下载)
image/jpeg - JPEG图片
image/png - PNG图片
image/gif - GIF图片
image/svg+xml - SVG矢量图
video/mp4 - MP4视频
audio/mpeg - MP3音频
4. HTTP方法详解
4.1 GET方法
作用:
获取资源(只读)
特点:
- 参数在URL中(查询字符串)
- 可缓存
- 可添加书签
- 幂等性(多次请求结果相同)
- 安全性(不修改服务器状态)
示例:
GET /api/users?id=123&name=Alice HTTP/1.1
Host: api.example.com
使用场景:
- 获取网页
- 查询数据
- 下载文件
- API查询
4.2 POST方法
作用:
提交数据(创建资源)
特点:
- 参数在请求体中
- 不可缓存
- 不可添加书签
- 非幂等(多次请求可能产生不同结果)
- 非安全(会修改服务器状态)
示例:
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
使用场景:
- 提交表单
- 上传文件
- 创建资源
- API提交
4.3 PUT方法
作用:
更新资源(完整更新)
特点:
- 幂等(多次请求结果相同)
- 替换整个资源
示例:
PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"id": 123,
"name": "Alice Updated",
"email": "alice@example.com"
}
使用场景:
- 完整更新资源
- 替换文件
4.4 DELETE方法
作用:
删除资源
特点:
- 幂等(多次删除同一资源结果相同)
示例:
DELETE /api/users/123 HTTP/1.1
Host: api.example.com
使用场景:
- 删除用户
- 删除文件
- 注销账号
4.5 PATCH方法
作用:
部分更新资源
特点:
- 只更新部分字段
- 比PUT更节省带宽
示例:
PATCH /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Alice Updated"
}
使用场景:
- 只更新某些字段
- 修改配置
4.6 HEAD方法
作用:
获取资源头部信息
特点:
- 不返回响应体
- 用于检查资源是否存在
- 用于获取元数据
示例:
HEAD /api/users/123 HTTP/1.1
Host: api.example.com
使用场景:
- 检查资源是否存在
- 获取文件大小
- 检查最后修改时间
4.7 OPTIONS方法
作用:
查询支持的方法
特点:
- 用于CORS预检请求
- 返回Allow头部
示例:
OPTIONS /api/users HTTP/1.1
Host: api.example.com
响应:
HTTP/1.1 200 OK
Allow: GET, POST, PUT, DELETE, OPTIONS
使用场景:
- CORS预检
- 服务发现
4.8 方法对比
┌────────┬────────┬────────┬────────┬──────────────┐
│ 方法 │ 幂等 │ 安全 │ 可缓存 │ 用途 │
├────────┼────────┼────────┼────────┼──────────────┤
│ GET │ ✅ │ ✅ │ ✅ │ 查询 │
│ POST │ ❌ │ ❌ │ ❌ │ 创建 │
│ PUT │ ✅ │ ❌ │ ❌ │ 完整更新 │
│ PATCH │ ❌ │ ❌ │ ❌ │ 部分更新 │
│ DELETE│ ✅ │ ❌ │ ❌ │ 删除 │
│ HEAD │ ✅ │ ✅ │ ✅ │ 获取头部 │
│ OPTIONS│ ✅ │ ✅ │ ❌ │ 查询方法 │
└────────┴────────┴────────┴────────┴──────────────┘
幂等性:多次请求结果相同
安全性:不修改服务器状态
5. Cookie和Session
5.1 为什么需要Cookie?
问题:
HTTP是无状态的
→ 服务器无法识别用户
→ 无法保持登录状态
解决方案:
Cookie = 客户端存储的小数据
工作流程:
1. 用户登录成功
2. 服务器返回Set-Cookie头
3. 浏览器保存Cookie
4. 后续请求自动带上Cookie
5. 服务器识别用户
5.2 Cookie详解
设置Cookie:
服务器响应:
HTTP/1.1 200 OK
Set-Cookie: session_id=abc123; Path=/; HttpOnly; Secure
Set-Cookie: user=Alice; Max-Age=86400
客户端后续请求:
GET /api/profile HTTP/1.1
Cookie: session_id=abc123; user=Alice
Cookie属性:
Name=Value
- Cookie的键值对
Expires=Wed, 21 Oct 2025 07:28:00 GMT
- 过期时间(绝对时间)
Max-Age=3600
- 有效期(秒数,相对时间)
Domain=.example.com
- 生效域名
- .example.com:所有子域名都生效
Path=/
- 生效路径
- /:所有路径
- /api:只在/api路径下生效
Secure
- 只在HTTPS下传输
HttpOnly
- 禁止JavaScript访问
- 防止XSS攻击
SameSite=Strict
- Strict:完全禁止跨站发送
- Lax:大部分情况禁止
- None:允许跨站(需要Secure)
- 防止CSRF攻击
Cookie示例:
# 设置普通Cookie
Set-Cookie: user=Alice
# 设置过期Cookie(30天)
Set-Cookie: user=Alice; Max-Age=2592000
# 设置安全Cookie
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Strict
5.3 Session详解
Session工作原理:
流程:
1. 用户登录
─────────────>
POST /api/login
{"username": "Alice", "password": "***"}
2. 服务器验证成功
- 创建Session(服务器内存/数据库)
- Session ID: abc123
- Session数据: {user_id: 1, username: "Alice"}
3. 返回Session ID
<─────────────
Set-Cookie: session_id=abc123; HttpOnly
4. 后续请求带上Cookie
─────────────>
GET /api/profile
Cookie: session_id=abc123
5. 服务器查找Session
- 根据session_id查找Session数据
- 获取用户信息
- 返回用户资料
Cookie vs Session:
┌────────────┬────────────────┬────────────────┐
│ 特性 │ Cookie │ Session │
├────────────┼────────────────┼────────────────┤
│ 存储位置 │ 客户端 │ 服务器 │
│ 安全性 │ 较低 │ 较高 │
│ 容量限制 │ 4KB │ 无限制 │
│ 性能 │ 无压力 │ 占用内存 │
│ 生命周期 │ 可持久化 │ 关闭浏览器失效│
└────────────┴────────────────┴────────────────┘
实际应用:
Cookie存储Session ID
Session存储用户数据
6. HTTP版本演进
6.1 HTTP/1.0
特点:
- 每个请求都要建立新的TCP连接
- 请求完成后立即关闭连接
问题:
- 性能差(TCP三次握手开销)
- 无法复用连接
示例:
客户端 → 服务器:建立连接
客户端 → 服务器:GET /page1.html
服务器 → 客户端:返回page1.html
断开连接
客户端 → 服务器:建立连接
客户端 → 服务器:GET /page2.html
服务器 → 客户端:返回page2.html
断开连接
6.2 HTTP/1.1
改进:
✅ 持久连接(Connection: keep-alive)
✅ 管道化(Pipelining)
✅ 分块传输(Chunked Transfer)
✅ 缓存控制增强
✅ Host头部(支持虚拟主机)
持久连接:
客户端 → 服务器:建立连接
客户端 → 服务器:GET /page1.html
服务器 → 客户端:返回page1.html
客户端 → 服务器:GET /page2.html
服务器 → 客户端:返回page2.html
... 保持连接 ...
问题:
- 队头阻塞(Head-of-Line Blocking)
- 一个请求慢会阻塞后续请求
6.3 HTTP/2
改进:
✅ 二进制协议(不再是文本)
✅ 多路复用(Multiplexing)
✅ 头部压缩(HPACK)
✅ 服务器推送(Server Push)
✅ 流优先级
多路复用:
一个TCP连接,多个请求并行
┌─────────────────────────┐
│ TCP连接 │
├─────────────────────────┤
│ Stream 1: GET /page1 │
│ Stream 2: GET /style.css│
│ Stream 3: GET /script.js│
│ Stream 4: GET /image.jpg│
└─────────────────────────┘
优点:
- 解决队头阻塞
- 减少延迟
- 提高性能
6.4 HTTP/3
改进:
✅ 基于QUIC(UDP)
✅ 更快的连接建立
✅ 更好的拥塞控制
✅ 连接迁移(IP变化不断线)
为什么用UDP?
- TCP队头阻塞无法彻底解决
- UDP更灵活
- QUIC在应用层实现可靠传输
对比:
HTTP/1.1:文本 + TCP
HTTP/2:二进制 + TCP
HTTP/3:二进制 + QUIC(UDP)
6.5 版本对比
┌────────────┬──────────┬──────────┬──────────┐
│ 特性 │ HTTP/1.1 │ HTTP/2 │ HTTP/3 │
├────────────┼──────────┼──────────┼──────────┤
│ 协议 │ 文本 │ 二进制 │ 二进制 │
│ 传输层 │ TCP │ TCP │ QUIC │
│ 多路复用 │ ❌ │ ✅ │ ✅ │
│ 头部压缩 │ ❌ │ ✅ │ ✅ │
│ 服务器推送│ ❌ │ ✅ │ ✅ │
│ 连接建立 │ 慢 │ 中等 │ 快 │
└────────────┴──────────┴──────────┴──────────┘
7. 实战项目:简单HTTP服务器
7.1 项目需求
功能需求:
1. 支持GET/POST请求
2. 解析HTTP请求
3. 返回HTTP响应
4. 支持静态文件服务
5. 支持JSON API
6. 日志记录
技术要求:
- 使用Socket实现
- 遵循HTTP/1.1协议
- 支持Content-Type识别
- 支持基本的错误处理
7.2 工具演示
# 启动HTTP服务器
python day19_http_server.py --host 0.0.0.0 --port 8080
# 测试HTTP客户端
python day19_http_client.py --url http://127.0.0.1:8080/
# 浏览器访问
open http://127.0.0.1:8080/
8. 今日练习
练习1:手动构建HTTP请求
# 使用socket发送原始HTTP请求
# 1. 连接到www.baidu.com:80
# 2. 发送GET请求
# 3. 解析响应
# 4. 打印状态码和头部
练习2:实现HTTP客户端
# 实现一个简单的HTTP客户端
# 支持:
# 1. GET请求
# 2. POST请求(JSON)
# 3. 自动处理重定向
# 4. Cookie管理
练习3:分析HTTP流量
# 使用Wireshark或tcpdump
# 1. 捕获HTTP流量
# 2. 分析请求和响应
# 3. 识别状态码和头部
练习4:扩展HTTP服务器
# 为HTTP服务器添加功能:
# 1. 支持PUT/DELETE方法
# 2. Session管理
# 3. 文件上传
# 4. 访问控制(Basic Auth)
9. 常见问题
Q1:GET和POST的本质区别是什么?
A:
- 语义:GET用于获取,POST用于提交
- 参数:GET在URL,POST在请求体
- 幂等性:GET幂等,POST不幂等
- 缓存:GET可缓存,POST不可
- 安全性:GET参数可见,POST相对隐藏
Q2:为什么有状态码304?
A:
- 节省带宽
- 利用浏览器缓存
- 服务器返回"资源未修改"
- 浏览器使用本地缓存
Q3:Cookie和Session哪个更安全?
A:
- Session更安全(数据在服务器)
- Cookie易被窃取和篡改
- 实际使用:Cookie存Session ID
Q4:HTTP/2比HTTP/1.1快多少?
A:
- 理论上:30%-50%
- 实际:取决于网络和资源数量
- 资源越多,优势越明显
Q5:什么时候用POST,什么时候用PUT?
A:
- POST:创建新资源(ID由服务器生成)
- PUT:更新已存在资源(ID已知)
- POST非幂等,PUT幂等
10. 总结
今天我们学习了:
核心知识点
HTTP基础:
- 应用层协议
- 无状态、明文传输
- 请求-响应模式
请求格式:
- 请求行(方法 URI 版本)
- 请求头
- 空行
- 请求体(可选)
响应格式:
- 状态行(版本 状态码 描述)
- 响应头
- 空行
- 响应体
HTTP方法:
- GET:查询
- POST:创建
- PUT:更新
- DELETE:删除
状态码:
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
Cookie/Session:
- Cookie:客户端存储
- Session:服务器存储
- 配合使用
版本演进:
- HTTP/1.1:持久连接
- HTTP/2:多路复用
- HTTP/3:QUIC
重点回顾
HTTP请求 = 请求行 + 请求头 + 空行 + 请求体
HTTP响应 = 状态行 + 响应头 + 空行 + 响应体
常用状态码:
200 OK
301 永久重定向
302 临时重定向
304 未修改
400 请求错误
401 未认证
403 禁止
404 未找到
500 服务器错误
HTTP/2核心:
多路复用 + 头部压缩 + 二进制协议
明天预告
第20天:HTTPS和安全
内容预览:
- TLS/SSL协议
- 数字证书
- 对称加密和非对称加密
- HTTPS握手过程
- 证书验证
- 常见攻击和防御
继续加油! 🚀
今天我们学习了HTTP协议的基础知识,这是Web开发的核心。理解HTTP协议对于开发Web应用、调试网络问题都至关重要。明天我们将学习HTTPS,了解如何保护HTTP通信的安全!