【Linux网络-HTTP协议】HTTP基础概念+构建HTTP
代码定位:南毅c/Linux - Gitee.com
HTTP协议
介绍
虽然我们说,应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
认识URL
平时我们俗称的“网址”其实说的就是 URL
协议名称://server ip[:80]/a/b/c/d/e.html


-
为什么第一张图片有端口号,第二张实际网址却没有端口号呢?
默认端口:对于HTTP(超文本传输协议)请求,默认端口号是80;对于HTTPS(安全超文本传输协议)请求,默认端口号是443。当客户端(如浏览器)访问这些默认端口时,通常不需要在网址中指定端口号
用户友好性:为了简化用户的操作和提高用户体验,浏览器和网站设计者通常省略默认端口号,因为大多数用户不需要知道这些细节。
惯例:随着时间的推移,省略默认端口号已经成为一种标准和惯例。除非访问非标准端口,否则在网址中包含端口号是不常见的。
安全性:在HTTPS成为Web安全标准之后,大多数网站都迁移到了443端口。由于HTTPS请求默认使用443端口,因此没有必要在网址中显示端口号
以下是一些具体 情况:
-
当你输入
http://www.example.com时,浏览器默认会访问http://www.example.com:80。 -
当你输入
https://www.example.com时,浏览器默认会访问https://www.example.com:443。
只有在以下情况下,你才需要在网址中指定端口号:
-
访问非标准端口的Web服务。
-
开发者在本地机器上运行Web服务器,并使用非标准端口进行测试。
例如,如果你正在本地开发一个Web应用程序,并且你的服务器在端口3000上运行,那么你需要输入 http://localhost:3000 来访问该服务。
-
谈一谈URL后半部分的资源
我们用网络的目的就是接受信息发送信息,比如我们要下载一个视频就需要向服务器发送请求,服务器接收请求后再将资源发送到手机,这些资源全部都在服务器端,Linux操作系统适合做后端服务器,Linux下一切皆文件,我们要访问资源,以及服务器把资源返回给客户端都需要找到对应的资源,在Linux下通过路径就可以定位到资源

urlencode和urldecode
urlencode 和 urldecode 是处理URL中查询字符串(query string)的两种常见方法。这些方法确保URL中的特殊字符被正确编码和解码,以便它们可以在网络中安全传输。
urlencode
urlencode 是一个函数,它将字符串转换为可以在URL中安全使用的格式。在URL中,某些字符具有特殊含义,例如 & 用于分隔参数,= 用于赋值,而空格可能表示参数的结束。如果这些字符是参数值的一部分,它们就需要被编码。
以下是 urlencode 常见的转换规则:
-
空格 转换为
+或%20 -
特殊字符(如
! # $ & ' ( ) * + , : ; = ? @ [ ])转换为%后跟它们对应的十六进制值
例如,假设我们有一个查询字符串参数 name=John Doe,使用 urlencode 后,它可能被转换为 name=John+Doe 或 name=John%20Doe。
urldecode
urldecode 是 urlencode 的逆过程。它将经过 urlencode 处理的字符串转换回原始字符串。这通常在服务器端进行,因为服务器需要知道用户发送的确切参数值。
继续上面的例子,如果服务器接收到 name=John+Doe 或 name=John%20Doe,urldecode 将其转换回原始字符串 name=John Doe。
HTTP协议请求与响应格式
HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传输协议。它定义了客户端(通常是浏览器)和服务器之间交换数据的请求和响应格式。
我们先看下面的HTTP初步设计思路 在再回来看这里的后续内容
HTTP(超文本传输协议)请求通常由以下几个部分组成:
-
请求行:包括请求方法、URL 和 HTTP 版本。
-
请求报头(Headers):包含了关于客户端环境和请求本身的信息。
-
空行:请求头和请求体之间必须有一个空行。用于将报头和有效载荷进行分离(封装)空行\r\n
-
请求体(可选):包含请求的数据,例如表单数据或上传的文件。

以下是一个简单的 HTTP GET 请求示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
在这个例子中:
-
GET是请求方法,表明客户端想要获取服务器上的资源。 -
/index.html是请求的资源路径。 -
HTTP/1.1是使用的 HTTP 版本。
以下是一些常见的 HTTP 请求方法:
| 请求方法 | 描述 |
|---|---|
| GET | 请求指定的页面信息,并返回实体主体 |
| POST | 向服务器提交数据,数据包含在请求体中 |
| PUT | 向服务器提交数据,通常用于更新资源 |
| DELETE | 请求服务器删除指定的页面 |
| HEAD | 类似于 GET 请求,但服务器不会返回请求的页面主体,只返回响应头 |
| OPTIONS | 允许客户端查看服务器支持的 HTTP 方法 |
| PATCH | 是对 PUT 方法的补充,用于对资源进行部分更新 |
URI:我们要访问资源的路径
HTTP版本:http/1.0 http/1.1 http/2.0
请求报头(Headers)提供了关于请求、响应或者其他的发送信息,以下是一些常见的请求头字段
| 请求头字段 | 描述 |
|---|---|
| Host | 指定请求的服务器的域名和端口号 |
| User-Agent | 包含发出请求的用户代理软件信息 |
| Accept | 指定客户端能够接收的内容类型 |
| Accept-Language | 指定客户端接受的语言 |
| Accept-Encoding | 指定客户端能够解码的响应内容编码方式 |
| Connection | 控制不同请求/响应之间的网络连接的选项 |
请求体(Body)通常用于 POST 和 PUT 请求,它包含了要发送给服务器的数据。例如,提交表单数据时,请求体可能如下所示
Content-Type: application/x-www-form-urlencoded name=John+Doe&age=30&city=New+York
在这个例子中,请求体包含了一些键值对,它们通过 & 符号连接,并且每个键和值之间用 = 符号分隔。Content-Type 请求头指明了请求体的内容类型。
我们在看一看HTTP响应就简洁明了了

HTTP设计思路
TcpServer.hpp
语法解释

我们在执行这里加上读数据
读到一个请求--->交个上层处理--->再把结果响应出去

Http.hpp初步设计
我们根据回掉函数设计执行函数内容 返回一个空串

接着我们用浏览器访问我们的服务器


我们的服务器就接收到了请求
接着我们加一些元素


我们看到的其实是一个长长的字符串,只不过打印出来的时候格式被解析了

Http.hpp设计
我们已经见过了HTTP的请求与响应,那么我们现在重新设计一下这个文件

首先将请求内容长长的字符串进行反序列化
我们将来读到一个请求,一定要先构建一个结构化请求
反序列的过程我们要手动获取请求行,请求报头和正文,其中请求报头我们放在vector内
基本的反序列化


测试

进一步反序列化
我们之前是放在vector内部的,现在我们要像kv一样,给你Host我们取Host的内容,因此这里我们引入unordered_map



测试已经全部解析出来了

现在我们加两个函数,返回我们的url,以及要访问的资源

我们进行第一次测试

我们再进行第二次测试,这时候我们输入http://47.120.76.87:8889/a/b/c/a.html

此时我们也就发现我们请求的url会发生变化
一般网站都会添加首页,比如百度https://www.baidu.com

但是我们也可以百度一下,你就知道

一般情况下/index.html就是我们的首页文件,这样我们就可以通过两种方式访问一个页面,现在我们也为我们的网页设置一个首页,我们放在wwwroot目录下

我们在请求行解析的路径处理一下

接下来我们构建响应
响应构建
基本属性

接着将请求发送的数据进行序列化
也就是将收到的请求,填充到响应的描述中,并且合并成一个长的完整的字符串

接下来读取文件内容
此时我们在class HttpServer内设计

接着构建响应 获取内容

然后我们访问

再访问http://47.120.76.87:8888/index.html

这样首页创建完成了,并且带不带index.html都能访问到同一个页面
接着我们往网站加入一些元素,加入一些图片



我们明明只是进入主页,为什么还多进了image下的文件呢
这是因为获得一个完整的网页,浏览器首先要得到html,根据html标签,检测出我们还要获取其他资源,浏览器会继续发器http请求
我们也知道我们网页还需要登陆页面,注册页面等
各个页面之间是怎么转换的呢?
我们在这里又需要认识一个新标签 链接标签
HTML中的链接标签用于创建指向其他网页、文件、位置、电子邮件地址或任何其他资源的超链接。链接标签是 <a>,并且通常包含以下属性:
-
href:指定链接的目标地址。 -
target:指定在哪里打开链接。例如,_blank表示在新窗口或标签页中打开链接。 -
title:提供链接的额外信息,当鼠标悬停在链接上时显示
基本链接
<a href="https://www.example.com">访问示例网站</a>
打开新窗口或标签页
<a href="https://www.example.com" target="_blank">在新窗口中访问示例网站</a>
链接到同一页面的特定部分
<a href="#section1">跳转到页面的一节</a>
带标题的链接,当鼠标悬停在链接上时,将显示标题文本。
<a href="https://www.example.com" title="这是示例网站的链接">访问示例网站</a>
首先我们先建立几个文件

我们在index.html添加如下内容

访问服务器,就多了登陆页面

点进去后就跳转到登陆页面了

再往里补充报头信息,将文件类型转换成对应的Content-Type;以及状态码及其对应描述



相关文章:
【Linux网络-HTTP协议】HTTP基础概念+构建HTTP
代码定位:南毅c/Linux - Gitee.com HTTP协议 介绍 虽然我们说,应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。 在互联网世界中,…...
web3.0简介
Web3.0(或简称 Web3)是近年来广泛讨论的一个新型互联网概念,其核心思想在于利用区块链及相关分布式技术,打造一个更加开放、去中心化、透明且以用户为主导的网络生态系统。这意味着在 Web3.0 时代,用户不再只是信息的消…...
高频 SQL 50 题(基础版)_626. 换座位
高频 SQL 50 题(基础版)_626. 换座位 select(case when mod(id,2)!0 AND counts ! id then id1when mod(id,2)!0 AND counts id then idelse id -1end) as id,student fromseat,(selectcount(*) as countsfrom seat) as seat_counts order by id asc;...
hive 面试题
Hive基础概念 1.1 Hive是什么? 基于Hadoop的数据仓库工具,支持类SQL(HiveQL)查询,底层转换为MapReduce/Tez/Spark任务。 核心功能:数据ETL、查询、分析;定位:OLAP(分析…...
【Jenkins】个人向-Jenkinsfile如何写
官方参考:https://www.jenkins.io/doc/book/pipeline/syntax/ Pipeline Utility Steps 插件:https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html 常用环境变量 含义表达式备注params,传入参数传入参数params…...
python第十一课:并发编程 | 多任务交响乐团
🎯 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目:高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 🎻 生活化比喻: 多线程 → 餐厅多个…...
Android SystemUI深度定制实战:下拉状态栏集成响铃功能开关全解析
一、功能实现全景视图 目标场景:在Android 14系统级ROM定制中,为SystemUI下拉状态栏的QuickQSPanel区域新增响铃模式切换开关,实现静音/响铃快速切换功能。该功能需通过三层关键改造实现: 二、核心实现三部曲 1. 配置注入&…...
基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成
本教程的演示都将在 Flink CDC CLI 中进行,无需一行 Java/Scala 代码,也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业,包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…...
ubuntu下r8125网卡重启丢失修复案例一则
刚装的一台服务器,ubuntu24.04,主板网卡是r8125,安装服务后会莫名其妙丢失驱动 按照官网的方法下载最新8125驱动包: Realtek 然后卸载驱动 rmmod r8125 然后在驱动包里安装(幸好我之前装了build-essential&#x…...
解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server
当使用 MySQL 时,您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上,服务器还没有配置为接受来自相关主机的连接。 Common Caus…...
科普|无人机专业术语
文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态,电调控制电机转速,遥控器通道控制飞行动作。电池C…...
Qt:窗口
目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…...
深入浅出 Go 语言:协程(Goroutine)详解
深入浅出 Go 语言:协程(Goroutine)详解 引言 Go 语言的协程(goroutine)是其并发模型的核心特性之一。协程允许你轻松地编写并发代码,而不需要复杂的线程管理和锁机制。通过协程,你可以同时执行多个任务,并…...
Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
实验:k8s+keepalived+nginx+iptables
1、创建两个nginx的pod,app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理,VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…...
elpis全栈课程学习之elpis-core学习总结
elpis全栈课程学习之elpis-core学习总结 核心原理 elpis-core是全栈框架elpis的服务端内核,主要应用于服务端接口的开发以及页面的SSR渲染,elpis-core基于约定优于配置的原理,通过一系列的loader来加载对应的文件,大大节约用户的…...
LlamaFactory-webui:训练大语言模型的入门级教程
LlamaFactory是一个开源框架,支持多种流行的语言模型,及多种微调技术,同时,以友好的交互式界面,简化了大语言模型的学习。 本章内容,从如何拉取,我已经搭建好的Llamafactory镜像开始࿰…...
手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人
手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上ÿ…...
Spring Cloud LoadBalancer详解
一、介绍 Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现,用来替代Ribbon(已经停更), 二、Ribbon和Loadbalance 对比 组件组件提供的负载策略支持负载的客户端Ribbon随机 RandomRule轮询 RoundRobinRule 重试 RetryRule最低并发 Bes…...
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成
使用Spring Boot与达梦数据库(DM)进行多数据源配置及MyBatis Plus集成 在现代企业级应用开发中,处理多个数据源是一个常见的需求。本文将详细介绍如何使用Spring Boot结合达梦数据库(DM),并通过MyBatis Plus来简化数据库操作&…...
基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…...
【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目
Visual Studio Code一只用的顺手,写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难,毕竟Qt项目其实就是CMake(QMake的情况这里就暂不考虑了)项目,VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…...
【Linux】修改 core 文件大小和路径
在 Linux 系统中,默认情况下,核心转储文件(core dump)会生成在当前工作目录下。为了将核心转储文件生成在指定路径下,可以通过以下方法进行配置。 1. 设置核心转储文件路径 Linux 系统提供了两种方式来指定核心转储文…...
本地部署大语言模型-DeepSeek
DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型,具备数学推理、代码生成等深度能力,堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…...
【03】STM32F407 HAL 库框架设计学习
【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL(Hardware Abstraction Layer)库框架设计的详细学习教程。通过本文,读者将从零开始,逐步掌握STM32F407的基本知识、HAL库的配置步骤…...
鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2
// 1 // 2 ArkUI 基本语法 // 方舟开发框架(简称:ArkUI),是一套 构建HarmonyOS应用 界面 的框架。 // 构建页面的最小单位就是 "组件"。 // 组件名(参数) { // 内容 // } // .属性1() // .属性2() // .属性N() import text from @ohos.graphics.text // @En…...
SQLAlchemy系列教程:SQLAlchemy快速入门示例项目
SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单,并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程,包括安装依赖包,创建连…...
【Linux网络#10】:Https协议原理
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 生活总是不会一帆风顺…...
蓝桥杯备考:记忆化搜索之function
这道题是有重复的问题的,所以我们可以选择记忆化搜索 #include <iostream> using namespace std; typedef long long LL; const int N 25; LL ret[N][N][N]; LL dfs(LL a,LL b, LL c) {if(a<0 || b<0 || c<0) return 1;if(a>20 || b>20 || c…...
在Nginx上配置并开启WebDAV服务的完整指南
在Nginx上配置并开启WebDAV服务的完整指南 如何在 Nginx 上开启 WebDAV 服务 要在 Nginx 上开启 WebDAV 服务,你需要配置 Nginx 以支持 WebDAV 请求。以下是详细的步骤: 1. 确保 Nginx 安装了 WebDAV 模块 Nginx 的 WebDAV 功能由 http_dav_module 模…...
