Linux 应用层协议HTTP

news2024/10/4 3:12:58

文章目录

  • 一、初始HTTP协议
  • 二、URL
    • 格式
    • 网络中怎么通过URL进行定位资源呢?
    • 编码和解码
  • 三、HTTP的请求格式和响应格式
    • HTTP的请求格式
    • HTTP的响应格式
    • HTTP的请求方法
      • GET方法
      • POST方法
      • GET Vs Post
      • HTTP的封装和分用
      • 文件流操作
      • 浏览器获得一个完整的网页流程
    • HTTP的状态码
    • 对3XX状态码的理解
    • HTTP常见的Header
      • 关于connection报头

一、初始HTTP协议

既然是协议,主要的作用就是为了统一,统一网络中数据的格式,来让所有设备都能够正确的解析,得到正确的数据。

  • 超文本传输协议,定义了客户端(浏览器…)与服务器之间如何通信,以及交换和传输超文本(如HTML文档)。
  • HTTP是一个无连接,无状态的协议,及每次进行请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

二、URL

  • 统一资源定位符。
  • 它提供了一种标准化的方式,用于定位网页、图片、视频、文件等各种网络资源。

格式

image-20241003165921703

image-20241003165942904

  • 超文本:能支持文本、图片、视频和音频等多种媒体类型。
  • 资源:HTTP上面获得的图片、视频、音频等。

网络中怎么通过URL进行定位资源呢?

所有的资源都是在服务器端,我们用http协议找到该资源,然后用URL进行标识,然后再通过http协议网络进行返回。

Linux系统中,一切皆文件,资源也是文件。 ===> 我们要找到对应的资源。 ===> 通过文件的路径进行标识。(当前机器上,可以标识文件的唯一性)

编码和解码

在URL中,有一些特殊的字符,如:空格、/、?、%、#等,当URL的内容中含有这些特殊字符的话,如果不进行处理的话,会影响URL的格式,导致解析错误。

所以为了解决这种情况,我们遇到这样的字符需要进行特殊的处理(转义),

转义规则:

将需要转码的字符转为 16 进制, 然后从右到左, 取 4 位(不足 4 位直接处理), 每 2 位做一位, 前面加上%, 编码成%XY 格式。

三、HTTP的请求格式和响应格式

HTTP的请求格式

image-20241003175105141

HTTP的响应格式

image-20241003175122053

HTTP的请求方法

HTTP的请求方法很多,但是最常见的就是GET、POST方法

image-20241003175300108

GET方法

  1. 用途:GET方法主要用于请求资源,即向服务器获取指定的数据或资源。
  2. 参数传递GET方法的请求参数会附加在URL后面,以键值对的形式呈现,如“?key1=value1&key2=value2”。
  3. 使用场景:GET方法通常用于搜索、排序、筛选等不涉及数据修改的操作。

POST方法

  1. 用途:POST方法主要用于向服务器提交数据,请求服务器进行处理,如提交表单或上传文件。
  2. 参数传递POST方法的请求参数包含在请求体中,而不是附加在URL后面
  3. 使用场景:POST方法通常用于创建新资源、提交表单数据或执行其他涉及数据修改的操作

GET Vs Post

  • GET:可以向服务器端发送数据。一般用来获取静态资源,也可以通过url向服务器传递参数。url传参,参数的体量一定不大,正文可以很大。
  • POST:可以通过http request的正文来进行参数传递。
  • POST方法,比GET方法参数更私密,但是都不安全!为了安全,需要对HTTP的参数部分进行加密(HTTPS)。
  • GET,没有请求正文,数据跟url放在一起;POST有请求正文,数据和正文放在一起。

HTTP的封装和分用

  • 将报头和有效载荷进行分离(封装):标志是空行\r\n
  • 在正文部分一定要有标识内容长度的字段 — 用来对有效载荷进行分离。

url中的第一个‘/’是web根目录,在底层需要在前面进行拼接一个字符串。

image-20241003225443112

但是用户要是访问一个目录,底层不会让其显示出所有的目录,只会显示出首页。所以底层还需要有个一个后缀‘index.html’(需要判断访问的是不是目录)

文件流操作

std::ifstream in(path, std::ios::binary);
if (!in.is_open()) return;
in.seekg(0, in.end); // 移动光标,从文件尾,向后移动0个偏移量
int filesize = in.tellg(); // 告知偏移量
in.seekg(0, in.beg); // 移动光标,从文件头,向后移动0个偏移量
std::string(content);
content.resize(filesize);
in.read((char *)content.c_str(), filesize); // 从流中读取filesizse个字符读取到content
in.close();

浏览器获得一个完整的网页流程

  1. 发送HTTP请求获取HTML
    • 用户在浏览器中输入URL或点击链接。
    • 浏览器解析URL,构建HTTP请求,并通过网络发送到服务器。
    • 服务器接收请求,处理并返回HTML文档的响应。
  2. 解析HTML文档
    • 浏览器接收HTML文档的响应,并开始解析。
    • 解析过程中,浏览器会识别出HTML文档中的标签,如<img>, <link>, <script>, <iframe>等,这些标签通常包含了对其他资源的引用。
  3. 检测并请求额外资源
    • 对于每个识别出的资源引用,浏览器会构建新的HTTP请求来获取这些资源。
    • 这些资源可能包括CSS样式表、JavaScript脚本、图片、视频、音频文件等。
    • 浏览器会按照HTML文档中的顺序或根据某些策略(如优先级、并行请求数量限制等)来发送这些请求。
  4. 接收并处理资源
    • 服务器接收这些请求,并返回相应的资源。
    • 浏览器接收这些资源,并根据需要将其缓存起来。
    • 对于CSS和JavaScript资源,浏览器会解析并应用它们,以改变页面的样式或添加交互功能。
    • 对于图片和其他媒体资源,浏览器会将其渲染在页面上。
  5. 渲染页面
    • 一旦所有必要的资源都被获取并处理完毕,浏览器就会开始渲染页面。
    • 渲染过程包括布局计算、绘制等步骤,最终将页面呈现给用户。
  6. 后续交互
    • 用户可以与页面进行交互,如点击按钮、输入文本等。
    • 这些交互可能会触发新的HTTP请求,以获取更多数据或更新页面内容。

HTTP的状态码

image-20241003181343771

对3XX状态码的理解

  • 重定向:客户端访问服务器,服务器给客户端响应一个location地址,客户端转而访问location地址。
  • 临时重定向:客户端一直访问服务器,然后服务器给客户端响应。
  • 永久重定向:客户端第一次访问服务器,第二次以后,客户端直接访问location。

永久重定向是给搜索引擎看的。

image-20241003182117509

HTTP常见的Header

  • Content-Type: 数据类型(text/html 等)
  • Content-Length: Body 的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

关于connection报头

  • HTTP 中的 Connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态

    核心作用

  • 管理持久连接:Connection 字段还用于管理持久连接(也称为长连接)。持久连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接,以便在同一个连接上发送多个请求和接收多个响应。

    持久连接(长连接)

  • HTTP/1.1:在 HTTP/1.1 协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复用同一个连接。

  • HTTP/1.0:在 HTTP/1.0 协议中,默认连接是非持久的。如果希望在 HTTP/1.0上实现持久连接,需要在请求头中显式设置 Connection: keep-alive。

    语法格式

  • Connection: keep-alive:表示希望保持连接以复用 TCP 连接。

  • Connection: close:表示请求/响应完成后,应该关闭 TCP 连接。

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

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

相关文章

一、Linux下MySQL的安装与使用

文章目录 1. 基于docker安装mysql2. 字符集的相关操作2.1 修改MySQL5.7字符集2.2 各级别的字符集2.3 字符集与比较规则(了解)2.4 请求到响应过程中字符集的变化 3. SQL大小写规范3.1 Windows和Linux平台区别3.2 Linux下大小写规则设置3.3 SQL编写建议 4. sql_mode的合理设置4.1…

知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)

Neo4j简介 Neo4j 是一个基于图结构的 NoSQL 数据库&#xff0c;专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集&#xff0c;如社交网络、推荐系统、知识图谱等领域。 与传统的关系型数据库…

端侧大模型系列 | 端侧AI Agent任务拆解大师如何助力AI手机?(简短版)

引言 简介 模型 实验 意义&前景: 总结 引言 今人不见古时月&#xff0c;今月曾经照古人。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖沙茶面的小女孩。 设想一下&#xff0c;你的智能手机不再只是"聪明"&#xff0…

12.梯度下降法的具体解析——举足轻重的模型优化算法

引言 梯度下降法(Gradient Descent)是一种广泛应用于机器学习领域的基本优化算法&#xff0c;它通过迭代地调整模型参数&#xff0c;最小化损失函数以求得到模型最优解。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.知晓梯度下降法的具体流程 2.掌握不同梯度下降法…

力扣 中等 129.求根节点到叶子结点数字之和

文章目录 题目介绍解法 题目介绍 解法 法一&#xff1a;有返回值、 class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}public int dfs(TreeNode root, int x) {if (root null) {return 0;}x x * 10 root.val;if (root.left root.right) { //…

LC刷题专题:dfs、哈希表合集

自己刷题缺少分类思想&#xff0c;总是这里刷一道那里刷一道&#xff0c;以后建立几个专辑&#xff0c;然后自己新刷的同类型的题目都会即使更新上。 文章目录 690. 员工的重要性 690. 员工的重要性 2024-10-03 题目描述&#xff1a; 我第一次写并没有考虑到dfs&#xff0c;…

基于Arduino的L298N电机驱动模块使用

一.简介&#xff1a; L298N作为电机驱动芯片&#xff0c;具有驱动能力强&#xff0c;发热量低&#xff0c;抗干扰能力强的特点,一个模块可同时驱动两个直流电机工作&#xff0c;能够控制电机进行正转、反转、PWM调速。 说明&#xff1a; 1&#xff09;12V输入端口接入供电电压…

esp32开发环境搭建和烧录测试

文章目录 前言一、硬件环境1、esp32开发板。2、两个micro usb 数据线&#xff0c;一路用于供电&#xff0c;另一路用于烧录和调试3、喇叭&#xff0c; 淘宝上买的 4 欧姆 3 W扬声器 二、软件环境配置1、开发软件2、ESP-IDF简介下载 3、vscode安装配置1、安装vscode2、安装IDF插…

论文提纲怎么写?分享5款AI论文写作软件

在学术研究和写作过程中&#xff0c;撰写高质量的论文是一项挑战性的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;AI论文写作工具逐渐成为帮助学者和学生提高写作效率的重要工具。这些工具不仅能够提高写作效率&#xff0c;还能帮助简化复杂的写作流程&#…

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

【JNI】hello world

JNI&#xff0c;作为java和C/C的中间层&#xff0c;为在Java中调用C/C代码提供了便利。作为初学者&#xff0c;这里简单记录学习的过程。 本文所有的操作都在kali linux上进行&#xff0c;jdk环境以及gcc&#xff0c;g编译器需自行提前安装好 操作系统&#xff1a; jdk&#…

行为型模式-命令-迭代-观察者-策略

命令模式 是什么 将一个请求封装成为一个对象, 从而可以使用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及可以撤销的操作 实例 请求封装成为对象 //用来声明执行操作的接口 public abstract class Command { protected Receiver receiver; public Comma…

【网络原理】Udp报文结构,保姆级详解,建议收藏

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 一、UDP报文格式 ​ ​ 可以看出UDP报文主要由报头和正文两部分构成&#xff0c;报头存储了此次报文的一些重要信息&#xff0c;而正文才是真正需要传输的内容。本篇文章就主要…

【Kubernetes】常见面试题汇总(五十二)

目录 116. K8S 集群服务暴露失败&#xff1f; 117.外网无法访问 K8S 集群提供的服务&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-…

Windows 环境上安装 NASM 和 YASM 教程

NASM 和 YASM NASM NASM&#xff08;Netwide Assembler&#xff09;是一个开源的、可移植的汇编器&#xff0c;它支持多种平台和操作系统。它可以用来编写16位、32位以及64位的代码&#xff0c;并且支持多种输出格式&#xff0c;包括ELF、COFF、OMF、a.out、Mach-O等。NASM使用…

复习HTML(进阶)

前言 上一篇的最后我介绍了在表单中&#xff0c;上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…

SQL Inject-基于报错的信息获取

常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路&#xff1a; 在MySQL中使用一些指定的函数来制造报错&am…

YOLOv8改进 - 注意力篇 - 引入SEAttention注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SEAttention注意力在YOLOv8中的使用。包含SEAttention原理分析&#xff0c;SEAttention的代码、SEAttention的使用方法、以及添加以后的yaml文件及运行记录。 二、SEAttention原理分析 SEAttention官方论文地址&#xff1…

深度学习——线性神经网络(一、线性回归)

目录 一、线性回归1.1 线性回归的基本元素1.1.1 术语介绍1.1.2 线性模型1.1.3 损失函数1.1.4 解析解1.1.5 随机梯度下降1.1.6 模型预测 1.2 正态分布与平方损失 因为线性神经网络篇幅比较长&#xff0c;就拆成几篇博客分开发布。目录序号保持连贯性。 一、线性回归 回归&#x…

基于单片机智能百叶窗卷帘门自动门系统

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…