我有关于负载平衡器处理TCP连接的问题。
我的负载均衡器后面有三台服务器,有时由于某些处理任务,在服务器和客户端之间没有数据发送,闲置5分钟后连接将被丢弃,因为服务器发送了RST标志(由对等端重置连接)。 我想知道负载平衡器可以负责这个,所以我使用WireShark捕获带有RST FLAG的TCP数据包,并捕获这些数据包。
我的问题是,如果负载平衡器负责重新设置连接,我会不会看到服务器端的RST数据包,因为它已经被改变源IP的LB发送? 或者,也许我错了,即使LB正在发送RST数据包,它仍然可以捕获在服务器端?
我想缩小(或者提高)我的问题。 如果客户端和服务器之间的任何事情都用RST发送数据包,它应该在客户端和服务器上还是仅在其中一个(客户端)上可见?
我已经捕获客户端和服务器端RST标志的数据包,奇怪的是,在客户端它看起来像LB服务器已经发送它,并在服务器端,它看起来像客户端发送它(通过源/目标IP )
据我所知,这是您对networking主题(包括OSI图层和通信方法)的误解。
简要回答你的主要问题,我应该说,你的LoadBalancer完全对待的方式取决于你的configuration和你如何定义/希望它被对待。 但是为了向您展示LoadBalancing在OSI模型的第4层和第7层如何真正起作用,请阅读以下信息:
首先,关于RST包,你应该注意到你提到的是非常普遍的,因为RST被用来重置连接,并且可以发生在双方,这取决于什么不能完成,什么时候在服务器和客户端之间没有更多的对话发生而连接尚未结束。 从Quora的答案摘录,当服务器拒绝连接或不可用时,或者在数据传输过程中服务器或客户机无法使用或拒绝进一步通信时,RST数据包在三次握手过程中发送没有正式的4路TCP连接终止过程。
传输控制协议(TCP)在传输层(OSI模型中的第4层)运行。 TCP提供可靠的,有序的和错误检查的八位位组stream,并在IPnetworking通信的主机上运行的应用程序之间build立虚拟连接。 换句话说,它在应用程序和因特网协议之间提供了一个中间级别的通信服务,并且由于IP数据包可能会被丢失,损坏或无序到达,所以TCP具有纠正这些错误的机制,转换IP数据包stream成可靠的通信信道。 每个应用程序都分配了一个唯一的TCP端口号,以便在正在运行许多应用程序的主机上启用正确的应用程序。 例如,标准TCP端口22已被分配用于联系SSH服务器 – 如果需要,可以在configuration文件中更改默认端口。
在第4层负载平衡负载平衡器的IP地址被通告给客户端的网站或服务。 因此,可能已经猜到了,客户端请求中logging的目标地址将是LoadBalancer的地址。 当第4层负载均衡器收到请求并作出负载平衡决定时,它还对请求数据包执行networking地址转换(NAT),将logging的目标IP地址从其自己更改为其所选内容服务器的IP地址内部networking。 例如,在你的场景中,你的LoadBalancer将把自己的地址改变成为服务器所要求的服务所需要的地址,为了更加明确,让我们考虑一下LoadBalancer后面的三台服务器是你的存储服务器,客户愿意阅读PDF或网站上的任何内容。 客户端的目标地址被设置为分配给您的LoadBalancer的公共IP地址,并且当您的LoadBalancer收到请求时,它将决定哪个服务器 – 在内部networking中使用它自己 – 它应该根据您拥有的规则映射请求在LoadBalancer中进行设置和configuration。 同样,在将服务器响应转发给客户端之前,负载均衡器会将logging在数据包标头中的源地址从内部服务器的IP地址(例如存储器)更改为自己的地址。 (数据包中logging的目标和源TCP端口号有时也会以类似方式改变)。然后,根据从TCPstream中前几个数据包中提取的地址信息做出其路由决策,而不检查数据包内容。
并回答“如果负载均衡器负责重新设置连接,我将不会看到在服务器端的RST数据包,因为它是由LB发送更改的源IP?”,我应该说你只会看到其他服务器上的RST数据包,如果他们连接需要用LoadBalancer重置,而不是客户端与LoadBalancer的连接。
顺便说一句,我强烈build议你在你的内部服务器上使用tcpdump来查看你是否可以接收来自LoadBalancer的请求,这样你就可以看到发生了什么问题,你将会发现如何解决你的问题。 不要用WireShark来迷惑自己,这是一个很好的工具,但是你应该熟悉它,以便理解它展现给你的东西。