负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解

系列文章:

负载均衡详解第一篇:负载均衡的需求

负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础

负载均衡详解第三篇:服务器负载均衡的基本概念-使用负载均衡器的服务器群

负载均衡详解第四篇:服务器负载均衡的基本概念-负载均衡时数据包流程

负载均衡详解第五篇:服务器负载均衡的基本概念-健康检查

负载均衡详解第六篇:服务器负载均衡的基本概念-网络地址转换(NAT)

负载均衡详解第七篇:服务器负载均衡的基本概念-服务器直接返回

负载均衡详解第八篇:服务器负载均衡技术进阶-会话保持(上)

负载均衡详解第九篇:服务器负载均衡技术进阶-会话保持(中)

负载均衡详解第十篇:服务器负载均衡技术进阶-会话保持(下)

我们以下图为例,讨论采用负载均衡器后数据包的流程。

如图所示,有三台服务器,RS1到RS3,还包含三种应用:Web(HTTP),FTP,和SMTP,分别在三台服务器上运行。在这个例子中,所有的应用都运行在TCP之上,而且每个应用都使用不同的TCP端口。WEB应用在80端口上运行,FTP在21端口上运行,而SMTP在端口25上运行。负载均衡器根据接收的TCP数据包中的目的端口号识别客户端需要访问的应用,并为每个客户请求选择合适的服务器。

选择服务的过程分两步,第一,负载均衡器必须判断哪些服务器上面的应用是可用的。服务器和应用是否可用由健康检查决定,我们将会在后面的章节中详细讨论。第二,负载均衡器采用一种负载均衡算法来选择服务器。常用的复杂均衡算法有轮循、最小连接数、权重、最快响应时间等,负载均衡算法将会在后面的章节详细讨论。

负载均衡器的配置包括以下几个步骤:

1.定义一个VIP:VIP=123.122.121.1;

2.确定哪些应用需要负载均衡:Web、FTP和SMTP;

3.对每个应用,绑定VIP到相应的真实服务器:把RS1和RS2绑定到Web的VIP;把RS1绑定到FTP的VIP;把RS2和RS3绑定到SMTP的VIP。也就是说,VIP的80端口绑定到RS1和RS2的80端口;VIP的21端口绑定到RS1的21端口,依此类推,如上图所示;

4.设置健康检查,用来检查服务器和应用的健康状态;

5.设置负载均衡算法。 通过把VIP绑定到真实服务器的不同TCP端口,我们把服务器和应用分离开,提供了强大的灵活性。举例来说,如果FTP应用的访问量增加,只需要把另外一台服务器绑定到VIP的21端口就可以增加FTP服务的处理能力。如果RS2需要下线维护,我们可以利用负载均衡器实现RS2的无缝停机,也就是停止向RS2发送任何新的请求,并等待所有的在线连接关闭,然后将RS2停机。

注意示例中所有的真实服务器都使用私有IP地址,这样做有两个好处:首先,只用一个公网IP地址,也就是VIP,来表示所有的服务器群可以节省IP地址空间;第二,提高了安全性,任何客户的请求都不能绕过负载均衡器直接访问到服务器。

对于负载均衡器能够做什么,现在我们都了解了,下面看一下采用负载均衡器后数据包的转发流程。

我们用一个简单例子,如下图所示,来了解请求响应过程中数据包的转发流程。

客户端首先建立一个TCP连接,发送HTTP请求,接收服务器响应,并关闭这个TCP连结。建立TCP连接需要三次握手,负载均衡器接收到的TCP SYN请求包含以下信息:

源IP地址:客户端的IP地址;

源端口:客户端用于此TCP连接的端口号码;

目的IP地址:VIP地址;

目的端口:由于请求访问的是WEB应用,所以目的端口是80。

上述四个因素唯一标识了一个TCP会话,当负载均衡器接收到第一个TCP SYN数据包后,假定选择RS2处理这个请求,并将请求发送到RS2。为了让RS2接收TCP SYN数据包并进行处理,必须把数据包的目的地址修改为RS2的私有IP地址,而不是VIP的IP地址。因此,负载均衡器在转发数据包之前会把目的地址修改为RS2的IP地址,这个IP地址转换的过程称为网络地址转换(NAT)。更确切的讲,由于负载均衡器修改的是目的地址,所以也称为目的地址NAT。

当用户敲入www.agilesharp.com之后,浏览器会产生一个DNS查询请求,获取www.agilesharp.com对应的IP地址,也就是VIP。然后客户端的浏览器发送TCP SYN数据包以建立一个新的TCP联接。当负载均衡器接收TCP SYN数据包后,它先确认这个请求是需要做负载均衡的数据包,因为数据包的目的地址是VIP。由于这是一个新的连接,负载均衡器无法在会话表中通过源IP地址、目的IP地址、源端口地址、目的端口地址查到这一个会话。根据负载均衡设置和健康检查的结果,负载均衡器确认RS1和RS2可以接收新建连接。根据预先定义的负载均衡算法,负载均衡器选择RS2来处理这个会话请求。服务器选定之后,负载均衡器在它的会话表中建立一个新的记录,并把数据包的目的IP地址和目的MAC地址修改为服务器RS2的IP地址和MAC地址,然后把数据包发送到RS2。

当接收到TCP SYN包之后,RS2会应答TCP SYN ACK包,数据包的源地址是RS2的IP地址,而目的地址就是客户端的IP地址。负载均衡器接收到这个数据包之后,再把RS2的IP地址修改为VIP的IP地址,并把数据包发送到路由器,最终路由到客户端。这个TCP会话后续所有的请求和回应数据包都是经过同样的流程。最终,当通过FIN或RESET结束或终止这个连接时,负载均衡器在其会话表中删除这个会话记录。

现在我们来跟踪数据包的流程,看一下IP地址和MAC地址是如何改变的。当路由器接收到数据包时,数据包的目的IP地址是VIP,而目的MAC地址是M1,也就是路由器的MAC地址。

第一步,如上图中所示,路由器把目的MAC地址修改为M2并把数据包发送到负载均衡器,M2是负载均衡器的MAC地址。

第二步,负载均衡器把目的IP地址和目的MAC地址修改为RS2的IP地址和MAC地址,并发送到RS2。

第三步,RS2响应客户端的请求。因此,源IP和源MAC都是RS2的地址,而目的IP地址是客户端的IP地址。RS1和RS2的缺省网关是负载均衡器的IP地址。因此,目的MAC地址是负载均衡器的MAC地址。

第四步,负载均衡器接收数据包之后,把源IP地址修改为VIP的地址,使得回应看起来跟VIP发出的一样。这一点非常重要,TCP连接是建立在客户端和VIP之间的,并不是真实服务器,所以回应的数据包必须看起来象是从VIP发出的一样。为了数据包能够正常到达客户端,负载均衡器需要把数据包转发给它的下一跳,也就是路由器。负载均衡器把源MAC地址修改为自己的MAC地址M2,目的MAC地址修改为路由器的MAC地址M1,然后把数据包转发至路由器。

在这个例子中,负载均衡器作为真实服务器的缺省网关。其实,也可以用路由器作为服务器的缺省网关。那样的话,从真实服务器返回的数据包的目的MAC地址为M1,也就是路由器的MAC地址,而负载均衡器对源MAC和目的MAC不做任何改动。对于其他的二、三层交换机和主机而言,负载均衡器就相当于一个二层交换机。

本篇就讨论到这里!下一篇,我们继续!

转载于:https://www.cnblogs.com/yanyangtian/archive/2012/04/05/2432734.html

负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解相关推荐

  1. 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础

    负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负 ...

  2. Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装

    Linux系统详解 第五篇:Linux的安装-4:Fedora 16的安装 前言: 本系列文章取材广泛,有来自于互联网的,有来自教科书的,有来自自己的笔记的,也有来自自己对Linux的经验积累的.此系 ...

  3. IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目

    看到本篇的题目,大家可能感到有点奇怪!下面,我们就来看看这到底是什么意思. 大家可能遇到过这样的一种情况:希望根据某些请求用户的特性,将用户的请求导向不同的站点(请大家这里区分"亲缘性&qu ...

  4. Netty详解(五):Netty TCP粘包 拆包

    1. 概述 无论是服务端还是客户端,我们读取或者发送消息的时候,都需要考虑TCP底层的粘包和拆包机制.下面我们来通过Netty来详解TCP底层的粘包和拆包机制. 2. TCP底层的粘包和拆包机制 TC ...

  5. IP数据包(详解版)

    1.IP数据包详解图 2,使用Wireshark抓包 (1)版本--占4位,指IP协议的版本目前的IP协议版本号为4(即IPv4). (2)首部长度--占4位,这里的值为20Bytes. (3)总长度 ...

  6. 【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用 | 解复用 )

    文章目录 一.FFmpeg 简介 二.FFmpeg 相关术语 1.容器 2.媒体流 3.数据帧 4.数据包 5.编解码器 6.复用 7.解复用 博客资源 一.FFmpeg 简介 FFmpeg 是 &q ...

  7. linux c中动态申请二维数组,Linux C 编程详解第五篇:二维数组

    二维数组 : 存储类型 数据类型 数组名[行数][列数] 列数不能够省略 , 行数可以省略 数组元素的引用 : 数组名[行标][列标] 练习 : 1.找出二维数组中的最大值, 如果有多个最大值, 找出 ...

  8. TCP/IP数据包结构详解

    一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解 网络数据包的结构,以及协议分析.如:网络监控,故障排查等-- IP包是不安全的,但 ...

  9. 渗透测试攻击(二)——wireshark过滤数据包语法详解

    目录 Wireshark过滤语句中常用的操作符 Wireshark捕获UDP数据包 UDP协议分析常用过滤条件 UDP校验和过滤条件

最新文章

  1. http几个版本的区别
  2. 获取程序所有加载的dll名称
  3. 个人收集 - 1、自动消失的消息提示(Js+Div实现)
  4. Javaweb之session创建销毁问题
  5. java之try catch finally
  6. 知名开源操作系统两大老板闹翻,一位联合创始人被迫退出,道一声:再见
  7. android短信安全,基于Android短信服务的手机安全监控系统的设计与实现
  8. 转载:java生成eps
  9. PHP字符串转换函数
  10. 开放平台介绍以及目前国内主要的开放平台
  11. windows图片查看器背景颜色更改
  12. Docker容器访问外部世界
  13. 关于opencv打开摄像头黑屏的问题
  14. 微信没有回车键怎么换行_微信打字怎么换行
  15. 存算分离后,VxRail动态计算节点构建虚拟化更给力
  16. app分享到微信的方案
  17. dns设置快速连接微软服务器,通过批处理快速设置windows网卡地址网关DNS
  18. 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
  19. Java程序员高效学习的六个中肯建议
  20. 聊聊php脚本执行流程

热门文章

  1. kotlin button_使用Kotlin和XML的Android Button
  2. java编程测试题_Java编程测试可帮助您评估求职者
  3. 使用Shell和Java驱动程序的MongoDB身份验证配置示例
  4. 使用Visual Studio对项目重命名
  5. C语言内存泄漏问题检视方法
  6. (免费领)Java大厂面试题: 常见的异常类有哪些?
  7. 《CUDA C编程权威指南》——2.2 给核函数计时
  8. jQuery鼠标事件整理
  9. orac l e数据库第一章
  10. 一个很详细的web.xml配置文件详解