目录
- HTTP协议概述
- URL结构与解析
- HTTP请求格式
- HTTP响应格式
- HTTP常见方法
- HTTP状态码
- HTTP Header详解
- Cookie与Session机制
- HTTPS与加密技术
- C++实现HTTP服务器
1. HTTP协议概述
HTTP(HyperText Transfer Protocol,超文本传输协议)是用于网络通信的应用层协议,主要用于浏览器和服务器之间的数据传输。它是无状态的请求-响应协议,通常运行在TCP协议之上。
1.1 HTTP的特性
- 无状态:每个HTTP请求都是独立的,不会记住上一次请求的状态。
- 基于请求-响应:客户端发送请求,服务器返回响应。
- 明文传输:数据未加密,容易被拦截(HTTPS解决此问题)。
- 灵活可扩展:支持多种数据格式(HTML、JSON、XML、图片、视频等)。
- 应用广泛:用于网页访问、API通信等。
1.2 HTTP的工作流程
要理解 HTTP 的本质,我们可以把它比作在餐厅点餐:
- 顾客(客户端) 走进餐厅(浏览器访问网站)。
- 向服务员(服务器)点菜(发送HTTP请求)。
- 服务员传达订单给厨房(服务器处理请求)。
- 厨房准备食物(服务器生成响应)。
- 服务员把食物端上来(服务器返回HTTP响应)。
- 顾客吃饭(浏览器渲染网页)。
HTTP 就是这样一个请求 - 响应的通信过程。
2. URL结构与解析
URL(Uniform Resource Locator,统一资源定位符)用于唯一标识互联网上的资源。
URL基本结构:
协议://用户名:密码@服务器地址:端口/路径?查询参数#片段标识符
2.1 URL组成部分
| 组件 | 说明 | 示例 |
|---|---|---|
| 协议 | 传输方式 | http://, https:// |
| 服务器地址 | 域名或IP | www.example.com, 192.168.1.1 |
| 端口 | 服务器监听端口 | 80, 443 |
| 路径 | 服务器上的资源位置 | /index.html |
| 查询参数 | 以 key=value 形式传递数据 | ?id=123&name=John |
| 片段标识符 | 页面内定位 | #section1 |
2.2 URL编码与解码
在 URL 传递数据时,某些特殊字符(如空格、&、?)不能直接使用,需要进行 URL 编码。
示例:
原始数据:Hello World!
URL 编码后:Hello%20World%21
在 C++ 中可以使用 curl 或 boost::asio 进行 URL 编码和解码。
3. HTTP请求格式
HTTP请求由请求行、请求头部、空行、请求正文四部分组成。
3.1 请求格式示例
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
<请求正文(POST请求时存在)>
3.2 请求方法
HTTP支持多种请求方法,如 GET、POST、PUT、DELETE 等。
| 方法 | 说明 |
|---|---|
| GET | 请求资源,不包含请求正文 |
| POST | 发送数据到服务器,如表单提交 |
| PUT | 上传文件 |
| DELETE | 删除资源 |
| HEAD | 仅获取响应头部信息 |
示例:C++ 代码发送HTTP请求
#include <iostream>
#include <boost/asio.hpp>
using namespace std;
using namespace boost::asio;
int main() {
io_service service;
ip::tcp::resolver resolver(service);
ip::tcp::resolver::query query("www.example.com", "80");
ip::tcp::resolver::iterator endpoint = resolver.resolve(query);
ip::tcp::socket socket(service);
connect(socket, endpoint);
string request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
socket.send(buffer(request));
char response[1024];
size_t bytes = socket.receive(buffer(response));
cout << string(response, bytes);
return 0;
}
4. HTTP响应格式
HTTP响应由状态行、响应头部、空行、响应正文组成。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
<HTML内容>
4.1 常见状态码
| 状态码 | 说明 |
|---|---|
| 200 OK | 请求成功 |
| 301 Moved Permanently | 永久重定向 |
| 302 Found | 临时重定向 |
| 403 Forbidden | 无权限访问 |
| 404 Not Found | 资源未找到 |
| 500 Internal Server Error | 服务器内部错误 |
5. HTTP Header详解
HTTP头部用于携带元信息,如 Content-Type、User-Agent。
| Header | 说明 |
|---|---|
| Content-Type | 指定返回数据格式,如 text/html |
| Content-Length | 返回数据大小 |
| User-Agent | 客户端信息,如 Mozilla/5.0 |
| Referer | 记录请求来源 |
| Set-Cookie | 服务器设置的Cookie |
6. HTTP状态码
HTTP 状态码用于表示服务器对客户端请求的处理结果。
6.1 状态码分类
| 分类 | 说明 |
|---|---|
| 1XX | 信息性响应,表示请求已收到,正在处理 |
| 2XX | 成功,表示请求已成功被服务器处理 |
| 3XX | 重定向,表示客户端需要采取额外操作获取资源 |
| 4XX | 客户端错误,表示请求错误,服务器无法处理 |
| 5XX | 服务器错误,表示服务器在处理请求时发生错误 |
6.2 常见状态码及含义
| 状态码 | 含义 | 详细说明 |
| 200 OK | 请求成功 | 服务器成功处理请求并返回数据 |
| 301 Moved Permanently | 资源永久移动 | 客户端应使用新的URL访问该资源 |
| 302 Found | 资源临时移动 | 资源暂时可用新URL,但以后可能变更 |
| 304 Not Modified | 资源未修改 | 服务器返回此状态码告知客户端可以使用缓存 |
| 400 Bad Request | 错误请求 | 由于请求格式错误,服务器无法理解请求 |
| 401 Unauthorized | 未授权 | 客户端请求资源需要身份验证 |
| 403 Forbidden | 禁止访问 | 服务器拒绝提供资源 |
| 404 Not Found | 资源未找到 | 服务器找不到请求的资源 |
| 500 Internal Server Error | 服务器内部错误 | 服务器在处理请求时遇到错误 |
| 502 Bad Gateway | 网关错误 | 服务器作为网关或代理,收到了无效响应 |
| 503 Service Unavailable | 服务不可用 | 服务器由于超载或维护,暂时无法处理请求 |
6.3 实际案例
案例 1:处理 404 Not Found 错误
如果用户请求一个不存在的页面,服务器应返回 404 Not Found。在 C++ 服务器实现中,可以检查请求的 URL,并返回适当的状态码。
if (requested_resource_not_found) {
std::string response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n";
response += "<html><body><h1>404 Not Found</h1></body></html>";
send(client_socket, response.c_str(), response.size(), 0);
}
7. HTTP Header详解
HTTP Header 头部信息用于在请求和响应之间传递额外的元数据。
7.1 常见请求头(Request Headers)
| Header | 说明 |
| Host | 指定服务器地址,如 Host: www.example.com |
| User-Agent | 发送客户端信息,如 Mozilla/5.0 |
| Accept | 指定客户端支持的返回格式,如 text/html, application/json |
| Referer | 指定请求来源,如 Referer: https://www.google.com |
| Authorization | 提供身份验证信息 |
7.2 常见响应头(Response Headers)
| Header | 说明 |
| Content-Type | 指定返回数据格式,如 text/html、application/json |
| Content-Length | 返回数据的长度 |
| Set-Cookie | 服务器设置 Cookie |
| Location | 指定重定向 URL |
案例 2:设置 JSON 响应头
如果服务器返回 JSON 数据,需要设置 Content-Type 头部。
std::string response = "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n";
response += "{\"message\": \"Hello, World!\"}";
send(client_socket, response.c_str(), response.size(), 0);
8. Cookie与Session机制
HTTP 是无状态协议,因此服务器通常使用 Cookie 和 Session 进行用户身份管理。
8.1 什么是 Cookie?
-
Cookie 存储在客户端,包含小型数据,如用户 ID、登录状态。
-
服务器使用
Set-Cookie响应头设置 Cookie。
示例:
std::string response = "HTTP/1.1 200 OK\r\nSet-Cookie: sessionid=xyz123; HttpOnly; Secure\r\n\r\n";
send(client_socket, response.c_str(), response.size(), 0);
8.2 什么是 Session?
-
Session 存储在服务器端,使用
SessionID关联用户。 -
客户端的 Cookie 存储
SessionID,用于后续请求身份识别。
示例:
std::unordered_map<std::string, std::string> sessions;
sessions["xyz123"] = "user_001"; // SessionID -> 用户数据
9. HTTPS与加密技术
HTTPS(HTTP Secure)通过 SSL/TLS 加密 HTTP 通信,防止数据被窃听或篡改。
9.1 HTTPS 主要流程
-
客户端请求 HTTPS 服务器
-
服务器返回 SSL 证书(包含公钥)
-
客户端验证证书有效性
-
客户端生成会话密钥,并用公钥加密
-
服务器使用私钥解密会话密钥
-
之后所有通信使用对称加密(AES)
9.2 对称加密 vs 非对称加密
| 加密方式 | 说明 |
| 对称加密 | 使用相同密钥加密解密,速度快(如 AES) |
| 非对称加密 | 使用公钥加密、私钥解密,安全性高(如 RSA) |
10. C++实现HTTP服务器
下面是一个使用 boost::asio 实现的简单 HTTP 服务器。
#include <boost/asio.hpp>
using namespace boost::asio;
int main() {
io_service service;
ip::tcp::acceptor acceptor(service, ip::tcp::endpoint(ip::tcp::v4(), 8080));
ip::tcp::socket socket(service);
acceptor.accept(socket);
std::string response = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!";
socket.send(buffer(response));
return 0;
}

2970

被折叠的 条评论
为什么被折叠?



