全面了解HTTP和HTTPS的区别

发布时间:2019-06-12 18:16:31 作者:admin 来源:本站 浏览量(733) 点赞(148)
摘要:序言Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们。在学习Http和Https的过程中,主要是参考了阮一峰老师的博客《阮一峰:HTTP 协议入门》,讲的很全面,并且通俗易懂,有兴趣的同学可以去学习学习。这篇文章主要是按照自己的思路来讲解对Http和Https的理解。文章将会从

序言

Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们。

在学习Http和Https的过程中,主要是参考了阮一峰老师的博客《阮一峰:HTTP 协议入门》,讲的很全面,并且通俗易懂,有兴趣的同学可以去学习学习。

这篇文章主要是按照自己的思路来讲解对Http和Https的理解。文章将会从以下几个方面介绍。

目录树:

一、网络层结构

二、Http协议

三、Tcp三次握手

四、Https协议/SSL协议

五、SSL证书

六、RSA加密和DH加密

七、Http和Https对比

从目录结构可以看出,每个标题展开来说都是一个很大的主题。但本文旨在让各位同学对Http和Https相关知识有一个全面的认知,不会太过深入探讨各个主题,有兴趣的同学可以进行针对性研究。

一、网络层结构

网络结构有两种主流的分层方式:OSI七层模型和TCP/IP四层模型。

OSI七层模型和TCP/IP四层模型

OSI是指Open System Interconnect,意为开放式系统互联。

TCP/IP是指传输控制协议/网间协议,是目前世界上应用最广的协议。

5.jpg

两种模型区别

1、OSI采用七层模型,TCP/IP是四层模型

2、TCP/IP网络接口层没有真正的定义,只是概念性的描述。OSI把它分为2层,每一层功能详尽。

3、在协议开发之前,就有了OSI模型,所以OSI模型具有共通性,而TCP/IP是基于协议建立的模型,不适用于非TCP/IP的网络。

4、实际应用中,OSI模型是理论上的模型,没有成熟的产品;而TCP/IP已经成为国际标准。

二、HTTP协议

Http是基于TCP/IP协议的应用程序协议,不包括数据包的传输,主要规定了客户端和服务器的通信格式,默认使用80端口。

Http协议的发展历史

1、1991年发布Http/0.9版本,只有Get命令,且服务端直返HTML格式字符串,服务器响应完毕就关闭TCP连接。

2、1996年发布Http/1.0版本,优点:可以发送任何格式内容,包括文字、图像、视频、二进制。也丰富了命令Get,Post,Head。请求和响应的格式加入头信息。缺点:每个TCP连接只能发送一个请求,而新建TCP连接的成本很高,导致Http/1.0新能很差。

3、1997发布Http/1.1版本,完善了Http协议,直至20年后的今天仍是最流行的版本。

优点:a. 引入持久连接,TCP默认不关闭,可被多个请求复用,对于一个域名,多数浏览器允许同时建立6个持久连接。b. 引入管道机制,即在同一个TCP连接中,可以同时发送多个请求,不过服务器还是按顺序响应。c. 在头部加入Content-Length字段,一个TCP可以同时传送多个响应,所以就需要该字段来区分哪些内容属于哪个响应。d. 分块传输编码,对于耗时的动态操作,用流模式取代缓存模式,即产生一块数据,就发送一块数据。e. 增加了许多命令,头信息增加Host来指定服务器域名,可以访问一台服务器上的不同网站。

缺点:TCP连接中的响应有顺序,服务器处理完一个回应才能处理下一个回应,如果某个回应特别慢,后面的请求就会排队等着(对头堵塞)。

4、2015年发布Http/2版本,它有几个特性:二进制协议、多工、数据流、头信息压缩、服务器推送。

Http请求和响应格式

Request格式:

GET /barite/account/stock/groups HTTP/1.1 

QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCA 

DEVICE-TYPE: ANDROID 

API-VERSION: 15 

Host: shitouji.bluestonehk.com 

Connection: Keep-Alive 

Accept-Encoding: gzip 

User-Agent: okhttp/3.10.0 

Response格式:

HTTP/1.1 200 OK 

Server: nginx/1.6.3 

Date: Mon, 15 Oct 2018 03:30:28 GMT 

Content-Type: application/json;charset=UTF-8 

Pragma: no-cache 

Cache-Control: no-cache 

Expires: Thu, 01 Jan 1970 00:00:00 GMT 

Content-Encoding: gzip 

Transfer-Encoding: chunked 

Proxy-Connection: Keep-alive 

 {"errno":0,"dialogInfo":null,"body":{"list":[{"flag":2,"group_id":1557,"group_name":"港股","count":1},{"flag":3,"group_id":1558,"group_name":"美股","count":7},{"flag":1,"group_id":1556,"group_name":"全部","count":8}]},"message":"success"} 

说明一下请求头和响应头的部分字段:

Host:指定服务器域名,可用来区分访问一个服务器上的不同服务

Connection:keep-alive表示要求服务器不要关闭TCP连接,close表示明确要求关闭连接,默认值是keep-alive

Accept-Encoding:说明自己可以接收的压缩方式

User-Agent:用户代理,是服务器能识别客户端的操作系统(Android、IOS、WEB)及相关的信息。作用是帮助服务器区分客户端,并且针对不同客户端让用户看到不同数据,做不同操作。

Content-Type:服务器告诉客户端数据的格式,常见的值有text/plain,image/jpeg,image/png,video/mp4,application/json,application/zip。这些数据类型总称为MIME TYPE。

Content-Encoding:服务器数据压缩方式

Transfer-Encoding:chunked表示采用分块传输编码,有该字段则无需使用Content-Length字段。

Content-Length:声明数据的长度,请求和回应头部都可以使用该字段。

三、Tcp三次握手

Http和Https协议请求时都会通过Tcp三次握手建立Tcp连接。

那么,三次握手是指什么呢?

6.jpg

那么,为什么一定要三次握手呢,一次可以吗?两次可以吗?

带着这些问题,我们来分析一下为什么必须是三次握手。

1、第一次握手,A向B发送信息后,B收到信息。B可确认A的发信能力和B的收信能力

2、第二次握手,B向A发消息,A收到消息。A可确认A的发信能力和收信能力,A也可确认B的收信能力和发信能力

3、第三次握手,A向B发送消息,B接收到消息。B可确认A的收信能力和B的发信能力

通过三次握手,A和B都能确认自己和对方的收发信能力,相当于建立了互相的信任,就可以开始通信了。

下面,我们介绍一下三次握手具体发送的内容,用一张图描述如下:

7.jpg

首先,介绍一下几个概念:

ACK:响应标识,1表示响应,连接建立成功之后,所有报文段ACK的值都为1

SYN:连接标识,1表示建立连接,连接请求和连接接受报文段SYN=1,其他情况都是0

FIN:关闭连接标识,1标识关闭连接,关闭请求和关闭接受报文段FIN=1,其他情况都是0,跟SYN类似

seq number:序号,一个随机数X,请求报文段中会有该字段,响应报文段没有

ack number:应答号,值为请求seq+1,即X+1,除了连接请求和连接接受响应报文段没有该字段,其他的报文段都有该字段

知道了上面几个概念后,看一下三次握手的具体流程:

1、第一次握手:建立连接请求。客户端发送连接请求报文段,将SYN置为1,seq为随机数x。然后,客户端进入SYN_SEND状态,等待服务器确认。

2、第二次握手:确认连接请求。服务器收到客户端的SYN报文段,需要对该请求进行确认,设置ack=x+1(即客户端seq+1)。同时自己也要发送SYN请求信息,即SYN置为1,seq=y。服务器将SYN和ACK信息放在一个报文段中,一并发送给客户端,服务器进入SYN_RECV状态。

3、第三次握手:客户端收到SYN+ACK报文段,将ack设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕,客户端和服务券进入ESTABLISHED状态,完成Tcp三次握手。

从图中可以看出,建立连接经历了三次握手,当数据传输完毕,需要断开连接,而断开连接经历了四次挥手:

1、第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了

2、第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。

3、第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。

4、第四次挥手:主机1收到主机2的FIN报文段,想主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。

下面是Tcp报文段首部格式图,对于理解Tcp协议很重要:

8.jpg

四、Https协议/SSL协议

Https协议是以安全为目标的Http通道,简单来说就是Http的安全版。主要是在Http下加入SSL层(现在主流的是SLL/TLS),SSL是Https协议的安全基础。Https默认端口号为443。

前面介绍了Http协议,各位同学能说出Http存在的风险吗?

1、窃听风险:Http采用明文传输数据,第三方可以获知通信内容

2、篡改风险:第三方可以修改通信内容

3、冒充风险:第三方可以冒充他人身份进行通信

SSL/TLS协议就是为了解决这些风险而设计,希望达到:

1、所有信息加密传输,三方窃听通信内容

2、具有校验机制,内容一旦被篡改,通信双发立刻会发现

3、配备身份证书,防止身份被冒充

下面主要介绍SSL/TLS协议。

SSL发展史(互联网加密通信)

1、1994年NetSpace公司设计SSL协议(Secure Sockets Layout)1.0版本,但未发布。

2、1995年NetSpace发布SSL/2.0版本,很快发现有严重漏洞

3、1996年发布SSL/3.0版本,得到大规模应用

4、1999年,发布了SSL升级版TLS/1.0版本,目前应用最广泛的版本

5、2006年和2008年,发布了TLS/1.1版本和TLS/1.2版本

SSL原理及运行过程

SSL/TLS协议基本思路是采用公钥加密法(最有名的是RSA加密算法)。大概流程是,客户端向服务器索要公钥,然后用公钥加密信息,服务器收到密文,用自己的私钥解密。

为了防止公钥被篡改,把公钥放在数字证书中,证书可信则公钥可信。公钥加密计算量很大,为了提高效率,服务端和客户端都生成对话秘钥,用它加密信息,而对话秘钥是对称加密,速度非常快。而公钥用来机密对话秘钥。

下面用一张图表示SSL加密传输过程:

9.jpg

详细介绍一下图中过程:

1、客户端给出协议版本号、一个客户端随机数A(Client random)以及客户端支持的加密方式

<p style="margin-top: 15px; margin-bottom: 15px; border: 0px; padding: 0px; vertical-align: baseline; list-style: none; color: rgb(85, 85, 85); outline: none; font-size: 15px; line-height: 26px; font-family: "Microsoft Yahei", "Microsoft Jhenghei", Tahoma, Simsun; white-spac

二维码

扫一扫,关注我们

声明:本文由【达扬网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【达扬网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

现在,非常期待与您的一次邂逅

青海达扬网络传媒有限责任公司努力让每一次邂逅总能超越期待!

您身边的【互联网信息化建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,软件开发,政府网站建设,信息系统开发,网络安全维护,app开发等

立即咨询 0971-6275815
在线客服
嘿,我来帮您!