如何validationTCP数据包是否已在C#中收到ACK?

使用阻塞/非阻塞方法发送一些tcp数据后,例如:

Socket.Send() or Socket.SendAsync() 

我怎么知道我的数据收到了ACK消息?

.NET能否知道TCP数据是否已成功发送?

确切知道的唯一方法是实现某种应用程序级别的确认。 TCP级别“ACK”数据包根本不会暴露给应用程序级别,因此您必须使用更多内容。

你让另一端回应它。

即使TCP已经Acked它,如果接收端在处理消息并对其进行操作之前终止(有好的或坏的原因),你仍然不知道,所以唯一的方法是让对方告诉你。

无法从.net的类库中获取此信息。 当我开始在C#中使用此端口扫描程序时,我有同样的注意事项。 我已经使用了libpcap的.NET包装器(在安装相应的驱动程序之后),SharpPcap( http://sourceforge.net/projects/sharppcap/ ),以获得这种信息。 ACK数据包是通过SharpPcap的接口获得的(透明地调用本机libpcap接口)。

我的应用程序是NScanner Port Scanner / Sweeper,您可以在codeplex找到代码,并参考我对上述库( http://nscanner.codeplex.com/ )的简单使用。

我希望我帮忙。

“我正在努力关注你怎么知道你的数据何时被连接的另一方接受。”

我认为您需要了解要实现的应用层协议类型以及它对应用程序性能的影响。

以HTTP为例,说明“Streaming like”协议。 服务器将数据流发布到客户端。 没有更多的额外应用程序层“ACK”,服务器实际上并不关心他的数据流何时以及如何到达。 这在高延迟链路上非常有效。

现在将其与SMB进行比较! 数据被分区为块,而不是流式传输文件。 每个成功传输的数据块都在应用层上进行处理。 这为您提供了更多控制,但是,它有效地杀死了WAN网络上的协议(请查看“带宽延迟产品”)。

考虑到这一点,您可以为自定义协议提出自己的设计。

我建议使用Pcap.Net 。

您可以使用C#中的库轻松嗅探数据包,然后轻松检查数据包值。

您还可以轻松构建和发送数据包。

如果您确实需要知道TCP连接的数据包级别详细信息,那么除了创建用于发送的TCP套接字之外,您还需要应用程序使用winpcap API来查看原始流量。 您可以安装filter,仅接收与确定远程端的特定IP,端口组合相关的数据包。

有一些项目在那里为libpcap创建.NET包装器,例如这里

TCP层将继续重新发送数据包,直到收到成功的ACK。

发送将阻止,直到发生这种情况 – SendAsync不会阻塞,并且您可以在TCP层处理发送数据包时继续处理其他内容。