1. HTTP通信全流程解析
HTTP通信是Web应用的基础,整个过程涉及多个网络协议协同工作。让我们深入剖析从浏览器输入网址到页面显示的完整过程。
1.1 DNS解析:从域名到IP地址
当你在浏览器地址栏输入"www.example.com"并按下回车时,首先发生的是DNS解析过程:
- 浏览器缓存检查:浏览器首先检查自身缓存中是否有该域名对应的IP地址
- 系统缓存查询:若浏览器缓存未命中,则查询操作系统缓存(如Windows的hosts文件)
- 递归查询:若本地缓存均未命中,浏览器会向配置的DNS服务器发起递归查询
- 权威DNS查询:最终DNS服务器会向该域名的权威DNS服务器查询,获取IP地址
提示:DNS解析结果通常会被缓存,TTL(Time To Live)决定了缓存的有效时间
1.2 TCP三次握手:建立可靠连接
获取到服务器IP后,浏览器通过TCP协议与服务器建立连接:
- SYN:客户端发送SYN=1的TCP报文,序列号为随机值x
- SYN-ACK:服务器回应SYN=1,ACK=1的报文,确认号为x+1,序列号为随机值y
- ACK:客户端发送ACK=1的报文,确认号为y+1,序列号为x+1
这个过程的目的是确保双方都具有收发能力,为后续数据传输建立可靠通道。
1.3 HTTP请求/响应:应用层通信
连接建立后,浏览器构造并发送HTTP请求报文:
code复制GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
服务器收到请求后处理并返回响应:
code复制HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
<!DOCTYPE html>
<html>...</html>
1.4 连接管理:短连接与长连接
HTTP/1.0默认使用短连接,每次请求后关闭TCP连接。HTTP/1.1引入长连接(keep-alive),允许在单个TCP连接上发送多个请求/响应,显著提高了性能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现简易HTTP服务器
2.1 服务器基础架构
我们将用C语言实现一个支持多线程的简易HTTP服务器,核心架构如下:
- 主线程:负责监听端口、接受新连接
- 工作线程池:每个线程独立处理一个客户端连接
- 请求处理流程:解析HTTP请求 → 定位资源 → 构造响应 → 发送数据
2.2 核心代码实现
2.2.1 服务器初始化
c复制int socket_init() {
// 创建TCP套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket creation failed");
return -1;
}
// 设置SO_REUSEADDR选项,避免端口占用问题
int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt failed");
close(sockfd);
return -1;
}
// 绑定地址和端口
struct sockaddr_in saddr;
memset(&saddr, 0, sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port =
