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

news2024/12/23 6:47:01

文章目录

  • 一、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.coloradmin.cn/o/1658687.html

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

相关文章

数据结构——希尔排序

基本思想: 希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述…

翼支付——风控场景中图模型的范式变迁

目录 风控图深度学习模型 风控图大模型

7-zip下载、安装

7-Zip 官方中文网站 (sparanoid.com) 7-Zip - 程序下载 (sparanoid.com)

idea使用git不提示账号密码登录,而是输入token问题解决

idea 或者 webstream 等全家桶软件 使用git 推送代码时,不提示账号密码登录,而是输入token问题解决 你的代码仓库是gitlab 然后打开修改代码后推送时,会默认使用gitlab插件,所以提示数据token 解决方式就是把gitlab插件取消使用这…

Kafka从0到消费者开发

安装ZK Index of /zookeeper/zookeeper-3.9.2 下载安装包 一定要下载-bin的,不带bin的是源码,没有编译的,无法执行。-bin的才可以执行。 解压 tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz 备份配置 cp zoo_sample.cfg zoo_sample.cfg-b…

Angular入门

Angular版本:Angular 版本演进史概述-天翼云开发者社区 - 天翼云 安装nodejs:Node.js安装与配置环境 v20.13.1(LTS)-CSDN博客 Angular CLI是啥 Angular CLI 是一个命令行接口(Angular Command Line Interface),是开发 Angular 应用的最快、最…

【Java基础】时间相关的类

需要引入类包java.util.Date* 用构造方法得到当前时间 Date d new Date(); 用构造方法将long类型的时间值转成日期 Date dd new Date(time); 得到当前时间的毫秒值 Long System.currentTimeMillis() 把Date类型转为long类型 long getTime() Date d new Date();//重写了…

亚马逊云科技中国峰会:与你开启云计算与前沿技术的探索之旅

亚马逊云科技中国峰会:与你开启云计算与前沿技术的探索之旅 Hello,我是科技博主Maynor,非常高兴地向你们推荐亚马逊云科技中国峰会,这是一场将于 5 月 29 日至 30 日在上海世博中心举办的科技盛会,如果你对云计算、行业发展新趋势…

探索人工智能的深度神经网络:理解、应用与未来

深度神经网络(DNNs)是一种人工智能模型,其灵感来自于人脑神经元之间的连接。它们由多个层次组成,每一层都包含多个神经元,这些神经元通过权重连接在一起。信息通过网络的输入层传递,并经过一系列隐藏层&…

【Leetcode每日一题】 分治 - 交易逆序对的总数(难度⭐⭐⭐)(74)

1. 题目解析 题目链接:LCR 170. 交易逆序对的总数 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 归并排序的基本思路 归并排序将数组从中间分成两部分,在排序的过程中,逆序对的来…

如何把公章盖在电子档文件上?

将公章盖在电子档文件上,尤其是确保其法律效力和安全性,通常涉及以下步骤: 准备工作 获取合法的电子公章:确保你拥有公司或机构正式授权的电子公章图像,且该图像经过了必要的加密或数字签名处理,以确保其…

特征提取与深度神经网络(二)

关键点/角点检测 2011论文-ORB关键点检测,比SIFT与SURF速度更快。 ORB算法可以看出两个部分组成:快速关键点定位BRIEF描述子生成 Fast关键点检测: 选择当前像素点P,阈值T,周围16个像素点,超过连续N12个像素…

SparkSQL概述

1.1. SparkSQL介绍 SparkSQL,就是Spark生态体系中的构建在SparkCore基础之上的一个基于SQL的计算模块。SparkSQL的前身不叫SparkSQL,而是叫做Shark。最开始的时候底层代码优化、SQL的解析、执行引擎等等完全基于Hive,总是Shark的执行速度要比…

SpringCloud:认识微服务

程序员老茶 🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 P   S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈&#…

让数据更「高效」一点!IvorySQL在Neon平台上的迅速部署和灵活应用

IvorySQL本身就是一个100%兼容PostgreSQL最新内核的开源数据库系统,而Neon Autoscaling Platform通常支持多种数据库和应用程序。将IvorySQL集成到该平台后,可以进一步增强与其他系统和应用程序的兼容性,同时更全面的体验IvorySQL的Oracle兼容…

lint 代码规范,手动修复,以及vscode的第三方插件eslint自动修复

ESlint代码规范 不是语法规范,是一种书写风格,加多少空格,缩进多少,加不加分号,类似于书信的写作格式 ESLint:是一个代码检查工具,用来检查你的代码是否符合指定的规则(你和你的团队可以自行约定一套规则)…

【3dmax笔记】032: 编辑顶点

一、编辑顶点概述 (1)启动安装好的3dmax软件。 (2)选择顶视图,用图形画出一个矩形。 (3)选择矩形,右击鼠标,将矩形转换成可编辑样条线。 (4)进入顶点层级。 展开可编辑样条线,选择顶点层级(快捷键为1,在不展开样条线的情况下也可以选择顶点层级)。选择后,可以…

python:做柱状图

import matplotlib.pyplot as plt # 数据 categories [A, B, C, D] values [23, 45, 56, 78] # 创建柱状图 plt.bar(categories, values) # 添加标题和标签 plt.title(柱状图示例) plt.xlabel(类别) plt.ylabel(数值) # 显示图形 plt.show() D:\software\新建文件夹\python\L…

TODESK远程开机的原理

在现代计算机技术飞速发展的背景下,远程控制软件成为我们日常工作中不可或缺的工具。其中,ToDesk作为一款高效且易用的远程控制软件,备受用户青睐。那么,ToDesk远程开机的原理是什么呢?本文将为你揭晓这个秘密。 KKVie…

[淘宝销量]—采集分析—实例参考▶

[干货] 本文爬取淘宝的搜索结果,包含标题、价格、原价、店铺、月销量字段。将结果保存成csv格式,并作简单分析。以手机为例。【淘宝销量】 用到的python库:selenium、urllib、pyquery、pandas。 1.爬取页面分析 1.1 获取URL 打开淘宝&am…