转载自:
http://hi.baidu.com/nathan2007/blog/item/ee7daecbc44f4ffd53664f59.html
作者:
nathan
飞信老是断线,这点互联网上很多用户都有提及。我待的地方就老断,一说是跟网络有关系,一说是飞信本身有问题。近一两天跟踪看了看,发现断得可真是恐怖,一天断20-30次的都有。可有一次在家通过ADSL上呢,好象又还好。难道是时间的关系?
飞信老是断线,这点互联网上很多用户都有提及。我待的地方就老断,一说是跟网络有关系,一说是飞信本身有问题。近一两天跟踪看了看,发现断得可真是恐怖,一天断20-30次的都有。可有一次在家通过ADSL上呢,好象又还好。难道是时间的关系?
但白天碰到的多次断线我感觉是服务器的问题,理由是通过Sniffer,我明确地看到了服务器端发过来的TCP RST的包,也就是说服务器对这个TCP连接做了CLOSE的操作。
让我们看看sniffer记录了什么,来看一次断线的记录(这是OmniPeek的PacketVisualizer Data):
.....
9451 12:46:48.661 > IP L= 40 TCP .A.... S= 4522 L= 0 10994=A W=64367 TCP Invalid Checksum
9452 12:46:51.181 << IP L= 119 TCP .AP... 4522=A L= 79 S= 10994 W=65402
9453 12:46:51.182 >> IP L= 115 TCP .AP... S= 4522 L= 75 11073=A W=64288 TCP Invalid Checksum
9454 12:46:51.343 < IP L= 40 TCP .A.... 4597=A L= 0 S= 11073 W=65327
9455 12:53:38.501 > IP L= 98 TCP .AP... S= 4597 L= 58 11073=A W=64288 TCP Invalid Checksum
9456 12:53:38.532 < IP L= 40 TCP ...R.. L= 0 S= 11073 W= 0
.....
9451 12:46:48.661 > IP L= 40 TCP .A.... S= 4522 L= 0 10994=A W=64367 TCP Invalid Checksum
9452 12:46:51.181 << IP L= 119 TCP .AP... 4522=A L= 79 S= 10994 W=65402
9453 12:46:51.182 >> IP L= 115 TCP .AP... S= 4522 L= 75 11073=A W=64288 TCP Invalid Checksum
9454 12:46:51.343 < IP L= 40 TCP .A.... 4597=A L= 0 S= 11073 W=65327
9455 12:53:38.501 > IP L= 98 TCP .AP... S= 4597 L= 58 11073=A W=64288 TCP Invalid Checksum
9456 12:53:38.532 < IP L= 40 TCP ...R.. L= 0 S= 11073 W= 0
从记录中我们看到,12:53:38,客户机发了9455号包到服务器,而服务器回了一个RST包(9456号包),从TCP的序列号看,通信过程都是正常的,否则RST包的Sequence就不会是11073了。9455的包的内容是:
R fetion.com.cn SIP-C/2.0
F: 565248767
I: 1
Q: 4 R
F: 565248767
I: 1
Q: 4 R
这是一个向SIP Proxy Server注册的SIP请求。我猜测是客户端有几分钟没收到服务器的任何消息(通常服务器在不停地给客户端发presence消息),客户端就向服务器发起一个注册请求,这时服务器应该将所有用户列表向飞信的客户端返回,然而,服务器却回了一个字:滚!;) 然后,飞信就痛苦地开始了重新登录过程,然后你的好友就看到你又缓缓地从他屏幕的右下角慢慢地爬了上来,冤啊。
一个半天可以记录到10多次这样的断线,每次均是以如此方式结束:客户端发一个请求到服务器,服务器回以RST。是网络问题吗?我想应该不是,TCP的交互过程是正常的,MSN也是同时用TCP连着的,它也不断。我认为是飞信服务器的用户状态机处理有问题,莫名其妙地把活动的用户给干掉了。:)
飞信自己应该知道这种情况的啊,Fetion本身的日志文件中是这么记录的:
....
<Summary>通信层异常</Summary>
<Detail>System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
....
<Summary>通信层异常</Summary>
<Detail>System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
....
可怜的飞信。