.NET TCP协议的可靠性如何?

我对C#很新,所以请耐心等待。 我在C#.NET 4.0中编写了一个相对简单的客户端服务器应用程序。 我使用TCP协议,TCPListener和TCPClient更具体。 我知道TCP协议在理论上是如何工作的。 但我必须100%确定在数据传输过程中不会出现(未处理的)错误。

发送数据后如何知道数据是否已成功接收。 我可以完全依赖TCP协议的底层实现吗? 所以我没有必要从另一方确认数据已收到?

至关重要的是,我真正知道哪些数据已发送并成功接收。 我知道这是一个愚蠢的问题,但我真的很想确定。 谢谢你的时间和答案。

TCP保证:

  • 您发送的数据将按照您发送的顺序到达
  • 您发送的数据将与您发送的数据完全一致(未经修改)
  • 不会收到其他(虚假)数据

它并不能保证啮齿动物不会吃掉你的电缆,建筑物的电源会继续存在,甚至你操作的另一台机器上的过程在操作系统告诉它有一些数据时也会烦恼到达。

如果您需要确认接收到数据并采取相应措施,则需要手动发送确认(因为TCP连接是双工的,您已经有了通道来执行此操作)。

当然,所有这些都不是特定于.NET,Windows或任何其他网络堆栈实现的。

更新:我想特别指出,在OS网络堆栈接受数据传输之后,您无法知道另一端的进程是否已收到该数据。 在大多数情况下,网络堆栈知道数据已经到达目标(通过TCP ACK消息), 但是它不知道目标上的OS是否已经将它们馈送到它们预定的进程 。 因此,发回您自己的“收到并执行的数据”消息是唯一的选择。

仅使用TCP / IP,您无法确定是否收到任何数据 – 您必须在顶部层叠另一个协议。

如果您可以查看是否收到了某些特定数据,那么TCP / IP会在收到之前保证所有数据。

没有“.NET TCP协议”这样的东西。 只有TCP协议,已经在互联网上运行了大约30年。 这很可靠。 这是一个设计目标。

一种选择是使用TCP上的WCF可靠会话 。 WCF可靠会话将掩盖传输故障。

如果您确实需要可靠性网络传输,为什么不使用消息队列 ? 他们有交易保证(与使用它的开发人员的纪律一样强,但不强于此!)

这就像所有具有数据库服务器类型安全性(和同上性能)的流量一样。 我认为您可以轻松配置.NET Remoting以使用MSMQ频道 。

我个人从未这样做过,但我一般都使用过消息队列。