文章目录
6.1 网络
6.1.1 OSI七层网络模型
- 应用层:用户访问网络的入口。HTTP、DNS、FTP。
- 表示层:数据处理,编解码、加解压、加解密。
- 会话层:会话管理。一个Session服务端会创建一个SessionID,SessionID通过请求头传输给客户端并使用Cookie来保存。一个Session可以发生多次TCP连接。
- 传输层:定义数据传输的协议、端口。UDP、TCP。
- 网络层:IP地址的封装和解析。交换机、路由器、防火墙。
- 数据链路层:物理地址的封装和解析。交换机、网卡、网桥。
- 物理层:定义物理设备标准,数模转换、模数转换。
6.1.2 TCP/IP四层网络模型
6.1.3 TCP的3次握手与4次挥手、SSL/TLS的4次握手
TCP的数据包结构
◎ 源端口号(16位):标识源主机的一个应用进程(连同源主机的IP地址)。
◎ 目的端口号(16 位):标识目的主机的一个应用进程(连同目的主机的IP 地址)。IP 报头中的源主机IP 地址、目的主机的IP 地址和源端口、目的端口确定了唯一一条TCP连接。
◎ 顺序号seq(32 位):标识从TCP 源端向TCP目的端发送的数据字节流,表示这个报文段中的第1 个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则TCP 用顺序号对每个字节进行计数。序号是 32bit的无符号数,序号达到 232-1 后又从 0 开始。在建立一个新的连接时,SYN 标志变为 1,顺序号字段包含由这个主机选择的该连接的初始顺序号ISN(Initial Sequence Number)。
◎ 确认号ack(32 位):存储发送确认的一端所期望收到的下一个顺序号。确认序号是上次已成功收到的数据字节顺序号加 1。只有ACK 标志为 1 时确认序号字段才有效。TCP 为应用层提供全双工服务,这意味着数据能在两个方向上独立进行传输。因此,连接的每一端都必须保持每个方向上的传输数据顺序号。
◎ TCP 报头长度(4 位):存储报头中头部数据的长度,实际上指明了数据从哪里开始。需要这个值是因为任选字段的长度是可变的,该字段占 4bit,因此TCP最多有60字节的首部,但没有任选字段,正常的长度是20字节。
◎ 保留位(6位):数据保留位,目前必须被设置为0。
◎ 控制位(control flags:6 位):在TCP 报头中有 6 个标志比特,它们中的多个可被同时设置为1。
◎ 窗口大小(16 位):数据字节数,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口的大小。窗口大小是 16bit的字段,因而窗口最大为65535字节。
◎ 校验和(16 位):此校验和是对整个的TCP 报文段,包括TCP 头部和TCP 数据,以 16 位字符计算所得的。这是一个强制性的字段,一定是由发送端计算和存储的,并由接收端验证。
◎ 紧急指针(16 位):只有在URG 标志置为 1 时紧急指针才有效,这时告诉TCP该条数据需要紧急发送。
◎ 选项:最常见的可选字段是最长报文大小,又叫作MSS(Maximum Segment Size)。每个连接方通常都在通信的第1 个报文段(为建立连接而设置SYN 标志的那个段)中指明这个选项,指明该TCP连接能接收的最大长度的报文段。选项长度不一定是32字节的整数倍,所以要加填充位,使得报头长度成为整字节数。
◎ 数据:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP 首部。如果一方没有数据要发送,则也使用没有任何数据的首部确认收到的数据。在处理超时的许多情况下也会发送不带任何数据的报文段。
TCP的3次握手与4次挥手、SSL/TLS的4次握手
使用Wireshark抓包,查看TCP的3次握手与4次挥手、SSL/TLS的4次握手
6.1.4 HTTP的原理
1.HTTP的传输流程
客户端逐层封包、服务端逐层解包。
- 地址解析:浏览器发送http://localhost.com:8080/index.htm请求,通过域名解析系统DNS解析出IP,从而分解出协议、IP、端口、请求路径。
- 封装HTTP数据包
- 封装TCP包
- 建立TCP连接
- 客户端发送请求
- 服务端响应:响应行、响应头、空白行、正文。
- 服务端关闭TCP连接:服务器主动关闭TCP连接。
http 1.0默认Connection: close;
http 1.1默认Connection: keep-alive,Nginx、Tomcat等可以配置时间。
2.HTTP中的常见状态码
- 2xx:成功。200
- 3xx:重定向。
- 4xx:客户端错误。401、403、404
- 5xx:服务器错误。500
3.HTTPS
6.1.5 CDN的原理
CDN(Content Delivery Network,内容分发网络)指基于部署在各地的机房服务器,通过中心平台的负载均衡、内容分发、调度的能力,使用户就近获取所需内容,降低网络延迟,提升用户访问的响应速度和体验度。
1.CDN的关键技术
CDN的关键技术包括内容发布、内容路由、内容交换和性能管理,具体如下。
◎ 内容发布:借助建立索引、缓存、流分裂、组播等技术,将内容发布到网络上距离用户最近的中心机房。
◎ 内容路由:通过内容路由器中的重定向(DNS)机制,在多个中心机房的服务器上负载均衡用户的请求,使用户从最近的中心机房获取数据。
◎ 内容交换:根据内容的可用性、服务器的可用性及用户的背景,在缓存服务器上利用应用层交换、流分裂、重定向等技术,智能地平衡负载流量。
◎ 性能管理:通过内部和外部监控系统,获取网络部件的信息,测量内容发布的端到端性能(包丢失、延时、平均带宽、启动时间、帧速率等),保证网络处于最佳运行状态。2.CDN的主要特点
CDN的主要特点如下。
◎ 本地缓存(Cache)加速:将用户经常访问的数据(尤其静态数据)缓存在本地,以提升系统的响应速度和稳定性。
◎ 镜像服务:消除不同运营商之间的网络差异,实现跨运营商的网络加速,保证不同运营商网络中的用户都能得到良好的网络体验。
◎ 远程加速:利用DNS 负载均衡技术为用户选择服务质量最优的服务器,加快用户远程访问的速度。
◎ 带宽优化:自动生成服务器的远程镜像缓存服务器,远程用户在访问时从就近的缓存服务器上读取数据,减少远程访问的带宽,分担网络流量,并降低原站点的We b服务器负载等。
◎ 集群抗攻击:通过网络安全技术和CDN 之间的智能冗余机制,可以有效减少网络攻击对网站的影响。
3.内容分发系统
将用户请求的数据分发到就近的各个中心机房,以保障为用户提供快速、高效的内容服务。缓存的内容包括静态图片、视频、文本、用户最近访问的JSON数据等。缓存的技术包括内存环境、分布式缓存、本地文件缓存等。缓存的策略主要考虑缓存更新、缓存淘汰机制。
4.负载均衡系统
负载均衡系统是整个CDN系统的核心,负载均衡根据当前网络的流量分布、各中心机房服务器的负载和用户请求的特点将用户的请求负载到不同的中心机房或不同的服务器上,以保障用户内容访问的流畅性。负载均衡系统包括全局负载均衡(GSLB)和本地负载均衡(SLB)。
◎ 全局负载均衡主要指跨机房的负载均衡,通过DNS 解析或者应用层重定向技术将用户的请求负载到就近的中心机房上。
◎ 本地负载均衡主要指机房内部的负载均衡,一般通过缓存服务器,基于LVS、Nginx、服务网关等技术实现用户访问的负载。
5.管理系统
管理系统分为运营管理和网络管理子系统。网络管理系统主要对整个CDN网络资源的运行状态进行实时监控和管理。运营管理指对CDN日常运维业务的管理,包括用户管理、资源管理、流量计费和流量限流等。
6.2 负载均衡
6.2.1 四层负载均衡与七层负载均衡的对比
四层负载均衡:基于第四层(传输层)的负载均衡,不同的IP+Port转发到不同的服务器。
- F5:硬件
- LVS
- Nginx:四层负载均衡、七层负载均衡,拥有缓存功能,可以基于正则表达式转发,在HTTP和Mail协议上功能较好。
七层负载均衡:基于第七层(应用层)的负载均衡,不同的URL前缀转发到不同的服务器。
- HAProxy:支持七层代理、会话保持、标记、路径转移等。
- Apache
- Nginx:四层负载均衡、七层负载均衡,拥有缓存功能,可以基于正则表达式转发,在HTTP和Mail协议上功能较好。
6.2.2 负载均衡算法
- 权重:默认权重为1,在权重的前提下仍然可以使用其他所有负载均衡算法。
- 轮询
- 随机
- 最少连接:记录当前每台服务器正在处理的连接数量。
- 处理能力:根据服务器的CPU、内存、当前连接数等换算而来。
- 响应时间:定时向每台服务器发送探测请求(如Ping)获取响应时间。
- DNS响应:在分布在不同中心机房的负载均衡设备都收到同一个客户端的域名解析请求时,所有负载均衡设备均解析此域名并将解析后的服务器IP地址返回给客户端,客户端向收到第一个域名解析后的IP地址发起请求服务,而忽略其他负载均衡设备的响应。
- 一致性散列:散列算法均衡指通过一致性散列算法和虚拟节点技术将相同参数的请求总是发送到同一台服务器,该服务器将长期、稳定地为某些客户端提供服务。在某个服务器被移除或异常宕机后,该服务器的请求基于虚拟节点技术平摊到其他服务器,而不会影响集群整体的稳定性。
- IP散列
- URL散列
6.2.3 LVS的原理及应用
详情请阅读《Offer来了(原理篇)》。
6.2.4 Nginx反向代理与负载均衡
1.负载均衡的配置:upstream
支持的负载均衡策略:
- 轮询(默认)
- 权重(weight)
- 最少连接(least_conn)
- 最短响应时间(fair)(第三方插件)
- IP散列(ip_hash)
- URL散列(url_hash)(第三方插件)
配置项:
- down:标志服务器为不可用状态。
- backup:备用服务器,只有其他非backup服务器都挂掉或很忙时,才会分配请求给它。
- weight:权重,默认是1。
- max_fails:最大失败次数,默认是1。超过max_fails后服务器暂停使用一定时间。
- fail_timeout:超过max_fails后服务器暂停使用的时间,默认是10s。
使用:
upstream tel_img_stream {
ip_hash;
server 192.168.11.68:20201;
server 192.168.11.69:20201 weight=100 down;
server 192.168.11.70:20201 weight=100;
server 192.168.11.71:20201 weight=100 backup;
server 192.168.11.72:20201 weight=100 max_fails=3 fail_timeout=30s;
}
2.反向代理的配置:proxy_pass
正向代理:
反向代理:
配置项:
使用:
location ~ .(jsp|jspx|do)?$ {
proxy_set_header Host $host; # 注意
proxy_set_header X-Real-IP $remote_addr; # 注意
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 注意
proxy_pass http://127.0.0.1:8080;
}
获取客户端真实IP:
- $host:nginx代理服务器的地址
- $remote_addr:客户端的真实IP
- $proxy_add_x_forwarded_for:客户端的真实IP+所有经过的nginx代理服务器的地址
3.解决Session共享问题
- 会话粘连:使用ip_hash策略即可实现会话粘连。
- 会话复制
- 会话集中