全面了解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是指传输控制协议/网间协议,是目前世界上应用最广的协议 。
全面了解HTTP和HTTPS

文章插图
 
两种模型区别
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说明一下请求头和响应头的部分字段: