HTTP 协议

目录

一、HTTP 是什么?—— 先搞懂最基础的概念

1.1 HTTP 的全称与作用

1.2 HTTP 的 2 个核心特点

(1)无连接

(2)无状态

二、URL:你输入的 “网址” 到底是什么?

2.1 URL 的完整结构

2.2 urlencode 与 urldecode:特殊字符的 “翻译官”

转义规则

实战工具

三、HTTP 的 “对话格式”:请求与响应

3.1 HTTP 请求格式:客户端怎么 “提需求”?

各部分详解

3.2 HTTP 响应格式:服务器怎么 “回消息”?

各部分详解

3.3 实战:手写一个简单的 HTTP 服务器

代码实现

代码解释

四、HTTP 方法:不同的 “请求类型” 有什么用?

4.1 GET 方法:“我要获取资源”

用途

示例

特点

4.2 POST 方法:“我要提交数据”

用途

示例

特点

4.3 GET vs POST:用 “登录” 举例对比

若用 POST:

若改成 GET:

五、HTTP 状态码:服务器的 “表情符号”

5.1 状态码分类(按第一位数字)

5.2 最常用的 5 个状态码

(1)200 OK:请求成功

(2)404 Not Found:资源不存在

(3)301 Moved Permanently:永久重定向

(4)302 Found:临时重定向

(5)500 Internal Server Error:服务器内部错误

5.3 实战:实现 302 重定向

运行效果

六、HTTP Header:隐藏的 “附加信息”

6.1 Content-Type:数据的 “身份证”

示例

6.2 Cookie 与 Set-Cookie:解决 “无状态” 的关键

工作流程

实战:设置 Cookie

效果

6.3 Connection:长连接 vs 短连接

长连接的好处

七、HTTPS:更安全的 “HTTP”

7.1 HTTPS 是什么?—— HTTP + 加密层

7.2 为什么需要 HTTPS?—— 防止 “中间人攻击”

7.3 HTTPS 的核心:证书与加密

(1)证书:证明服务器 “身份合法”

(2)混合加密:兼顾安全与速度

7.4 HTTP vs HTTPS:关键区别

八、总结


在我们每天刷网页、聊微信、逛淘宝时,背后都有一个 “隐形的信使” 在工作 —— 它就是HTTP 协议。无论是打开百度搜索,还是登录抖音账号,本质上都是客户端(手机 / 电脑)通过 HTTP 协议向服务器发送请求,再接收服务器响应的过程。这篇博客会从 HTTP 的基本概念讲起,一步步拆解它的工作原理,结合实战代码让你彻底搞懂这个 “互联网信使”。

一、HTTP 是什么?—— 先搞懂最基础的概念

1.1 HTTP 的全称与作用

HTTP(HyperText Transfer Protocol,超文本传输协议)是客户端与服务器之间交换数据的 “语言”。它定义了:

  • 客户端如何向服务器 “说话”(发送请求);
  • 服务器如何 “回应”(返回响应);
  • 传输的数据格式(比如网页、图片、登录信息等)。

举个例子:当你在浏览器输入www.baidu.com时,浏览器会自动用 HTTP 协议向百度服务器发送 “我要访问首页” 的请求,服务器收到后,用 HTTP 协议返回百度首页的 HTML 代码,浏览器再解析代码显示出我们看到的页面。

1.2 HTTP 的 2 个核心特点

(1)无连接

“无连接” 不是说不建立连接,而是每次请求完成后,连接就会断开。比如你刷淘宝时,看第一个商品是一次连接,看第二个商品是重新建立连接 —— 不像打电话那样一直 “占线”,这样能节省服务器资源,支持更多人同时访问。

(2)无状态

“无状态” 指服务器不会记住你上一次的操作。比如你第一次访问淘宝时登录了账号,第二次再打开淘宝,服务器本身不知道 “你就是刚才登录的那个人”—— 这时候就需要 “Cookie” 来帮忙记录状态(后面会详细讲)。

二、URL:你输入的 “网址” 到底是什么?

我们俗称的 “网址”,其实是 URL(Uniform Resource Locator,统一资源定位符),它的作用是精确找到互联网上的某个资源(比如一个网页、一张图片)。

2.1 URL 的完整结构

一个标准的 URL 由 7 部分组成,我们以http://user:pass@www.baidu.com:80/s?wd=HTTP#ch1为例拆解:

部分示例作用说明
协议方案名http://用什么协议访问(HTTP/HTTPS/FTP 等)
登录信息user:pass访问资源的用户名和密码(几乎不用,隐私性差)
服务器地址www.baidu.com服务器的域名(对应一个 IP 地址,比如百度的 IP)
服务器端口号:80访问服务器的 “门牌号”,HTTP 默认 80,HTTPS 默认 443
带层次的路径/s资源在服务器上的存储路径
查询字符串?wd=HTTP向服务器传递的参数(比如百度搜索的关键词)
片段标识符#ch1跳转到页面内的指定位置(比如文章的第一章)

注意:日常使用中,登录信息、端口号(默认时)、片段标识符经常被省略,比如百度搜索的 URL 简化为https://www.baidu.com/s?wd=HTTP

2.2 urlencode 与 urldecode:特殊字符的 “翻译官”

URL 中有些字符有特殊含义(比如/表示路径、?表示查询开始),如果要传输这些特殊字符或中文,就需要 “转义”—— 这就是urlencode;服务器收到后再 “还原”—— 这就是urldecode

转义规则

将特殊字符转为十六进制,前面加%。比如:

  • +号转义为%2B(因为+在 URL 中表示空格);
  • 中文 “你好” 转义为%E4%BD%A0%E5%A5%BD(UTF-8 编码下的十六进制)。
实战工具

可以用在线工具验证:比如在 “站长工具 - URL 编码 / 解码” 中输入C++,编码后得到C%2B%2B,解码后又能还原为C++

三、HTTP 的 “对话格式”:请求与响应

HTTP 的核心是 “请求 - 响应” 模式:客户端发 “请求”,服务器回 “响应”。两者都有固定的格式,就像写信要按 “收件人、内容、落款” 的格式一样。

3.1 HTTP 请求格式:客户端怎么 “提需求”?

一个完整的 HTTP 请求由 4 部分组成:请求行 → 请求 Header → 空行 → 请求 Body,我们用 “登录表单提交” 的请求举例:

http

POST /login HTTP/1.1 # 请求行:方法 + URL + 版本 Host: www.example.com # Header:服务器地址 Content-Type: application/x-www-form-urlencoded # Header:Body的数据类型 Content-Length: 27 # Header:Body的长度(字节数) # 空行:分隔Header和Body username=zhangsan&passwd=123456 # Body:登录数据(表单内容)
各部分详解
  1. 请求行:HTTP 请求的 “核心指令”

    • 方法:请求的类型(比如 GET/POST,后面详解);
    • URL:要访问的资源路径(比如/login);
    • 版本:HTTP 的版本(常用 HTTP/1.1,支持长连接)。
  2. 请求 Header:请求的 “附加信息”以 “键:值” 格式存在,常见的有:

    • Host:告诉服务器要访问哪个域名(比如多域名共享一个服务器时有用);
    • User-Agent:告诉服务器客户端的 “身份”(比如Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0表示 Windows10 的 Chrome 浏览器);
    • Referer:告诉服务器 “我是从哪个页面跳过来的”(比如从百度搜索跳转到知乎,Referer 就是百度的 URL)。
  3. 空行:必须存在,用于分隔 Header 和 Body(如果没有空行,服务器会把 Body 当成 Header 的一部分,解析出错)。

  4. 请求 Body:要传给服务器的 “具体数据”

    • GET 请求的 Body 通常为空(数据放在 URL 的查询字符串中);
    • POST 请求的 Body 用于传表单、文件等数据(比如登录的账号密码)。

3.2 HTTP 响应格式:服务器怎么 “回消息”?

服务器收到请求后,会返回 HTTP 响应,格式与请求对应:状态行 → 响应 Header → 空行 → 响应 Body,比如登录成功的响应:

http

HTTP/1.1 200 OK # 状态行:版本 + 状态码 + 描述 Content-Type: text/html; charset=utf-8 # Header:Body的数据类型(HTML) Content-Length: 128 # Header:Body的长度 Set-Cookie: sessionid=abc123; Path=/ # Header:设置Cookie(记录登录状态) # 空行:分隔Header和Body <html><body>登录成功!</body></html> # Body:返回的网页内容
各部分详解
  1. 状态行:服务器的 “处理结果”

    • 版本:HTTP 版本(与请求一致);
    • 状态码:3 位数字,代表请求的处理状态(比如 200 成功、404 找不到资源);
    • 描述:状态码的文字解释(比如 OK、Not Found)。
  2. 响应 Header:响应的 “附加信息”常见的有:

    • Content-Type:告诉客户端 Body 的数据类型(比如text/html是网页,image/jpeg是图片);
    • Content-Length:Body 的长度(客户端知道要读多少字节);
    • Location:搭配 3xx 状态码使用,告诉客户端 “跳转到新地址”(比如重定向到首页);
    • Set-Cookie:服务器给客户端 “发小纸条”,记录状态(比如登录后的 SessionID)。
  3. 空行:分隔 Header 和 Body(和请求同理)。

  4. 响应 Body:服务器返回的 “实际内容”

    • 可能是 HTML(网页)、JSON(接口数据)、图片二进制数据等;
    • 如果是 404 响应,Body 就是 “找不到页面” 的提示网页。

3.3 实战:手写一个简单的 HTTP 服务器

我们用 C++ 写一个极简的 HTTP 服务器,功能是:接收浏览器请求,返回 “Hello World” 网页。通过代码理解 HTTP 响应的构建过程。

代码实现
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> // 端口号(选8080,避免和默认80端口冲突) #define PORT 8080 // HTTP响应的内容(状态行+Header+空行+Body) const char* RESPONSE = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=utf-8\r\n" "Content-Length: 22\r\n" "\r\n" "<h1>Hello World!</h1>"; int main() { // 1. 创建socket(相当于打开“通信管道”) // 参数1:AF_INET(IPv4),参数2:SOCK_STREAM(TCP),参数3:0(默认协议) // 返回值:成功返回socket描述符(非负整数),失败返回-1 int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd == -1) { perror("socket创建失败"); return 1; } // 2. 绑定端口(给“管道”分配一个“门牌号”) struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; // IPv4 server_addr.sin_port = htons(PORT); // 端口号(转网络字节序) server_addr.sin_addr.s_addr = INADDR_ANY; // 绑定所有网卡的IP // 参数1:socket描述符,参数2:服务器地址结构体,参数3:结构体大小 // 返回值:成功0,失败-1 if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("绑定端口失败"); close(listen_fd); return 1; } // 3. 监听连接(让“管道”处于“等待来电”状态) // 参数2:等待队列的最大长度(5个) // 返回值:成功0,失败-1 if (listen(listen_fd, 5) == -1) { perror("监听失败"); close(listen_fd); return 1; } std::cout << "HTTP服务器已启动,访问:http://127.0.0.1:" << PORT << std::endl; while (true) { // 4. 接收客户端连接(“接电话”) struct sockaddr_in client_addr; socklen_t client_len = sizeof(client_addr); // 参数2:客户端地址结构体(输出参数,存客户端IP和端口),参数3:结构体大小指针 // 返回值:成功返回新的socket描述符(与该客户端通信),失败返回-1 int conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len); if (conn_fd == -1) { perror("接收连接失败"); continue; } // 5. 读取客户端请求(可选,这里只打印请求内容) char buf[1024] = {0}; // 参数2:缓冲区,参数3:缓冲区大小,参数4:0(默认读取方式) // 返回值:成功返回读取的字节数,0表示客户端断开,-1表示失败 ssize_t n = recv(conn_fd, buf, sizeof(buf)-1, 0); if (n > 0) { std::cout << "收到客户端请求:\n" << buf << std::endl; } // 6. 发送HTTP响应(给客户端“回消息”) // 参数2:响应内容,参数3:响应长度,参数4:0(默认发送方式) // 返回值:成功返回发送的字节数,失败返回-1 send(conn_fd, RESPONSE, strlen(RESPONSE), 0); // 7. 关闭连接(“挂电话”) close(conn_fd); } // 8. 关闭监听socket(实际不会执行到这里,因为while(true)) close(listen_fd); return 0; }
代码解释
  1. 核心函数说明

    • socket():创建 TCP 通信的 “管道”,返回的listen_fd是 “监听用的管道”;
    • bind():给监听管道绑定端口(8080),让客户端能找到服务器;
    • listen():让管道进入 “监听状态”,等待客户端连接;
    • accept():接收客户端连接,返回conn_fd是 “与该客户端通信的管道”;
    • recv():读取客户端发送的 HTTP 请求(这里只打印,不解析);
    • send():发送 HTTP 响应(提前拼接好状态行、Header、Body);
    • close():关闭管道,释放资源。
  2. 运行步骤

    • 编译:g++ http_server.cpp -o http_server
    • 启动:./http_server
    • 访问:浏览器输入http://127.0.0.1:8080,会看到 “Hello World!” 的大标题。

四、HTTP 方法:不同的 “请求类型” 有什么用?

HTTP 定义了多种 “请求方法”,用来告诉服务器 “我要做什么操作”,最常用的是GETPOST,其他方法(PUT/DELETE 等)多用于接口开发。

4.1 GET 方法:“我要获取资源”

用途

从服务器获取资源(比如网页、图片、查询数据),是最常用的方法。

示例
  • 浏览器访问百度首页:GET / HTTP/1.1/表示根路径,即首页);
  • 百度搜索 “HTTP”:GET /s?wd=HTTP HTTP/1.1(参数wd=HTTP放在 URL 的查询字符串中)。
特点
  1. 数据在 URL 中:参数跟在?后面,用&分隔(比如?username=zhangsan&age=20);
  2. 长度有限制:URL 的长度通常不超过 2048 字节,不适合传大量数据;
  3. 不安全:参数会显示在地址栏,不适合传敏感数据(比如密码);
  4. 可缓存:浏览器会缓存 GET 请求的结果(比如静态图片,下次访问直接读缓存)。

4.2 POST 方法:“我要提交数据”

用途

向服务器提交数据(比如登录表单、上传文件)。

示例
  • 登录表单提交:POST /login HTTP/1.1(数据放在请求 Body 中,不在 URL 里);
  • Body 内容:username=zhangsan&passwd=123456
特点
  1. 数据在 Body 中:参数不显示在地址栏,适合传敏感数据;
  2. 长度无限制:可以传大文件(比如 100MB 的图片);
  3. 不安全(但比 GET 私密):数据虽然不在 URL 中,但默认还是明文传输(需要 HTTPS 加密);
  4. 不可缓存:浏览器不会缓存 POST 请求的结果(每次提交都是新操作)。

4.3 GET vs POST:用 “登录” 举例对比

假设我们有一个登录页面login.html,表单代码如下:

html

<!-- POST方法提交 --> <form action="/login" method="POST"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="passwd"><br> <button type="submit">登录</button> </form>
若用 POST:
  • 请求行:POST /login HTTP/1.1
  • 请求 Body:username=zhangsan&passwd=123456
  • 地址栏:http://127.0.0.1:8080/login(无参数,隐私性好)。
若改成 GET:
  • 请求行:GET /login?username=zhangsan&passwd=123456 HTTP/1.1
  • 请求 Body:空;
  • 地址栏:http://127.0.0.1:8080/login?username=zhangsan&passwd=123456(参数暴露,不安全)。

五、HTTP 状态码:服务器的 “表情符号”

状态码是服务器返回的 3 位数字,用来告诉客户端 “请求处理得怎么样了”,就像服务器的 “表情”——200 是 “微笑”(成功),404 是 “疑惑”(找不到),500 是 “难过”(服务器出错)。

5.1 状态码分类(按第一位数字)

分类含义常见状态码
1xx信息提示(临时响应)100(继续)
2xx成功200(OK)
3xx重定向(需要进一步操作)301(永久重定向)、302(临时重定向)
4xx客户端错误(请求有问题)404(Not Found)、403(Forbidden,权限不足)
5xx服务器错误(服务器有问题)500(Internal Server Error)、504(Gateway Timeout,网关超时)

5.2 最常用的 5 个状态码

(1)200 OK:请求成功
  • 场景:服务器正常处理了请求,返回了需要的资源;
  • 示例:访问百度首页,服务器返回 200,Body 是百度首页的 HTML。
(2)404 Not Found:资源不存在
  • 场景:客户端访问了服务器上没有的资源;
  • 示例:访问http://www.taobao.com/a.html,如果淘宝服务器没有a.html这个文件,就会返回 404,Body 是 “页面找不到” 的提示。
(3)301 Moved Permanently:永久重定向
  • 场景:资源被永久移动到新地址,以后请用新地址访问;
  • 示例:访问http://taobao.com,会重定向到https://www.taobao.com,状态码 301,响应 Header 中有Location: https://www.taobao.com
(4)302 Found:临时重定向
  • 场景:资源临时移动到新地址,下次可能还会变;
  • 示例:登录成功后,临时重定向到首页(Location: /index)。
(5)500 Internal Server Error:服务器内部错误
  • 场景:服务器处理请求时出错(比如代码 bug、数据库连接失败);
  • 示例:访问一个 PHP 页面,PHP 代码有语法错误,服务器返回 500。

5.3 实战:实现 302 重定向

修改之前的 HTTP 服务器代码,让访问/redir时重定向到百度首页:

// 在while(true)循环中,接收连接后添加: if (n > 0) { std::cout << "收到客户端请求:\n" << buf << std::endl; // 判断是否访问/redir if (strstr(buf, "GET /redir HTTP/1.1") != NULL) { // 302重定向响应:Location指向百度 const char* REDIRECT_RESP = "HTTP/1.1 302 Found\r\n" "Location: https://www.baidu.com\r\n" "\r\n"; send(conn_fd, REDIRECT_RESP, strlen(REDIRECT_RESP), 0); close(conn_fd); continue; } } // 其他情况返回Hello World send(conn_fd, RESPONSE, strlen(RESPONSE), 0);
运行效果
  • 访问http://127.0.0.1:8080/redir,浏览器会自动跳转到百度首页;
  • 抓包能看到服务器返回 302 状态码和Location: https://www.baidu.com

六、HTTP Header:隐藏的 “附加信息”

Header 是 HTTP 请求 / 响应中的 “附加说明”,以 “键:值” 格式存在,决定了数据如何传输、解析。我们重点讲几个最常用的 Header。

6.1 Content-Type:数据的 “身份证”

告诉接收方 “Body 中的数据是什么类型”,避免解析错误。常见值:

Content-Type 值含义示例场景
text/html; charset=utf-8HTML 网页,UTF-8 编码浏览器显示网页
application/jsonJSON 格式数据接口返回数据(比如登录状态)
application/x-www-form-urlencoded表单数据(键值对)POST 表单提交
image/jpegJPEG 图片加载图片
text/plain纯文本返回简单文本(比如 “登录成功”)
示例

服务器返回图片时,Header 要加:

http

Content-Type: image/jpeg Content-Length: 10240 # 图片大小10KB

6.2 Cookie 与 Set-Cookie:解决 “无状态” 的关键

HTTP 是无状态的,服务器记不住客户端,这时候需要 “Cookie”—— 服务器通过Set-Cookie给客户端发 “小纸条”,客户端下次请求时用Cookie带上 “小纸条”,服务器就能识别客户端了。

工作流程
  1. 客户端第一次登录:

    • 客户端发送登录请求(POST /login,Body 是账号密码);
    • 服务器验证成功,返回响应 Header:Set-Cookie: sessionid=abc123; Path=/
    • 浏览器收到后,把sessionid=abc123保存在本地 Cookie 文件中。
  2. 客户端第二次访问:

    • 客户端发送请求(GET /index),自动在 Header 中加:Cookie: sessionid=abc123
    • 服务器读取sessionid=abc123,查询到对应的用户信息,知道 “你是刚才登录的张三”,不用重新登录。
实战:设置 Cookie

修改服务器代码,返回响应时加Set-Cookie

const char* RESPONSE = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=utf-8\r\n" "Content-Length: 30\r\n" "Set-Cookie: username=zhangsan; Max-Age=3600\r\n" // Cookie有效期1小时 "\r\n" "<h1>已设置Cookie,刷新页面试试!</h1>";
效果
  • 访问http://127.0.0.1:8080,浏览器会保存username=zhangsan的 Cookie;
  • 刷新页面,请求 Header 中会自动带上Cookie: username=zhangsan
  • 打开浏览器 “开发者工具”→“应用”→“Cookie”,能看到这个 Cookie。

6.3 Connection:长连接 vs 短连接

控制客户端与服务器的连接是否保持:

  • Connection: close:短连接(默认 HTTP/1.0),每次请求后断开连接;
  • Connection: keep-alive:长连接(默认 HTTP/1.1),请求后保持连接,下次请求不用重新建立。
长连接的好处

比如浏览一个有 10 张图片的网页,短连接需要建立 11 次连接(1 次 HTML+10 次图片),长连接只需要 1 次连接,大大节省时间和资源。

七、HTTPS:更安全的 “HTTP”

HTTP 的缺点是明文传输—— 数据在网络中传输时,任何人都能通过抓包工具看到(比如账号密码、支付信息)。为了解决这个问题,就有了HTTPS(HTTP Secure)。

7.1 HTTPS 是什么?—— HTTP + 加密层

HTTPS 不是新协议,而是在 HTTP 和 TCP 之间加了一层SSL/TLS 加密层

  • 客户端发送数据:HTTP 数据 → SSL/TLS 加密 → TCP 传输;
  • 服务器接收数据:TCP 数据 → SSL/TLS 解密 → HTTP 数据。

这样,数据在网络中传输时是 “密文”,即使被抓包,也看不到原始内容。

7.2 为什么需要 HTTPS?—— 防止 “中间人攻击”

没有 HTTPS 时,运营商或黑客可能 “劫持” 数据:

  • 你点击 “下载 QQ”,运营商把下载链接改成 “下载 QQ 浏览器”;
  • 你输入银行卡号,黑客抓包后偷走信息。

有了 HTTPS,数据被加密,劫持者看不到原始内容,也无法篡改(篡改后解密会失败)。

7.3 HTTPS 的核心:证书与加密

HTTPS 的安全依赖两个关键技术:证书混合加密

(1)证书:证明服务器 “身份合法”

服务器要使用 HTTPS,需要向CA 机构(比如 Symantec、Let’s Encrypt)申请 “数字证书”,证书包含:

  • 服务器的域名、公钥;
  • CA 机构的签名(用 CA 的私钥加密,防止证书被篡改)。

客户端(浏览器)收到证书后,会验证:

  1. 证书是否在有效期内;
  2. 证书的 CA 机构是否在浏览器的 “信任列表” 中(浏览器内置了很多权威 CA 的公钥);
  3. 证书的签名是否合法(用 CA 的公钥解密签名,对比证书内容的哈希值,确认没被篡改)。
(2)混合加密:兼顾安全与速度

HTTPS 用 “非对称加密” 协商 “对称加密密钥”,再用 “对称加密” 传输数据:

  1. 非对称加密:有公钥和私钥,公钥加密的内容只有私钥能解密(慢,但安全);

    • 服务器把公钥放在证书中发给客户端;
    • 客户端生成一个 “对称加密密钥”,用服务器的公钥加密后发给服务器;
    • 服务器用自己的私钥解密,得到 “对称加密密钥”。
  2. 对称加密:用同一个密钥加密和解密(快,适合大量数据);

    • 后续客户端和服务器的所有数据,都用这个 “对称加密密钥” 加密传输。

7.4 HTTP vs HTTPS:关键区别

对比项HTTPHTTPS
端口80443
加密明文传输SSL/TLS 加密
证书不需要需要 CA 证书
速度快(无加密开销)稍慢(有加密解密开销)
安全不安全安全
地址栏标识无 “锁” 图标有绿色 “锁” 图标

八、总结

HTTP 是互联网的 “通用语言”,这篇博客从基础到实战,讲解了:

  1. HTTP 是什么:客户端与服务器的通信协议,无连接、无状态;
  2. URL 结构:从协议到片段标识符,特殊字符需要 urlencode;
  3. 请求响应格式:4 部分组成,空行是关键分隔;
  4. 方法与状态码:GET 获取、POST 提交,200 成功、404 找不到;
  5. Header 作用:Content-Type 定义数据类型,Cookie 解决无状态;
  6. HTTPS 安全:加密层 + 证书,防止数据泄露和篡改。

-------------------------------------------------------------------------------------------------------------------------------

通过实战代码,我们亲手实现了简单 HTTP 服务器、302 重定向、设置 Cookie,相信你已经对 HTTP 有了直观的理解。下次浏览网页时,不妨打开 “开发者工具”,看看请求和响应的细节 —— 你会发现,原来背后都是这些知识点在工作!