随笔-8  评论-24  文章-0  trackbacks-0

Socket连接的小知识,和一个疑难杂症

我这篇文章说一个Socket的小技巧,另外咨询一个问题

这些天重点攻打Socket
以前总觉得Socket编程应该比较容易,也做过简单的Socket程序。
但真正要应用时,发现有很大问题!

我用C#语言

我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,总共用到网络带宽大概512bps。

问题产生在数据延迟上了,程序对数据包的延迟要求很高,要求延迟平稳不跳动。程序每发送一个请求后,到从服务器接受到的反馈数据时间差要求基本一致。此外,程序还不停接受从服务器发送来的一些信息。

当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
但开到40个Socket的时候(每个socket连接不同服务器),就完全不一样了。发送请求后,接收到服务器响应的数据包的时间差距很大。从100ms~10000ms不等。这对于我的程序完全是个灾难!!!


在查询很多资料后,终于知道微软有个nagle算法。为了有效利用带宽,nagle算法会使得Socket发送短数据包尽量合并发送,就产生一个延迟。

使用socket.SetSocketOption(SocketOptionLevel.TCP,SocketOptionName.NoDelay,1)可以关闭nagle算法。这样发出的数据包就立刻出发了!~~ :)

程序性能终于有所改善,但还是有问题
数据包延迟从原来的100ms~10000ms变为100ms~2000ms了。这个延迟对我仍然是灾难。而ping的时间是比较稳定的40~60ms

这个就是我要向大家咨询的问题了

我也做了个测试,几台电脑通过一个电脑共享Internet连接,然后在这几台电脑上分别运行我的程序。发现延迟与所有电脑总连接数没有关系,只与当前电脑上连接数量有关。当前电脑连接越多,延迟越不稳定!!~~~如果当前电脑只有一个连接,其他电脑不管开多少连接都不会影响到这台电脑上程序的稳定!!~~~

这是什么原因呢?应该如何解决呢?
谢谢大家
posted on 2006-05-07 11:54 闪电猪 阅读(3594) 评论(13) 编辑 收藏

评论:
#1楼 2006-05-07 13:02 | neoragex2002      
原因可能在于服务器端你用的是什么样的并发处理模式,另外C#也不适合实时性要求较高的应用,慢了,CLR的执行速率和时间精度是不可预测的,随便一次一般规模的垃圾收集都可以让你延迟骤增。

普通数据传输一般不必关闭nagle,这样会降低总吞吐率(带宽延迟积)。只有在使用telnet等交互性要求较高、数据量小的应用时才建议关闭nagle。

另外做测试时不要使用internet共享连接,NAT将极大增加round trip延迟,导致问题本身现象不明显。你可以用UDP试试,初步判断一下问题究竟是出在网络上还是出在机器处理模式上。

 回复 引用 查看   
#2楼[楼主] 2006-05-07 13:08 | 闪电猪      
回@neoragex2002
服务器是不同的,每个Socket是不同服务器,所以服务器上并发处理不重要吧。的确是要求交互高,数据量小的。

服务器已经定型是TCP的,我没有办法修改了。。。:(
你说的NAT有影响,我测试一下吧
计划在我直接连Internet的机器上的公网IP上帮50个Socket连接看看是否会慢
这样应该能避免NAT的影响。等一会我说结果~~~

 回复 引用 查看   
#3楼[楼主] 2006-05-07 13:38 | 闪电猪      
@neoragex2002
测试了一下啊,好像还是不行

我在公网IP上绑所有Socket连接,和原来情况一样
然后我干脆关闭了Internet共享,再测,情况仍然一样

又开启Internet共享,公网IP挂50个Socket,然后在地下的一台共享上网的电脑上开一个Socket。这一个Socket运行很好,而那50个Socket仍然是灾难!!

:(

麻烦再多指点一下吧

 回复 引用 查看   
#4楼 2006-05-07 13:49 | neoragex2002      
如果确定不是nat和并发模式(一般这个问题居多,不过.net里面也没多少选择)的问题,试试用VC吧,这个跟C#非确定终止的内存分配模式可能有关系。要看程序具体是怎么编的了。

另,要考虑规避XP SP2同时10个并发连接请求的限制。总之,一个一个排除吧,防火墙、网络拓扑、协议、平台、语言、并发模式。

 回复 引用 查看   
#5楼[楼主] 2006-05-07 14:02 | 闪电猪      
@neoragex2002

你说并发模式我不太懂,是客户端也有的问题么?

XP SP2同时10个并发连接请求的限制,我用工具调到200个了

 回复 引用 查看   
#6楼 2006-05-07 14:43 | neoragex2002      
并发模式主要指服务器端,见:
http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html

而10个并发连接限制主要是客户端的问题,测试时注意一下即可。

 回复 引用 查看   
#7楼[楼主] 2006-05-07 14:51 | 闪电猪      

多谢指教了
我继续研究研究

 回复 引用 查看   
#8楼 2006-05-08 09:07 | 鞠强      
同情ing。。。不懂,帮你up一下!!!
 回复 引用 查看   
#9楼 2006-05-08 09:46 | baoli[未注册用户]
最近也在关注socket这方面的开发。也不是太懂楼主的问题,但是感觉楼主的模式是有点问题,一个客户端的软件同时使用50个socket连接,也太夸了。
socket的处理速度不仅和网络的因素有关,和机器的内存处理以及线程效率等好像也有关系的。我也不太懂。呵呵呵

 回复 引用   
#10楼[楼主] 2006-05-08 17:37 | 闪电猪      
真的是很不明白
搞了两天还是不行

昨天看到介绍,.net framworks,在winxp上针对Socket异步调用是采用完成端口实现的。于是兴致勃勃的修改程序为完成端口,结果还是延迟~~~~~

然后怀疑是否还是其他线程占用CPU,于是异步开启所有Socket后,关闭其他所有线程。结果还是延迟~~~~~~~


真不明白乐~~~~

 回复 引用 查看   
#11楼[楼主] 2006-05-09 13:52 | 闪电猪      
做梦也没有想到
我的网络数据莫名其妙的延迟是拨号软件搞的
用嗅谈软件仔细分析了1天才搞明白

我用的是ADSL拨号王
这个拨号软件会把从一台电脑上(指Internet共享下的任意一台)发出的数据包缓存组合再发出,包括纯ACK包。再数据包很多的时候,会打乱ACK包和正常包的次序。有可能把ACK包放到正常发包后发出,从而导致服务器重传TCP包而带来延迟。。。。

还是非常感谢各位的热情帮助~~~

 回复 引用 查看   
#12楼 2008-02-20 10:59 | 无名王[未注册用户]
我现在也碰到了一个问题,JAVA开发的SOCKET客户端,应用布署在不同的机器上,访问相同的SOCKET服务,响应速率完全不一样.在不同的机器上PING那台SOCKET服务器的响应时间都在6MS左右.JDK/TOMCAT版本也都是一致,且跟客户端机器的硬件配置也没什么关系(硬件配置好的反倒速率差),操作系统也没什么关系(其中有些机器的操作系统是一样的).是何原因?
 回复 引用   
#13楼 2008-02-20 15:38 | 无名王[未注册用户]
找到原因了,把IP当成域名来解析了.在HOST里面加进去就可以了
 回复 引用   
昵称:闪电猪
园龄:5年11个月
粉丝:0
关注:0
<2006年5月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

搜索

 
 

常用链接

随笔档案

最新评论

阅读排行榜

评论排行榜

推荐排行榜