当前位置: 首页 > article >正文

【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

urlencodeurldecode 是处理URL中查询字符串(query string)的两种常见方法。这些方法确保URL中的特殊字符被正确编码和解码,以便它们可以在网络中安全传输。

urlencode

urlencode 是一个函数,它将字符串转换为可以在URL中安全使用的格式。在URL中,某些字符具有特殊含义,例如 & 用于分隔参数,= 用于赋值,而空格可能表示参数的结束。如果这些字符是参数值的一部分,它们就需要被编码。

以下是 urlencode 常见的转换规则:

  • 空格 转换为 +%20

  • 特殊字符(如 ! # $ & ' ( ) * + , : ; = ? @ [ ])转换为 % 后跟它们对应的十六进制值

例如,假设我们有一个查询字符串参数 name=John Doe,使用 urlencode 后,它可能被转换为 name=John+Doename=John%20Doe

 

urldecode

urldecodeurlencode 的逆过程。它将经过 urlencode 处理的字符串转换回原始字符串。这通常在服务器端进行,因为服务器需要知道用户发送的确切参数值。

继续上面的例子,如果服务器接收到 name=John+Doename=John%20Doeurldecode 将其转换回原始字符串 name=John Doe

HTTP协议请求与响应格式

HTTP(Hypertext Transfer Protocol,超文本传输协议)是用于从服务器传输超文本到本地浏览器的传输协议。它定义了客户端(通常是浏览器)和服务器之间交换数据的请求和响应格式。

 

我们先看下面的HTTP初步设计思路 在再回来看这里的后续内容

 

HTTP(超文本传输协议)请求通常由以下几个部分组成:

  1. 请求行:包括请求方法、URL 和 HTTP 版本。

  2. 请求报头(Headers):包含了关于客户端环境和请求本身的信息。

  3. 空行:请求头和请求体之间必须有一个空行。用于将报头和有效载荷进行分离(封装)空行\r\n

  4. 请求体(可选):包含请求的数据,例如表单数据或上传的文件。

以下是一个简单的 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

代码定位&#xff1a;南毅c/Linux - Gitee.com HTTP协议 介绍 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c…...

web3.0简介

Web3.0&#xff08;或简称 Web3&#xff09;是近年来广泛讨论的一个新型互联网概念&#xff0c;其核心思想在于利用区块链及相关分布式技术&#xff0c;打造一个更加开放、去中心化、透明且以用户为主导的网络生态系统。这意味着在 Web3.0 时代&#xff0c;用户不再只是信息的消…...

高频 SQL 50 题(基础版)_626. 换座位

高频 SQL 50 题&#xff08;基础版&#xff09;_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是什么&#xff1f; 基于Hadoop的数据仓库工具&#xff0c;支持类SQL&#xff08;HiveQL&#xff09;查询&#xff0c;底层转换为MapReduce/Tez/Spark任务。 核心功能&#xff1a;数据ETL、查询、分析&#xff1b;定位&#xff1a;OLAP&#xff08;分析…...

【Jenkins】个人向-Jenkinsfile如何写

官方参考&#xff1a;https://www.jenkins.io/doc/book/pipeline/syntax/ Pipeline Utility Steps 插件&#xff1a;https://birdbook.com.cn/ops/ci/jenkins/plugins/pipeline%20utility%20steps.html 常用环境变量 含义表达式备注params&#xff0c;传入参数传入参数params…...

python第十一课:并发编程 | 多任务交响乐团

&#x1f3af; 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目&#xff1a;高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 &#x1f3bb; 生活化比喻&#xff1a; 多线程 → 餐厅多个…...

Android SystemUI深度定制实战:下拉状态栏集成响铃功能开关全解析

一、功能实现全景视图 目标场景&#xff1a;在Android 14系统级ROM定制中&#xff0c;为SystemUI下拉状态栏的QuickQSPanel区域新增响铃模式切换开关&#xff0c;实现静音/响铃快速切换功能。该功能需通过三层关键改造实现&#xff1a; 二、核心实现三部曲 1. 配置注入&…...

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…...

ubuntu下r8125网卡重启丢失修复案例一则

刚装的一台服务器&#xff0c;ubuntu24.04&#xff0c;主板网卡是r8125&#xff0c;安装服务后会莫名其妙丢失驱动 按照官网的方法下载最新8125驱动包&#xff1a; Realtek 然后卸载驱动 rmmod r8125 然后在驱动包里安装&#xff08;幸好我之前装了build-essential&#x…...

解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server

当使用 MySQL 时&#xff0c;您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上&#xff0c;服务器还没有配置为接受来自相关主机的连接。 Common Caus…...

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态&#xff0c;电调控制电机转速&#xff0c;遥控器通道控制飞行动作。电池C…...

Qt:窗口

目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…...

深入浅出 Go 语言:协程(Goroutine)详解

深入浅出 Go 语言&#xff1a;协程(Goroutine)详解 引言 Go 语言的协程&#xff08;goroutine&#xff09;是其并发模型的核心特性之一。协程允许你轻松地编写并发代码&#xff0c;而不需要复杂的线程管理和锁机制。通过协程&#xff0c;你可以同时执行多个任务&#xff0c;并…...

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…...

elpis全栈课程学习之elpis-core学习总结

elpis全栈课程学习之elpis-core学习总结 核心原理 elpis-core是全栈框架elpis的服务端内核&#xff0c;主要应用于服务端接口的开发以及页面的SSR渲染&#xff0c;elpis-core基于约定优于配置的原理&#xff0c;通过一系列的loader来加载对应的文件&#xff0c;大大节约用户的…...

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架&#xff0c;支持多种流行的语言模型&#xff0c;及多种微调技术&#xff0c;同时&#xff0c;以友好的交互式界面&#xff0c;简化了大语言模型的学习。 本章内容&#xff0c;从如何拉取&#xff0c;我已经搭建好的Llamafactory镜像开始&#xff0…...

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中&#xff0c;使用蓝牙电话拦截手机通话的声音&#xff0c;并对数据加工&#xff0c;这个功能出来也有一段时间了。前段时间有试用的用户咨询说&#xff1a;有没有办法在手机上&#xff…...

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集成 在现代企业级应用开发中&#xff0c;处理多个数据源是一个常见的需求。本文将详细介绍如何使用Spring Boot结合达梦数据库&#xff08;DM&#xff09;&#xff0c;并通过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一只用的顺手&#xff0c;写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难&#xff0c;毕竟Qt项目其实就是CMake&#xff08;QMake的情况这里就暂不考虑了&#xff09;项目&#xff0c;VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…...

【Linux】修改 core 文件大小和路径

在 Linux 系统中&#xff0c;默认情况下&#xff0c;核心转储文件&#xff08;core dump&#xff09;会生成在当前工作目录下。为了将核心转储文件生成在指定路径下&#xff0c;可以通过以下方法进行配置。 1. 设置核心转储文件路径 Linux 系统提供了两种方式来指定核心转储文…...

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型&#xff0c;具备数学推理、代码生成等深度能力&#xff0c;堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…...

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握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结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…...

【Linux网络#10】:Https协议原理

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xf…...

蓝桥杯备考:记忆化搜索之function

这道题是有重复的问题的&#xff0c;所以我们可以选择记忆化搜索 #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 服务&#xff0c;你需要配置 Nginx 以支持 WebDAV 请求。以下是详细的步骤&#xff1a; 1. 确保 Nginx 安装了 WebDAV 模块 Nginx 的 WebDAV 功能由 http_dav_module 模…...