直接返回服务器(DRS)与负载均衡器(LB)相关技术问询汇总
直接返回服务器(DRS)与负载均衡器(LB)相关技术问询汇总
DRS 核心原理概述
直接返回服务器(DRS)的核心设计就是让真实服务器绕过负载均衡器(LB)直接给客户端回包,具体运作逻辑如下:
- 真实服务器会将LB的虚拟IP(VIP)配置为本地回环地址(localhost)
- LB与真实服务器处于OSI二层网络环境中,属于同一广播域
- 客户端向VIP发起请求时,LB仅修改数据包的目标MAC地址,将流量转发至某台真实服务器,数据包的其他内容(IP、端口等)完全保持不变
- 由于真实服务器上的回环VIP是公网可访问的,且与LB的VIP完全一致,因此真实服务器可以直接向客户端发送响应,无需经过LB中转
技术问题解答
Q1: 当服务器回复客户端时,源端口是80还是4001?
答案是80。这里的关键逻辑是:客户端发起请求时,目标端口是LB的VIP:80,LB转发数据包仅修改了目标MAC,数据包内的目标IP(VIP)、目标端口(80)均未改动。真实服务器虽然实际Web服务运行在4001端口,但它是通过回环VIP的80端口接收请求的(比如通过本地端口转发,或者服务本身绑定回环VIP的80端口并将请求转发至4001处理)。为了让客户端识别这是对之前VIP:80请求的合法响应,服务器回复时必须将源端口设为80,而非实际服务运行的4001端口。
Q2: 假设TCP连接仍然存活,后续的客户端请求会绕过LB吗?为什么?
不会绕过LB。原因在于TCP连接是通过**四元组(源IP、源端口、目标IP、目标端口)**唯一标识的,客户端侧的目标IP始终是VIP、目标端口是80,因此后续所有数据包都会被发送至VIP(即LB的地址)。客户端完全不知道真实服务器的存在,它只知道要和VIP建立连接。
这里需要明确DRS的核心特性:DRS仅让响应数据包绕过LB,所有客户端的请求数据包必须先经过LB,由LB完成转发决策后再发送至真实服务器,后续的请求包也遵循同样的流程。
Q3: 如果使用DRS负载均衡器,且Webserver运行在4001,TCP握手的流程是怎样的?
整个TCP三次握手的流程如下,核心是LB仅参与请求转发,不参与响应回传:
- 客户端 → LB:客户端发送SYN包,目标地址为VIP:80
- LB → 真实服务器:LB仅修改SYN包的目标MAC地址,将其转发至真实服务器(数据包的目标IP仍为VIP、目标端口仍为80;真实服务器通过回环VIP接收该包后,将请求转发至本地4001的Web服务处理)
- 真实服务器 → 客户端:真实服务器直接向客户端发送SYN+ACK包,源地址为VIP(回环地址)、源端口为80,目标地址为客户端的IP和端口
- 客户端 → LB:客户端发送ACK包,目标地址为VIP:80
- LB → 真实服务器:LB修改ACK包的目标MAC地址,转发至真实服务器,完成TCP三次握手
简单来说:握手过程中的SYN、ACK请求包均需经过LB转发,而SYN+ACK响应包由真实服务器直接发送给客户端,全程LB仅修改数据包的MAC地址,不改动IP和端口信息。
备注:内容来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

