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  闪电猪  阅读(4391)  评论(13编辑  收藏  举报