HTTP的工作原理

news2024/11/22 16:34:22

HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一,被广泛用于万维网上的数据通信。(超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。)

不要被官方性语言吓到,简单来说,网络上传输东西有一定的规则, 就像收发快递有包装、贴码等标准一样,我们在网络上传递的信息也会有一定的标准,而HTTP就是网络上传输多种信息的标准(不仅仅是文本,所以叫超文本)。

那这个“标准“具体都有啥呢?从下图可以看出HTTP包含了请求、响应及会话三个部分,下面我们分别进行讲解。

一、HTTP 请求

当我们在浏览器中输入网址并回车后,浏览器会向服务器发送一个 HTTP 请求。这个请求由多个部分组成,其中最重要的是请求行、头部和正文。

1、请求行:

请求行包含三个部分,分别是请求方法、请求 URI 和 HTTP 版本号。

1)请求方法指定了客户端想要执行的动作,例如 GET、POST、PUT、DELETE 等。

2)请求 URI 指定了要访问的资源的位置,也就是我们想要的信息的存放地。

3)HTTP 版本号表示请求所使用的 HTTP 协议版本,往往是HTTP1.1,了解即可。

2、头部:

包含了一系列的键值对,用于向服务器传递一些请求信息。例如,Accept 表示客户端可以接受的响应内容类型,User-Agent 表示客户端的浏览器信息,Referer 表示客户端从哪个页面跳转而来等等。

3、正文:

正文是可选的(有的有正文,有的没有,get就没有请求正文),用于向服务器传递一些数据。例如,当客户端向服务器提交表单时,表单数据就可以放在请求的正文中。

4、HTTP 请求报文(实际应用)

上面我们已经讲了HTTP请求的格式和内容,下面我们讲一下HTTP请求在实际传输过程中是什么样子的。

HTTP请求报文组成部分(再简述一下上面的理论):

1)请求行(必须在 HTTP 请求报文的第一行)

2)请求头(即头部,从第二行开始,到第一个空行结束。请求头和请求体之间存在一个空行,是键值对)

3)请求体(即正文,通常以键值对 {key:value}方式传递数据)

下面是HTTP请求进行传递时的样子,

这段请求的意思就是:以POST方式请求访问某台 HTTP 服务器上的 /form/login 页面资源,并附带参数 name = veal、age = 37,是HTTP1.1版本,请求体长度为16

二、HTTP 响应

当服务器收到客户端的请求后,它会向客户端返回一个 HTTP 响应。与请求类似,响应也由多个部分组成,其中最重要的是状态行、头部和正文。

1、状态行:

状态行包含三个部分,分别是 HTTP 版本号、状态码和状态短语。

1)HTTP 版本号表示响应所使用的 HTTP 协议版本。

2)状态码是一个三位数字,用于表示服务器对请求的处理结果。常见的状态码有 200 表示成功、404 表示未找到资源、500 表示服务器内部错误等等。HTTP 定义了很多状态码,用于表示服务器对请求的处理结果。这些状态码被分成 5 类,分别是 1xx、2xx、3xx、4xx 和 5xx。

其中,

  1xx 表示信息类状态

  2xx 表示成功状态,例如 200 表示成功,201 表示资源创建成功。

  3xx 表示重定向状态,例如 301 表示永久重定向,302 表示临时重定向。

  4xx 表示客户端错误状态,例如 400 表示请求格式错误,401 表示未授权,404 表示未找到资源等等。

  5xx 表示服务器错误状态,例如 500 表示服务器内部错误,503 表示服务器暂时无法处理请求等等。

常见状态码及其含义:

3)状态短语是对状态码的简短描述,例如 200 对应的状态短语是 OK,404 对应的状态短语是 Not Found。

2、头部:

包含了一系列的键值对,用于向客户端传递一些响应信息。

例如,Content-Type 表示响应内容的类型,Content-Length 表示响应内容的长度,Set-Cookie 表示服务器要求客户端保存一个 Cookie 等等。

3、正文:

响应的实际内容。例如,当客户端请求一个网页时,网页的 HTML 代码就可以放在响应的正文中。

4、响应报文(实际应用)

HTTP 的响应报文组成部分:

1)响应行(必须在 HTTP 响应报文的第一行)报文协议及版本,状态码及状态描述

2)响应头(从第二行开始,到第一个空行结束。响应头和响应体之间存在一个空行,是键值对)

3)响应体

例,

在响应行开头的 HTTP 1.1 表示服务器对应的 HTTP 版本。紧随的 200 OK 表示请求的处理结果的“状态码”和“原因短语”。

三、HTTP 会话(cookie、session)

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。会话技术就是记录这次会话中客户端的状态和数据的。

简单来说,一次会话就是你与某个网站进行了一次完整的交流,这个交流可能会你来我往很多次(一次会话可能会有很多次请求、响应,就像人与人的一次会话会有很多对话)。

HTTP 是一种无状态协议,这意味着每次请求都是独立的,服务器不会记录客户端的状态信息。为了实现状态管理,HTTP 引入了 Cookie 和 Session 机制。

简单来说,你和网站服务器又不和人一样能面对面互相见到,它怎么知道你是你?cookie与session就相当于我们双方的“脸部特征”,让我们能够互相认识,而不用每说一句之前都得重新“自我介绍“。

1、通俗介绍:

1)Session:由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是 Session。

典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的 Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。

这个 Session是保存在服务端的,有一个唯一标识。在服务端保存 Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑 Session的转移,在大型的网站一般会有专门的 Session服务器集群,用来保存用户会话,这个时候 Session信息都是放在内存的,使用一些缓存服务比如 Memcached之类的来放 Session。

2)Cookie:思考一下服务端如何识别特定的客户?这个时候 Cookie就登场了。

每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie来实现 Session跟踪的,第一次创建 Session的时候,服务端会在HTTP协议中告诉客户端,需要在Cookie里面记录个SessionID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。

设想你某次登陆过一个网站,只需要登录一次就可以在一定时间内浏览这个网站的所有内容,这是如何做到的?也是 Cookie

Cookie是指某些网站为了辨别用户身份而储存在客户端上的数据(通常经过加密)。也就是说,只要有了某个用户的 cookie,就能以他的身份登录。

2、官方介绍

1)Cookie 是一种在客户端保存状态信息的机制。服务器可以通过 Set-Cookie 头部向客户端发送一个 Cookie,客户端在下一次请求时将该 Cookie 发送回服务器。服务器可以根据 Cookie 的内容来识别客户端的身份,从而实现状态管理。

2)Session 是一种在服务器保存状态信息的机制。服务器在接收到客户端的请求时,为该客户端创建一个 Session 对象,并将该对象的 ID 保存在一个 Cookie 中发送给客户端。客户端在下一次请求时将该 Cookie 发送回服务器,服务器根据 Cookie 中的 Session ID 来查找该客户端对应的 Session 对象,从而实现状态管理。

3)其中工作原理大致如下:

 客户端请求服务端

 服务端开启会话,并下发一个特殊的COOKIE(会话的唯一标识符),   服务端将会话数据存储在指定位置

 客户端收到服务端响应内容,并且保存这个COOKIE

 客户端在下一次请求服务端时带上这个COOKIE,服务端根据这个唯一标识符读取相关会话数据,恢复会话的状态

3、基于COOKIE、SESSION能做什么?

有了COOKIE,我们能存储SESSION在浏览器端的唯一标识,能存储其他各种不敏感的数据。

有了SESSION,我们能对同一个用户的连续访问行为进行识别,用户可以 避免重复登录的烦恼,比如你在PC上登录天猫,就能很欢乐的连续买买买,而不用买一件登录一次。

简单来说,有了COOKIE、SESSION,我们就能进行连续请求与响应(与服务器已经“互相认识”),不用每次请求之前都得重新登录

四、相关练习

这里有几道不错的CTF题,大家可以找着做一下。

攻防世界的:

web基础-攻防世界-CSDN博客

CTFHub技能树的(作者以后会出CTFHub技能树的专栏,希望小伙伴们多多支持):

web-前置技能(HTTP协议)-CTFHub-CSDN博客

参考文献:

HTTP 的工作原理

HTTP协议演进与各版本特性

计算机网络——HTTP协议原理-CSDN博客

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

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

相关文章

数据交换的金钟罩:合理利用安全数据交换系统,确保信息安全

政府单位为了保护网络不受外部威胁和内部误操作的影响,通常会进行网络隔离,隔离成内网和外网。安全数据交换系统是专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。 使用…

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型: 上面的类型是非常常用,很重要的类型。 除此之外的其他类型不常用,只是在特定的场景能够发挥用处&#…

澳鹏干货 | 大语言模型的上下文窗口 (Context Windows)

大语言模型(LLMs)极大地提升了人工智能在理解和生成文本方面的能力。其中一个影响其效用的重要方面是“上下文窗口”(Context Windows)—— 这个概念直接影响着模型接收和生成语言的有效性。 本期澳鹏干货将深入探讨上下文窗口对…

微软确认Word离奇Bug 命名不当会导致文件被删

微软近日确认Word应用中存在一个Bug,该漏洞可能导致用户在特定情况下错误地删除文件。该问题主要出现在文件命名过程中,如果用户在保存Word文件时采用特定的命名方式,文件可能会被移动到回收站。 根据微软支持中心的消息,如果用户…

MVS海康工业相机达不到标称最大帧率

文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前,OpenAI等GPT服务厂商主要提供HTTP接口,这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题,Spring团队推出了Spring AI ,它提供了统一且标准化的接口来对接不同的AI服务提供商…

毕设分享 大数据用户画像分析系统(源码分享)

文章目录 0 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Linux-Docker阿里云镜像仓库失效

写在前面&#xff0c;这个是我很早之前在VmWare安装的Linux7,通过yum 安装的docker&#xff0c;但是今天怎么都无法pull镜像&#xff0c;报错如下。 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waitin…

在IDEA里用XDebug调试PHP,断点....

做程序开发,调试必不可少,这里最近用到了PHP,顺便写个关于PHP的调试安装使用: 1、首先是PHP先安装xdebug扩展(还有zend的),这个我的工具是IDEA,所以安装方法也相对简单,如果你是用VSCode等应该也是一样,如下图,找到这个PHP->DEBUG 2、直接点上面的Install XDebug 就可以帮你…

Unity网络开发 - C#开源网络通信库PESocket的使用

概述 在现代多人在线游戏中&#xff0c;稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例&#xff0c;读者不仅能够了解PESocket的基本用法&#xff0c…

Windows11系统下Sentinel环境搭建教程

目录 前言Sentinel简介Sentinel下载安装Sentinel配置与启动总结 前言 本文为博主在项目环境搭建时记录的Sentinel安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Sentinel简介 github主页地址 &#x…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…

Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Ruby脚本:自动化网页图像下载的实践案例

随着互联网的快速发展&#xff0c;网页上的内容变得越来越丰富&#xff0c;尤其是图像资源。对于需要大量图像资源的设计师、内容创作者或数据分析师来说&#xff0c;手动下载这些图片不仅耗时耗力&#xff0c;而且效率低下。因此&#xff0c;自动化网页图像下载成为了一个迫切…

3_路由器分组交换知多少?20241009

上次介绍到了路由器的分组交换戛然而止&#xff0c;这次扫盲式介绍下。 1、分组交换的主要特点 分组交换则采用存储转发技术1-11 表示把一个报文划分为几个分组后再进行传送。通常我们把要发送的整块数据称为一个报文(message)。在发送报文之前&#xff0c;先把较长的报文划分成…

java-02 数据结构-队列

在Java中&#xff0c;队列是一种常见的数据结构&#xff0c;用于在保持顺序的同时存储和检索数据。Java提供了java.util.Queue接口&#xff0c;它的常见实现包括ArrayDeque、LinkedList和PriorityQueue等。 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只…

元数据 - iXML

在专业的音频和视频制作中&#xff0c;元数据的准确传递对于后期制作和编辑至关重要。iXML&#xff08;iXML Metadata&#xff09;是一种开放的、可扩展的元数据规范&#xff0c;旨在在录音设备和数字音频工作站&#xff08;DAW&#xff09;之间传递详细的录音信息。 一、什么是…