海阔天空

导航

网络问题求教

   最近在客户那里遇到一个非常郁闷的问题,特来此地请教高手。具体表现是过一段时间后网络开始不通,具体描述如下:
 
最初网络连接正常的时候用netstat一把,看到的连接状态是:
tcp        0      0 200.200.50.80:32912     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32910     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32911     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32908     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32909     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32906     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32907     A:5400      ESTABLISHED
tcp        0      0 200.200.50.80:32905     A:5400      ESTABLISHED
两台主机(A主机由于是公网IP,所以就用A暂时取代)之间建立了8个连接。这8个连接的用途分别是1个保活连接,端口是32905的那个,另外7个是数据传输连接,7条连接轮流传输数据,在A机器前面有防火墙,防火墙的规则当然是让5400端口的数据包通过,但是是否还有其他的规则就暂时无从得知,客户比较严格。
现在的问题在于,过一段时间后这7个连接中就有那么1-2个连接的数据始终发不出去,其他的连接收发正常,由于整个程序有两个连接不正常,最后导致整个程序退掉。

用tcpdump抓包显示如下:
//一开始正常的收发数据
16:36:28.042894 200.200.50.80.32906 > A.5400: P 12793:12830(37) ack 35926 win 84 <nop,nop,timestamp 2503990 79926858> (DF)
16:36:28.043274 200.200.50.80.32906 > A.5400: P 12830:13026(196) ack 35926 win 84 <nop,nop,timestamp 2503990 79926858> (DF)
16:36:28.043555 200.200.50.80.32906 > A.5400: P 13026:13055(29) ack 35926 win 84 <nop,nop,timestamp 2503990 79926858> (DF)
16:36:28.065101 A.5400 > 200.200.50.80.32906: P 35926:36118(192) ack 12830 win 45 <nop,nop,timestamp 79926860 2503990> (DF)
16:36:28.065105 A.5400 > 200.200.50.80.32906: P 36118:36147(29) ack 12830 win 45 <nop,nop,timestamp 79926860 2503990> (DF)
16:36:28.095327 200.200.50.80.32906 > A.5400: . ack 36147 win 84 <nop,nop,timestamp 2503996 79926860> (DF)
16:36:28.100736 A.5400 > 200.200.50.80.32906: . ack 13055 win 45 <nop,nop,timestamp 79926864 2503990> (DF)//最后一次通讯
......//这段时间内其他连接在发送数据,然后32906的连接再次发送数据的时候问题开始出来了。
16:41:52.678878 200.200.50.80.32906 > A.5400: P 13055:13084(29) ack 36147 win 84 <nop,nop,timestamp 2536454 79926864> (DF)
16:41:52.679206 200.200.50.80.32906 > A.5400: P 13084:13198(114) ack 36147 win 84 <nop,nop,timestamp 2536454 79926864> (DF)
16:41:52.680035 200.200.50.80.32906 > A.5400: P 13198:13230(32) ack 36147 win 84 <nop,nop,timestamp 2536454 79926864> (DF)
16:41:52.935317 200.200.50.80.32906 > A.5400: P 13055:13198(143) ack 36147 win 84 <nop,nop,timestamp 2536480 79926864> (DF)
16:41:53.455321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2536532 79926864> (DF)
16:41:54.495319 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2536636 79926864> (DF)
16:41:56.575319 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2536844 79926864> (DF)
16:42:00.735321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2537260 79926864> (DF)
......//下面该连接一直在不停的重发改数据,同时也有其他的连接在发送数据,其他的连接发达数据包在此省略,但是都是正常。
16:42:09.055321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2538092 79926864> (DF)
......
16:42:25.695321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2539756 79926864> (DF)
......
16:42:58.975320 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2543084 79926864> (DF)
......
16:44:05.535320 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2549740 79926864> (DF)
......
16:46:05.535313 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2561740 79926864> (DF)
......
16:50:05.535320 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2585740 79926864> (DF)
......
16:52:05.535321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2597740 79926864> (DF)
......
16:54:05.535321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2609740 79926864> (DF)
......
16:56:05.535321 200.200.50.80.32906 > A.5400: P 13055:13230(175) ack 36147 win 84 <nop,nop,timestamp 2621740 79926864> (DF)
......//下面开始断开了,其他的连接全部断开,只取了一个包做示例。
16:59:11.775665 200.200.50.80.32905 > A.5400: F 1736:1736(0) ack 1736 win 45 <nop,nop,timestamp 2640364 80063224> (DF)

当32906的连接在重发数据的时候再用netstat看,可以发现
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0    175 200.200.50.80:32906      A:5400                  ESTABLISHED
该连接的TCP发送缓冲区内一直停留有175个字节没办法发送出去。

现在的问题在于,由于我们只能登录到200.200.50.80的机器进行控制,A机器由于防火墙的原因无法shell登录,客户开防火墙比较麻烦,不让开。
现在有两个问题:
1.  由于其他的连接正常,只有这一条连接的数据发不出去,说明对端的5400是开放的,并且我们还可以telnet到5400端口,那么为什么有一条连接的数据发不出去呢?A机器前面的防火墙的原因?如果是的话为什么只阻挡了一条连接的数据呢?暂时无法知道防火墙是基于简单的包过滤还是基于状态等其他类型。当然也不排除A上我们程序不接收这条连接的数据的可能,但是这个可能性应该比较小,毕竟已经久经测试。
2.  最后一次A:5400通告的接收窗口为45字节,为什么TCP还会发送超过该字节的数据包大小(重传的是175字节)?这样对端很明显会丢弃数据的。两边的机器的系统都是Linux2.4.32,打了web-100的补丁包,即启用了BicTcp。

郁闷了很久还没定为到底哪里出问题了,网络求助,高手帮忙看下。

posted on 2008-06-27 13:16  fll  阅读(1589)  评论(4编辑  收藏  举报