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

在这里插入图片描述

阅读导航

  • 引言
  • 一、认识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.mzph.cn/diannao/5271.shtml

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

相关文章

LLaMA3(Meta)微调SFT实战Meta-Llama-3-8B-Instruct

LlaMA3-SFT LlaMA3-SFT, Meta-Llama-3-8B/Meta-Llama-3-8B-Instruct微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/LLaMA3-SFT默认数据类型为bfloat6 备注 1. 非常重要: weights要用bfloat16/fp32/tf32(第二版大模型基本共识), 不要用fp16, f…

坚守食品安全,美乐家(中国)守护大众健康

在现代社会&#xff0c;食品安全已成为公众关注的焦点&#xff0c;对于食品行业的企业而言&#xff0c;确保食品安全是极为重要的责任。产品是消费者与企业之间最直接、最紧密的纽带&#xff0c;也是消费者对品牌的最直观印象。因此&#xff0c;美乐家一直将产品质量、安全、绿…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP&#xff1a;可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP&#xff1a;可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认&#xff08;像GBN&#xff09;单个重传定时器&#xff08;像…

XYCTF 2024

Web 参考博客&#xff1a;https://www.yuque.com/yunzhiyunweiji/wrgkex/rfpnkn0293l7cp09#ezMake ezhttp Via - HTTP | MDN 代理那里难住了 XFF不给用可以用client-ip ezmd5 让我们上传图片并比较&#xff0c;结合题目名可以猜测应该是比较两个图片的md5值是否相同&…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments&#xff0c;获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

使用硬盘对拷方法将数据无损转移到另一个硬盘!

硬盘对拷&#xff0c;其实就是磁盘克隆&#xff0c;很多人喜欢将其说成对拷&#xff0c;或者硬盘复制等&#xff0c;但不管怎么说&#xff0c;他们的目的都是一个&#xff0c;想要把原硬盘上的全部数据&#xff08;包括系统、程序、个人文件、隐藏配置数据等&#xff09;都无损…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…

虚析构与纯虚析构

这里的new Cat("Tom"&#xff09;是由于基类函数中的构造函数里面带有string变量 1. 法一:利用虚函数&#xff0c;虚化基类中的析构函数 virtual ~Animal() { cout << "动物的析构函数调用" << endl; } 2. 法二:利用纯…

JAVA自定义日期选择器

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

ROS1快速入门学习笔记 - 10服务数据的定义和使用

目录 一、服务模型&#xff08;客户端/服务器&#xff09; 二、自定义服务数据 1. 定义srv文件 2. 在package.xml中添加功能包依赖 3. 在CMakeLists.txt添加编译选项 4. 编译生成语言相关文件 5. 配置服务器/客户端代码编译规则 6. 编译并运行程序 7. Python文件 一…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

若依:Linux Centos 7.9 安装部署RuoYi前后端集成版

目录 1.虚拟机操作系统版本 2.删除旧的jdk 3.下载JDK 17 &#xff1a; 4.下载 mvn 3.9.6&#xff1a; 5.下载mysql:5.7.44版本 6.git下载若依&#xff1a; 7.修改数据库连接&#xff1a; 8.mvn 清理和打包 9.启动若依&#xff1a; 1.虚拟机操作系统版本 2.删除旧的jd…

几个容器网络问题实战解析

容器云平台和容器网络紧密结合&#xff0c;共同构建了容器化应用程序的网络基础设施&#xff0c;实现了容器之间的通信、隔离和安全性。文中容器云平台采用的容器网络组件是calico&#xff0c;这个是业界普遍采用的一种方案&#xff0c;性能及安全性在同类产品中都是比较好的。…

什么是视频号小店?应该如何操作?全网最详细的解答来了!

大家好&#xff0c;我是电商糖果 “视频号小店”这个词这两年在电商圈很火&#xff0c;但是因为它是2022年下半年才出来的。 就有很多刚接触电商的朋友&#xff0c;对它并不了解。 于是就有不少朋友问糖果&#xff0c;视频号小店去哪里找&#xff1f;什么是视频号小店&#…

汽车信息安全入门总结(2)

目录 1.引入 2.汽车信息安全技术 3.密码学基础知识 4.小结 1.引入 上篇汽车信息安全入门总结(1)-CSDN博客主要讲述了汽车信息安全应该关注的点&#xff0c;以及相关法规和标准&#xff0c;限于篇幅&#xff0c;继续聊信息安全相关技术以及需要掌握的密码学基础知识。 2.汽…

OpenAI发布GPT-4.0使用指南

大家好&#xff0c;ChatGPT 自诞生以来&#xff0c;凭借划时代的创新&#xff0c;被无数人一举送上生成式 AI 的神坛。在使用时&#xff0c;总是期望它能准确理解我们的意图&#xff0c;却时常发现其回答或创作并非百分之百贴合期待。这种落差可能源于我们对于模型性能的过高期…

区块链技术下的DApp与电商:融合创新,开启商业新纪元

区块链技术的蓬勃发展正引领着一种新型应用程序的崛起——去中心化应用程序&#xff08;DApp&#xff09;。DApp并非传统的中心化应用&#xff0c;它构建于去中心化网络之上&#xff0c;融合了智能合约与前端用户界面&#xff0c;为用户提供了全新的交互体验。智能合约&#xf…

webpack 常用插件

clean-webpack-plugin 这个插件的主要作用是清除构建目录中的旧文件&#xff0c;以确保每次构建时都能得到一个干净的环境。 var { CleanWebpackPlugin } require("clean-webpack-plugin") const path require("path");module.exports {mode: "de…

MATLAB 2024a软件下载安装教程

1-首先下载Matlab&#xff0c;以下迅雷云链接&#xff0c;里面有全版本的matlab&#xff0c;根据自己的需要下载即可&#xff0c;建议下载最新版的&#xff0c;功能会更多&#xff0c;当然内存也会更大。 迅雷云盘迅雷云盘https://pan.xunlei.com/s/VNgH_6VFav8Kas-tRfxAb3XOA…