一、从浏览器输入URL到页面显示的过程
1.1 URL到显示的全过程
- URL解析:浏览器解析URL,得到服务器的域名(www.baidu.com)和端口号,以及请求资源的路径
- 在缓存中找得到该域名对应的IP地址:直接访问服务器发送请求
- 在缓存中找不得到该域名:发起DNS迭代查询,得到服务器的IP地址
- DNS域名解析:客户端发起迭代查询;DNS服务器之间通过递归查询得到域名对应的IP地址
- 浏览器 ---> 本地DNS
- 本地DNS ---> 根DNS ---> 向本地DNS返回顶级DNS的IP地址
- 本地DNS ---> 顶级DNS ---> 向本地DNS返回权威DNS的IP地址
- 本地DNS ---> 权威DNS ---> 向本地DNS返回域名对应的IP地址
- 客户端发起TCP连接:三次握手
- 客户端发送HTTP请求:请求报文
- 服务器发送HTTP响应:响应报文与状态码
- 浏览器解析渲染页面:解析HTML、CSS、JS等文件
- 客户端发起断开TCP连接:四次挥手
1.2 DNS域名解析
- DNS域名解析:客户端发起迭代查询;DNS服务器之间通过递归查询得到域名对应的IP地址
- 浏览器 ---> 本地DNS
- 本地DNS ---> 根DNS ---> 向本地DNS返回顶级DNS的IP地址
- 本地DNS ---> 顶级DNS ---> 向本地DNS返回权威DNS的IP地址
- 本地DNS ---> 权威DNS ---> 向本地DNS返回域名对应的IP地址
DNS域名解析过程如下:
DNS可能出现的一些网络攻击问题:
- DNS劫持:黑客劫持DNS服务器并篡改解析结果,使用户访问的网站跳转到恶意网站
- 解决:换个DNS服务器,躲过被劫持的DNS服务器
- DNS污染:黑客监听某些DNS查询,并伪装成目标服务器返回虚假结果(禁用google就是通过DNS污染实现的)
- 解决:直接在本机绑定hosts绕过DNS,或者更换成没被污染的DNS服务器
1.3 正向代理和反向代理
- 正向代理:代理客户端,向服务端隐藏客户端的真实IP地址
- 如平时通过VPN访问外网使用的技术就是正向代理
- 反向代理:代理服务器,向客户端隐藏服务器的真实IP地址
- 如Nginx就是一个反向代理服务器
二、HTTP协议的特点
2.1 Web构建的技术
2.2 HTTP1:HTTP1.0与HTTP1.1
2.3 HTTP2
HTTP2的很大特点是采用了stream技术,可以同时发送多个请求,并且不需要按照顺序来发送,这样可以提高传输效率,并且减少延迟。
stream中一个TCP连接可以有多个stream,每个stream都有一个唯一的标识符;一个stream中可以有多个message;每个message可以有多个frame。frame是HTTP2的最小单位。
2.4 HTTP3
HTTP3是基于UDP的,使用了QUIC协议,可以减少延迟,并且提高传输效率。
2.5 HTTP1~HTTP3的应用层到链路层的区别
三、HTTP缓存
客户端中存储缓存副本,有效的缓存副本在下一次可以直接使用而不需要再次请求服务器
HTTP实现缓存的方式有:强制缓存和协商缓存
- 强缓存:通过Cache-Control和Expires字段设置缓存时间,当缓存时间未过期时,直接使用缓存,不需要与服务器通信
- 协商缓存:通过Last-Modified和Etag字段,向服务器发送请求,服务器判断资源是否能直接使用缓存
HTTP实现缓存的方式如下:
其中HTTP协商缓存的流程图如下:
四、HTTPS
HTTPS是在HTTP的基础上加入了SSL/TLS协议,可以保证数据传输的安全性。具有数据加密、校验、身份认证等特点。
4.1 对称加密
对称加密是指加密和解密使用的是同一个密钥,加密和解密的速度非常快,但是密钥的安全是一个问题。
密钥安全问题是指:密钥的传输和存储是一个问题,如果密钥被泄露,那么加密的数据也就不安全了。
所以如果要安全使用对称加密,我们需要有一个保证密钥被安全传输到双方的措施,这个措施我们后面会讲,就是通过非对称加密对密钥进行加密,然后将加密后的密钥传输给对方,这样才能保证后续通信过程中的密钥安全。
4.2 非对称加密RSA
非对称加密是指加密和解密使用的是不同的密钥,加密使用的是公钥,解密使用的是私钥。
RSA加密过程(公钥对密文进行加密)如下:
也就是说RSA加密是对明文进行E
次方后求对N
的余数,得到密文。
从公式可以知道,E
和N
是公钥,所有人都可以获得,并通过公钥对信息进行加密,所以我们用(E,N)
来表示公钥。
神奇的点在于,只有拥有对应私钥的才能对密文进行解密,得到明文。(一般私钥都在服务端处保存)
RSA解密过程(私钥对密文进行解密)如下:
也就是说RSA解密是对密文进行D
次方后求对N
的余数,得到明文,所以我们用(D,N)
来表示私钥。
生成密钥对的过程
生成密钥对需要求N
、L
、E
、D
的值
- 求
N
的值:N
是两个大质数p
和1
的乘积,当p
和q
都是大质数时,N
的值很难被分解,也就是基本不可能从公钥N
的值反推出p
和q
的值(所以不能反推出私钥的值)N = p * q
- 求
L
的值:L
是p-1
和q-1
的最小公倍数L = LCM(p-1, q-1)
- 求
E
的值:E
是一个小于L
的数,且E
和L
的最大公约数为1 - 求
D
的值:D
是E
的逆元,即E * D % L = 1
求完之后,我们就得到了公钥(E,N)
和私钥(D,N)
。
我们只需要记得私钥D
的值是几乎不可能被通过公钥反推回来的就行,且通过公钥加密的密文只有对应的私钥才能解密。
RSA神奇的点就在于,私钥可以解密公钥加密的密文,而公钥可以解密私钥加密的密文。但是由于公钥是公开的,所以我们一般不用私钥进行加密(不然所有拥有公钥的都能解密数据了),只有在数字签名的时候才会用到私钥进行加密。
采用RSA除了加密外,还可以用于数字签名
数字签名其实是加密的反过程,是为了验证服务端的身份(也就是说数据是不是从服务端发送过来的)
最主要的过程是:服务端用私钥对数据进行加密(这里说加密其实不准确,我们可以称为签名),然后客户端用公钥对数据进行解密(这里说法也不准确,应该称为验证签名),如果解密后的数据和原数据一样(通过同步送过来的哈希值来判断是否一样),那么就说明数据是从服务端发送过来的。
数字签名的过程如下:
- 服务端用私钥对原始消息的哈希值进行签名
- 发送给客户端:原始消息和签名
- 客户端用公钥对签名进行解密,并计算同步发送过来的原始消息的哈希值,如果解密后的哈希值和同步发送过来的哈希值一样,那么就说明数据是从服务端发送过来的
4.3 HTTPS采用的混合加密模式
HTTPS采用的是混合加密模式,即对称加密和非对称加密结合使用。
- 非对称加密:用于传输对称加密的密钥
- 服务端发送自己的数字证书给客户端,请求身份认证
- 客户端用CA认证过的服务端的公钥对服务端的数字证书进行验证(防止中间人发送伪造的证书来伪造服务端)
- 客户端验证通过后用公钥对自己随机生成的对称加密的密钥进行加密,然后发送给服务端
- 由于只有服务端有私钥,所以只有服务端能解密得到对称加密的密钥,所以此时只有服务端能解开并得到对称加密的密钥
- 对称加密:客户端和服务端验证完并获取安全的对称加密的密钥后,就用于后续的传输数据
为什么要采用混合加密模式呢?
因为对称加密的速度很快,但是密钥安全是个问题,所以我们首次建立TLS连接的时候,采用非对称加密用于传输对称加密的密钥,可以确保密钥的安全。然后后面正常通信的时候使用这个安全的密钥,就可以保证在安全情况下进行快速通信。
4.4 HTTPS的数字证书
数字证书是由权威的CA机构颁发的,用于证明服务端身份的一种证书。
如果没有权威公开的CA机构颁发的数字证书,那么就会出现中间人攻击,即中间人有自己的公钥和私钥,然后伪造了一个数字证书,客户端用伪造的公钥验证通过后,就会误认为是服务端发送的数据,这样就会出现中间人攻击安全问题。
而如果通过CA的私钥对服务器的公钥进行数字签名,那么这个证书就是只能由权威的CA公钥进行解密验证,所以客户端可以用CA的公钥验证服务端发来的数字证书,验证通过后才会从发来的数据中获取服务端的公钥。SSL/TLS建立安全连接的过程如下:
CA能确保数据安全的图解:
五、RPC
5.1 RPC的通信流程
RPC是一种远程调用框架,目的是使得调用远程服务和调用本地一样简单,而开发者更专注于业务开发,不需要考虑网络编程等细节。
RPC实现的主要流程为:
前提:服务提供端向注册中心注册接口服务
- 注册中心根据服务名找到服务提供端的IP地址和端口号
- Netty客户端将数据序列化成二进制格式然后请求网络调用
- 服务端在TCP通道中接收数据,将二进制数据反序列后分割成接口地址和参数对象,然后通过反射找到接口然后执行调用
- 服务端处理完接口后将结果序列化成二进制数据返回给Netty客户端
- Netty客户端接收到二进制数据后将数据反序列化成结果对象
5.2 RPC与HTTP的区别
1)RPC和HTTP都是基于TCP封装的协议
2)RPC适用于C/S模式,比如PC上用的电脑管家等软件、公司内部微服务通信只需要跟自家的服务器通信;而HTTP适用于B/S模式,比如浏览器需要和其他公司的服务器通信,这时候就需要一个统一的协议也就是HTTP了。
3)RPC域名获取时一般都是有专门的中间服务去获取,而HTTP更统一于使用DNS去获取域名
4)RPC跟HTTP1.1一样保持的长连接,此外,RPC实现连接池来复用连接(不少编程语言在HTTP中也会用连接池复用)
5)RPC一般通过Protobuf实现序列化,而HTTP一般通过JSON实现序列化,Protobuf序列化后的数据量更小,传输效率更高
因此不难看出,RPC定制化程度比HTTP更高