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 小时前
【Rust入门知识点学与练】第1课变量与打印
开发语言·学习·rust
OpenPomeloxCommunity1 小时前
Linux驱动基础(一):模块机制的设计与实现
linux
浔溺1 小时前
al+大数据每日学习笔记32
大数据·笔记·学习
Shadow(⊙o⊙)1 小时前
Linux网络——文件与网络的连接桥梁struct sock {
linux·运维·网络
xian_wwq1 小时前
【学习笔记】深度认知系列-第10讲AI绘画与设计——从Stable Diffusion到Midjourney
笔记·学习·ai作画
凯尔萨厮1 小时前
Java学习笔记十五(GUI)
java·笔记·学习
新时代牛马1 小时前
Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证
linux·运维·服务器
陈年老古董1 小时前
矿物分类实战:从传统机器学习到深度学习(含PyTorch实现)
笔记·深度学习·学习·机器学习·分类
咖啡忍者1 小时前
【SAP】100小时学会SAP-5生产计划PP
笔记