本文来自网易云社区nginx
做者:刘超算法
上一节咱们讲到,手机App通过了一个复杂的过程,终于拿到了电商网站的SLB的IP地址,是否是该下单了?
缓存
别忙,俗话说的好,买东西要货比三家。大部分客户在购物以前要看不少商品图片,比来比去,最后好不容易才下决心,点了下单按钮。下单按钮一按,就要开始创建链接。创建链接这个过程也挺复杂的,最终还要通过层层封装,才构建出一个完整的网络包。今天咱们就来看这个过程。服务器
客户想要在购物网站买一件东西的时候,通常是先去详情页看看图片,是否是想买的那一款。网络
咱们部署电商应用的时候,通常会把静态资源保存在两个地方,一个是接入层nginx后面的varnish缓存里面,通常是静态页面;对于比较大的、不常常更新的静态图片,会保存在对象存储里面。这两个地方的静态资源都会配置CDN,将资源下发到边缘节点。
负载均衡
配置了CDN以后,权威DNS服务器上,会为静态资源设置一个CNAME别名,指向另一个域名cdn.com,返回给本地DNS服务器。网站
当本地DNS服务器拿到这个新的域名时,须要继续解析这个新的域名。这个时候,再访问的时候就不是原来的权威DNS服务器了,而是 cdn.com 的权威DNS服务器。这是CDN本身的权威DNS服务器。
加密
在这个服务器上,仍是会设置一个CNAME,指向另一个域名,也即CDN网络的全局负载均衡器。cdn
本地DNS服务器去请求CDN的全局负载均衡器解析域名,全局负载均衡器会为用户选择一台合适的缓存服务器提供服务,将IP返回给客户端,客户端去访问这个边缘节点,下载资源。缓存服务器响应用户请求,将用户所需内容传送到用户终端。
对象
若是这台缓存服务器上并无用户想要的内容,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器,将内容拉到本地。
有关CDN,请参考《CDN:你去小卖部取过快递么?》
当你浏览了不少图片,发现实在喜欢某个商品,因而决定下单购买。
电商网站会对下单的状况提供RESTful的下单接口,而对于下单这种须要保密的操做,须要经过HTTPS协议进行请求。
在全部这些操做以前,首先要作的事情是创建链接。
HTTPS协议是基于TCP协议的,于是要先创建TCP的链接。在这个例子中,TCP的链接是从手机上的App和负载均衡器SLB之间的。
尽管中间要通过不少的路由器和交换机,可是TCP的链接是端到端的。TCP这一层和更上层的HTTPS没法看到中间的包的过程。尽管创建链接的时候,全部的包都逃不过在这些路由器和交换机之间的转发,转发的细节咱们放到那个下单请求的发送过程当中详细解读,这里只看端到端的行为。
对于TCP链接来说,须要经过三次握手创建链接,为了维护这个链接,双方都须要在TCP层维护一个链接的状态机。
一开始,客户端和服务端都处于CLOSED状态。服务端先是主动监听某个端口,处于LISTEN状态。而后客户端主动发起链接SYN,以后处于SYN-SENT状态。服务端收到发起的链接,返回SYN,而且ACK客户端的SYN,以后处于SYN-RCVD状态。
客户端收到服务端发送的SYN和ACK以后,发送ACK的ACK,以后处于ESTABLISHED状态。这是由于,它一发一收成功了。服务端收到ACK的ACK以后,处于ESTABLISHED状态,由于它的一发一收也成功了。
当TCP层的链接创建完毕以后,接下来轮到HTTPS层创建链接了,在HTTPS的交换过程当中,TCP层始终处于ESTABLISHED。
对于HTTPS,客户端会发送Client Hello消息到服务器,用明文传输TLS版本信息、加密套件候选列表、压缩算法候选列表等信息。另外,还会有一个随机数,在协商对称密钥的时候使用。
而后,服务器会返回Server Hello消息,告诉客户端,服务器选择使用的协议版本、加密套件、压缩算法等。这也有一个随机数,用于后续的密钥协商。
而后,服务器会给你一个服务器端的证书,而后说:“Server Hello Done,我这里就这些信息了。”
客户端固然不相信这个证书,因而你从本身信任的CA仓库中,拿CA的证书里面的公钥去解密电商网站的证书。若是可以成功,则说明电商网站是可信的。这个过程当中,你可能会不断往上追溯CA、CA的CA、CA的CA的CA,反正直到一个授信的CA,就能够了。
证书验证完毕以后,以为这个服务端是可信的,因而客户端计算产生随机数字Pre-master,发送Client Key Exchange,用证书中的公钥加密,再发送给服务器,服务器能够经过私钥解密出来。
接下来,不管是客户端仍是服务器,都有了三个随机数,分别是:本身的、对端的,以及刚生成的Pre-Master随机数。经过这三个随机数,能够在客户端和服务器产生相同的对称密钥。
有了对称密钥,客户端就能够说:“Change Cipher Spec,我们之后都采用协商的通讯密钥和加密算法进行加密通讯了。”
而后客户端发送一个Encrypted Handshake Message,将已经商定好的参数等,采用协商密钥进行加密,发送给服务器用于数据与握手验证。
一样,服务器也能够发送Change Cipher Spec,说:“没问题,我们之后都采用协商的通讯密钥和加密算法进行加密通讯了”,而且也发送Encrypted Handshake Message的消息试试。
当双方握手结束以后,就能够经过对称密钥进行加密传输了。
真正的下单请求封装成网络包的发送过程,咱们先放一放,咱们来接着讲这个网络包的故事。
有关TCP协议,参考《TCP协议(上):因性恶而复杂,先恶后善反轻松》和《TCP协议(下):西行一定多妖孽,恒心智慧消磨难》
有关HTTP协议,参考《HTTP协议:看个新闻原来这么麻烦》,有关HTTPS协议参考《HTTPS协议:点外卖的过程原来这么复杂》
有关RESTful API,参考《基于JSON的RESTful接口协议:我不关心过程,请给我结果》
当客户端和服务端之间创建了链接后,接下来就要发送下单请求的网络包了。
在用户层发送的是HTTP的网络包,由于服务端提供的是RESTful API,于是HTTP层发送的就是一个请求。