HTTP和HTTPS协议及工作原理分析

 HTTP协议概念

HTTP协议(HyperText Transfer Protocol,超文本传输协议,属于应用层)是用于从服务器传输超内容到本地浏览器的传送协议。是一个无状态的协议

想了解http,就需要了解TCP,IP协议。因为http是基于TCP,IP层上面的。如下图所示:

整张图应该从下边向上看,假设别人想发一条信息给我的电脑。首先是通过网络把信息传导到的电脑,但不能说我的电脑对于所有的信息都接受,我会判断信息,之后在处理信息,这些就是七层模型做的事情。一步一步分开来看 ,并用打电话这一创建的例子来对应:

  1. 物理层 包括物理连网媒介,实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西。它规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。(这就相当于电信公司的信号发射塔,接收信号而已)
  2. 数据链路层 数据链路层主要作用是控制网络层与物理层之间的通信。它保证了数据在不可靠的物理线路上进行可靠的传递。它把从网络层接收到的数据分割成特定的可被物理层传输的帧,保证了传输的可靠性。(相当于发射塔让接受的信号更稳定,方便下一层的解读)
  3. 网络层 很多人经常混淆2层和3层的相关问题,简单来说,如果你在谈论一个与IP地址、路由协议或地址解析协议(ARP)相关的问题,那么这就是第三层的问题。  网络层负责对子网间的数据包进行路由选择,它通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中两个节点的最佳路径。另外,它还可以实现拥塞控制、网际互连等功能 (相当于我们打一个长途电话,当前连接的发射站不能直接传递给另一用户,需要先传递给附近的发射站)
    到这里为止,其实信息还没有传递到我们的电脑,可以理解为信息在路由网络间传递。
  4. 传输层 是OSI模型中最重要的一层,它是两台计算机经过网络进行数据通信时,第一个端到端的层次,起到缓冲作用。当网络层的服务质量不能满足要求时,它将提高服务,以满足高层的要求;而当网络层服务质量较好时,它只需进行很少的工作。另外,它还要处理端到端的差错控制和流量控制等问题,最终为会话提供可靠的,无误的数据传输。(相当于我们找到了最后的信号站,可以直接发送信号给通话者,但是这层会做一些数据的整合等工作)
  5. 会话层 会话层负责在网络中的两节点之间建立和维持通信,并保持会话获得同步,它还决定通信是否被中断以及通信中断时决定从何处重新发送。
  6. 表示层 表示层的作用是管理数据的解密与加密,如常见的系统口令处理,当你的账户数据在发送前被加密,在网络的另一端,表示层将对接收到的数据解密。另外,表示层还需对图片和文件格式信息进行解码和编码。 (相当于发射塔给手机发送一些压缩的信息,我们手机接收到后解码)
  7. 应用层   简单来说,应用层就是为操作系统或网络应用程序提供访问网络服务的接口,包括文件传输、文件管理以及电子邮件等的信息处理。  应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。 (这就是真正的收到信息,相当于我们听到了对方的声音,这次对话完成了)

总结起来就是:

  • 信息发出(www)

  1. --->发射塔收到不稳定信息流(物理层)
  2. ---> 发射塔整理信息流(链路层)
  3. ---> 发射塔转给离接收人更近的发射塔(网络层IP)
  4. ---> 发射塔向接收人发送信息(传输层TCP)
  5. ---> 通话建立(会话层)
  6. ---> 解码信息(表示层)
  7. ---> 发出声音给接收人(应用层HTTP)
  • 看到信息

对于HTTP网络应用,我们在网络层用的是IP,在传输层用的是TCP。
IP: internet protocal。顾名思义,网络协议。他能确保计算机之间在网络上互相通信,但是他不检查消息是否以发送次序到达而没有损坏,因此,我们需要上一层来检验消息。于是有了TCP层
TCP: 保证信息正确次序,内容不变。同时引入端口分发给不同的服务。同时分割数据为更小的ip包,到达时重组。
HTTP: 当信息解读好,我们传给HTTP层,即为应用层。超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

以上是对支撑HTTP的网络七层的概括,我们需要理解为什么要在http层下面有那么多层,每一层的目的是什么。

明白了这些之后,问题来了,这七层是怎么知道自己应该怎么解读数据,而不是说TCP层解读HTTP层。这里面就是网络数据的封装和传递了:

从这个图中,我们可以看到每一层的数据都会被一个这层的头信息包裹。
之后我们在接收到信息时再一层一层读取信息

讲完http,我们会发现,我们传递的信息在网络上经过那么多物理层的传输,保不准会被别人截获,而我们却一点也不知道。于是我们想到要加密我们传输的数据。因为只有http层信息是我们要的,所以在这一层下面加入一层来加密信息。这一层就是SSL层,同时我们如果想传给ssl层,我们用端口443.
ssl层简称安全套阶层,主要就是加密解密。
一开始我们会说,我们就让服务器给我们一个公钥,每次用他来解密不就行了。但是这种办法不可以,因为别人同样可以截获你的公钥,毕竟公钥也是在网络上传递的。
于是我们就要想一种办法,让我们的公钥也被加密,并且这个加密方式是在服务器或者我们电脑上进行的,这样才安全

HTTPS协议

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),简单来讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。

SSL:(Secure Socket Layer,安全套接字层),通过使用证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。SSL协议位于TCP/IP协议与各种应用层协议之间。

TLS:TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。SSL和TLS的主要区别?

TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。

说到HTTPS肯定少不了加解密算法,我们来了解下相关内容

有两种基本的加解密算法类型:

  1、对称加密(symmetrcic encryption):密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;例如我们创建一个带密码(口令)的加密压缩包。当你下次要把这个压缩文件解开的时候,你需要输入【同样的】密码。在这个例子中,密码/口令就如同刚才说的“密钥”。

   对称加密主要问题是共享秘钥,除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密。解决这个问题的方案是非对称加密

   2、非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥。一般来说指:加密时使用公钥,解密时使用私钥。

   这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。


如图:

 

总结及答疑

① 证书验证阶段

  1. 浏览器发起 HTTPS 请求
  2. 服务端返回CA证书(包含公钥)
  3. 客户端验证证书是否合法,如果不合法则提示告警

② 数据传输阶段

  1. 当证书验证合法后,在本地生成随机数
  2. 通过公钥加密随机数,并把加密后的随机数传输到服务端
  3. 服务端通过私钥对随机数进行解密
  4. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输

为什么数据传输是用对称加密?

非对称加密的加解密效率是非常低的,而在https 的应用场景中通常客户端端与服务端之间存在大量的ajax交互,非对称加密的效率是无法接受的;

另外,在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

为什么需要 CA 认证机构颁发证书?

HTTP 协议被认为不安全是因为传输过程容易被监听、伪造服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。

首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的“中间人攻击”问题。
“中间人攻击”的具体过程如下:


过程原理:

  1. 本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器
  2. 中间人服务器返回中间人自己的证书
  3. 客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输
  4. 中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密
  5. 中间人以客户端的请求内容再向正规网站发起请求
  6. 因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据
  7. 中间人凭借与正规网站建立的对称加密算法对内容进行解密
  8. 中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输
  9. 客户端通过与中间人建立的对称加密算法对返回结果数据进行解密

由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。

中间人攻击:总结起来一句话就是客户端不知道CA证书是不是合法的,谁都可以冒充合法的服务器,从而获取到真实的客户端生成的内容及随机数相关的值,然后中间人再利用获取到这些值去和真实的服务器进行https请求(这个过程是合法的,因为中间人这个服务器拿的真实的客户端数据,模仿真实的客户端请求)。

浏览器如何验证证书的合法性?

  1. 验证证书上的域名、有效期等信息是否正确。
  2. 判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证;
  3. 判断证书是否被篡改。需要与 CA 服务器进行校验;
  4. 判断证书是否已吊销。通过CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现,其中 OCSP 可用于第3步中以减少与 CA 服务器的交互,提高验证效率

只有认证机构可以生成证书吗?

从技术上角度来看谁都可以生成证书,只要有证书就可以完成网站的 HTTPS 传输。但是浏览器会提示风险。

用了 HTTPS 会被抓包吗?

会,但是得是用户授权了同意了访问该网站,只要是用户主动授权访问风险网站,都可能造成数据被中间人抓包

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

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

相关文章

前端兼容性问题

一、CSS 1、浏览器的兼容性问题-CSS 盒子模型(Box Model) 一旦为页面设置了恰当的 DTD,大多数浏览器都会按照上面的图示来呈现内容。然而 IE 5 和 6 的呈现却是不正确的。根据 W3C 的规范,元素内容占据的空间是由 width 属性设置的,而内容周…

索引原理及几种索引类型区别

在关系数据库中,索引是一种单独的、物理的对数据库表中的一列或多列的值进行排序的一种存储结构, 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码…

Android Studio Intent使用(显式、隐式)

https://blog.csdn.net/u012005313/article/details/47006689 使用Intent能够使程序在不同活动中跳转,意及能够使用不同界面。Intent用法分为显示和隐式 Intent概念:Intent是Android程序中各组件之间进行交互的一种重要方式,不仅可以指明当前…

淘宝首页的HTML以及CSS技术点

1、 一个网页的开发流程 内容结构,比如js、css页面结构。自上而下,从左往右。(内容、颜色块、间距、边框) 2、 line-height的5种设置方式及区别 normal || 1.5 || 150% || 50px || 5em 初始化元素的时候,一般使用 l…

Windows+Python 3.6环境下安装PyQt4

第一步:下载.whl,地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4,这里可以下载不同的python版本对应的包。 第二步:选择一个目录,将下载好的文件放到该目录下,然后cmd下,c…

0065-数方块

题目 数方块难度级别:A; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B 试题描述在墙角堆放着一堆完全相同的正方体小木块,如下图所示: 因为木块堆…

【HNOI2006】鬼谷子的钱袋

本题在洛谷上的链接:https://www.luogu.org/problemnew/solution/P2320 做法和二进制划分很像,,,原来我的二进制划分一直有点问题(之前我是枚举2的n次方然后减,逃)。。。 我们举20这个例子&…

小米5安卓使用微信X5 Blink内核调试

1.打开微信开发模式,连续点击MIUI版本 2.在其他高级设置、开发者选项打开调试 3.打开微信调试工具,选择移动调试,安卓设备调试,选择X5 BINK, 4.手机用数据线连接电脑,并用微信扫描二维码,打开TBS调试 5.退出微信&…

c语言小项目-使用mysql数据库的图书管理系统

VS2013通过MySQL方式连接到MySQL MySQL官网上C的API有两个。一个是很成熟的mysql,另一个是MySQL Connector/C,近两年才出的,模仿JDBC做的,封装得很方便使用。这里使用的是mysql方式。 1.新建bookAdminSys工程 2.将文件夹MySQL目录下的include添加到VC目录中的包含目录中,另外将…

二年级小学生四则运算30道题目

实现代码&#xff1a; #include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>int main(int argc, char **argv){int a[30],b[30]; int i,c,d;srand((unsigned int)time(NULL));for (i 0; i < 30; i){ a[i] rand()%101; b…

Java第一次上机实验源代码

小学生计算题&#xff1a; package 第一次上机实验_; import java.util.*; public class 小学计算题 { public static void main(String[] args){ System.out.println("请输入要出的题目的类型\n" "1、加法\n" "2、减法\n" "3、乘法\n"…

Centos7安装SVN+HTTP

1.首先安装svn yum install subversion 2.安装httpd yum install httpd 3.安装apache的svn操作模块 yum install mod_dav_svn yum install openssl openssl-devel 4.查看svn版本 svnserve –version 5.创建svn版本库 svnadmin create /home/svn/project 6.进入svn的c…

MyEclipse2015双击不能打开文件

1.返回桌面 2.连续按5次Shift键 3.点击启用粘滞键 4.再点击应用&#xff0c;然后确定 4.然后重新打开一下myeclipse2015就可以了 第二种方法&#xff1a; 1.关闭MyEclipse Explor窗口&#xff08;这个MyeclipseExplor是有问题的&#xff0c;不推荐用这个&#xff09; 2.W…

python 获取当前文件夹下所有文件名

os 模块下有两个函数&#xff1a; os.walk() os.listdir() 1 # -*- coding: utf-8 -*- 2 3 import os 4 5 def file_name(file_dir): 6 for root, dirs, files in os.walk(file_dir): 7 print(root) #当前目录路径 …

MyEclipse2015 Web项目转Maven项目

1、新建一个Web项目 下面是web项目的结构&#xff1a; 2.项目右键属性(开始转啦&#xff0c;注意诺) 注意&#xff1a;Target runtime可以随便选一个运行容器&#xff0c;比如tomcat,也可以不改动,直接下一步 注意&#xff1a;下面一定要选Standard Maven JEE project structu…

【题解】洛谷P4145 花神游历各国(线段树)

洛谷P4145&#xff1a;https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)1 一个限制条件 与正常线段树不同的是区间修改为开方 那么我们用一个数组记录每个区间的最大值 只有当这个区间的最大值大于1时才需要开方 因此 当我们更新到叶子节点时把每个区…

基于墨刀实现的短视频分享软件原型设计

1.设计理念 最近几年&#xff0c;随着生活节奏的加快&#xff0c;“快餐文化”成了社会的主流&#xff0c;人们乐于忙里偷闲&#xff0c;或者在电车上&#xff0c;或者在等车时&#xff0c;又或者忙了很久有些疲惫的时候打一局竞技手游&#xff0c;或是逛逛抖音&#xff0c;b站…

工作341:uni-表头不显示

需要pagejson style中加入 {"path": "pages/analysis_sale/analysis_sale","style": {"navigationBarTitleText": "商户销量统计","enablePullDownRefresh": false,"navigationStyle": "custom&q…

如何在FineUIMvc(ASP.NET MVC)中显示复杂的表格列数据(列表和对象)?

起源 最初&#xff0c;这个问题是知识星球内的一个网友提出的&#xff0c;如何在FineUIMvc中展现复杂的列数据&#xff1f; 在FineUIPro中&#xff0c;我们都知道有一个 TemplateField 模板列可以使用&#xff0c;我们只需要在后台定义一个 C# 方法&#xff0c;就可以返回任意想…