我编写了一个简单的测试客户端(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
),但它没有效果,虽然我的理解是这更有可能改善非常小的消息的吞吐量,而不是像这样的大消息。