【探索Linux】P.33(HTTP协议)

news2025/7/10 17:55:31

在这里插入图片描述

阅读导航

  • 引言
  • 一、认识URL
  • 二、URL编码和解码
    • 1. Urlencode(URL编码)
    • 2. Urldecode(URL解码)
  • 三、HTTP的方法
  • 四、HTTP的状态码
  • 五、HTTP常见Header
  • 六、最简单的HTTP服务器
  • 温馨提示

引言

在上一篇文章中,我们深入探讨了“自定义协议”的概念、原理及其应用,并通过一个实际案例——跨网络计算器,展示了自定义协议如何有效地促进不同网络环境下的设备间通信和数据交换。自定义协议的灵活性和高效性为特定场景下的通信提供了强有力的支持。

今天,我们将转换视角,聚焦于互联网世界中最为广泛使用的一种协议——HTTP协议。HTTP(超文本传输协议)是构建万维网(WWW)的基础,它定义了客户端与服务器之间如何进行数据的传输和沟通。通过本文的介绍,我们将了解HTTP协议的基本结构、工作原理以及它在网络通信中的重要性。让我们一起开始这段关于HTTP协议的学习之旅吧。

一、认识URL

URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。而在实际中,也有一些例外,最常见的情况就是一个 URL 指向了不存在的或是被移动过的资源。由于通过 URL 呈现的资源和 URL 本身由 Web 服务器处理,因此 web 服务器的拥有者需要认真地维护资源以及与它关联的 URL。

一个 URL 由不同的部分组成,其中一些是必须的,而另一些是可选的。让我们以下面这个 URL 为例看看其中最重要的部分:
在这里插入图片描述

  1. http 是协议。它表明了浏览器必须使用何种协议。它通常都是 HTTP 协议或是 HTTP 协议的安全版,即 HTTPS。Web 需要它们二者之一,浏览器也知道如何处理其他协议,比如 mailto:(打开邮件客户端)或者 ftp:(处理文件传输),所以当你看到这些协议时,不必惊讶。
  2. www.example.com 是域名。它表明正在请求哪个 Web 服务器。或者,可以直接使用IP address,但是因为它不太方便,所以它不经常在网络上使用。
  3. :80 是端口。它表示用于访问 Web 服务器上的资源的技术“门”。如果 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)来授予其资源的访问权限,则通常会被忽略。否则是强制性的。
  4. /path/to/myfile.html 是网络服务器上资源的路径。在 Web 的早期阶段,像这样的路径表示 Web 服务器上的物理文件位置。如今,它主要是由没有任何物理现实的 Web 服务器处理的抽象。
  5. ?key1=value1&key2=value2 是提供给网络服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。在返回资源之前,Web 服务器可以使用这些参数来执行额外的操作。每个 Web 服务器都有自己关于参数的规则,唯一可靠的方式来知道特定 Web 服务器是否处理参数是通过询问 Web 服务器所有者。
  6. #SomewhereInTheDocument 是资源本身的另一部分的锚点。锚点表示资源中的一种“书签”,给浏览器显示位于该“加书签”位置的内容的方向。例如,在 HTML 文档上,浏览器将滚动到定义锚点的位置;在视频或音频文档上,浏览器将尝试转到锚代表的时间。

🚨注意后面的部分(也称为片段标识符)从来没有发送到请求的服务器。上面内容摘自:MDN

在网络通信中,尤其是通过HTTP协议进行数据传输时,经常需要对URL中的某些字符进行编码和解码,以确保数据的正确性和安全性。urlencodeurldecode就是这样两种常用的技术。

二、URL编码和解码

1. Urlencode(URL编码)

urlencode是一种编码机制,用于将非ASCII字符和一些特殊字符转换为可以在URL中安全传输的格式。这是因为URL只允许一小部分字符直接显示,而其他字符可能会引起歧义或被错误地解释。例如,空格' '在URL中通常被视为参数分隔符,而不是字符串的一部分。因此,urlencode会将空格转换为+,或者将其转换为%20这样的百分比编码形式。

在进行urlencode时,以下字符会被保留,不需要编码:

  • 字母(a-zA-Z
  • 数字(0-9
  • - _ . ! ~ * ' ( )

所有其他字符都会被编码为%后跟两位十六进制数的形式。

2. Urldecode(URL解码)

urlencode相对应,urldecode是将编码后的URL转换回原始格式的过程。例如,%20会被解码回空格' '+会被解码回空格,其他编码的字符也会被转换回其原始表示。

  1. 应用场景

    • 表单提交:在HTML表单中,用户输入的数据需要通过URL或POST请求发送到服务器。urlencode用于确保这些数据在传输过程中不会被误解或损坏。
    • URL参数:URL中的查询字符串参数经常需要包含特殊字符,使用urlencode可以确保这些参数能够正确地被服务器解析。
    • 数据传输:在网络应用中,为了确保数据的完整性和准确性,发送方需要对数据进行urlencode,接收方在接收到数据后需要进行urldecode以还原数据的原始形式。
  2. 示例

    • 原始字符串:Hello, World!
    • urlencode后:Hello%2C%20World!
    • urldecode后:Hello, World!

通过urlencodeurldecode,我们可以确保在网络中传输的数据不会因为特殊字符而遭到破坏,从而保证了数据的完整性和安全性。这两种技术在日常网络应用中扮演着至关重要的角色。

三、HTTP的方法

方法简介支持HTTP协议版本
GET请求从服务器获取指定资源的数据。GET请求应该是幂等的,多次执行相同的GET请求应得到相同的结果。HTTP/1.1
POST向服务器提交数据,请求服务器处理并可能创建新资源。POST请求可能会导致服务器上数据的改变。HTTP/1.1
PUT请求服务器存储一个资源,并用请求体中的内容替换目标资源的所有当前内容。HTTP/1.1
DELETE请求服务器删除指定的资源。HTTP/1.1
HEAD请求获取与GET请求相同的响应,但没有响应体。HEAD请求主要用于检查资源的元数据。HTTP/1.1
OPTIONS请求查询服务器的性能,如询问哪些HTTP方法该服务器支持。HTTP/1.1
PATCH请求对资源应用部分修改。PATCH请求主要用于更新资源的一部分,而不是整个资源。HTTP/1.1, HTTP/2
CONNECT用于代理服务器,建立到目标服务器的隧道。主要用于HTTPS代理。HTTP/1.1
TRACE回显服务器收到的请求,主要用于测试或诊断。HTTP/1.1

四、HTTP的状态码

下表是一些常见的HTTP状态码

状态码说明适用场景
100Continue服务端已接收到请求的初始部分,要求客户端继续发送剩余部分。
200OK请求成功。常用的状态码之一。
201Created请求成功并且服务器创建了新的资源。
202Accepted服务器已接受请求,但尚未处理完成。
203Non-Authoritative Information服务器已成功处理请求,但返回的信息可能来自另一来源。
204No Content服务器成功处理请求,但没有返回任何内容。
205Reset Content服务器成功处理请求,且要求客户端重置其文档视图。
206Partial Content服务器成功处理了部分请求。
300Multiple Choices指示请求的资源有一系列可供选择的回馈信息,用户或浏览器能够自行选择一个首选的地址进行重定向。
301Moved Permanently请求的资源已永久移动到新位置,以后应使用资源现在所指的URI。
302Found请求的资源现在临时从不同的URI响应请求。
303See Other与302类似,但要求始终使用头字段中给出的新的URI进行后续请求。
304Not Modified自从上次请求后,请求的资源未修改过。
305Use Proxy被请求的资源必须通过指定的代理才能被访问。
307Temporary Redirect请求的资源临时从不同的URI响应请求。
400Bad Request服务器无法理解请求的格式。
401Unauthorized请求要求身份验证。
402Payment Required保留有效,但尚未使用。
403Forbidden服务器拒绝请求。
404Not Found请求失败,服务器找不到请求的资源。
405Method Not Allowed禁用请求中指定的方法。
406Not Acceptable服务器无法提供请求的响应,因为客户端不接受服务器可以生成的响应格式。
407Proxy Authentication Required要求代理身份验证。
408Request Timeout服务器在等待客户端发送请求时超时。
409Conflict服务器在尝试处理请求时发生冲突。
410Gone请求的资源永久性地从服务器上移除了。
411Length Required服务器拒绝请求,因为请求没有包含有效的长度头部。
412Precondition Failed服务器未满足请求者在请求中设置的其中一个前提条件。
413Payload Too Large服务器无法处理请求,因为请求的主体过大。
414URI Too Long请求的URI过长,服务器无法处理。
415Unsupported Media Type服务器无法处理请求,因为请求的媒体类型不被支持。
416Range Not Satisfiable无法满足请求的Range头所指定的范围。
417Expectation Failed服务器无法满足请求者在请求中设置的期望值。
500Internal Server Error服务器遇到错误,无法完成请求。
501Not Implemented服务器不具备完成请求的功能。
502Bad Gateway服务器作为网关或代理,从上游服务器收到无效响应。
503Service Unavailable服务器目前无法使用(由于超载或停机维护)。
504Gateway Timeout服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505HTTP Version Not Supported服务器不支持请求中所用的HTTP协议版本。

⭕ 这些状态码是HTTP协议中定义的一部分,用于告知客户端请求的处理结果。状态码分为五个类别:1xx(信息性状态码),2xx(成功状态码),3xx(重定向状态码),4xx(客户端错误状态码)和5xx(服务器错误状态码)。每个状态码都有其特定的含义和用途,帮助开发者和用户理解HTTP请求的结果,并采取相应的措施。

五、HTTP常见Header

头部名称描述请求/响应常见值示例
Host指定请求的服务器域名和端口号请求example.com:80
User-Agent客户端的用户代理信息请求Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept客户端可接受的媒体类型请求text/html,application/xhtml+xml,application/xml
Accept-Language客户端偏好的语言请求en-US,en;q=0.5
Accept-Encoding客户端可接受的压缩格式请求gzip, deflate
Connection指定连接的选项请求keep-aliveclose
Content-Type发送数据的媒体类型请求/响应application/x-www-form-urlencoded
Content-Length请求体的长度请求/响应123
Authorization认证信息请求Basic YWRtaW46YWRtaW4= (基本认证示例)
Cache-Control请求和响应的缓存指令请求/响应no-cache, no-store, must-revalidate
Cookie客户端发送的cookie信息请求sessionid=abc123; username=johndoe
Server服务器软件信息响应Apache/2.4.7 (Unix)
Set-Cookie服务器设置新的cookie响应sessionid=abc123; expires=Sat, 10 Apr 2021 08:00:00 GMT
WWW-Authenticate认证挑战信息响应Basic realm="Restricted Area"
Date响应生成的日期和时间响应Tue, 07 Apr 2025 16:00:00 GMT
Last-Modified资源最后修改的时间响应Tue, 07 Apr 2025 15:00:00 GMT
ETag资源的特定版本标识符响应"xyz123"

请注意,上表中的“常见值示例”列仅提供了可能的值,并不是完整的头部字段值。实际的头部字段值可能会根据具体的应用场景和需求而有所不同。

六、最简单的HTTP服务器

#include <sys/socket.h>  // 引入套接字相关的头文件
#include <netinet/in.h>    // 引入处理IPv4地址的头文件
#include <arpa/inet.h>     // 引入INET相关函数的头文件
#include <unistd.h>        // 引入UNIX标准函数,如close()
#include <stdio.h>         // 引入标准输入输出头文件
#include <string.h>        // 引入字符串处理函数的头文件
#include <stdlib.h>        // 引入标准库函数,如atoi()

// 打印服务器的使用方法
void Usage() {
    printf("usage: ./server [ip] [port]\n");
}

int main(int argc, char* argv[]) {
    // 确保命令行参数数量正确(应为3个:程序名、IP地址和端口号)
    if (argc != 3) {
        Usage();
        return 1;
    }

    // 创建一个基于IPv4的TCP套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) {
        perror("socket"); // 如果创建失败,打印错误信息
        return 1;
    }

    struct sockaddr_in addr; // 定义一个地址结构体
    addr.sin_family = AF_INET; // 设置为IPv4地址族
    addr.sin_addr.s_addr = inet_addr(argv[1]); // 设置IP地址
    addr.sin_port = htons(atoi(argv[2])); // 设置端口号,并转换为网络字节序

    // 将套接字绑定到指定的IP地址和端口
    int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if (ret < 0) {
        perror("bind"); // 如果绑定失败,打印错误信息
        return 1;
    }

    // 开始监听传入的连接,允许最多10个连接同时等待
    ret = listen(fd, 10);
    if (ret < 0) {
        perror("listen"); // 如果监听失败,打印错误信息
        return 1;
    }

    // 无限循环,持续接受客户端的连接
    for (;;) {
        struct sockaddr_in client_addr; // 定义客户端地址结构体
        socklen_t len = sizeof(client_addr); // 定义长度变量
        // 接受一个客户端连接,并将客户端的地址信息存储在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};
        // 从客户端读取数据,最多读取缓冲区大小-1字节
        ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);
        if (read_size < 0) {
            perror("read"); // 如果读取失败,打印错误信息
            close(client_fd); // 关闭客户端套接字
            continue; // 继续下一次循环
        }

        // 打印接收到的请求
        printf("[Request] %s\n", input_buf);

        // 定义一个缓冲区,用于存储响应数据
        char buf[1024] = {0};
        // 定义要发送的HTML内容
        const char* hello = "<h1>hello world</h1>";
        // 格式化HTTP响应消息,包括HTTP头部和HTML内容
        sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);
        // 将响应消息发送回客户端
        write(client_fd, buf, strlen(buf));

        // 关闭客户端套接字
        close(client_fd);
    }

    // 关闭服务器套接字
    close(fd);

    return 0; // 正常退出
}

这段代码是一个简单的HTTP服务器实现,它监听指定的IP地址和端口上的TCP连接,并响应每个连接以"Hello, World!"页面,服务器使用标准的套接字API来处理网络通信。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1635347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点

1、帧类型 CAN (Controller Area Network) 帧格式是为了高效、可靠地在多个节点间传输数据而设计的。CAN 帧有几种类型,包括数据帧(标准帧和扩展帧)、远程帧、错误帧和过载帧,其中数据帧和远程帧是最常用的。 2、数据帧 数据帧包括:标准帧和扩展帧。 两者的主要区别: …

solidworks出现slderrresu.dll错误如何解决?亲测有效

通过近来给客户安装SolidWorks发现&#xff0c;SolidWorks2010、SolidWorks2012、SolidWorks2014、SolidWorks2015、SolidWorks2016、SolidWorks2017都会出现这个slderrresu.dll安装错误问题&#xff1a; 其实这个错误很好解决,主要是因為安裝中文版solidworks沒有選擇安裝中文…

VS Code开发STM32F4xx jlink接口swd模式

VS Code开发STM32F4xx jlink接口swd模式(测试OK) 下面的代码(已验证),只作为参考,不同情况的更改参照文章末尾链接 c_cpp_properties.json代码 (其中include路径和宏定义可以参照makefile添加) : {"configurations": [{"name"…

Vue生命周期都有哪些?

定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom($el)->渲染、更新->渲染&#xff0c;卸载等一系列的过程。el是挂载点如<div id"app"></div>。 Vue的生命周期分为八个阶段 1.beforeCreate…

C++-10

1.C一个程序&#xff0c;实现两个类&#xff0c;分别存放输入的字符串中的数字和字母&#xff0c;并按各自的顺序排列&#xff0c; 类中实现-一个dump函数&#xff0c;调C用后输出类中当前存放的字符串结果。 例如&#xff0c;输入1u4y2a3d,输出:存放字母的类&#xff0c;输出a…

Oracle21C判断[点]是否在[多边形]内

环境 Oracle Database 21c Express Edition Release 21.0.0.0.0OracleSpatial函数 SELECT sdo_inside( sdo_geometry( 2001, NULL, SDO_POINT_TYPE(118.439140, 31.385456, NULL), NULL, NULL ), SDO_GEOMETRY( 2003, NULL, NULL, sdo_elem_info_array(1, 2003, 2), SDO_ORDI…

conda env list找不到anaconda/envs下的环境。Could not find conda environment。

home/用户名/anaconda3/envs中的环境与conda env list下显示的环境不一致。 想进入home/用户名/anaconda3/envs中的环境&#xff0c;显示环境不存在。 重点&#xff01;&#xff01;&#xff01;&#xff08;conda activate 环境地址 可进入环境&#xff09; 这一步最重要&…

一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;一种基于YOLOv8改进的高精度小目标检测算法&#xff0c; 在红外小目标检测任务中实现暴力涨点&#xff1b; &#x1f4a1;&#x1f4a1;&#x1f4a1;创新点&#xff1a; 1&#xff09;SPD-Conv特别是在处理低分…

IT外包的可扩展性及其如何推动业务增长

在当前数字化的时代&#xff0c;企业的发展与其IT战略的有效性息息相关。随着市场需求和技术的不断变化&#xff0c;企业需要灵活和可扩展的IT解决方案以适应不断变化的环境。IT外包作为一种智慧选择&#xff0c;为企业提供了卓越的可扩展性&#xff0c;从而推动了业务的增长。…

Leetcode-轮转数字

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 目录 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 题目 解题 第一种方法 第二种方法 题目 给定一个整数数组 …

如何把为知笔记导入到Notion笔记里面

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 为知笔记并不开放&#xff0c;笔记文件只能以pdf或者图片的方向导出来&#xff0c;无法与其他笔记文件相互导入导出&#xff0c;然而&#xff0c;稍…

如何测试响应式网站

我们每天通过多种设备访问互联网。移动电话&#xff0c;台式机/笔记本电脑&#xff0c;平板电脑&#xff0c;平板电脑…我们所掌握的设备数量已经增长为天文数字。作为消费者&#xff0c;体验很棒。我们可以随时随地在任何设备上自由访问互联网。但对于Web开发人员&#xff0c;…

stable diffusion controlnet前处理中的图像resize

在SD controlnet应用中&#xff0c;一般都要先安装controlnet_aux&#xff0c;并在项目代码中import相关前处理模块&#xff0c;如下所示。 在对control image进行前处理&#xff08;比如找边缘&#xff0c;人体特征点&#xff09;之前&#xff0c;往往会图像进行resize&#x…

Ollama配置webui连接大预言模型

Ollama配置Web UI连接大预言模型 默认ollama安装后&#xff0c;chat对话只有命令行界面&#xff0c;交互体验较差。借助open-webui可以通过web界面连接ollama&#xff0c;从而实现类似chatgpt式的web交互体验。 使用家用PC实践记录如下&#xff1a; 1. 环境配置 本次使用的操作…

python学习笔记----数据容器(六)

一、数据容器的入门 python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素。每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否…

JAVA自定义日期选择器

下载jar地址&#xff0c; https://toedter.com/jcalendar/ jar包下载地址 依赖包如下图所示&#xff1a; 整个项目代码已经上传到CSDN https://download.csdn.net/download/qq_30273575/89241601?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9kb3dubG9hZC9tYW5hZ2UvZG93bmxvYWQ…

由异常的测试眼图引发的深入思考

最近的信号测试中&#xff0c;出现了“双眼皮”的眼图测试效果&#xff0c;直觉告诉我&#xff0c;这肯定是有问题的&#xff0c;于是&#xff0c;脑海中就出现了很多的场景假设&#xff0c;并将可能的导致因素总结如下&#xff1a; 1. PCB通道阻抗设计不匹配&#xff0c;负载端…

Windows 本地直接使用 SSH,SFTP 以及 SFTP下载文件到 Windows/mac 本地或上传(没有客户端时)

windows 本地打开 ssh 以及 sftp 等的方式 1.win(windows图标那个键) r 直接搜 然后从打开的位置运行 如果是打开 sftp 前面的 ssh 换一下成sftp 就行 直接从地址栏输入也可以直接转过去 通过 windows 的工具直接访问 sftp 后将文件下载到自己的windows 或 mac 上 先通过…

Pandas 2.2 中文官方教程和指南(二十五·一)

原文&#xff1a;pandas.pydata.org/docs/ 食谱 原文&#xff1a;pandas.pydata.org/docs/user_guide/cookbook.html 这是一个简短而精炼的示例和链接存储库&#xff0c;包含有用的 pandas 示例。我们鼓励用户为此文档添加内容。 在这一部分添加有趣的链接和/或内联示例是一个…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…