网络接入涉及到当你打开一个网页或者打开一个app,请求是怎么发送的以及这些内容是怎么获取回来的,途中经历了什么。因为之前对这些方面接触较少,所以做一下笔记来巩固一下所学到的知识。
网络接入问题引入
经典问题:浏览器输入网站到网页加载出来都经历了什么?
笼统来说,首先是域名解析来获得服务器所在的地址。其次浏览器会向对应的服务器发送一个http/https的请求来获取网站加载所需要的数据。浏览器得到服务器响应之后就可以进行页面渲染从而得到大家平时看到的页面。主要有以下过程:
- DNS
- TCP
- TLS
- HTTP请求
那要怎么样搭建一些这样的服务器呢?下面我们来进一步说明。
域名系统
Host管理
最原始的做法去解析一个域名来获得服务器的地址是通过管理主机表上的Host与IP的映射来实现的。这种方法通过人工一一指定域名与IP的映射关系来达到解析的目的。然而该方法面临诸多问题:
- 流量和负载:用户的规模大量增长后文件的规模也越来越大,这种统一分发的方式会引起较大的网络流量和cpu负载。
- 名称冲突:无法保证主机名称的唯一性。
- 时效性:这种解析靠人工上传映射关系,时效性太差。
DNS域名系统
使用DNS来代替Host管理。DNS主要通过解析域名来获得服务器的IP地址,所以域名空间显得极其重要。
域名空间
域名空间被组织成树形结构,通过划分zone的方式进行分层授权管理,包括顶级域名,二级域名,三级域名等。全球公共域名空间仅对应一棵树。域名解析的查询起点为根域名服务器。
如何开放外部用户访问
首先得有一个外网的IP地址,专门用于外部用户访问门户网站。将域名解析到外网的IP,然后将该IP绑定到一台物理机上并发布公网route用于外部访问。
我之前也搭建过几台可以外网访问的服务器,与该做法类似。我是先将外网的Ip绑定到一个路由器上,然后在路由器上通过端口映射来指向不同的服务器,然后通过外网IP+端口来访问到不同的服务器上。
自建DNS服务器
一般大规模公司都会自建DNS服务器来提高域名解析的效率和保护内网IP地址。 常见的开源DNS有:bind,nsd,knot,coredns。 主要的DNS功能包括:DNS Query, DNS Response, DNS Update, DNS Notify, DNS XFR
接入HTTPS协议
有了DNS后,要实现HTTPS协议来实现向服务器发送请求来获取所需的数据。HTTP协议因为明文传输有很多弊端,所以HTTPS更是目前所需。为了保护数据的安全,在发送请求以及响应过程中加密算法也应用进去了,常见的加密算法包括对称加密以及非对称加密。
SSL通信过程
- 用户端向服务端发送获取数据的请求
- 服务端收到请求并向用户端响应回public key
- 用户端收到public key后用来对premaster加密并发送给服务端
- 服务端收到加密的premaster后用private key来对其进行解密。
SSL过程需要加深了解,有机会在更新这一部分。
接入全站加速
当外网用户访问站点时,容易出现响应慢和卡顿的情况。这是主要因为站点的容量低,当并发请求数增大时容易被打垮。其次报文经过的网络设备越多,出问题的概率越大,包括丢包,mtu问题等,其通过自主选路的时延也高。因此我们要解决站点容量以及网络传输的问题
静态加速CDN
对于站点容量的问题,主要方案就是扩容嘛,静态内容使用静态加速缓存。缓存减轻了更省的出口带宽压力,优化了网上热点内容的分布。
动态加速DCDN
对于网络传输问题,由于不能在用户边缘增加缓存来解决,我们可以使用智能的选路技术,从众多的回源线路中择优选择一条线路进行传输。
四层负载均衡
四层负载均衡和基于IP+端口,利用算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。它主要三个功能:解耦vip和re,NAT以及防攻击syn proxy。
常见的调度算法有RR轮询,加权RR轮询,最小链接,五元组hash,一致性hash。具体原理就不在这一一细说,到用到的时候再去查找阅读。
目前四层负载均衡大部分都是通过dpdk技术实现,技术成熟。纯用户态技术栈,kernel bypass,消除协议栈瓶颈,无缓存,零拷贝,大页内存,可承受高cps。