繁体   English   中英

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

[英]How reliable is .NET TCP protocol?

我对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频道

我个人从来没有这样做,但我已经使用消息队列一般。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM