如何验证TCP数据包是否在C#中收到了ACK?

时间:2009-12-07 21:40:53

标签: c# .net tcp

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

Socket.Send() or Socket.SendAsync()

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

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

7 个答案:

答案 0 :(得分:12)

唯一可以确定的方法是实现某种应用程序级别的确认。 TCP级“ACK”数据包根本没有暴露给应用程序级别,所以你必须使用更多的东西。

答案 1 :(得分:5)

你让另一端回应它。

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

答案 2 :(得分:3)

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

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

我希望我能帮忙。

答案 3 :(得分:2)

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

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

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

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

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

答案 4 :(得分:1)

我建议使用Pcap.Net

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

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

答案 5 :(得分:0)

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

有一些项目为libpcap创建.NET包装器,例如here

答案 6 :(得分:-1)

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

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