应用层 HTTP协议(1)
回顾
前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点.
这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析
版本
首先我们谈谈HTTP协议的版本
HTTP 0.9 (1991)
HTTP 1.0 (1992 - 1996)
HTTP 1.1 (1997 - 1999) 常用
HTTP 2.0 (2012 - 2014) 常用
HTTP 3.0 (未完全完善)
这里的前面的HTTP版本一直到2.0都是基于TCP协议来实现的,然而3.0版本的协议是基于UDP版本的协议实现的/
目前讨论的是HTTP1.1协议,因为它是最常用的
2.0和3.0就是引入了一系列的机制提高传输数据和安全性
3.0基于UDP实现了一些更复杂的机制
例子
比如当前我们在浏览器输入一个网址,假设是搜狗搜索的网址,这里浏览器就会给搜狗的服务器发送一个HTTP请求,搜狗的服务器返回一个 HTTP响应,这个响应被浏览器解析之后,就展示成我们所看到的页面内容了,这就包含了HTML,CSS,JS等信息,所以称HTTP协议为超文本传输协议,就是能传输图片这样的能表达更多信息的内容
这里的响应就是指HTML+CSS+JS写成的网页
这里的文本指的是 字符串,能用utf8或gbk表示的合法字符串
超文本就是在这个基础上加上了图片等特殊格式
富文本 就是类似于word这种对格式有强要求的数据
HTTP协议的交互过程基本上也是一问一答的形式
但是点进去一个网页,如果出现这样的交互式窗口,称之为消息推送
HTTP抓包
为了更好地理解HTTP协议的报文内容,我们选择抓取传输的数据包来分析内容数据
这里推荐使用Fiddler(专注HTTP协议,使用更便捷)
官网 Fiddler | Web Debugging Proxy and Troubleshooting Solutions (telerik.com)
点击社区版本
然后填写信息无脑安装即可
安装好之后,点击Tools
将这里的都勾选,就可以开始简单的抓包了
记得弹出的窗口问你是否同意证书记得得勾选
注:除了上述操作以外,电脑上的代理记得关闭,fiddler本质上也是一个代理程序,之间可能会产生冲突.
正确配置之后,程序中就会抓取到很多的数据包
肯呢个并不是浏览器的数据包
电脑上后台也会有很多应用程序在你感知不到的情况下做很多事情,比如向服务器发送一些HTTP/HTTPS请求
通常来说打开一个浏览器,浏览器和服务器之间的交互不仅仅只有一次,通常来说是有很多次的
比如说第一次拿到页面的HTML
在拿到CSS,JS等
当执行JS的时候又出现了很多http请求,获取到一些数据,经过这样的反复拉扯,就出现了呈现在你面前的网页
fiddler抓取的蓝色的往往是返回的HTML,往往是网站入站请求
双击就可以查看明细
点击这两个之后就可以看到HTTP请求的组成格式
上面的raw表示的是显示原始数据,这里的请求会一定程度的压缩,因为网络带宽是有限的
下面那个是在记事本中查看,这样更加方便
下面的就是显示响应的报文 (记得点击黄色的框decode)
这里就是被压缩了,为了减少占用的网络带宽
为什么发送的请求报文没有压缩呢?
因为请求的报文本来就很短 就不需要压缩了
HTTP请求报文简介
首先我们从整体上来看HTTP请求报文就是首行 + 请求头 + 空行 + 正文(可有可无)
这里首行就表示了 使用的请求方法 + URL + 请求使用的协议以及版本号
这里上文的请求报文从第二行到最后一行表示的就是 请求头
类似于TCP协议,包含着一些重要的属性信息 以键值对的方式呈现
最后是一个空行,代表报文的结束标记
大部分的请求不包含正文部分
HTTP响应报文简介
和请求的报文类似
以 首行 + 响应头 + 空行 + 正文 组成
这里的正文一般是存在的
首行包含的是 版本号 状态码 状态描述
比如 HTTP/1.1 200 OK
响应头仍然是以键值对方式来描述的一些属性信息
这里空行就不能作为结束标记了
这里的结束标记是以Content-Length来标记的
这就表示如何区分响应报文的结束标志
URL(网络资源定位符)
这里HTTP协议中的URL就描述了网络上唯一定位某个资源的定位符
这里的URL不仅仅只是在HTTP协议中使用到
像我们之前使用JDBC链接数据库也是使用到类似的内容的
下面我们来介绍一下HTTP协议中的URL的具体组成部分
一般常见的URL是以上的组成方式
协议方案名:HTTP/HTTPS
登录信息:user:pass 放在URL中对于现在来说不太安全,现在的登录信息都是有另外的页面来完成身份验证的
服务器ip:定位服务器地址
服务器端口号:确定应用程序,如果URL中不包含端口就会配置默认端口
带层次的文件路径:表示待访问资源的位置
查询字符串:对于资源地址查询的补充(不同的网站定义的规则不同)
片段标识符:一般是小说页面使用的,用通过不同的片段符能表示页面的跳转
下面还是以一家店铺买吃的来举例
eg:http://上海某饭店:18/招牌菜/红烧肉?餐具=需要&外带=是
URL encode
这里的URL encode一般是在query string 这里使用
在URL中一般会有很多字符代表着特殊的含义
比如 + / @ 等 或者是汉字也是需要转义的,如果直接使用就会导致浏览器的解析失败等等
所以我们常常就是将字符的ASCII码拿出来然后转为16进制加上%进行分割
这里搜索的C++ 就转义成了C%2B%2B
实际开发中,在URL中需要包含中文的时候一定要进行encode
HTTP方法
常见的方法如下,但是最常用的还是get方法(相对更多)和post方法
注:这里的方法使用说明只是编辑标注文档的作者的一厢情愿,其实我们可以任意搭配和使用这些方法
post方法常常有body,get方法常常没有body,假设一个登录的场景
post方法常常会将登录信息放到body中
get方法则会放到URL中
我们可以通过抓包查看(这里不做演示了)
post方法常用于登录,上传
get和post方法的区别
定论:两个没有啥区别,可以相互替代使用(大部分可以相互替代使用)
小部分浏览器不支持
但是两者在使用习惯上还是有区别的
1.post请求常常将数据写到body中传输,而get请求常常将数据放到URL中传输
2.语义的区别
get请求常常用来获取数据,post请求常常用来传输数据给服务器
3.标准文档中get请求要求是幂等的,post请求没有要求
幂等:输入内容一定,输出的内容也是一定的,称为幂等
4.get请求是可以被浏览器收藏的
post请求不可以被浏览器收藏的
关于post请求个get请求在互联网上广为流传的一些误解
1.post请求比get请求更安全???
论据:get请求的数据和登录信息放在URL,可以之间看到,所以不安全
结论:这完全就是扯,假设是post,我抓个包还不是能看到嘛,所以真正重要的是以什么方式来加密的
2.get传输的数据量小,post传输的数据量大?
这描述的是以前,以前的浏览器对URL是有大小限制的,现在则没有
3.get只能携带文本信息,post可以携带二进制数据?
这个结论不完全错误,其实URL通过query string携带数据
这里我们将二进制数据进行 URL encode,然后服务器进行decode就可以还原成二进制数据了post请求一般也不是直接携带二进制数据的,而是以base64编码或者是urlencode进行携带
报头简单解释(header)
1.Host 表示服务器的地址和端口
2.Content-Type Content-Length
这两个属性就表示了正文body中的内容长度和编码格式
也就是标志着结束在哪里,避免粘包问题
注:如果没有body部分其实就是空行作为结束标志
Type类型
1.application/json json格式
2.application/x-www-form-urlencoded form表单,通过HTML中的form标签构造的一种格式
可以认为是把query string 放到body里
3.multipart / form-data
上传文件的时候使用的,暂时不做过多介绍
响应中的报头格式
3.UA(user-agent)
也可以表示浏览器的使用设备是什么,就能依据这个信息来给不同的设备来匹配不同的页面显示,这样只需维护一套代码即可,但是现在越来越多的网站不使用UA进行区分了,因为CSS3出现了一个新特性,"媒体查询",可以根据不同的设备的尺寸大小来匹配不同的设备
5.referer
可以表示是从哪个页面来跳转过来的,比方说很多公司接广告,在早期移动这些网络运营商会在路由器上面搞小动作,修改成自己的referer,从而就能获取一定的广告费用,这样就很舒服
这是通过点击量来赚钱的.
现在就有了HTTPS 这个s可以理解为SSL(加密协议)
这里的正文信息等都是有密文加密的,不容易破解
就算破解了也很容易被感知到
6.cookie
cookie本质上是一个将数据持久化在硬盘上的一种方案
浏览器是可以读写电脑硬盘设备的,调用操作系统的api即可
其实理论上网页也是可以这样执行操作的,但是浏览器禁止了这种操作,为了安全起见
所以就提供了这样的api来退而求其次,能有限度的存储数据,而不是无限度的访问文件系统
重要结论:
1.cookie是服务器返回给客户端的,通常是首次访问或者登录之后
2.cookie会存储在浏览器本地硬盘中,后续访问服务器会带有cookie
3.cookie中存储的信息和query string样是程序员自定义的键值对信息
4.cookie在浏览器中的组织方式按照不同的域名为维度存储的,可以这样查看
5.cookie一般是保存用户的身份标识,这样服务器就可以通过不同的身份标识来区分用户了
注:HTTPS关注的是不能被篡改而不是不能被解密,所以密码放到cookie中不合适
相关文章:

应用层 HTTP协议(1)
回顾 前面我们说到了数据链路层,网络层IP协议,传输层的TCP/UDP协议一些知识点,现在让我们谈谈 应用层的HTTP协议的知识点. 这篇我们先从大局入手,仍然是对总体报文进行全局分析,再对细节报文进行拆解分析 版本 首先我们谈谈HTTP协议的版本 HTTP 0.9 (1991) HTTP 1.0 (1992 - 1…...

Linux学习笔记(centOS)—— 文件系统
目录 一、Linux中的文件 打开方式 二、目录结构 三、相关命令 切换目录命令 列出当前目录下的文件和目录命令 一、Linux中的文件 “万物皆文件。” 图1.1 所有文件 打开方式 图形化界面左上角的位置→计算机,打开以后就可以看到Linux全部的文件了…...

华视 CVR-100UC 身份证读取 html二次开发模板
python读卡:python读卡 最近小唐应要求要开发一个前端的身份证读卡界面,结果华视CVR-100UC 的读取界面是在是有点,而且怎么调试连官方最基本的启动程序都执行不了。CertReader.ocx 已成功,后面在问询一系列前辈之后,大…...

ubuntu彻底卸载cuda 重新安装cuda
sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" \"*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" cuda10以上 cd /usr/local/cuda-xx.x/bin/ s…...
【Java】学习笔记:关于java.sql;
Connection conn null; Connection:这是一个 Java 接口,表示与数据库的连接。在这里,conn 是一个 Connection 类型的变量。 conn:这是变量的名称,可以根据需要进行更改。通常,conn 被用作表示数据库连接的…...

python web 框架Django学习笔记
2018年5月 python web 框架Django学习笔记 Django 架站的16堂课 MVC架构设计师大部分框架或大型程序项目中一种软件工程的架构模式,把程序或者项目分为三个主要组成部分,Model数据模型、View视图、Controller控制器。 命令及设置相关 创建数据库及中间…...
ubuntn20 搭建 redmine
安装数据库 更新包列表:sudo apt update 安装MySQL服务器:sudo apt install mysql-server 运行安全性脚本:MySQL服务器安装后,运行以下命令以加固安装:sudo mysql_secure_installation 这个脚本将引导您完成几个安全选…...

每日五道java面试题之java基础篇(三)
第一题. switch 是否能作⽤在 byte/long/String 上? Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。从 Java 5 开始,Java 中引⼊了枚举类型, expr 也可以是 enum 类型。从 Java 7 开始,expr 还可以…...

如何升级 gpt4?快速升级至ChatGPT Plus指南,爆火的“ChatGPT”到底是什么?
提到 ChatGPT。想必大家都有所耳闻。自从 2022 年上线以来,就受到国内外狂热的追捧和青睐,上线2个月,月活突破1个亿!!! 而且还在持续上涨中。因为有很多人都在使用 ChatGPT 。无论是各大头条、抖音等 App、…...

【实习】深信服防火墙网络安全生产实习
一、实习概况 1.1实习目的 1.掌握防火墙规则的作用2.掌握代理上网功能的作用3.掌握端口映射功能的作用 1.2实习任务 1.防火墙的WEB控制台 2.需要在防火墙上配置dnat …...

怎么把视频音乐提取成mp3?分享详细工具和方法!
在数字媒体时代,音乐已经成为我们生活中不可或缺的一部分。有时候,我们会在社交媒体、视频分享网站或在线视频平台上看到一些非常喜欢的视频音乐,想要将其保存为MP3格式以便随时随地聆听。那么,如何从视频中提取音乐并转换为MP3格…...

代码随想录算法训练营第44天 | 完全背包理论基础 518.零钱兑换II 377.组合总和 Ⅳ
完全背包理论基础 完全背包与01背包只相差在物品是无限取用的。因此和01背包相比第二层对背包容量的遍历应该是正序的,而且正因为这个正序,使得在纯完全背包问题中,背包容量和物品的遍历是可以倒过来的。 #include <bits/stdc.h> usi…...
深度解析与推荐:主流Web前端开发框架
一、引言 在信息化社会中,Web前端开发的重要性日益凸显。作为连接用户与后台服务的关键桥梁,前端界面不仅直接影响用户体验,更是企业品牌形象、产品价值传递的重要载体。随着互联网技术的飞速发展,用户对于网站和应用的交互性、响应速度以及视觉效果等方面的要求越来越高,…...

【React】如何使antd禁用状态的表单输入组件响应点击事件?
最近遇到一个需求,需要在<Input.textarea>组件中,设置属性disabled为true,使textarea响应点击事件,但直接绑定onClick并不会在禁用状态下被响应。 解决方法1 之后尝试了很多方法,比如设置csspointer-events:no…...
Apache Flink
前言 最近在学习室内融合定位服务架构,业务架构上,涵盖了数据采集、处理、状态管理、实时计算和告警等多个方面,但有些问题:这套系统中包含了大量的有状态计算,目前是通过自设计内存对象进行管理,并利用Re…...

SpringMVC速成(一)
文章目录 SpringMVC速成(一)1.SpringMVC概述2.SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行…...

通过nginx学习linux进程名的修改
目录 1. 缘起2. 背景知识3. 源码分析3.1 准备工作3.2 设置进程名字 1. 缘起 在运行nginx的时候,用ps查看nginx的进程信息,可能的输出如下: root 42169 3105 0 16:51 ? 00:00:00 nginx: master process ./objs/nginx root …...
【PyTorch】实现迁移学习框架DANN
文章目录 前言代码实现1、导入数据库关于torch.manual_seed(1)2、参数设置3、数据导入4、定义训练函数4.1 nn.CrossEntropyLoss()4.2 .detach()4.3 .size VS .shape4.4 .to(DEVICE)4.5 .max()4.6 optimizer.zero_grad()4.7 len(data...

thinkphp6入门(18)-- 中间件中除了handle函数,还可以有其它函数吗
在ThinkPHP 6的中间件中,除了 handle 方法外,还可以定义其他方法。这些额外的方法可以用于执行中间件中的不同逻辑,但是只有 handle 方法是中间件的入口点,其他方法则需要在 handle 方法中手动调用。 (图片来自https://www.cnblog…...

Java stream 流的基本使用
Java stream 的基本使用 package com.zhong.streamdemo.usestreamdemo;import jdk.jfr.DataAmount; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.util.ArrayList; import java.util.Comparator; import java.util.Li…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...