关于在数据包丢失或连接断开时处理 TCP 连接
本文关键字:连接 断开 处理 TCP 数据包 | 更新日期: 2023-09-27 18:34:41
我有用C#编写的TCP服务器和客户端。由于我的连接是通过不可靠的wifi进行的,因此我使用重新发送相同的数据包并处理数据包丢失。
例如银行账户平台。用户存钱后客户端将此消息发送给服务器,如果服务器收到此消息,它将回复客户端操作成功。如果客户端未收到回复,它将在一段时间后再次发送。
这看起来很简单,但我遇到了wifi卡住并且客户端没有收到回复并继续向服务器发送相同消息的情况。最终,服务器同时接收了这些消息。结果,服务器认为用户存款了100次。
我通常想知道人们如何处理 tcp 服务器客户端程序的这种情况,特别是当应用程序不仅仅是一个聊天应用程序,而是更敏感的信息(如金钱(时。我的第一个想法是在消息中添加一个事务 ID,这样服务器就不会处理具有相同事务 ID 的消息,这将防止上述情况。但不确定是否有更好的解决方案,或者 .Net 对此有一些内部功能。
谢谢。
使用 C# 编写代码时,您主要在 OSI 模型的应用程序层中工作。TCP 协议适用于传输层(位于应用层下方(。
您想要实现的可靠性已经嵌入在TCP协议本身中。这意味着,如果某些数据包丢失,它将尝试重新发送数据包,而无需您的其他请求。这也将在控制权返回到应用层程序之前发生。还有其他保证,例如数据包的有序交付。
这意味着,您需要的功能已经在下面的层中实现,您无需担心它。
请注意,如果要使用 UDP,则需要自己处理可靠性问题。