为什么在多次读取后套接字会减慢?

时间:2015-06-24 08:44:03

标签: sockets tcpclient tcp-ip

我编写了一个简单的测试客户端(VB.Net),它使用TcpClient类将一个小的“命令”字节数组(6或7个字节)发送到整个公司网络的硬件设备。设备响应一个字节数组(大约48kb),我的客户端应用程序读取。我知道返回数组的确切长度,所以我重复读取套接字,直到我拥有它: -

Dim read_data() As Byte

Dim stream As NetworkStream = tcpClient.GetStream()

' Send the "command"
stream.Write(data, 0, commandByteArray)

' Read the response
Using ms As New MemoryStream()
    Dim sw As Stopwatch = New Stopwatch()
    sw.Start()

    Dim temp_read(16384) As Byte
    Try
        Do
            Dim bytes_read = stream.Read(temp_read, 0, temp_read.Length)
            ms.Write(temp_read, 0, bytes_read)
        Loop While ms.Length < expectedResponseSize
    Catch ex As IOException
        ' No more data
    End Try

    read_data = ms.ToArray()

    Debug.WriteLine(sw.ElapsedMilliseconds)
End Using

此代码连接到按钮单击事件。每次运行时,秒表都会显示平均 5ms 来读回48kb字节数组。但是,如果我每秒反复点击几次按钮,几秒钟后秒表报告的时间开始增加,并最终稳定在 50ms 附近。如果我断开连接,重新连接并再试一次,那么时间将恢复到5毫秒(直到我再次开始快速点击按钮)。

知道是什么导致了这个吗?我假设它是网络协议或网络硬件中的东西,例如什么东西使连接适应增加的数据吞吐量?

编辑:如下面的评论所述,我尝试禁用Nagling(socket.NoDelay = true),但它没有效果,虽然我的理解是这更有可能改善非常小的消息的吞吐量,而不是像这样的大消息。

0 个答案:

没有答案