笔者在研究四层负载均衡的时候,有读到这么一篇博客:
https://blog.csdn.net/friends99/article/details/79803638
文中提到的一点笔者存在一些困惑,我把原文截图出来:
对于文章中的描述,笔者不是太理解为什么服务器会和客户端直接建立连接,负载均衡会修改数据包源地址又是什么意思?所以下面笔者做了实验并抓包分析。
首先第一次使用的是haproxy,实验拓扑如下
笔者将环境部署好后,用client去访问负载均衡以请求web内容,同时分别在haproxy的内网口和client的网口上抓包进行查看,下面的截图是抓到的包中笔者认为比较重要的部分:
haproxy内网口
client网口
从抓到的数据包中可以分析TCP三次握手与四次挥手,负载均衡以源IP为自己,目的IP为后端的web,将数据包进行了转发,可证实博客中我划了红线的部分
下面是对蓝线部分的抓包分析,拓扑类似,仅将haproxy换成了lvs
以同样的方法进行抓包,得到:
client网口,lvs起转发作用
lvs内网口,可以看到web是直接将数据包回给client的
这里我的理解是,lvs将client的请求进行转发,转发的时候将包的源地址(本来应该是lvs)改成了client,web根据接收请求数据包的源地址,在回包的时候直接将数据包路由给client。我想到的这么做的理由是,client来自外网,那web向client回数据必定需要路由,若负载均衡不是网关且不修改转发的包的源地址(这样的话源地址是负载均衡),那么web将会把包回给负载均衡设备,负载均衡再经过网关将数据路由给client……这么做相当于回包的时候还要从负载均衡走一趟,浪费资源。
通过上面两次观察,笔者大致能理解博客中所说的意思,只是不知道有没有理解偏差。欢迎广大读者留下建议,若文章中有什么不对的地方也请批评指出。感谢!!