06.应用层协议—— HTTP协议详解

目录

  1. HTTP协议概述
  2. URL结构与解析
  3. HTTP请求格式
  4. HTTP响应格式
  5. HTTP常见方法
  6. HTTP状态码
  7. HTTP Header详解
  8. Cookie与Session机制
  9. HTTPS与加密技术
  10. C++实现HTTP服务器

1. HTTP协议概述

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于网络通信应用层协议,主要用于浏览器和服务器之间的数据传输。它是无状态的请求-响应协议,通常运行在TCP协议之上。

1.1 HTTP的特性

  • 无状态:每个HTTP请求都是独立的,不会记住上一次请求的状态。
  • 基于请求-响应:客户端发送请求,服务器返回响应。
  • 明文传输:数据未加密,容易被拦截(HTTPS解决此问题)。
  • 灵活可扩展:支持多种数据格式(HTML、JSON、XML、图片、视频等)。
  • 应用广泛:用于网页访问、API通信等。

1.2 HTTP的工作流程

要理解 HTTP 的本质,我们可以把它比作在餐厅点餐:

  1. 顾客(客户端) 走进餐厅(浏览器访问网站)。
  2. 向服务员(服务器)点菜(发送HTTP请求)
  3. 服务员传达订单给厨房(服务器处理请求)
  4. 厨房准备食物(服务器生成响应)
  5. 服务员把食物端上来(服务器返回HTTP响应)
  6. 顾客吃饭(浏览器渲染网页)

HTTP 就是这样一个请求 - 响应的通信过程。


2. URL结构与解析

URL(Uniform Resource Locator,统一资源定位符)用于唯一标识互联网上的资源。

URL基本结构

协议://用户名:密码@服务器地址:端口/路径?查询参数#片段标识符

2.1 URL组成部分

组件说明示例
协议传输方式http://, https://
服务器地址域名或IPwww.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++ 中可以使用 curlboost::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支持多种请求方法,如 GETPOSTPUTDELETE 等。

方法说明
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-TypeUser-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/htmlapplication/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 是无状态协议,因此服务器通常使用 CookieSession 进行用户身份管理。

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 主要流程

  1. 客户端请求 HTTPS 服务器

  2. 服务器返回 SSL 证书(包含公钥)

  3. 客户端验证证书有效性

  4. 客户端生成会话密钥,并用公钥加密

  5. 服务器使用私钥解密会话密钥

  6. 之后所有通信使用对称加密(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值