发送TCP数据后,测量直到收到TCP ACK为止的时间

时间:2017-06-01 12:27:53

标签: c# sockets tcp tcpclient networkstream

当我通过开放的tcp连接发送一些数据时,使用TcpClientNetworkStream,如何检查接收方是否已回复最后一个数据包的TCP ACK?

如果接收方没有发送ACK会发生什么情况,我是否可以检测到这个异常?

我的目标是记录发送的数据包和收到的ACK之间的时间,并在丢失的pakets导致延迟时记录。

示例:

using (TcpClient  client = new TcpClient("127.0.0.1",2000))
using (NetworkStream stream = client.GetStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII))
while (true)
{
    writer.Write("test");
    writer.Flush(); // this does nothing, NetworkStream.Flush is a NoOp

    // do other stuff
}

在writer.Write()之后,如何确定数据是否仍然在内核缓冲区中,或者由于网络接口收到ACK而被删除?

  • tcp连接必须无限期保持打开状态,我无法关闭它。

  • NetworkStream.Flush()或关联的StreamReader.Flush() is not implemented并会立即返回。

  • 我知道接收方可以发送一条我可以检查的明确回复消息。但是在这种情况下,协议无法更改。

  • 我也知道,通过设置TcpClient.NoDelay=true,我可以减少发送少量数据时的延迟。但是,这仍然没有告诉我是否收到了ACK。

有没有办法从c#检查是否已收到确认,或收到的速度有多快?

0 个答案:

没有答案