Linux 应用层协议HTTP

news/2024/10/4 5:18:23 标签: http, 网络协议, 网络
http://www.w3.org/2000/svg" style="display: none;">

文章目录

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

一、初始HTTP协议

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

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

二、URL

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

格式

https://img-blog.csdnimg.cn/img_convert/dc0020f6152b4726c057ad9165b0ecef.png" alt="image-20241003165921703" />

https://img-blog.csdnimg.cn/img_convert/2f31c198d92f3cd743c8f0d7f998b762.png" alt="image-20241003165942904" />

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

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

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

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

编码和解码

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

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

转义规则:

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

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

HTTP的请求格式

https://img-blog.csdnimg.cn/img_convert/249ce5631ee4cd7b62b8b196477a6f73.png" alt="image-20241003175105141" />

HTTP的响应格式

https://img-blog.csdnimg.cn/img_convert/0ebe7ffdbc82b8b0ba05cdf89323adbe.png" alt="image-20241003175122053" />

HTTP的请求方法

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

https://img-blog.csdnimg.cn/img_convert/2d5573aa48d0e9ba4195bed778593be1.png" alt="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根目录,在底层需要在前面进行拼接一个字符串。

https://img-blog.csdnimg.cn/img_convert/65465254ae14faa34f10481d5aae2812.png" alt="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的状态码

https://img-blog.csdnimg.cn/img_convert/437488926e86be46f316ef5b1ceee466.png" alt="image-20241003181343771" />

对3XX状态码的理解

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

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

https://img-blog.csdnimg.cn/img_convert/af1591fdf792d5fd5a0988f24f99f8f3.png" alt="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.niftyadmin.cn/n/5689483.html

相关文章

Java | Leetcode Java题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution {public int findMinArrowShots(int[][] points) {if (points.length 0) {return 0;}Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {if (point1[1] > point2[1…

【分布式微服务云原生】详解Redis的主从模式,主服务器挂了如何从多个从服务器选出新的主服务器

深入探索Redis主从模式&#xff1a;架构、故障转移与最佳实践 摘要&#xff1a; 本文深入探讨了Redis的主从复制模式&#xff0c;包括其工作原理、故障转移机制以及如何配置和管理这一模式。文章通过清晰的结构和实例代码&#xff0c;帮助读者理解如何在实际项目中应用Redis主…

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…

nginx配置多域名共用服务器80端口

nginx配置多域名共用服务器80端口 多个域名&#xff0c;比如两个域名&#xff0c;这两个域名其实共用一台服务器&#xff08;意味着域名解析到同一个IP&#xff09;&#xff0c;一个域名为abc.com&#xff08;可以是http://abc.com或者www.abc.com&#xff09;,另外一个域名为x…

【rCore OS 开源操作系统】Rust HashMap应用 知识点及练习题

【rCore OS 开源操作系统】Rust HashMap应用 知识点及练习题 前言 这一章节中的题目难度一下子就起来了&#xff0c;难度主要在两个方面&#xff1a; Rust 特性 HashMap 相关 API 不熟悉题目理解&#xff08;英语理解能力丧失ed 不知道 HashMap API&#xff0c;问题也不大…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代&#xff0c;管理和备份手机数据变得越来越重要。无论是转移照片、备份短信&#xff0c;还是管理应用程序&#xff0c;一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件&#xff0c;已经成为许多用户的选择。但是&#xff0c;许多…

鼓组编写:SsdSample鼓映射 GM Map 自动保存 互换midi位置 风格模板 逻辑编辑器

SsdSample音源的键位映射 方便编写鼓的技巧 可以这样去设置键位关系的面板和钢琴卷帘窗的面板&#xff0c;方便去写鼓。 可以先按GM的midi标准去写鼓&#xff0c;然后比对下鼓的键位映射的关系&#xff0c;去调整鼓。 可以边看自己发b站等处的图文笔记&#xff0c;然后边用电…

Vue3 Pinia持久化存储

文章目录 Vue3 Pinia持久化存储一、引言二、安装Pinia和持久化插件1、安装2、注册持久化插件 三、定义Store并启用持久化1、组合式API定义Store2、选项式API定义Store 四、使用Store五、高级持久化配置1、自定义存储的key值和存储方式2、选择性存储对应字段 六、总结 Vue3 Pini…