Linux软件编程学习笔记(十一)——HTTP协议

一、HTTP协议简介

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于客户端和服务器之间进行数据传输的应用层协议。

我们平时使用浏览器访问网页,本质上就是浏览器作为客户端,通过HTTP协议向Web服务器发送请求,服务器处理请求后,再把结果返回给浏览器。

基本通信过程:

复制代码
客户端                         服务器
  │                              │
  │────── HTTP请求 ─────────────→│
  │                              │
  │←────── HTTP响应 ─────────────│
  │                              │

二、HTTP的特点

HTTP建立在TCP协议之上。

可以理解为:

复制代码
应用层      HTTP
             ↓
传输层      TCP
             ↓
网络层      IP
             ↓
数据链路层

所以HTTP通信通常需要先建立TCP连接。

例如访问:

复制代码
http://192.168.0.125:8080

大致过程:

复制代码
socket()
    ↓
connect()
    ↓
建立TCP连接
    ↓
发送HTTP请求
    ↓
接收HTTP响应
    ↓
close()

三、HTTP请求

客户端发送给服务器的数据叫做HTTP请求(Request)。

一个基本的HTTP请求格式:

复制代码
请求行
请求头
空行
请求正文

例如:

复制代码
GET /index.html HTTP/1.1
Host: 192.168.0.125
Connection: close

四、请求行

请求行主要包含三个部分:

复制代码
请求方法    URL    HTTP版本

例如:

复制代码
GET /index.html HTTP/1.1

其中:

复制代码
GET

表示请求方法。

复制代码
/index.html

表示请求的资源。

复制代码
HTTP/1.1

表示使用HTTP/1.1协议。


五、HTTP常见请求方法

1. GET

用于获取服务器资源。

例如:

复制代码
GET /index.html HTTP/1.1

表示向服务器请求:

复制代码
/index.html

2. POST

用于向服务器提交数据。

例如登录、注册、上传数据等。

复制代码
POST /login HTTP/1.1

3. PUT

用于更新服务器上的资源。

4. DELETE

用于删除服务器上的资源。

在初学阶段,重点掌握:

复制代码
GET
POST

即可。


六、HTTP请求头

请求头用于向服务器提供一些额外信息。

例如:

复制代码
Host: 192.168.0.125
Connection: close
User-Agent: Mozilla/5.0

常见请求头:

请求头 作用
Host 指定服务器主机
User-Agent 客户端信息
Connection 是否保持连接
Content-Type 请求数据类型
Content-Length 请求正文长度

七、空行

HTTP请求中非常重要的一部分就是:

复制代码
请求头
请求头
请求头

请求正文

请求头和请求正文之间必须有一个空行。

例如:

复制代码
POST /login HTTP/1.1
Host: 192.168.0.125
Content-Length: 10

username=aa

服务器通过这个空行可以知道:

HTTP请求头结束,后面开始进入请求正文。


八、HTTP响应

服务器收到HTTP请求后,会向客户端返回HTTP响应(Response)。

基本格式:

复制代码
状态行
响应头
空行
响应正文

例如:

复制代码
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 13

Hello World!

九、HTTP状态码

HTTP响应中的状态码非常重要。

常见状态码:

状态码 含义
200 请求成功
201 创建成功
301 永久重定向
302 临时重定向
400 请求错误
401 未授权
403 禁止访问
404 资源不存在
500 服务器内部错误

其中最常见的是:

复制代码
200 OK

表示请求成功。

以及:

复制代码
404 Not Found

表示请求的资源不存在。


十、HTTP响应头

例如:

复制代码
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 13
Connection: close

常见响应头:

响应头 作用
Content-Type 指定返回数据类型
Content-Length 指定响应正文长度
Connection TCP连接方式
Server 服务器信息
Location 重定向地址

十一、Content-Type

Content-Type 用来表示数据的类型。

例如:

网页:

复制代码
Content-Type: text/html

普通文本:

复制代码
Content-Type: text/plain

JPEG图片:

复制代码
Content-Type: image/jpeg

PNG图片:

复制代码
Content-Type: image/png

因此服务器发送不同类型的文件时,需要设置相应的 Content-Type。


十二、使用C语言实现简单HTTP服务器

HTTP本身建立在TCP之上,所以我们之前学习的TCP服务器代码仍然可以使用。

基本流程:

复制代码
socket()
   ↓
bind()
   ↓
listen()
   ↓
accept()
   ↓
recv()       ← 接收HTTP请求
   ↓
解析请求
   ↓
open()       ← 打开网页文件
   ↓
send()       ← 返回HTTP响应
   ↓
close()

例如客户端请求:

复制代码
GET /index.html HTTP/1.1
Host: 192.168.0.125

服务器首先:

复制代码
recv(confd, buf, sizeof(buf), 0);

接收请求。

然后从请求中找到:

复制代码
/index.html

再打开:

复制代码
fd = open("index.html", O_RDONLY);

最后将文件内容通过:

复制代码
send(confd, buf, nret, 0);

发送给浏览器。


十三、最简单的HTTP响应

服务器可以直接发送:

复制代码
char response[] =
    "HTTP/1.1 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Content-Length: 12\r\n"
    "\r\n"
    "Hello World!";

然后:

复制代码
send(confd, response, strlen(response), 0);

浏览器收到后就可以按照HTTP协议解析。

这里的:

复制代码
\r\n

非常重要。

HTTP协议中的请求行、请求头等通常使用:

复制代码
\r\n

作为换行。

而:

复制代码
\r\n\r\n

表示:

复制代码
HTTP头部结束

十四、HTTP与TCP的关系

可以简单理解成:

复制代码
        HTTP
          ↓
        TCP
          ↓
         IP

TCP负责:

可靠地传输数据。

HTTP负责:

规定这些数据应该按照什么格式进行通信。

例如:

复制代码
HTTP/1.1 200 OK
Content-Type: text/html

Hello

这是HTTP定义的内容。

而这些数据最终通过TCP连接发送。

相关推荐
一个人旅程~1 小时前
关于imac27inch因改短用户名导致混合硬盘和系统崩溃的问题分析与故障解决
经验分享·笔记·macos·新浪微博
心祭丫丫2 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
爱莉希雅&&&2 小时前
GitLab 完整学习笔记
linux·运维·服务器
风笙9782 小时前
[文件系统]文件系统挂载与卸载详解
linux
GeW2 小时前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
派大猩猩_4 小时前
Obsidian 笔记怎么同步多端:Nutstore Sync 大笔记库同步测评
笔记·obsidian·obsidian插件·obsidian同步
陈希1234 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
Nerd(BUG版)5 小时前
Flutter学习day5--事件手势与命中测试
学习·flutter
Nerd(BUG版)6 小时前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin
東隅已逝,桑榆非晚6 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法