linux 学习进展 网络编程 ——HTTP 协议详解
前言前面我们把TCP 三次握手、四次挥手、TIME_WAIT、UDP 套接字编程全部学完了TCP/UDP 属于传输层协议。实际上网、浏览器访问网页、接口调用、前后端交互底层都是 TCP上层跑的就是HTTP 协议。本节课重点搞懂 HTTP 是什么、请求报文、响应报文、请求方法、状态码、HTTP 工作流程最后结合 Linux Socket 手写一个极简 HTTP 服务器把网络编程真正落地到网页访问。一、HTTP 协议基础概念1. 什么是 HTTPHTTPHyperText Transfer Protocol超文本传输协议是应用层协议基于TCP实现。作用用于浏览器 - 服务器之间传输超文本数据HTML、图片、CSS、JS、接口 JSON 等。2. HTTP 核心特点基于 TCP 可靠传输默认端口80无状态服务器不记录客户端是谁每次请求都是独立的靠 Cookie / Session / Token 做身份记录。明文传输数据不加密所以有了 HTTPSHTTPSSL/TLS 加密。请求 - 响应模型客户端发请求 → 服务器返回响应一问一答。简单灵活文本格式易读、易解析。3. HTTP 工作流程浏览器域名解析 DNS → 拿到服务器 IP浏览器和服务器TCP 三次握手建立连接浏览器发送HTTP 请求报文服务器解析请求返回HTTP 响应报文浏览器渲染页面 / 解析数据断开连接短连接或保持长连接二、HTTP 报文整体结构HTTP 分两种报文HTTP 请求报文浏览器 → 服务器HTTP 响应报文服务器 → 浏览器都由三部分组成起始行请求行 / 状态行请求头 / 响应头空行实体体请求体 / 响应体可选三、HTTP 请求报文详解1. 请求行格式请求方法 URL HTTP版本示例GET /index.html HTTP/1.12. 常见请求方法GET获取资源参数拼在 URL 后面无请求体POST提交数据有请求体用于登录、表单提交PUT修改资源DELETE删除资源HEAD只拿响应头不拿响应体OPTIONS询问服务器支持的请求方法3. 请求头Request Headers常用字段Host: 服务器域名/IP User-Agent: 浏览器客户端标识 Accept: 能接收的数据类型 Content-Type: 请求体数据格式 Content-Length: 请求体长度 Cookie: 身份凭证 Connection: keep-alive 保持长连接 / close 短连接4. 请求体只有 POST/PUT 等方法才有存放提交的表单数据、JSON 数据。四、HTTP 响应报文详解1. 状态行格式HTTP版本 状态码 描述信息示例HTTP/1.1 200 OK2. 常用状态码2xx 成功200 OK请求成功3xx 重定向301永久重定向302临时重定向304资源未修改走缓存4xx 客户端错误404 Not Found资源不存在403 Forbidden禁止访问400 Bad Request请求报文格式错误5xx 服务器错误500 服务器内部错误502 网关错误503 服务不可用3. 响应头plaintextServer: 服务器软件 Content-Type: 响应数据类型(text/html、application/json) Content-Length: 响应体长度 Connection: keep-alive Set-Cookie: 下发Cookie给浏览器4. 响应体真正返回给浏览器的数据HTML 页面、图片、JSON、文件等。五、HTTP/1.0 与 HTTP/1.1 区别HTTP/1.0默认短连接一次请求响应完立刻四次挥手断开 TCPHTTP/1.1默认长连接Connection: keep-alive一个 TCP 连接可以多次 HTTP 请求响应支持断点续传、管道请求六、Linux 网络编程手写极简 HTTP 服务器利用前面 TCP 套接字知识写一个能被浏览器直接访问的 HTTP 服务器。功能基于 TCP浏览器访问127.0.0.1:8080服务器返回一段 HTML 网页c运行#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #define PORT 8080 #define BUF_SIZE 1024 // 构造HTTP响应 char *http_response HTTP/1.1 200 OK\r\n Content-Type: text/html;charsetutf-8\r\n Content-Length: 80\r\n Connection: close\r\n \r\n htmlbodyh1Hello Linux HTTP Server/h1p自制HTTP协议服务器/p/body/html; int main() { int lfd socket(AF_INET, SOCK_STREAM, 0); if(lfd 0){ perror(socket); return 0; } // 端口复用 int opt 1; setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt)); struct sockaddr_in serv; memset(serv, 0, sizeof(serv)); serv.sin_family AF_INET; serv.sin_port htons(PORT); serv.sin_addr.s_addr INADDR_ANY; bind(lfd, (struct sockaddr *)serv, sizeof(serv)); listen(lfd, 5); printf(极简HTTP服务器启动成功端口%d\n, PORT); printf(浏览器访问http://127.0.0.1:8080\n); char buf[BUF_SIZE]; while(1) { struct sockaddr_in clnt; socklen_t len sizeof(clnt); int cfd accept(lfd, (struct sockaddr *)clnt, len); // 读取浏览器发来的HTTP请求报文 read(cfd, buf, BUF_SIZE); printf(收到HTTP请求\n%s\n, buf); // 固定返回HTTP响应 write(cfd, http_response, strlen(http_response)); close(cfd); memset(buf, 0, BUF_SIZE); } close(lfd); return 0; }编译运行gcc http_server.c -o http_server ./http_server打开浏览器输入http://127.0.0.1:8080就能看到网页内容这就是最底层 HTTP 协议的工作过程。七、HTTP 与 HTTPS 简单区别HTTP明文、端口 80、不安全、容易被抓包篡改HTTPSHTTP SSL/TLS 加密、端口 443、传输加密、安全八、学习小结HTTP 是应用层协议底层基于 TCP 可靠传输。分为请求报文、响应报文都是文本格式结构固定。掌握常用请求方法、状态码、请求头、响应头是网络编程必备。HTTP/1.1 默认长连接减少频繁三次握手 / 四次挥手开销。可以用原生 Linux Socket 手写极简 HTTP 服务器理解浏览器和服务器交互本质。HTTPS 就是 HTTP 加加密解决明文不安全问题。