https
证书包含服务器信息和服务器信息摘要加密后的签名
客户端拿到证书后先自己将服务器信息进行hash算法得到一个摘要,然后用证书公钥解密证书里的签名得到另外一份摘要,两个摘要进行对比
https=http+ssl/tls(安全的连接)
证书链:由于要申请的证书太多,因此出现了二级三级证书机构。二级证书由根证书机构签发,二级证书机构再去给服务器签发证书。客户端先用根证书的公钥验证二级证书,再用二级证书的公钥验证服务器信息
HTTPS抓包的原理就是通过中间人代理工具,通过伪装成服务器和客户端,拦截并可能修改通信数据。这个过程依赖于客户端对中间人代理根证书的信任(中间人无法再从ca机构申请一个相同域名的证书,所以只能使用不受信任的自证书)
okhttp
okhttp中的拦截器是比较关键的内容,请求从第一个拦截器链RealInterceptorChain proceed(request)开始,chain的构建包含了index,proceed(request)方法中调用了第一个拦截器的intercept(nextChain),参数为index+1的拦截器链,在intercept(nextChain)方法中会调用nextChain的proceed(request),使得拦截器依次被调用,最后一个拦截器CallServerInterceptor为网络请求过程
配置的普通拦截器在最开始,网络拦截器在倒数第二的位置(连接拦截器和请求拦截器之间)
http1.1 keep-alive 相同host的连接可以复用
http2.0 多路复用,同一个tcp连接上多个请求并行执行,压缩请求头和响应头
tcp
1、客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值);
2、服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ack字段,ack字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ack=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接;
3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ack=y+1,seq=x+1)。
第三次握手是可以携带数据的,前两次握手是不可以携带数据的
ack为确认应答号
三次握手才可以阻止重复历史连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费
控制位:
ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。
1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成);
2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ack字段,ack字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ack=x+1,seq=y,y由服务端随机生成);
3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ack=x+1,seq=z,z由服务端随机生成);
4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,ack字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ack=z+1,seq=x+1)
密码学
Base 64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题。 需要注意的是,Base 64不是一种加密方式,只是一种编码方式。很多时候,我们都将Base64编码作为数据加密后的传输 / 存储格式
防窃听:加密
防伪装:签名,证书
防篡改:摘要算法
数字签名:验证完整性 & 认证数据来源(因为非对称加密确保了私钥和公钥匹配,所以可以验证发送方的身份)
1.签名:先对数据进行摘要,然后用私钥进行加密得到签名,传输数据+签名
2.验证:先对数据进行摘要,然后用公钥解密得到数据摘要,对比两个摘要
数字证书:安全地发放公钥(相当于ca机构的数字签名)
1.证书:包含服务器信息,服务器公钥和对前者的数字签名
2.验证:先对证书信息进行摘要,然后用ca公钥解密得到证书信息摘要,对比两个摘要
ca证书是为了确保服务器返回公钥不被篡改,如果服务器公钥被篡改为中间人公钥,客户端生成的对称加密密钥就会被中间人用他的私钥获取到