让我先说一下,我对这个级别的networking知识足够了解是危险的,所以如果我说一些愚蠢的话,请善良。
我在3台Apache服务器前使用了一个Big IP负载均衡器。 这3个Apache服务器都在同一台物理机器上(运行Linux),绑定到三个不同的虚拟IP地址的端口80,但我不认为这是在这个问题上的一部分。 我们configuration了LB,以便同一个客户端每次获得相同的WEB服务器,通过LB提供的cookie进行控制。
如果我通过LB来访问我们的应用程序,我会偶尔(5-15%的时间)得到一个浏览器正在旋转的页面,永远不会返回。 如果我直接打到每个WEB服务器上,我都不会那么做。 使用WireShark,我查看了我的电脑,LB和我通过LB打的WEB服务器发生了什么,我看到了以下内容:
1)大多数时候,PC用来打LB的端口是LB用来打WEB服务器的端口,我认为是“正常”的。 所有3次我复制我的问题,端口是不同的(例如1234之间的PC / LB和2345之间的LB / WEB)。 但是,并不是所有的时代,他们是不同的,我看到一个问题。 这可能是一个红鲱鱼….
2)PC < – > LB通信与1260字节长的数据包; LB – > WEB报文为1260字节,LB < – WEB报文为1260的几倍。当WEB向LB发送2520字节时,LB收到2×1260字节报文,只发送一个ACK。 然后它将发送回PC 2×1260字节的数据包,并从PC接收一个ACK。 我不明白为什么2520被分成2×1260,我也不明白为什么PC知道只发送一个ACK。 这也可能是一个红鲱鱼….
3)在某些时候,WEB服务器向没有收到ACK的LB发送数据,然后重新发送启动这个数据序列的数据包。 但是,我不知道为什么重新传输会发生,因为只有0.6秒的时间,所以不能超时(呃,我想是可能的,但看起来似乎不太可能)。 此外,原始的WEB-> LB数据包是5040字节(4×1260),但重传仅为1260.LB接收到来自原始5040发送的所有4个数据包,但是从不发送任何原因的ACK。 我看到其他时候,LB已经能够处理发送给它的5040个字节,它确认得很好,所以看起来好像发送的数据包的长度不是问题。 但是,这些数据包都没有从LB发送回PC。
4)尽pipe只有第一个1260块的数据从WEB重新发送到LB。 有一个小的延迟(0.4秒),然后是第二次重传数据,从第一个1260块开始,这次所有的4×1260数据包都被重新发送。 然而,由LB发回的ACK是全部5个重新发送的数据包,即使它们中的一个明显地重新发送了两次(我基于WireShark所示的相对seq编号;发回的ACK等于seq即使第二重发分组的序号与第一重发分组相同,也是第一重发分组的编号+ 5×1260)。 这似乎很糟糕。
5)最糟糕的是,我认为,港口都搞砸了。 原来的对话端口如下:
PC <-> LB == 2723 LB <-> WEB == 2722
在这个谈话中混杂着一个看起来像这样的人:
PC <-> LB == 2722 LB <-> WEB == 2723
这足以让我目瞪口呆,但是我根据数据包的内容(呃)证实了这些对话是在我认为是他们的端口上发生的。 第二个对话成功完成(实际上,在这组端口上有两个对话,两个都成功完成)。 在发送第一个(中止?)重发数据包之后,但在发送第二组4×1260重发之前,有一个对话:
PC <-> LB == 2722 LB <-> WEB == 2722
因此,端口2722上的原始LB < – > WEB对话中断。 我不认为这是根据议定书允许的。 在这个端口上没有任何方向发送FIN或SYN。 从LB – > WEB发送的这个新发起的对话的序列号是我所期望的。 从WEB到LB的ACK具有正确的序列号,但是ACK是closures的(正好是1260)。
这个第二次对话似乎从来没有发生,因为在4×1260被重新传输之后,WEB发送另一个新的1260数据块,并且全部是来自原始请求的响应(通过检查包中的数据)。 然后,LB发回一个ACK,这是我期望从原来的谈话(最后ACK + 4×1260 + 1260)。
所以,我有线索知道发生了什么,但不知道为什么会发生,当然没有线索如何解决这个问题。 我从哪里出发?
编辑:我只记得一些东西; 在4×1260的中间从WEB重新发送到LB,LB发回一个比我预期的多100个字节的ACK。 在发送第一个1260的新数据包之后,LB发回一个确切的应答(即自己纠正)的ACK。 我不知道如何可能发生或者意味着什么,或者即使这是有意义的。
有一件事情就是我的networking服务器使用不同的IP地址在同一台机器上。 如果你把所有的服务器都放在一个盒子里,你真的没有什么负载平衡的东西。
你用包来描述的一些看起来很正常。 你有没有使用过Wireshark的'Expert Info'和'Follow TCP Stream'function? 这些将显示TCP连接的更高级别的视图。 另外请记住,Wireshark可能不会捕获所有的数据包(特别是如果你在千兆以太网上)。
至于这个问题,你可能会看到LB中的一个bug,因为你所有的web服务都在同一个盒子里,这意味着你的三个IP地址都有相同的MAC地址。 如果LB使用MAC地址跟踪连接,则可能会混淆您的三个服务器IP地址,并将数据包指向错误的地方。
在客户端以及BIG-IP的服务器端(现在是Web服务器的客户端),tcp端口将根据需要进行更改。 这是预期的行为,因为BIG-IP处理到客户端和服务器的完全独立的TCP连接。
由于代理处理客户端和服务器之间的单独连接,因此正常的TCP行为将在连接的客户端和服务器端执行不同的操作。 你应用了什么样的TCPconfiguration文件,以及代理的哪一方(你可以在连接的客户端和服务器端应用不同的configuration文件,或者根据你的使用情况和networking环境来select不同的configuration文件)在什么时间在线上,以及发送多less次和多less次确认。
重新传输是常见的,以及tcp堆栈如何处理networking拥塞取决于连接的客户端和服务器端的堆栈。 同样,对于任何客户端 – > BIG-IP->服务器场景,您都有两台客户端和两台服务器。
将需要查看整个捕获来诊断您所看到的行为。
不要以为这里的TCP端口是一个问题。
没有细节,我的猜测是你有股票tcpconfiguration文件启用,而不是一个自定义的configuration文件,它的行为与您的应用程序严重。 我强烈build议使用自定义configuration文件,并让人们了解TCPstream量和拥塞控制algorithm如何工作,以及TCPconfiguration文件中的某些设置对于某些应用程序的行为performance不佳。 几年前,我们写了一篇关于BIG-IP TCPconfiguration文件的10部分的系列文章(可以使用刷新以及所有更改,但仍然是一个很好的信息来源),我认为这将有助于: https://devcentral.f5。 COM /用品/调查最LTM-TCP-型材纳格尔algorithm