[英]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.