【发布时间】:2021-01-02 06:25:44
【问题描述】:
和许多人一样,我一直在研究测试 TCP 会话是否处于活动/活跃的主题。有太多半有效的解决方案似乎是一个不必要的难题。一个连接在测试自己之前什么都不知道。然后尝试发送可能会成功,尽管连接实际上已丢失。轮询似乎会为连接提供误报。某些服务器配置为不响应 ping。唯一真正的测试似乎是尝试建立新的连接并感知尝试是否成功。这似乎是不必要的笨拙,但协议没有一种轻量级的方式来回答“在这个特定的时刻,是否可以将数据从客户端传输到服务器并验证它是否被接收”的问题,这似乎有点疯狂?'
我正在使用 .net 框架和其中公开的 TCP 对象。断开网络电缆时,肯定会立即向所有消费者发出连接丢失的信号。然而,情况并非如此,我对连接的任何感觉都没有意识到这种损失。只有尝试重新建立连接才会发现物理链路已断开。
我错过了什么?
【问题讨论】:
-
它必须有多轻?我见过的最可靠的方法是通过良好的请求和响应。你必须发送数据,一旦服务器发回一些东西,你就知道你可以走了。即使有长期存在的 Websocket 连接,也会有一个不断发生的 ping/pong 过程。
-
您可以尝试回答的问题是“在很短的时间内,是否可以将数据从客户端传输到服务器” - 这是网络、独立机器等的本质。您永远无法回答提前你的下一步行动是否能够成功。
-
而 ping 告诉你“这台机器响应回显请求”,不是“这台机器能够处理我的下一个请求”
-
所有优点,沟通会随着时间的推移而发生,除了已经发生的事情之外,没有任何确定性。事实上,连接似乎很难测试,我认为这是协议的基本部分。当我按下 F5 时,Chrome 不知何故知道有线连接已丢失,但 TCPClient 对象却不能。
-
@arjabbar 这意味着客户端和服务器在数据级别有一个约定的 ping 和响应,这也意味着开发人员可以控制两端。这一切都是为了确定协议本身肯定负责的事实?
标签: .net tcp intermittent