【Http协议】 一

本文主要介绍了Http协议的作用以及如何通过抓包工具Fiddler抓取http请求/响应,重点介绍了请求/响应报文的内容

一.Http协议

最常用的应用层协议

http超文本传输协议,除了能传输字符串文本,还能那个传输其他的

比如:

浏览器打开网站这个过程都是http支持的;使用app,加载数据,这个过程也是http支持的

https本质还是http,是进化版本!

>http请求

>http响应

我们在浏览器看到的网页其实是我们在向服务器发送一个http请求,然后服务器会给我们返回一个http响应(通常是html/css/js),在浏览器显示,这就是我们看到的网页。

二.抓包工具Fiddler

学习http需要学习协议格式,需要用到 抓包工具(本质是代理)   

抓包工具相当于是服务器和浏览器之间的一种代理,通过抓包工具就可以获取到浏览器和服务器之间的交互细节,也就可以拿到http请求和http响应中的具体信息

抓包工具是一种代理

但是代理不一定都是抓包工具,还有一些其他的。

正向代理:代理客户端

反向代理:代理服务器

抓包工具有很多:

比如wireshark,功能强大,但是使用比较复杂;这里使用fiddler,虽功能更少,但是使用很方便,也足够用

下载:Fiddler官网下载经典版(免费)

打开之后的样子:

左侧显示当前机器上有哪些http数据报在交互(不仅能抓浏览器的,而且能抓到所有程序的

注意:刚装Fiddler的时候,是抓取不到https的,要抓https要稍微设置一下

举个例子:

我们现在在浏览器访问了搜索浏览器的主页面

>在Fiddler左侧就会显示一条这样的信息

>双击这条信息,右侧就会显示这条应用层数据报的https请求和响应

http请求报文(点击Raw看原生的)

可以用记事本打开查看(看的出来并不是乱码,这样意味着http协议是文本协议-->用记事本打开看得懂)

http响应报文

注意:响应通常会进行压缩(为了节省带宽),因此在查看之前要先进行解压

从http响应报文中也可以直观的看出来,它的内容大多数就是html/css/js 

这也印证了那句话:访问网页的过程就是浏览器从服务器把数据下载下来的,然后在浏览器显示

三.请求报文和响应报文

1.请求报文

请求报文有四个部分:

1.首行

2.请求头header

3.空行

4.正文body

比如(通过Fiddler查看抓取到的一个请求报文)

1.1首行

//首行
GET https://www.sogou.com/web/css/yuyin.v1.0.1.css HTTP/1.1

首行组成:method方法 url http版本号


>URL唯一资源定位符

用来描述网络上的资源

请求就是客户端给服务器发起一个数据,在这里指出要访问的服务器以及服务器的资源是什么

RFC官方文档给出的url格式:

查询字符串query string:针对访问的资源进行补充说明

键值对格式,键值对之间使用&符号分割(键和值的含义都是程序员自定义的)

注意:url有些内容是可以省略的

比如,

省略IP地址相当于是访问当前服务器的地址;

省略端口号,浏览器会自动加上

(这个端口号表示的是访问目标服务器的哪个端口)

如果是http协议,自动添加80端口(http服务器端口号80)

如果是https,自动添加443端口(https服务器端口号是443)

因此一个商业服务器部署服务器的时候,往往会遵守上述规则:http协议绑定到80,https绑定到443端口

省略带层次路径:就相当于访问根目录/主页

正式上述灵活性,使http可以根据不同的场景,进行一些自定制的工作,也使得http成了

广泛使用的协议。

Urlcode

对url进行编码

例子:这个url中我们可以看到%还有一些类似于十六进制的数字,这就是url转码后的样子

https://cn.bing.com/images/search?view=detailV2&ccid=5or%2fQ%2fua
&id=798251EDFD497BC501D529226E9248C195C6E01D

为什么要转码?

这是因为有一些特殊字符(比如/!@#%等)会和url语法冲突,如果不转换,就可能导致浏览器/服务器解析失败;此时query string中就不会出现特殊含义的符号,浏览器和服务器才能正确识别。

转码规则:把要转换的内容的二进制的每个字节,都使用16进制表示出来,然后在每个字节

前面加上一个%

总结:url转码的作用是将特殊字符转义为了保证url的正确解析还有避免url语法冲突

>方法method

描述了这个请求是做啥的

上述方法用的最多的是前两个:

GET:从服务器获取***

POST:向服务器传输***

(实际上,现在GET/POST 不一定遵守之前设计的语义了)

>GET方法

一般没有正文(body) ,就像上面搜狗的http请求

>POST方法

一般有正文(body),空行分隔了header和body,相当于分隔符

body里的格式有很多种,也有键值对,只是经过了urlencode转码

常见场景:登陆/上传

比如这个请求:

经典面试题!!!

POST和GET的区别:

1.GET是把一些自定义的数据放在query string里,body通常是空的

2.POST是把一些自定义的数据放在body里,query string通常是空的

(不管放哪里都是要上传到服务器,本质没有区别)

放在url中,用户可以直接看到(浏览器收藏夹可以收藏);放在body中,无法直接看到;

实质上,GET和POST没有本质区别,两者经常可以相互替代

误区:

1.url长度有限制

RFC官方文档明确说明对url的长度不做限制

2.POST比GET更安全

POST只是把传输的数据让普通用户无法直接看到,但是不影响黑客截获

保证安全的关键:对传输的的敏感数据进行加密!

3.GET是幂等的,POST不是幂等的

幂等:相同的出入,每次都是相同的输出;

不幂等:相同的输入,每次输出不幂等

RFC文档只是建议这样设计;实际开发中,不一定真的会这样设计

4.GET可以缓存,POST不能被缓存

(缓存的前提是幂等的)不管是GET和POST,幂等/不幂等都是不确定的,缓存自然也不能确定

其他方法

(稍微了解一下)


1.2请求头header

也是键值对结构,每一行是一个键值对

键和值之间使用 :空格来分割

方框里的字段是需要我们认识并了解的!

>Host

表示服务器主机的地址和端口

>Content_Length

表示body的数据长度;如果没有body,这个字段也可以省略

(为了解决粘包问题,区分每个完整的数据包)

粘包问题:

GET请求:使用空行作为结束符

POST请求:使用长度标识

>Content_Type

表示请求的body中的数据结构

主要有三种情况:

1application/x-www-form-urlencoded

body的格式和query string一样

2multipart/form-data

一般上传文件/图片

3applicatin/json

bodyjson格式

>Referer

描述了当前页面的来源

*如果是从url/收藏夹中打开的网页,那么请求不带referer

*如果是点击某个网页的内容产生的跳转,就带上referer

问题:referer是明文传输的,因此有可能被修改,比如运营商就可以修改referer(运营商劫持)

解决方法:使用https进行加密传输

>Cookie

浏览器本地存储数据的一种机制

用户访问网页的过程中,会产生很多临时性的数据

对于临时数据,有的可以放到服务器存储(下次就可以直接获取到)

有的不太重要的,就可以直接放到浏览器存储(下次访问可以直接用)

举个例子:

为了保证安全,浏览器会对网页的功能做限制(比如禁止直接访问硬盘),同时为了又能存储数据,浏览器就提供了Cookie功能

Cookie

* 按照键值对的方式存储一些字符串,这些键值对往往都是服务器返回回来的,浏览器把这些键值对按照域名维度,分类存储(不同的网络的cookie是独立的,里面的内容是自定义的)

当前网站涉及到两个域名,一个网站cookie中会存储很多键值对,其中往往会有一个很重要的键值对,用来表示用户的身份信息,标识当前请求来自哪个用户,这样登陆一个网站之后,后续再访问这个网站,就不必重新登陆。

为了实现身份识别的效果,不仅仅需要cookie来支持,在服务器也需要session机制

Session

首次访问网站,登陆成功之后,网站就会有一个sessionId,它会被服务器返回给浏览器的响应,保存在浏览器的Cookie中,服务器也会创建一个对应的Session,记录一些关键信息,服务器会用类似于hash表这样的方式,以sessionId为key,以session为value,把数组组织起来。

后续去访问网站的其他页面,都会在请求的Cookie字段中,带上sessionId,服务器就可以根据sessionId知道当前的用户信息

以上是网站登陆以及身份识别这样功能的实现的基本思路~


总结:

1.Cookie从哪里来

从服务器返回给浏览器的

2.Cookie保存在哪里

保存在浏览器上,浏览器所在电脑的硬盘上,每个域名都有自己的一组cookie

3.Cookie内容是什么

键值对结构的数据(程序员自定义的)

其中往往会有一个键值对,作为用户的身份标识

4.Cookie的内容到哪里去

后续再访问这个网站,就都会在请求中带上cookie,服务器就可以进一步的知道客户端的详细情况了。

1.3空行

作为header和body的分割


2.响应报文

响应报文也有四个部分:

1.首行

2.响应头header

3.空行

4.正文body

2.1首行

HTTP/1.1 200 OK

首行的组成:http版本号 状态码 OK

状态码是对这次响应的定性(成功/失败/其他情况)

一些常见的状态码:

200 OK成功

404 Not Found访问的资源不存在

403 Fobidden没有权限

502 Bad Gateway 服务器挂了

504 Gateway Timeout 服务器响应超时

302 Move temporarily重定向 浏览器会自动跳转到其他页面上

2.2响应头header

除了请求头中说到的host/content_length/content_type/referer/cookie等字段

响应头中可能还有这些

2.3空行

依旧是header和body的分割

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

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

相关文章

网络工程综合试题(二)

1. SR技术有哪些缺点? SR(Segment Routing)技术是一种新兴的网络编程技术,它具有很多优点,但也存在一些缺点,包括: 部署复杂性:SR技术需要对网络进行改造和升级,包括更新…

MAC缓解WebUI提示词反推

当前环境信息: 在mac上安装好stable diffusion后,能做图片生成了之后,遇到一些图片需要做提示词反推,这个时候需要下载一个插件,参考: https://gitcode.net/ranting8323/stable-diffusion-webui-wd14-tagg…

Android 驱动学习调试

1 Android 驱动代码编译 参考https://www.sharetechnote.com/html/Linux_DeviceDriver_Programing.html#Device_Driver_HelloWorld编译ko文件调试驱动代码&#xff0c;将ko文件push到手机上验证 相关C文件testdriver.c #include <linux/init.h> #include <linux/mod…

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放&#xff0c;会自动翻页&#xff0c;直到翻页到最后一页。

input改造文件上传,el-table的改造,点击上传,拖拽上传,多选上传

第一个input标签效果 第二个input标签的效果 el-table的改造效果 <template><div class"outerBox"><div class"analyze" v-if"status"><div class"unFile"><div class"mainBox"><img clas…

电阻距离------Resistance distance

原来的解释来自维基百科&#xff1a;https://en.wikipedia.org/wiki/Resistance_distance 在图论中&#xff0c;简单连通图G的两个顶点之间的电阻距离等于电网上两个等效点之间的电阻&#xff0c;电网被构造为与G相对应&#xff0c;每条边被一欧姆的电阻代替。它是图上的度量。…

分布式:一文掌握分布式ID生成方案

目录 背景1、UUID2、数据库自增ID2.1、主键表2.2、ID自增步长设置 3、号段模式4、Redis INCR5、雪花算法6、美团(Leaf)7、百度(Uidgenerator)8、滴滴(TinyID)总结比较 背景 在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对一个订单表进…

Python-函数

目录 一、函数的定义与调用 二、日期时间函数 1、时间戳 2、日历函数 三、随机数函数 1、random.random() 2、random.uniform(a,b) 3、random.randomint(a,b) 4、random.randrange(start,stop,step) 5、random.choice(sequence) 6、random.shuffle([random]) 7、ran…

2023年阿里云双11优惠来了,单笔最高可省2400元!

2023年阿里云双11活动终于来了&#xff0c;阿里云推出了金秋云创季活动&#xff0c;新用户、老用户、企业用户均可领取金秋上云礼包&#xff0c;单笔最高立减2400元&#xff01; 一、活动时间 满减券领取时间&#xff1a;2023年10月27日0点0分0秒-2023年11月30日23点59分59秒 …

BSTree二叉树讲解

二叉搜索树的概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值…

YOLOv5— Fruit Detection

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营-第7周&#xff1a;咖啡豆识别&#xff08;训练营内部成员可读&#xff09; &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制](https…

CentOS 安装 tomcat 并设置 开机自启动

CentOS 安装 tomcat 并设置 开机自启动 下载jdk和tomcat curl https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz curl https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz解压jdk和tomcat并修改目录名称 tar -z…

homeassistant安装HACS应用商店

环境&#xff1a;iStoreOS&#xff0c;已在商店中安装homeassistant。 homeassistant在iStoreOS中是以docker容器运行的。 1、进入终端&#xff0c;输入账号和密码&#xff08;默认&#xff1a;root&#xff0c;password&#xff09; 查看容器&#xff1a;docker ps 进入容…

3.3每日一题(变量可分离方程)

1、判断类型选方法&#xff1a;等式中分别提一个x、y出来&#xff0c;形成了x与y相乘的等式&#xff1b;为变量可分离类型 2、不一定非得把y解出来&#xff0c;化成上述的等式即可&#xff08;为隐函数的方程解&#xff09; 注&#xff1a;等式不定积分后记得&#xff0b;一个…

大数据-Storm流式框架(七)---Storm事务

storm 事务 需求 storm 对于保证消息处理&#xff0c;提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发&#xff0c;可以用于计数吗&#xff1f;不会重复计数吗&#xff1f; strom0.7.0 引入了事务性拓扑的概念&#xff0c;可以保证消息仅被严格的处理一次。因此可…

【电路笔记】-交流电感和感抗

交流电感和感抗 文章目录 交流电感和感抗1、概述1.1 电感1.2 电感器 2、频率特性2.1 电抗(Reactance)2.2 相移2.3 感应现象 3、RL滤波器4、总结 在之前有 交流电阻的文章中&#xff0c;我们已经看到电阻器在正常频率下的直流或交流状态下的行为是相同的。 然而&#xff0c;其他…

【机器学习合集】人脸表情分类任务Pytorch实现TensorBoardX的使用 ->(个人学习记录笔记)

人脸表情分类任务 注意&#xff1a;整个项目来自阿里云天池&#xff0c;下面是开发人员的联系方式&#xff0c;本人仅作为学习记录&#xff01;&#xff01;&#xff01;该文章原因&#xff0c;学习该项目&#xff0c;完善注释内容&#xff0c;针对新版本的Pytorch进行部分代码…

山东大学开发可解释深度学习算法 RetroExplainer,4 步识别有机物的逆合成路线

逆合成旨在找到一系列合适的反应物&#xff0c;以高效合成目标产物。这是解决有机合成路线的重要方法&#xff0c;也是有机合成路线设计的最简单、最基本的方法。 早期的逆合成研究多依赖编程&#xff0c;随后这一工作被 AI 接替。然而&#xff0c;现有的逆合成方法多关注单步逆…

机器学习第一周

一、概述 机器学习大致会被划分为两类&#xff1a;监督学习&#xff0c;无监督学习 1.1 监督学习 监督学习其实就是&#xff0c;给计算机一些输入x和正确的输出y&#xff08;训练数据集&#xff09;&#xff0c;让他总结x->y的映射关系&#xff0c;从而给他其他的输入x&a…

【算法】动态规划之LeetCode 53.最大子数组和

目录 文章目录 **目录**&#x1f4d1;前言1.题目描述2. 动态规划法 &#x1f4d1;文章末尾 &#x1f4d1;前言 本文主要是leetcode题解析&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁…