一文搞懂HTTP和HTTPS协议
1.什么是协议?
网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者“规则”,有了这种“约定”,不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信。
2.HTTP协议是什么?
HTTP协议是超文本传输协议的缩写,他是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。
HTTP协议是一个双向协议。我们在上网冲浪时,浏览器是请求方A,百度网站是应答方B,双方约定通过HTTP协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染在屏幕。虽然是在A和B之间传输,但允许中间有中转或接力,在HTTP里,需要中间人遵从HTTP协议,只要不打扰基本的数据传输,就可以添加任意额外的东西,就好像第一排的同学想传递给最后一排的同学,那么传递的过程就需要经过好多个同学(中间人),这样的传输方式就从「A < --- > B」变成了「A <-> N <-> M <-> B」。
超文本传输协议:
「协议」:刚毕业时会签一个协议,例如三方协议。「协」字,代表的意思是必须有两个以上的参与者,例如三方协议参与者:你、公司、学校;「议」:代表的意思是对参与者的一种行为和规范,三方协议有试用期期限等。
「传输」:所谓的传输很好理解,就是把一堆东西从A点搬到B点,或者从B点搬到A点。
「超文本」:它是超越了普通文本的文字,是图片、视频等的混合体最关键的有超链接,能从一个超文本跳到另一个超文本,HTML就是最常见的超文本了,他本身只是纯文字文件,但内部定义了很多标签定义了图片、视频等的链 接,在经过浏览器的解释,呈现给我们的就是一个文字有画面的网页了。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
HTTP有多个版本,目前广泛使用的是HTTP/1.1版本。
3.HTTP原理
HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件、图片文件,查询结果等。浏览器作为HTTP客户端通过URL向HTTP服务器发送所有请求。
我们以百度为例:
4.HTTP特点
- http协议支持客户端/服务端模式,也是一种请求/响应模式协议
- 简单快速: 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST
- 灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Typr加以标记;各类请求方法都没有被固定死允许开发人员自定义和补充
- 无连接:限制每次连接只处理一个请求。服务器处理完请求,并收到客户的应答后,即断开连接,但是不利于客户端与服务器保持会话连接,为了弥补这种不足,产生了两项记录HTTP状态的技术(Cookie和Session)
- 无状态:无状态的好处,因为服务器不会记忆HTTP状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够更多地把CPU和内存用来对外提供服务;无状态的坏处,既然服务器没有记忆能力,他在完成所有关联行的操作会非常麻烦, 例如:登录->添加购物车->下单->结算->支付,这系列操作都要知道用户的身份才行。但服务器不知道这些请求是关联的,每次都要问一遍身份信息。
- 明文传输双刃剑:明文意味着在传输过程中的信息,是方便可阅读的,为我们调试工作带来了极大的便利,但是正是这样HTTP的所有信息相当于裸奔,传输的信息毫无隐私可言,很容易就被窃取。
- 不安全:明文传输,内容可能被窃听;不验证通信方的身份,有可能遭遇伪装; 无法正在报文的完整性,有可能已遭篡改,比如网上植入垃圾广告,视觉污染,眼没了;
对于无状态的问题解决方案有多种,其中比较简单的方式用Cookie技术和Session技术; Cookie在通过请求和响应报文中写入Cookie信息来控制客户端的状态。
5.URI和URL的区别
URI(统一资源标识符):是用来表示一个具体的资源的,我们可以通过URI知道一个资源时什么。
URL(统一资源定位符):是用来定位一个具体的资源的,标示了一个具体的资源位置,互联网的每一个文件都有一个唯一的URL.
6.HTTP报文组成
请求报文组成
1.请求行:包括请求方法、URL、协议版本
2.请求头(Request Header)
3.请求正文
响应报文组成
1.状态行
2.响应头
3.响应正文
7.常见请求方法
- GET:请求指定的页面信息
- POST:向指定资源提交数据进行处理请求(例如提交表单或上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立/或已有资源的修改
- PUT:从客户端向服务器传送的数据取代指定的文档内容
- DELETE:请求服务器删除指定内容
POST和GET的区别:
GET方法的含义是请求从服务器获取资源,这个资源可以使静态的文本、页面、图片视频等。
比如你打开我的文章,浏览器就会发送GET请求给服务器,服务器就会返回文章的所有文字和资源
POST,它向URI指定的资源提交数据,数据就放在报文的body里,然后拼接好POST请求头,通过TCP协议发送给服务器
比如你在我的文章底部,评论或者留言(暗示你们留言^_^),浏览器会执行一次POST请求,把你的留言文字放在报文body里,然后拼接好POST请求头,通过TCP协议发送给服务器
8.安全和冥等,以及get和post有安全和冥等吗?
概念:所谓的「安全」是指请求方法不会「破坏」服务器上的资源。所谓的「冥等」,意思是执行多次相同的操作,结果都是「相同」的。
那么很明显GET的方法是安全冥等的,因为它是「只读操作」,无论操作多少次,服务器上的数据是安全的,切每次结果是相同的。
POST因为是「新增或者提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交就会创建多个资源,所以是不「冥等」的。
9.响应状态码
访问一个网页时,浏览器会向web服务器发出请求,此网页所在的服务器会返回一个包含HTTP状态码的信息头用来响应浏览器的请求。
状态码分类:
- 1XX- 信息型,服务器收到请求,需要请求者继续操作
- 2XX- 成功型,请求成功收到,理解并处理
- 3XX -重定向,需要进一步的操作已完成请求
- 4XX - 客户端错误,请求包含语法错误或无法完成请求
- 5XX - 服务器错误,服务器在处理请求的过程中发生了错误。
常见状态码:
- 200:OK客户端请求成功
- 301:资源(网页等)被永久转移到其他URL
- 302:临时跳转
- 400:客户端请求有语法错误,不能被服务器理解
- 401:请求未经授权
- 404:请求资源不存在,可能是输入了错误的URL
- 500:服务器内部发生了不可预期的错误
- 503:Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常
10.为什么要用https?
HTTP是超文本传输协议,信息是明文传输,存在安全风险问题。HTTPS则解决HTTP不安全的缺陷,在TCP和HTTP网络层加入了SSL安全协议,使得报文能加密传输,通过SSL证书来验证服务器的身份,并为浏览器和服 务 器之间的通信进行加密
SSL协议位于TCP/IP协议与各种应用层协议 之间,为数据通讯提供安全支持
11.浏览器在使用HTTPS传输数据的流程是什么?
- 首先客户端通过URL访问服务器建立SSL链接。
- 服务器收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端
- 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级
- 客户端的浏览器根据双方同意的安全等级,建立会话秘钥,然后利用网站的公钥将会话密钥加密,并传送给网站
- 服务器利用自己的私钥解密出会话密钥
- 服务器利用会话密钥加密与客户端之间的通信
12.HTTPS的缺点
- HTTPS协议多次握手,导致页面的加载时间延长近50%
- HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗
- 申请SSL证书需要钱,功能越强大的证书费用越高
- SSL涉及到的安全算法会消耗CPU资源,对服务器消耗较大
13.总结HTTPS和HTTP的区别
- HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理
- HTTP链接建立相对简单,TCP三次握手后便可进行HTTP的报文传输。而HTTPS在TCP三次握手之后,还需进行SSL/TLS的握手过程,才可加密明文传输
- HTTP和HTTP使用连接方式不同,默认端口号也不一样,HTTP是80,HTTPS是443
- HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的
14. HTTPS解决了HTTP的哪些问题
窃听风险(获取通信内容,用户账号容易没);篡改风险(强制植入垃圾广告,视觉污染);冒充风险(冒充淘宝网站,用户钱容易没)。
HTTPS是如何解决上面三个问题的?
- 混合加密的方式实现信息的机密性,解决了窃听的风险
- 摘要算法的方式来实现完整性,他能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改风险
- 将服务器的公钥放入到数字证书中,解决了冒充风险