HTTP 是 “HyperText Transfer Protocol” 的缩写,中文通常译作“超文本传输协议”。它是互联网上应用最广泛的一种网络协议,专门用来在浏览器和 Web 服务器之间传输超文本文档(例如 HTML 页面、图片、视频、API 数据等)。

  1. 工作模型
  • 基于 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服务器例子在仓库中

今天的更新就到这里,如有错误欢迎指出