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

时间:2011-04-12 21:40:43

标签: c# .net networking tcp protocols

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

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

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

5 个答案:

答案 0 :(得分:21)

TCP保证:

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

它并不能保证啮齿动物不会吃掉你的电缆,建筑物的电源会继续存在,甚至当你操作系统告诉它一些数据时,你正在谈论的另一台机器上的过程也会费心去做因为它已经到了。

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

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

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

答案 1 :(得分:4)

单独使用TCP / IP,您无法确定是否收到任何数据 - 您必须将最新的协议分层。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

一个选项是通过TCP使用WCF Reliable Sessions。 WCF可靠会话将掩盖传输失败。

答案 4 :(得分:0)

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

这就像你的所有流量都具有数据库服务器类型的安全性(和同上性能)。我认为您可以轻松配置.NET Remoting to use an MSMQ channel

我个人从未做过那个,但我一般都使用过消息排队。