### 计算机网络TCP/IP模型 #### 1. 计算机网络TCP/IP五层模型 ![计算机网络TCP/IP五层模型](https://upload-images.jianshu.io/upload_images/2570030-c1bf4e65065a42e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 2. TCP和UDP协议的区别 ##### TCP和UDP协议的区别是什么? * TCP:面向链接的保证可靠传输的协议,通过TCP协议传输,得到的是一个顺序的无差错的数据流,能提供两台计算机之间的可靠数据传输。 * UDP协议:无链接的协议,每个数据包都是一个独立的信息,包括原地址和目的地址,他在网络上可以通过任何的途径把信息传递到目的地。至于能否达到目的地、达到目的地的时间、信息的准确性都不能得到保证。 ##### 既然有可靠的TCP协议,为什么还需要不可靠的UDP协议? * TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过**三次握手**方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低。可靠的协议肯定需要付出代价,因此TCP的传输效率远远不如UDP高。例如对数据的时间和检验必然会消耗计算机的计算时间和网络带宽。 * 不是所有的程序都需要保证数据传递的可靠性,例如视频聊天、音频传输、游戏、直播技术等只要保证数据连贯性即可,不考虑数据是否安全等问题,所以这些场景下用UDP更合适。 #### 3. TCP中的三次握手和四次挥手 ##### 三次握手过程? ![三次握手](https://upload-images.jianshu.io/upload_images/2570030-d4896e778e182b48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 1. A对B说:我的序号是x,我要向你请求连接;(第一次握手,发送SYN包,然后进入SYN_SEND状态) 2. B听到之后对A说:我的序号是y,期待你下一句序号是y+1的话(意思就是收到了序号为x的话,即ack=x+1),同意建立连接。(第二次握手,发送ACK_SYN包,然后进入SYN_RCVD状态) 3. A听到B说同意建立连接之后,对A说:与确认你同意与我连接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已进入ESTABLISHED状态) 4. B听到A的确认之后,也进入ESTABLISHED状态。 ##### 四次挥手过程? ![四次挥手](https://upload-images.jianshu.io/upload_images/2570030-ff7f10c2a94ffb8d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 1. A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN_WAIT_1) 2. B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE_WAIT) 3. A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2) 4. B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手) 5. A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED) 6. B收到A的确认后,也进入CLOSED。 ##### 为什么需要三次握手? * 三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是**双方确认自己与对方的发送与接收机能正常**。 * 三次握手的另外一个目的就是通过发送特定的数据包,确认双方都支持TCP,告知对方用TCP传输。 ##### 为什么要四次挥手? * 根本原因是,一方发送FIN只表示自己发完了所有要发的数据,但还允许对方继续把没发完的数据发过来。 * 与三次握手类似,通过发送特定的数据包,确认双方都支持TCP,告知对方用TCP传输。 #### 4. 参考文章 [互联网协议入门(一)](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html) [互联网协议入门(二)](http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html) [TCP三次握手与四次挥手过程](https://blog.csdn.net/shuaicenglou3032/article/details/67634938) [简明理解三次握手和四次挥手](https://blog.csdn.net/zixiaomuwu/article/details/60965466) [图解TCP通信三次握手和四次挥手](https://blog.csdn.net/xixiangdeshaonian/article/details/79029118) ### HTTP协议 #### 1. HTTP协议是什么? 协议:计算机通信网络中两台计算机之间进行通信所必须的共同遵守的规定或规则。 HTTP协议:是计算机网络中应用层中的协议,基于TCP/IP通信协议来传递数据,属于应用层的面向对象的超文本传输协议。 #### 2. HTTP协议的特点有哪些? * 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 * 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 * 非持续连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 * 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 * 支持B/S及C/S模式。 #### 3. URI、URL、URN 基本概念: * URI(Uniform Resource Identifier):统一资源标识符,用来唯一的标识一个资源。 * 访问资源的命名机制 * 存放资源的主机名 * 资源自身的名称,由路径表示 * URL(Uniform Resource Locator):统一资源定位符,是一种具体的URi,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。 * 协议:常见的有ftp(文件传输协议)、http(超文本传输协议)、mailto(电子邮件)、file(特定主机文件名) * 存放资源的主机IP地址、端口号 * IP地址:为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识-IP地址。它是识别网络通讯的实体,可以理解为主机,也可以理解为每个路由器的端口。 * 端口号:一个通讯实体他可以拥有很多的通讯程序同时提供网络服务,这个时候就要通过端口号来区分通讯程序,一个通讯实体不能有两个通讯程序使用同一个端口号。端口号范围为0-65535,其中0-1023位为系统保留。 * 主机资源的具体地址 * 请求参数 * 锚点 * URN(Uniform Resource Name):统一资源命名,是通过名字来标识资源,与其所处的位置无关,这样即使资源的位置发生变动,其URN也不会变化。用于标识持久性Internet资源,URN可以提供一种机制,用于查找和检索定义特定命名空间的架构文件。(P2P下载中使用的磁力链接是URN的一种实现,它可以持久化的标识一个BT资源,资源分布式的存储在P2P网络中,无需中心服务器用户即可找到并下载它。) URI与URL/URN直接的区别? * HTTP协议中使用URI来传输数据和建立连接。 * URL、URN都是一种具体的URI,URL与URN都是URI的子集;而URI属于URL和URN更高层次的抽象定义,URI使用两种方法标识资源: * URL:用地址标识 * URN:用名称标识 * URL强调的是资源的路径、URN强调的是资源的名称;而URI强调的是资源本身 #### 4. 打开浏览器输入URL然后发生了什么? ![浏览器输入URL之后发生了什么](https://upload-images.jianshu.io/upload_images/2570030-864dbdf0febc84e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 5. HTTP请求和响应 ![HTTP请求](https://upload-images.jianshu.io/upload_images/2570030-e874754606aafbe0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![HTTP响应](https://upload-images.jianshu.io/upload_images/2570030-7ebf2744719c3b9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 6. 影响HTTP请求的因素有哪些? HTTP是建立在TCP协议之上,所以HTTP协议的瓶颈及其优化技巧都是基于TCP协议本身的特性。影响一个HTTP网络请求的因素主要有两个:带宽和延迟: * 带宽:拨号上网的阶段带宽是一个比较严重影响请求的问题;但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。 * 延迟: * 浏览器阻塞(HOL Blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。 * DNS查询(DNS Lookup):浏览器需要知道目标服务器的IP才能建立连接。将域名解析为 IP 的这个系统就是DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。 * 建立连接(Initial Connection):HTTP是基于TCP协议的,浏览器最快也要在第三次握手时才能捎带HTTP请求报文,达到真正的建立连接,但是连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。 #### 7. HTTP1.0、HTTP1.1、HTTP2.0 ![HTTP协议发展](https://upload-images.jianshu.io/upload_images/2570030-2d057d98df7ca0d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) HTTP1.0、HTTP1.1的主要区别: * 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 * 带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 * 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。 * Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。 * 长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。 HTTP1.0和1.1现存的一些问题: * HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出。 * HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。 * HTTP1.x在使用时,header里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量。 * 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。 HTTP1.1、HTTP2.0的主要区别: * 新的二进制格式(Binary Format):HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。 * 多路复用(MultiPlexing):即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。多路复用原理图: * Header压缩:如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。 * 服务端推送(server push):同SPDY一样,HTTP2.0也具有server push功能。 #### 8. GET请求和POST请求的区别 基本区别: * 行为上的区别:GET请求是从服务器请求数据;POST请求是向服务器提交要数据 * 数据的类型、大小是否有限制:GET请求有限制;POST请求没有 * 安全性:GET请求提交的数据都在URL中,可见,不安全;相对来说POST请求更加安全 * JS中获取参数上的区别:GET请求在JS中是通过```Request.QueryString["xxx"]```获取URL中的参数,而POST请求在JS中是通过```Request.Form["xxx"]```获取Form表单中的参数 详细区别: ![GET和POST的区别](https://upload-images.jianshu.io/upload_images/2570030-5f8a8b61368ba00f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 9. Cookie和Session的区别 ##### Cookie的基本概念与工作原理 Cookie的基本概念:Cookie技术是客户端的会话跟踪解决方案,弥补了HTTP协议无状态的缺点。Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 Cookie的工作原理: 1. 客户端发送一个http请求到服务器端 2. 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部 3. 客户端发送一个http请求到服务器端,其中包含Cookie头部 4. 服务器端发送一个http响应到客户端 ![Cookie的原理](https://upload-images.jianshu.io/upload_images/2570030-47987404afc976d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ##### Session的基本概念与工作原理 Session的基本概念:Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。 Session的工作原理: 1. 服务端程序运行的过程中创建Session,并且分配Session ID 2. 调用Session相关的方法往Session中增加内容,而这些内容只会保存在服务器中,发到客户端的只有Session ID(通过Cookie发送) 3. 当客户端再次发送请求的时候,会将这个Session ID带上,服务器接受到请求之后就会依据Session ID找到相应的Session,从而再次使用之。 ![Session的原理](https://upload-images.jianshu.io/upload_images/2570030-87635b52a46d3fa4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ##### Cookie和Session的区别 1. 存取方式的不同 * Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 * Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 2. 隐私策略的不同 * Cookie存储在客户端中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。 * Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 * 使用Cookie时,最好对敏感的信息信息加密,提交到服务器后再进行解密。 * Session是放在服务器上,Session里任何隐私都能够有效的保护。 3. 有效期上的不同 * 要实现登录信息长期有效,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。 * Session的有效期依赖于名为JSESSIONID的Cookie,而该Cookie的过期时间默认为–1,只需关闭了浏览器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。 4. 服务器压力的不同 * Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。 * Cookie保管在客户端,不占用服务器资源。假如并发的用户十分多,Cookie是很好的选择。关于Google、Baidu来说,Cookie或许是唯一的选择。 #### 10. 参考文章 [关于HTTP协议,一篇就够了](https://www.cnblogs.com/ranyonsue/p/5984001.html) [HTTP协议详解](https://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html) [互联网协议入门(一)](http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html) [互联网协议入门(二)](http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html) [URI、URL和URN的区别](https://segmentfault.com/a/1190000006081973) [URL、URN、URI的区别?](https://www.cnblogs.com/52php/p/5677645.html) [详解URL的组成](https://blog.csdn.net/ergouge/article/details/8185219) [百度百科-URN](https://baike.baidu.com/item/URN/2901667) [浏览器中输入url后发生了什么](https://www.jianshu.com/p/c1dfc6caa520) [当你在浏览器中输入url地址之后发生了什么?](https://www.jianshu.com/p/adb31e6c58a6) [当在浏览器地址栏里输入URL后会发生什么事情](https://www.cnblogs.com/yzfdjzwl/p/6646048.html) [DNS解析过程,以及Wireshark抓包数据包分析](https://www.jianshu.com/p/b71a3f126317) [一篇文章带你详解 HTTP 协议(网络协议篇一)](https://www.jianshu.com/p/6e9e4156ece3) [http协议-思维导图](https://mubu.com/doc/explore/13923) [HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事](http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/#prettyPhoto) [HTTP1.0 HTTP 1.1 HTTP 2.0主要区别](https://blog.csdn.net/linsongbin1/article/details/54980801) [HTTP 方法:GET 对比 POST](http://www.w3school.com.cn/tags/html_ref_httpmethods.asp) [GET和POST请求的区别-深入答案](https://blog.csdn.net/q179886903/article/details/52741327) [理解Cookie和Session机制](https://www.cnblogs.com/andy-zhou/p/5360107.html) [详解Cookie和Session](https://blog.csdn.net/lidatgb/article/details/8739035) [Cookie与Session的区别](https://www.cnblogs.com/raymond715/p/5257947.html) [DNS原理及其解析过程【精彩剖析】](http://blog.51cto.com/369369/812889) ### 密码学基础知识 #### 1. 密码学基础概念 * 加密/解密:计算机术语加密/解密是一种用于加密或者解密的算法。分为对称加密和非对称加密。 * 密钥:密钥是一种参数,它是在使用加密/解密算法过程中输入的参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大。密钥分为对称密钥与非对称密钥。 * Hash算法:Hash算法是一种单向算法,通过Hash算法可以对目标数据生成一段特定长度、唯一的hash值,但是不能通过这个hash值重新计算出原始的数据,因此也称之为摘要算法。经常被用在不需要数据还原的密码加密以及数据完整性校验上,常用的算法有MD2,MD4,MD5,SHA等。 * 明文/密文:明文是加密之前的原始数据,密文是通过密码运算后得到的结果成为密文。 ![明文/密文](https://upload-images.jianshu.io/upload_images/2570030-2e269ca59eb72aeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 2. 对称加密和非对称加密 ##### 对称加密 对称加密:又称为共享密钥加密,对称加密在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES、3DES、AES、RC5、RC6。 * 优点:计算速度快。 * 缺点:密钥需要在通讯的两端共享,维护比较麻烦,保密性差。如果所有客户端都共享同一个密钥,那么可以凭借一个密钥破解所有人的密文了;如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理大量的密钥。 #### 非对称加密 非对称加密:又称为公开密钥加密,服务端会生成一对密钥,一个私钥保存在服务端,仅自己知道,另一个是公钥,公钥可以自由发布供任何人使用。客户端的明文通过公钥加密后的密文需要用私钥解密。RSA,ECC,DSA(数字签名)。 * 优点:非对称加密保密性好。与对称加密相比,非对称加密无需在客户端和服务端之间共享密钥,只要私钥不发给任何用户,即使公钥在网上被截获,也无法被解密,仅有被窃取的公钥是没有任何用处的。 * 缺点:加密和解密花费的时间较长,不适合对大文件加密而只适合对少量的数据加密。 非对称加解密的过程: 1. 服务端生成配对的公钥和私钥 2. 私钥保存在服务端,公钥发送给客户端 3. 客户端使用公钥加密明文传输给服务端 4. 服务端使用私钥解密密文得到明文 RSA算法的原理: * RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难。可以将乘积公开作为公钥,两个质数作为加密解密的关键。 #### 3. 数字签名 * 数字签名:**用于验证传输的内容的真实性**。数字签名是非对称加密的一种应用场景。数字签名是反过来用私钥来加密,通过与之配对的公钥来解密。 数字签名的步骤: 1. 服务端把报文经过Hash处理后生成摘要信息Digest,摘要信息使用私钥加密之后就生成签名,服务器把签名连同报文一起发送给客户端。 2. 客户端接收到数据后,把签名提取出来用解密,如果能正常的解密出来Digest2,那么就能确认是对方发的。 3. 客户端把报文Text提取出来做同样的Hash处理,得到的摘要信息Digest1,再与之前解密出来的Digest2对比,如果两者相等,就表示内容没有被篡改,否则内容就是被人改过了。因为只要文本内容哪怕有任何一点点改动都会Hash出一个完全不一样的摘要信息出来。 ![数字签名过程](https://upload-images.jianshu.io/upload_images/2570030-e7722fff7c2f43e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 4. 数字证书 * 数字证书:简称CA,**用于验证密钥的真实性**,它由第三方权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的。Android已经把将近150个CA根证书(数字证书认证机构认证过的证书)内置在我们手机中。这150多个证书被全世界信赖。 数字证书的颁发过程: 1. 生成密钥对:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。 2. 确认身份:认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来。 3. 颁发证书:认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。 4. 使用证书:用户就可以使用自己的数字证书进行相关的各种活动。 数字证书的认证过程: 1. 证书安装:客户端操作系统已经存在一些权威的数字证书(Android系统在不root的情况下,是安全的) 2. 证书传输:客户端请求服务端,客户端收到服务端的消息,消息带有权威机构颁发给服务端的数字证书A 3. 证书查找:客户端从本地已经存在的权威数字证书中去寻找与服务端相同的证书B,如果存在,则服务端的证书真实,否则不真实 4. 证书验证:客户端用证书B的公钥对证书A里面的摘要和摘要算法进行解密,然后使用这个摘要算法计算A证书的摘要,将这个计算的摘要与放在证书中的摘要对比。如果一致,说明服务端的证书肯定没有被修改过并且证书是权威机构发布的,服务端的证书中的公钥肯定是真实的,以后就采用这个公钥进行安全通信。 #### 5. 参考文章 [HTTPS中的加密算法相关概念](http://blog.jobbole.com/107930/) [摘要,数字签名,数字证书认证过程详解(非HTTPS)](https://www.jianshu.com/p/143dccb2e803) [数字证书的颁发过程](https://zhidao.baidu.com/question/586478840340711325.html) ### HTTPS #### 1. HTTPS的基本概念 ![HTTPS](https://upload-images.jianshu.io/upload_images/2570030-5d2432d7cc869079.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) HTTPS:HTTPS(HTTP over TLS)并不是一个单独的协议,而是对工作在加密连接TLS上的常规HTTP协议的称呼。主要用到了对称加密、非对称加密、数字证书等技术来实现加密传输,保证通信过程的安全性。 HTTPS在TCP/IP协议栈中TLS(各子协议)和HTTP的关系如下所示: ![HTTPS](https://upload-images.jianshu.io/upload_images/2570030-bd0b134c64ccfd02.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) HTTPS的特点如下: * 优点:传输安全可靠 * 缺点:加解密相关的计算耗时,导致HTTPS的通信速度慢 #### 2. HTTP与HTTPS的主要区别: * 数据完整性:HTTPS内容传输经过完整性校验 * 数据安全性/隐私性:HTTPS内容经过对称加密,每个连接生成一个唯一的加密密钥;HTTP所有传输的内容都是明文 * 身份认证:第三方无法伪造服务端(客户端)身份 * HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费 * HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443 * HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题 #### 3. TLS协议及其握手过程 * TLS:SSL是一种安全传输协议,TLS是SSL的3.0升级版,采用的是非对称加密。TLS包括TLS Record Protocol和TLS Handshake Protocol * TLS Handshaking Protocols:提供实现了身份认证,包括Handshake protocol,Change Ciper Spec protocol和Alert protocol * TLS Record Protocol:保证了数据完整性和隐私性 TLS握手过程(通过三个随机数保证传输的安全): ![TLS握手过程](https://upload-images.jianshu.io/upload_images/2570030-726ced5dfe6c8381.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 1. 客户端发送随机数client_random和支持的加密方式列表(明文) 2. 服务器返回随机数server_random,选择的加密方式和服务器证书链(明文) 3. 客户端验证服务器证书,使用证书中的公钥加密premaster secret发送给服务端(RSA)。并且发送编码改变、握手结束通知 4. 服务端使用私钥解密premaster secret 5. 服务端端分别通过client_random,server_random和premaster secret生成master secret。服务端也返回编码改变、握手结束通知 6. 客户端也生成master secret 7. 两端通过master secret用于对称加密后续通信内容 #### 4. HTTPS如何改造以及需要关注的问题(服务端Android) HTTPS如何改造? * 购买或者生成SSL证书。如果是购买证书,需要在购买或者生成证书之后,在证书提供的网站上配置自己的域名,将证书下载下来。 * 证书持有:客户端持有服务端的公钥证书,并持有自己的私钥,服务端持有客户的公钥证书,并持有自己私钥。 * 服务器端改造:配置自己的web服务器,同时进行代码改造(例如修改Tomcat配置文件等),部署。 * Android端改造:由于Retrofit是基于OkHttp实现的,因此想通过Retrofit实现HTTPS需要给Retrofit设置一个OkHttp代理对象SSLSocketFactory用于处理HTTPS的握手过程。其中需要实现SSLSocketFactory的getSSLCertifcation方法实现证书的读取、加载、初始化SSLContext等工作。 ```java OkHttpClient okHttpClient = new OkHttpClient.Builder() .sslSocketFactory(SSLHelper.getSSLCertifcation(context))//为OkHttp对象设置SocketFactory用于双向认证 .hostnameVerifier(new UnSafeHostnameVerifier()) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://xxx:xxxx") .addConverterFactory(GsonConverterFactory.create())//添加 json 转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加 RxJava 适配器 .client(okHttpClient)//添加OkHttp代理对象 .build(); ``` * 证书验证:建立连接的时候,客户端利用服务端的公钥证书来验证服务器是否上是目标服务器;服务端利用客户端的公钥来验证客户端是否是目标客户端。(请参考RSA非对称加密以及HASH校验算法)。服务端给客户端发送数据时,需要将服务端的证书发给客户端验证,验证通过才运行发送数据,同样,客户端请求服务器数据时,也需要将自己的证书发给服务端验证,通过才允许执行请求。 HTTPS优化的注意点? * 访问速度:HTTPS降低用户访问速度(HTTPS未经任何优化的情况下要比HTTP慢几百毫秒以上,特别在移动端可能要慢500毫秒以上)。SSL握手,HTTPS对速度会有一定程度的降低,但是只要经过合理优化和部署(例如使用代理服务器等),HTTPS对速度的影响完全可以接受。 * 服务端压力:相对于HTTPS降低访问速度,其实更需要关心的是服务器端的CPU压力,HTTPS中大量的密钥算法计算(加密、解密、Hash等),会消耗大量的CPU资源,只有足够的优化(例如选取合适的加密、解密、完整性校验算法等),HTTPS的机器成本才不会明显增加。 #### 参考文章 [理解 HTTPS 的工作原理](http://www.07net01.com/2015/12/1057010.html) [Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)](https://www.jianshu.com/p/64172ccfb73b) [https是如何工作的?](https://blog.csdn.net/dd864140130/article/details/52598107) [浅谈HTTPS协议和SSL、TLS之间的区别与关系](https://zhangzifan.com/https-http-tls-ssl.html) [腾讯HTTPS性能优化实践](https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650995461&idx=1&sn=ff45463bbf862517761c17887ef3fd2d) [HTTPS 性能优化技巧](https://blog.csdn.net/oqqssh/article/details/78077221) [阿里聚安全组件](https://segmentfault.com/a/1190000007097234)