深入理解网络原理5----HTTP协议

文章目录

  • 一、HTTP协议格式
  • 二、HTTP请求
    • 2.1 URL 基本格式
    • 2.2 URL encode
    • 2.3 "方法" (method)
    • 2.4 认识请求 "报头" (header)
  • 三、HTTP 响应
    • 3.1 "状态码" (status code)
  • ==四、HTPPS工作过程(经典面试题)==



提示:以下是本篇文章正文内容,下面案例可供参考

一、HTTP协议格式

HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的应⽤层协议。
在这里插入图片描述
HTTP 是⼀个⽂本格式的协议。可以通过 Chrome 开发者⼯具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节。

抓包⼯具的原理—
Fiddler 相当于⼀个 “代理”。
浏览器访问 sogou.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给 sogou 的服务器。当 sogou 服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器。因此 Fiddler 对于浏览器和 sogou 服务器之间交互的数据细节, 都是⾮常清楚的。

在这里插入图片描述

抓包结果
以下是⼀个 HTTP请求/响应 的抓包结果.

协议格式总结
在这里插入图片描述
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

为什么 HTTP 报⽂中要存在 “空⾏”?
因为 HTTP 协议并没有规定报头部分的键值对有多少个,空⾏就相当于是 “报头的结束标记”,或者是 “报头和正⽂之间的分隔符”,HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的。如果没有这个空⾏, 就会出现"粘包问题。

二、HTTP请求

2.1 URL 基本格式

请添加图片描述

2.2 URL encode

像 / ? : 等这样的字符, 已经被url当做特殊意义理解了, 因此这些字符不能随意出现。
⽐如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进⾏转义.
⼀个中⽂字符由 UTF-8 或者 GBK 这样的编码⽅式构成, 虽然在 URL 中没有特殊含义, 但是仍然需要进⾏转义。否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号。

转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不⾜4位直接处理),每2位做⼀位,前⾯加上%,编码成%XY格式。

2.3 “方法” (method)

请添加图片描述
GET 是最常⽤的 HTTP ⽅法. 常⽤于获取服务器上的某个资源.
在浏览器中直接输⼊ URL, 此时浏览器就会发送出⼀个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.

GET 请求的特点
• ⾸⾏的第⼀部分为 GET
• URL 的 query string 可以为空, 也可以不为空.
• header部分有若⼲个键值对结构. • body 部分为空.

POST ⽅法也是⼀种常⻅的⽅法. 多⽤于提交⽤⼾输⼊的数据给服务器(例如登陆⻚⾯).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使⽤ JavaScript 的 ajax 也可以构造 POST 请求.

POST 请求的特点
• ⾸⾏的第⼀部分为 POST
• URL 的 query string ⼀般为空 (也可以不为空)
• header部分有若⼲个键值对结构.
• body 部分⼀般不为空. body 内的数据格式通过 header 中的Content-Type 指定. body 的⻓度 由 header 中的 Content-Length 指定.

谈谈 GET 和 POST 的区别?(经典面试题)
• 语义不同: GET ⼀般⽤于获取数据, POST ⼀般⽤于提交数据.
• GET 的 body ⼀般为空, 需要传递的数据通过 query string 传递, POST 的 query string ⼀般为空, 需要传递的数据通过 body 传递.
• GET 请求⼀般是幂等的, POST 请求⼀般是不幂等的. (如果多次请求得到的结果⼀样, 就视为请求是幂等的).
• GET 可以被缓存, POST 不能被缓存. (这⼀点也是承接幂等性)

在这里插入图片描述

2.4 认识请求 “报头” (header)

header 的整体的格式也是 “键值对” 结构.
每个键值对占⼀⾏. 键和值之间使⽤分号分割.
报头的种类有很多, 此处仅介绍⼏个常⻅的
Host

表⽰服务器主机的地址和端⼝.

Content-Length

表⽰ body中的数据⻓度.通过这个长度来处理“粘包”问题,HTTP底层也是基于TCP,连续传输多个HTTP数据报,此时接收方这边的接收缓冲区里面就会积累多个包的数据,应用程序在读取这些数据的时候就需要明确包之间的边界。

Content-Type

表⽰请求的 body 中的数据格式.boby可以传输很多种格式,包括程序员也可以自己约定任意的格式,但有些格式非常常见。
请求中:
1)application/json:数据为 json 格式.
2)application/x-www-form-urlencoded:form 表单提交的数据格式.
3)multipart/form-data: form 表单提交的数据格式(在 form 标签中加上enctyped=“multipart/form-data” . 通常⽤于提交图⽚/⽂件.

User-Agent (简称 UA)

表⽰浏览器/操作系统的属性.
形如: 1 Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) .
其中 Windows NT 10.0; Win64; x64表⽰操作系统信息 .
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 表⽰浏览器信息.

Referer

表⽰这个⻚⾯是从哪个⻚⾯跳转过来的.
如果直接在浏览器中输⼊URL, 或者直接通过收藏夹访问⻚⾯时是没有 Referer 的.
Q:referer是否会被篡改(eg.运营商劫持)?
A:十年前这种情况很普遍,后来通过使用HTTPS里面的SSL(网络中用于加密的协议)就能很好解决这个问题。把header和body进行加密,网络上传输的就是密文,想要篡改就需要破解,就算解密成功也不能篡改,因为一旦修改就能被用户的浏览器感知到。

Cookie

本质是一个浏览器这边本地持久化存储数据的机制(数据要存到硬盘里)。
Cookie 中存储了⼀个字符串, 这个数据可能是客⼾端(⽹⻚)⾃⾏通过 JS 写⼊的, 也可能来⾃于服务器 (服务器在 HTTP 响应的header 中通过 Set-Cookie 字段给浏览器返回数据).
往往可以通过这个字段实现 “⾝份标识” 的功能.
每个不同的域名下都可以有不同的 Cookie, 不同⽹站之间的 Cookie 并不冲突.
在这里插入图片描述在这里插入图片描述在这里插入图片描述

三、HTTP 响应

3.1 “状态码” (status code)

状态码表⽰访问⼀个⻚⾯的结果. (是访问成功, 还是失败, 还是其他的⼀些情况…).

在这里插入图片描述
以下为常⻅的状态码—

  • 200 OK 这是⼀个最常⻅的状态码, 表⽰访问成功.
  • 404 Not Found 没有找到资源.
  • 403 Forbidden 请求的资源没有权限. 表⽰访问被拒绝. 有的⻚⾯通常需要⽤⼾具有⼀定的权限才能访问(登陆后才能访问). 如果⽤⼾没有登陆直接访问, 就容易⻅到 403.
  • 405 Method Not Allowed
  • 对⽅的服务器不⼀定都⽀持所有的⽅法(或者不允许⽤⼾使⽤⼀些其他的⽅法).eg.你的服务器只支持GET请求,但是你发了POST请求.
  • 500 Internal Server Error 服务器出现内部错误(服务器挂了). ⼀般是服务器的代码执⾏过程中遇到了⼀些特殊情况(服务器异常崩溃)会产⽣这个状态码. 咱们平时常⽤的⽹站很少会出现 500(但是偶尔也能看到)
  • 504 Gateway Timeout 当服务器负载⽐较⼤的时候, 服务器处理单条请求的时候消耗的时间就会很⻓, 就可能会导致出现超时的情况. 访问服务器超时,可能是服务器挂了,也可能是网挂了.
  • 302 Move temporarily 临时重定向.明明要访问的网站A,A让你去访问B,浏览器就会自动去访问B.
  • 301 Moved Permanently 永久重定向. 当浏览器收到这种响应时, 后续的请求都会被⾃动改成新的地址. 301 也是通过 Location 字段来表⽰要重定向到的新地址

状态码小结:
在这里插入图片描述

四、HTPPS工作过程(经典面试题)

只要针对HTTPS的数据进行解密,就能得到HTTP格式的数据,前面提到的运营商劫持,无论是修改referer还是修改返回的链接(body),本质上都是明文传输造成的问题。需要引入加密,对上述传输的数据进行保护,主要是针对header和body进行加密。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述操作,仍有严重的漏洞,黑客仍有办法破解掉其中的加密操作。
服务器也可以创建出一对公钥和私钥,按照同样的方法,冒充自己是服务器。
在这里插入图片描述

如何解决上述问题?
引⼊证书。
服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性。
在这里插入图片描述
验证证书过程:
在这里插入图片描述

HTTPS 工作过程中涉及到的密钥有三组.
第⼀组(非对称加密): 用于校验证书是否被篡改. 服务器持有私钥(私钥在注册证书时获得), 客户端持有
公钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥). 服务器使用这个私钥对证书
的签名进行加密. 客⼾端通过这个公钥解密获取到证书的签名, 从而校验证书内容是否是篡改过.
第⼆组(非对称加密): ⽤于协商⽣成对称加密的密钥. 服务器生成这组 私钥-公钥 对, 然后通过证书把公
钥传递给客户端. 然后客户端用这个公钥给⽣成的对称加密的密钥加密, 传输给服务器, 服务器通过私钥
解密获取到对称加密密钥.
第三组(对称加密): 客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密.
其实⼀切的关键都是围绕这个对称加密的密钥. 其他的机制都是辅助这个密钥工作的.
第⼆组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器.
第⼀组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥.


最后,码字不易,如果觉得对你有帮助的话请点个赞吧,关注我,一起学习,一起进步!

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

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

相关文章

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能: 智能定位与路线规划:UU跑腿小程序能够利用定位技术,为用户提供附近的跑腿服务,并自动规划最佳路线,提高配送效率。订单管理:包括订单查询、订单状态更新、订单评价等功能,全行业覆盖…

智慧营销的未来:中国AIGC技术的演进与应用 #未来是现在的趋势#

📑前言 随着人工智能(AI)技术的蓬勃发展,尤其是在营销技术(MarTech)领域,AIGC(AI Generated Content)技术在中国市场的应用和影响日益显著。2023年,中国在AIG…

一款好用的memcached的内存使用分析工具

文章目录 简介1.打印帮助信息2.查看memcached的基础信息3.查看memcached的StatsSizes分布4.查看memcachd中slab的使用情况5.查看memcachd中slab的置换率、回收及内存使用率 简介 xmc是一款分析memcached内存使用情况的工具,通过读取memcached的状态,包括…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件,选择Config or installation folder 如果本地没有设置文件,选择Do not import settings 同意两个协议 耐…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电:测试手机来电时,能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件:待测手机与车载车载设备处于连接状态 2、测试步骤: 1)用辅助测试机拨打待测手机&…

LeetCode-460. LFU 缓存【设计 哈希表 链表 双向链表】

LeetCode-460. LFU 缓存【设计 哈希表 链表 双向链表】 题目描述:解题思路一:一张图秒懂 LFU!解题思路二:精简版!两个哈希表,一个记录所有节点,一个记录次数链表【defaultdict(new_list)&#x…

OpenHarmony实战开发——WLAN驱动框架介绍及适配方法

1. WLAN 驱动框架概述 WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度,减少 WLAN 驱动移植和开发的工作量。 本文主要分析 WLAN 驱…

Windows下安装人大金仓数据库

1、点击安装包进行安装 2、双击进行安装 3、点击确定 4、接着选择下一步 5、勾选接收 6、选择授权文件 7、显示授权文件信息 8、选择安装位置 9、点击安装 10、点击下一步 11、正在进行安装 12、设置密码。123456 13、系统正在进行配置 14、安装完成 15、登…

C 深入指针(3)

目录 一、关于数组名 1 数组名的理解 2 数组名 与 &数组名 的区别 二、使用数组访问指针 三、一维数组传参的本质 四、二级指针 五、指针数组 六、指针数组模拟二维数组 一、关于数组名 1 数组名的理解 //VS2022 x64 #include <stdio.h> int main() {int …

为什么要使用大模型

随着OpenAI引领的超大模型风潮&#xff0c;大模型的发展日新月异&#xff0c;如同雨后春笋般茁壮成长。在现今的科技舞台上&#xff0c;每周&#xff0c;甚至每一天&#xff0c;我们都能见证到一个全新模型的开源&#xff0c;这些模型的创新性和实用性不断超越前作&#xff0c;…

leetcode 1235

leetcode 1235 代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vector<vector<int>> jobs(n);for(int i0; i<n; i){jobs[i] …

Kotlin基础知识总结(三万字超详细)

1、条件语句 &#xff08;1&#xff09;if条件 if条件表达式&#xff0c;每一个分支最后一条语句就是该分支的返回值。适用于每个分支返回值类型一致这种情况。 fun getDegree(score: Int): String{val result: String if(score 100){"非常优秀"}else if(score …

Vue从入门到实战Day03

一、生命周期 1. 生命周期四个阶段 思考&#xff1a; ①什么时候可以发送初始化渲染请求&#xff1f; 答&#xff1a;越早越好&#xff0c;在创建阶段后 ②什么时候可以开始操作DOM&#xff1f; 答&#xff1a;至少DOM得渲染出来&#xff0c;在挂载阶段结束后。 Vue生命周…

SpringBoot+logback实现日志记录写入文件

前言 在实际的开发过程中&#xff0c;日志记录有着极其重要的作用&#xff0c;它帮助我们实现更高效的故障排查与调试、更及时的监控和性能优化、更全面的业务分析与决策支持…那么我们如何在SpringBoot项目中实现日志的个性化定制&#xff0c;以满足其他特殊需求呢&#xff1f…

987: 输出用先序遍历创建的二叉树是否为完全二叉树的判定结果

解法&#xff1a; 一棵二叉树是完全二叉树的条件是&#xff1a; 对于任意一个结点&#xff0c;如果它有右子树而没有左子树&#xff0c;则这棵树不是完全二叉树。 如果一个结点有左子树但是没有右子树&#xff0c;则这个结点之后的所有结点都必须是叶子结点。 如果满足以上条…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数&#xff08;回归&#xff09; 2.1 最小二乘函数&#xff08;Least Squares Function&#xff09; 2.2 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2.3 均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09; 2.4 平均绝…

PC端网页特效异读

pc网页特效 一、三大系列1.元素偏移量&#xff08;offset系列&#xff09;&#xff08;1&#xff09;一些属性&#xff08;2).offset和style的区别(3).一些例子 2.元素可视区(client系列&#xff09;(1).一些属性(2).flexible.js源码分析 3.scroll系列(4).三大系列小结 其他&am…

libcity笔记:参数设置与参数优先级

1 参数优先级 高优先级的参数会覆盖低优先级的同名参数 Libcity中的优先级顺序维&#xff1a; 命令行参数&#xff08;命令行python run_model.py时导入的&#xff09; > 用户定义配置文件&#xff08;命令行python run_model.py时由config_file导入的&#xff09; >…

QT--4

QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…

jsp 实验16 MVC 表白墙

源代码以及执行结果截图&#xff1a; ExpressWish_Bean.java package web; import java.util.HashMap; import java.util.ArrayList; import java.util.Iterator; public class ExpressWish_Bean { public HashMap<String,ExpressWish> wishList; ArrayList&…