HTTP 是 “HyperText Transfer Protocol” 的缩写,中文通常译作“超文本传输协议”。它是互联网上应用最广泛的一种网络协议,专门用来在浏览器和 Web 服务器之间传输超文本文档(例如 HTML 页面、图片、视频、API 数据等)。
- 工作模型
- 基于 TCP/IP:默认端口 80(HTTPS 是 443)。
- 经典版本:
– HTTP/1.1(1997):持久连接、管道化、分块传输。
– HTTP/2(2015):二进制分帧、多路复用、头部压缩(HPACK)、服务器推送。
– HTTP/3(2022 标准化):基于 QUIC(UDP),解决队头阻塞,移动网络下更快。 - 无状态:每次请求互相独立,服务器默认不保存上下文。用 Cookie/Session/JWT 等机制“补”状态。
url:平时我们俗称的 “⽹址” 其实就是说的 URL

HTTP协议请求与响应格式
响应报本和请求报文

• ⾸⾏: [⽅法] + [url] + [版本]
• Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤ \r\n 分隔;遇到空⾏表⽰ Header部分结束
• Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的⻓度;

• ⾸⾏: [版本号] + [状态码] + [状态码解释]
• Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤\r\n分隔;遇到空⾏表⽰Header部分结束
• Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的⻓度; 如果服务器返回了⼀个html⻚⾯, 那么html⻚⾯内容就是在body中.
HTTP的⽅法

HTTP常⻅⽅法
get方法:
⽤途:⽤于请求URL指定的资源。
⽰例: GET /index.html HTTP/1.1特性:指定资源经服务器端解析后返回响应内容。
form表单:https://www.runoob.com/html/html-forms.html
POST⽅法
⽤途:⽤于传输实体的主体,通常⽤于提交表单数据。
⽰例: POST /submit.cgi HTTP/1.1特性:可以发送⼤量的数据给服务器,并且数据包含在请求体中。
form表单:https://www.runoob.com/html/html-forms.html
HTTP的状态码

HTTP状态码301(永久重定向)
• 当服务器返回HTTP 301状态码时,表⽰请求的资源已经被永久移动到新的位置。
• 在这种情况下,服务器会在响应中添加⼀个Location头部,⽤于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会⾃动重定向到该地址。
• 例如,在HTTP响应中,可能会看到类似于以下的头部信息:
HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n1
HTTP状态码302(临时重定向)
• 当服务器返回HTTP 302状态码时,表⽰请求的资源临时被移动到新的位置。
• 同样地,服务器也会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使⽤新的URL进⾏后续的请求,但不会缓存这个重定向。
• 例如,在HTTP响应中,可能会看到类似于以下的头部信息:
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n1
HTTP常⻅Header
• Content-Type: 数据类型(text/html等)
• Content-Length: Body的⻓度
• Host: 客⼾端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;
• User-Agent: 声明⽤⼾的操作系统和浏览器版本信息;
• Referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;
• Location: 搭配3xx状态码使⽤, 告诉客⼾端接下来要去哪⾥访问;
• Cookie: ⽤于在客⼾端存储少量信息. 通常⽤于实现会话(session)的功能;
关于connection报头
TTP中的Connection字段是HTTP报⽂头的⼀部分,它主要⽤于控制和管理客⼾端与服务器之间的连接状态
核⼼作⽤•
管理持久连接:
Connection 字段还⽤于管理持久连接(也称为⻓连接)。持久连接允许客⼾端和服务器在请求/响应完成后不⽴即关闭TCP连接,以便在同⼀个连接上发送多个请求和接收多个响应。
持久连接(⻓连接)
• HTTP/1.1:在HTTP/1.1协议中,默认使⽤持久连接。当客⼾端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复⽤同⼀个连接。
• HTTP/1.0:在HTTP/1.0协议中,默认连接是⾮持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显式设置 Connection: keep-alive 。语法格式
• Connection: keep-alive :表⽰希望保持连接以复⽤TCP连接。
• Connection: close :表⽰请求/响应完成后,应该关闭TCP连接
下面是一个简单的HTTP服务器:
for (;;) {
struct sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);
if (client_fd < 0) {
perror("accept");
continue;
}
char input_buf[1024 * 10] = {0};
ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);
if (read_size <= 0) {
close(client_fd);
continue;
}
input_buf[read_size] = '\0';
printf("[Request] %s\n", input_buf);
const char* hello = "hello world
";
char buf[1024] = {0};
sprintf(buf,
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Content-Length: %lu\r\n"
"\r\n"
"%s", strlen(hello), hello);
write(client_fd, buf, strlen(buf));
close(client_fd);
}
完整的HTTP服务器例子在仓库中
今天的更新就到这里,如有错误欢迎指出
评论
还没有任何评论,你来说两句吧!