HTTP协议

news2024/10/7 12:20:23

哈喽,友友你好呀~今天要给大家分享的是关于HTTP协议的相关知识点,这部分的知识在web开发中还是很重要的一部分知识,耐点心看完,肯定会有收获滴~~

 

目录

1.什么是HTTP

2.HTTP协议工作过程

3.什么是抓包工具

4.HTTP协议格式

4.1 HTTP请求(Request)

4.2 HTTP响应(Response)

5.HTTP中的方法

6.请求报头Header中的一些属性


1.什么是HTTP

HTTP:全称超文本传输协议(超文本:即传输的内容不仅仅是文本(html,css等),还有一些图片,音频,视频等).HTTP诞生于1991年,目前是一种主流且应用非常广泛的应用层协议.

那什么是应用层协议呢?我们知道,数据能从客户端进程经过路径选择跨网络传输到达服务器端进程(IP/Port),比如数据从A端传到B端,TCP/IP协议的作用是体现在数据传输过程中的,但是仅仅传输完成就好了吗?显然不是,AB两端还要对数据进行加工处理或者使用.因此,我们还需要一层协议,不关心通信细节,只关心应用细节.这层协议就叫做应用层协议.比如我从网上买了一款电子产品(数据),商家按照地址信息给我邮递过来(TCP/IP),我拿到货(数据)后,我还需要参照说明书怎么去使用它,而这里的说明书就可以理解为应用层协议了

应用层协议有很多种类,不同的应用场景可能对应着不同的应用层协议,其中最经典的协议之一当属HTTP.


2.HTTP协议工作过程

当我们在游览器的网址栏输入一个网址时,此时游览器就会给对应的服务器发送一个HTTP请求.对应的服务器收到这个请求后,经过数据处理,就会返回一个HTTP响应.比如下图:

事实上,当我们访问这个网站的时候,可能不止只涉及一次HTTP请求/响应的交互过程,比如一些图片的加载等等.我们可以通过FIddler这个抓包工具来具体看看它们之间的请求响应过程 .


3.什么是抓包工具

抓包工具相当于一个"代理人",可以简单理解为一个"跑腿小弟".比如你想喝奶茶,又懒得出门,于是你让你的怨种弟弟(跑腿小弟)去帮你买,他去了超市拿了奶茶付了钱,然后把奶茶送到你手里.在这个过程中,你的怨种弟弟对于你超市老板之间的交易细节是很清楚的.而抓包工具就相当于这里面的怨种弟弟.游览器访问baidu.com时,抓包工具会将构造好的HTTP请求先获取到,再将其发给百度的服务器.当百度服务器返回数据时,抓包工具也会先拿到返回数据,再把数据交给游览器.因此,抓包工具对游览器和服务器之间的交互数据细节是很清楚的.抓包工具有很多,我是用Fiddler来进行抓包(可以去官网下载:https://www.telerik.com/fiddler)以下是一个简化的抓包过程:

当我们访问一个网站时,通过抓包工具,我们就可以很容易的看到发送的HTTP请求和响应了,接下来,我们就来认识一下HTTP请求和响应.


4.HTTP协议格式

HTTP请求和响应都可大致分为四个部分:首行,报头,空行,正文.接下来我们就来分别了解一下HTTP请求和响应的这四个部分.

假设我现在要访问百度(www.baidu.com),这时游览器会向百度的服务器发一个HTTP请求,而服务器收到请求后会返回HTTP响应,期间我用Fiddler对其进行抓包,现在我们来就抓包来分析HTTP请求和响应.

4.1 HTTP请求(Request)

请求报文格式:

首行: HTTP请求的首行一共包含了三部分信息:

  1. 方法:告诉服务器应该调用什么样的方法来处理请求,这里是GET方法
  2. url:HTTP要请求的资源
  3. HTTP的版本号:这里是1.1

请求报头(Header):

header里面都是"键值对",每一行就是一个键值对,键和值之间使用冒号(:)隔开,header以空行结束,说白点就是空行以上首行以下的都是header.键值对所表达的信息就是一些请求的属性.

空行:

用来标志header的结束,空行以下是正文,在此HTTP请求中没有正文.所以我们也不难发现正文在HTTP协议中并不是必须要有的.

正文(Body):空行以下的都是正文,正文可有可无,根据具体情况而定.如果存在正文,则header里面会有一个Content-Length属性来标识正文的长度.很显然我们这里没有正文,因此在header里面也没有这个属性.


4.2 HTTP响应(Response)

HTTP响应报文(部分)格式:

 首行:

 HTTP响应的首行也包含了三部分信息:

HTTP的版本号,状态码, (状态码为200时表示请求成功)以及状态码解释.

响应报头(header):

与请求的响应报头格式相同,同样也是键值对结构,每个键值对都包含了响应的属性,遇到空行表示结束.

空行:用来标志header的结束,空行以下是正文.

  

响应正文(body):

服务器返回的响应内容(上图中空行的下面都是正文,因为正文较多,没有全部截取).

以上只是带大家了解一下HTTP协议的格式,接下来就让我们来具体认识一下HTTP协议中的一些方法和属性吧.


5.HTTP中的方法

我们可以在响应报文的首行中可以看到HTTP协议中的方法,首行的第一个单词就是方法名,在发送请求后,服务器会按照请求报文中首行的这个方法来做出相应的处理.也就是说,不同的方法会触发不同的响应.HTTP协议中的方法很多,这里只讲最常见的两种方法:GET和POST

  • GET方法

GET方法是HTTP请求中最常见的,常用来获取服务器上的某个资源.在游览器中输入一个url会发送一个GET请求;HTML中的link,img,script也会发送一个GET请求.

如果游览器发送的是一个GET请求的话,那么请求报文中会有这么几个特点:

  1. 首行第一个单词为GET
  2. URL的query string可以为空,也可以不为空
  3. header部分有若干个键值对
  4. body部分为空.
  • POST方法

POST方法也是一种常见的方法,多用于用户将输入的数据提交给服务器(比如用户登录).通过HTML中的form表单可以发送一个post请求,也可以通过JavaScript的ajax去发送一个post请求.

如果游览器发送的是一个POST请求的话,那么请求报文中会有这么几个特点:

  1. 首行第一个单词为POST
  2. URL的query string一般为空(也可以以不为空)
  3. header部分有若干个键值对
  4. body一般不为空.body内的数据格式一般由header中的Content-Type指定,长度由Content-Length指定.

当用户将一些数据信息通过前端页面提交给服务器时,这些被提交的信息可以放到url的query string中,也可以放到body中.而当发送一个POST请求时,我们的信息通常是放到body中的.

通常情况下,GET请求一般使用query string去传输一些数据,而POST请求一般则是使用body去传输一些数据.当然这也是我们一种常见的方式而已,具体用什么方式去传输数据,都是我们人为去约定的.

  • GET和POST方法的区别

其实GET和POST没有本质区别.GET请求用POST也可以实现,POST请求也可以用GET去实现.

以下的区别也只是我们一些人为的约定俗成,并不是非要遵守的:

  1. 我们一般都习惯用GET方法去获取服务器上的资源,POST方法用来提交我们用户输入的数据给服务器.
  2. GET的body一般为空,需要传输的数据通过query string传输;POST的query string一般为空,传输的数据一般通过body来传输.
  3. GET请求一般是幂等的,POST请求一般是不幂等的.(幂等:如果多次请求得到的结果都是一样,则视为是幂等的.比如我们实现一个"查看账户余额",在没有转账的情况下,无论我们请求看多少次,都是一样的结果,余额都不会变,这个就是幂等的.若去实现一个"转账"功能,那我们在不同的时间下去看的话,这个余额是在慢慢变少的.这个就不是幂等的了.)
  4. 承接上面的第3点,GET一般是可以被缓存的(也就是可以放到收藏夹中的),POST一般不要求被缓存,也不能放入收藏夹.(因为GET是幂等的,所以无论什么时候发过来得到的请求都是一样的,所以可以缓存起来,到时候直接拿出来看即可,但POST不行,因为不同时间访问的话得到的响应可能不同),但是这都不是绝对的.比如一个网站上的广告.一个广告以下也是通过GET来的,但是有的就不能被缓存.

以下是HTTP中其他的一些方法:

方法说明  支持的HTTP协议版本
PUT传输文件1.0/1.1
HEAD获得报文首部1.0/1.1
DELETE删除文件1.0/1.1
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开连接关系1.0

 

 

6.请求报头Header中的一些属性

请求报头的格式都是键值对.在这里给大家介绍几个比较常见且重要的.以下是访问百度的一个HTTO请求的抓包结果:

 Host:

这个表示访问的服务器主机/地址是什么.

Content-Length:

这是要搭配body使用的,表明body的数据长度是多少.上图中没有body,所以也没有Content-Length(TCP是一个面向字节流的协议,基于TCP的应用层协议,必须要明确数据报和数据报之间的边界,否则会出现粘包问题.这个边界要么就是指定长度,要么就是指定分隔符.而HTTP就是基于TCP的,当HTTP报文中带有body时需要明确的指出,body到哪里是结束.这里就是在报头中指定正文长度.报头的结束就是指定分隔符(空行)).

Content-Type:

指定HTTP请求的数据格式.

请求报文中常见的有json/urlencode(全称:application/x-www-form-urlencode.格式和query string一样,键值对之间用&分割,键和值用等号连接,就相当于把query string拿到了body中)/form-data(多用于上传一些文件)

响应报文中的Content-Type有以下几种格式:

  • text/html : body的数据格式是 HTML
  • text/css : body的数据格式是 CSS
  • application/javascript : body的数据格式是 JavaScript
  • application/json : body的数据格式是 JSON

以下是一个有body的请求报文的一个抓包,大家可以看一下:

User-Agent(简称UA):

 

Referer:

表示当前这个页面是从哪个页面跳转过来的.如果直接从游览器地址栏输入url或收藏夹进入当前页面的话,往往不会有referer.(一些将广告投放到各大平台的,可以通过的这个referer知道是从哪个平台过来的,从而达到一些交易)

Cookie:

游览器在本地存储数据的一种机制. 

我们在访问一些网站的时候,可能会遇到需要登录的情况,首次登录的时候,我们会把输入的一些账号密码啥的发送给服务器,服务器收到请求后,返回的HTTP响应的Header中就会有带有set-Cookie属性.这个是cookie什么呢,其实就相当于一份身份证.初次访问时,你的个人信息会被发送到服务器(登录操作),服务器就会给你份"身份证"(响应中带有set-Cookie属性),游览器就会将这个"身份证"(cookie)保存下来,当你再去访问这个网站时,就不需要再登录了,因为以后你每一次访问这个网站时,HTTP请求中都会带有这个"身份证"(cookie属性),直到你退出或者身份过期.登录过程我画了一个大致的图,也许有助于理解:

这个过程就和去医院看病一样:

  1. 1.当你初次去医院看病时,就需要办一张就诊卡(相当于登录过程,就诊卡相当于"上文中提到的身份证"),
  2. 2.有了这个就诊卡你就可以去这家医院看病,开药啥的,这个时候只需要出示这张就诊卡,并不需要身份证啥的.
  3. 3.当你看完病之后,你也可以选择注销这个就诊卡(删除cookie),这时候这个就诊卡和你的身份信息就解除关联了.
  4. 4.再来看病,再次办一张新的就诊卡,就又得到了一个新的身份证.

 

好啦,关于HTTP协议格式就分享到这里啦,建议友友在学习这块的时候多多抓包哦,抓的多了自然而然就容易理解啦.博主也是在学习中,现将自己学到的分享出来,有写的不对的或建议或不太理解的都欢迎评论或者私信哦.

 

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

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

相关文章

基于javaweb的停车库管理系统(java+jsp+jquery+servlet+mysql)

基于javaweb的停车库管理系统(javajspjqueryservletmysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基…

补环境:vm2 transformer.js 源码分析

在补环境框架的文件夹里执行 vm2 文件能成功得到结果,但是将合并了环境和原 js 文件后的代码内容单独提取出来通过 vm2 调用却报错提示 SyntaxError: Use of internal vm2 state variable: 通过 transformer.js 源码,分析 VM2_INTERNAL_STATE…

【韩顺平老师讲MySQL】函数和多表查询

文章目录P33.数学函数P34.日期函数P37.加密函数P38.流程控制函数P39.查询增强P40.分页查询P41.分组查询P42.多子句查询P43.多表查询笛卡尔积(重难点)P44.多表查询P45.自连接P46.多行子查询P33.数学函数 # 绝对值 SELECT ABS(-12) FROM DUAL;# 十进制转为二进制 SELECT BIN(10) …

【offer拿到手软系列】面试小贴士

​ 学习好一门语言贵在坚持——初识JavaScript🏹💁‍♂️! 首先: 博主是👦一个帅气的boy,你可以叫我山鱼君 🖱 ⌨个人主页:山鱼菌的个人主页 💖💖如果对你有帮…

vmlogin多登防关联浏览器中配置Geolocation定位插件的使用教程

Geolocation 接口是一个用来获取设备地理位置的可编程的对象,它可以让Web内容访问到设备的地理位置,这将允许Web应用基于用户的地理位置提供定制的信息。说实话:其实Geolocation 就是用来获取到当前设备的经纬度(位置)…

Zookeeper ---- Zookeeper集群操作

Zookeeper ---- Zookeeper集群操作1. 集群操作1. 集群规划2. 选举机制(面试重点)3. ZK集群启动停止脚本2. 客户端命令操作1. 命令行语法2. znode节点数据信息3. 节点类型(持久/短暂/有序号/无序号)4. 监听器原理5. 节点删除与查看…

2022年NPDP新版教材知识集锦--【第三章节】(1)

【新产品开发概论】 产品创新是“风险与回报”的过程 随着新产品的累积成本增加,产品的不确定性降低。成功率在很大程度上取决于企业采用的新产品开发实践和流程的质量。 【决策基本框架】 ⚫识别问题或机会 ⚫收集信息(信息来源:内部、外部、内外部…

iOS开发之Undefined symbol:_OBJC_CLASS_$_****

更新了Xcode14.0.1以后,项目突然曝出了此问题Undefined symbol:_OBJC_CLASS_$_****,因此记录一下,解决此问题的步骤: 第一步:首先在Build Phases中找到 Compile Sources,查看是否有对应的***.m文件&#x…

查找算法【二叉查找树】 - 二叉查找树的插入

查找算法【二叉查找树】 - 二叉查找树的插入 因为二叉查找树的中序遍历存在有序性,所以首先要查找待插入关键字的插入位置,当查找不成功时,再将待插入关键字作为新的叶子节点成为最后一个查找节点的左孩子或右孩子。 【算法步骤】 ① 若二…

vim编辑器使用和vim一键配置

1.vim的三种模式 开始之前,先简单说,vim并不是只有这三种模式。总的来说vim大概有12种模式,不同的版本可能也有一些具体的区别。今天我们先介绍三种常用的模式。 先用一张图来大概介绍三种模式之间的转换 命令模式(Normal mod…

强化学习算法实践(一)——策略梯度算法

文章目录Reference1. REINFORCE1.1 Basic1.2 Code2. Improvement Tips2.1 Assign Suitable Credit2.2 Add a Baseline2.3 Advantage Function3. Actor-Critic(A2C)3.1 Basic3.2 Code策略梯度是一种基于策略的算法,相比于DQN一类的基于价值的算法,它会直接…

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

jupyter怎么换环境?

1.为什么要换环境而不用使用默认环境? 在这之前我只知道,要pip安装很多环境包,来在程序中调用使用,但是在不同的项目中,环境总是相互矛盾,总会出现诸多版本问题。所以需要每个项目对应一个环境。conda默认…

2022第二届中国高校大数据竞赛A题(实时更新)

题目 制造业是国民经济的主体,近十年来,嫦娥探月、祝融探火、北斗组网,一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心,机械设备在工业生产的各个环节都扮演着不可或缺的重要角色。但是,在…

【FTP工具】FileZila安装以及使用详解

一、FTP概念 安装FTP主要是为了传输文件,FTP是持久的,只有一次认证过程,传输多个文件都是使用同一个连接。因为FTP就是为远程文件交互而设计的,有些时候只是为了单纯做一个文件传输,往往搭建FTP服务更省时和节约成本。…

【每日刷题】之【Z字形变换】

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【力扣刷题篇】 🐲🐲本篇内容: 每日刷题 🐯🐯作者简介:一名现大二的三非编程小白&#…

BI设计上篇 - 像设计师一样思考

形式服从功能。这句产品设计的箴言也适用于数据可视化。就数据可视化的形式和功能而言,我们首先考虑的是我们希望受众能用数据做什么(功能),然后才是用可视化(形式)来简化这个过程。在本文中,我…

总结flutter玩转之-安卓view 承载flutter 的页面

1.假设你已经熟悉flutter 开发熟悉dart 语言 android 原生开发技能 一、在安卓原生项目添加代码 1.创建示例布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

【Linux修炼】6.gcc/g++及Makefile【工具篇】

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 Linux-gcc/g及Makefile本节目标程序的翻译过程1.程序的翻译过程2. 理解选项的含义3. 动态链接和静态链接Linux项目自动化构建工具-make/Makefile1. 背景2. “见见猪跑”3. makefile原理及语法3.1 Makefile原理3.2 Makefile…

pytorch初学笔记(二):TensorBoard之add_scale()的使用

目录 一、SummaryWriter类的介绍 1. 定义 2. SummaryWriter初始化 2.1 初始化 2.2 帮助文档给出的使用范例 2.3 常用方法 二、add_scale()方法介绍 1. 常用参数介绍 2. 绘制图形 2.1 安装tensorboard 2.2 对应代码 2.3 打开tensorboard窗口 2.3 注意事项 三、a…