HTTP的工作原理

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.rhkb.cn/news/444907.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】CRUD增删改查操作

文章目录 CRUD简介一、Creat 新增1.单行数据全列插入2.单行数据全指定列插入3.多行数据指定列插入 二、Retrieve 检索1.全列查询 --练习阶段最简单的查询:(在生产环境最好不要用!!)2.指定列查询3.结果去重查询4.where条…

柒拾伍- AI内容农场生产文章自动发布至公众号 (一)

一、内容农场 X AI 看过很多的新闻说 AI 产生 内容 污染网络,我也想试一下到底能污染成怎样。 然后为了编写爆款的内容,我选用这个 内容农场 的种子是来源于 微博热搜,让生长出来的垃圾文章更加火爆 涉及内容不能放 二、编写代码 关于代…

常用类(一)----包装类的使用和分析

文章目录 1.包装类2.课堂测试题3.包装类方法4.Integer创建机制5.Integer面试题 1.包装类 概念:基本数据类型对应的类就是包装类,就是为了把基本数据类型转换为包装类,使用这个类里面的方法操作数据----装箱的过程; //装箱&#…

springboot查询全部部门流程

前端发送请求后,会请求DeptController的方法list()。 package com.intelligent_learning_aid_system.controller;import com.intelligent_learning_aid_system.pojo.Dept; import com.intelligent_learning_aid_system.pojo.Result; import com.intelligent_learni…

ArcGis JS天地图 暗色地图

方法一&#xff1a;使用css filter 在body下增加svg&#xff0c;并增加需要用到的滤镜&#xff0c;这边用到x-rays <svg id"svgfilters" aria-hidden"true" style"position: absolute; width: 0; height: 0; overflow: hidden"version"…

Kafka-初识

一、Kafka是什么&#xff1f; Kafka是一个高度可扩展、弹性、容错和安全的分布式流处理平台&#xff0c;由服务器和客户端组成&#xff0c;通过高性能TCP网络协议进行通信。它可以像消息队列一样生产和消费数据。可以部署在裸机硬件、虚拟机和容器上&#xff0c;也可以部署在本…

鼠标市场洞察:数据分析揭示消费趋势!

鼠标整体数据分析 一. 概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前百个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。(以上两个接口有需求的可以找我要链接&#xff09; 1. 大盘整体…

基于Python flask的豆瓣电影可视化系统,豆瓣电影爬虫系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

ppt压缩文件怎么压缩?压缩PPT文件的多种压缩方法

ppt压缩文件怎么压缩&#xff1f;当文件体积过大时&#xff0c;分享和传输就会变得困难。许多电子邮件服务对附件的大小有限制&#xff0c;而在网络环境不佳时&#xff0c;上传和下载大文件可能耗时较长。此外&#xff0c;在不同设备上播放时&#xff0c;较大的PPT文件还可能导…

基于FPGA的以太网设计(一)

以太网简介 以太网&#xff08;Ethernet&#xff09;是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问控制的内容。以太网是目前应用最普遍的局域网技术&#xff0c;取代了其他局域网标准如…

GA-BP回归预测 | MATLAB实现GA-BP多输入单输出回归预测

回归预测 | MATLAB实现GA-BP多输入单输出回归预测 目录 回归预测 | MATLAB实现GA-BP多输入单输出回归预测预测效果基本介绍模型描述遗传算法神经网络GA-BP网络程序设计学习总结参考资料预测效果 基本介绍 MATLAB实现GA-BP多输入单输出回归预测,输入7个特征,输出1个,优化权重…

指针——数组(指针)传参

&#xff08;一&#xff09;前文问题答案解析 1、代码 int(*pa[10])[5] 的解析 某人&#xff1a;嗯&#xff0c;有*pa&#xff0c;这不很明显是个指针嘛&#xff0c;然后 [5] 说明是个数组指针&#xff0c;int类型&#xff0c;[10]。。。。 这这这&#xff0c;很明显不是指针。…

第38讲:Ceph分布式存储集群部署

文章目录 1.Ceph分布式存储集群安装方式2.Ceph集群环境规划3.基础环境配置3.1.设置主机名以及SSH免密登录3.2.配置Ceph yum源 4.部署Ceph分布式存储集群4.1.安装Ceph-deploy自动化部署工具4.2.初始化创建一个Ceph分布集群4.3.在每个节点中部署Ceph集群所有的组件4.4.部署并配置…

DevOps

DevOps中的Dev指的是Development&#xff08;开发&#xff09;&#xff0c;Ops指的是Operations&#xff08;运维&#xff09;&#xff0c;DevOps就是打通开发运维的壁垒&#xff0c;实现开发运维一体化。 一、项目开发考虑的维度 Dev&#xff1a;怎么开发。 Ops&#xff1a…

基于FPGA的以太网设计(二)

一.以太网硬件架构概述 前文讲述了以太网的一些相关知识&#xff0c;本文将详细讲解以太网的硬件架构 以太网的电路架构一般由MAC、PHY、变压器、RJ45和传输介质组成&#xff0c;示意图如下所示&#xff1a; PHY&#xff1a;Physical Layer&#xff0c;即物理层。物理层定义了…

IO进程--day1

一、定义学生结构体 学生信息&#xff1a;学号&#xff0c;姓名&#xff0c;成绩等编写2个函数 save_stu 和 load_stu save_stu通过 fprintf 将arr数组中的3个学生的所有信息&#xff0c;保存到文件中去 load_stu通过 fscanf 将文件中的3个学生的所有信息&#xff0c;读取到一个…

【cocos creator】输入框滑动条联动小组建

滑动条滑动输入框内容会改变 输入框输入&#xff0c;滑动条位置改变 const { ccclass, property } cc._decorator;ccclass() export default class SliderEnter extends cc.Component {property({ type: cc.Float, displayName: "最大值", tooltip: "" }…

linux设备驱动介绍

目录 一.裸机设备驱动 vs linux设备驱动 1.什么是驱动程序 2.裸机驱动和操作系统驱动有什么区别 3.linux驱动的本质是什么 二.linux设备分类 一.裸机设备驱动 vs linux设备驱动 1.什么是驱动程序 一般来说能让硬件工作起来的程序就是驱动程序,驱动程序提供的是硬件设备操作的…

随机掉落的项目足迹:修改组件库默认样式

需求引入 为了便于讲解&#xff0c;我直接引入案例 在使用element ui的表单组件时&#xff0c;我觉得输入框前面的“文章标题”几个字太小了&#xff0c;想改大一点 解决方法 F12 审查元素&#xff0c;找到“文章标题”对应的代码&#xff0c;发现这个标签对应的类名class&q…

学以致用 SAP HCM 顾问excel函数实战系列

EXCEL函数&#xff1a;在上学的时候&#xff0c;对word、excel、PPT感觉都很简单&#xff0c;稀里糊涂的学&#xff0c;稀里糊涂的忘&#xff0c;然后走向工作岗位的时候&#xff0c;突然发现这三大宝剑无比锋利&#xff0c;可惜自己太菜&#xff0c;曾经努力学习&#xff0c;但…