考虑自定义网络协议。此自定义协议可用于从基于 .NET 的中央工作站通过 LAN 控制机器人外围设备。(如果很重要,机器人正忙于在芯片生产环境中移动晶圆厂)。
- 对话中只有 2 方:.NET 站和机器人外围板
- 机器人端只能接收请求和发送响应
- .NET 端只能发起请求和接收响应
- 每个请求总是应该有一个响应
- 随后的请求可以一个接一个地紧跟,无需等待响应,但永远不会超过同时服务请求的固定限制(例如 5 个)
我与我的朋友(他拥有设计,我作为旁观者讨论过这件事)就所有好的细节和想法进行了详尽的讨论。在讨论结束时,我们对错过超时有强烈的分歧。我朋友的论点是双方的软件应该无限期地等待。我的论点是任何网络协议总是需要超时。我们根本无法达成一致。
我的一个理由是,如果发生任何故障,无论付出什么代价,你都应该“快速失败”,因为如果无论如何已经发生故障,恢复成本将继续与接收有关故障信息所花费的时间成正比增长。说在 LAN 上 1 分钟后,您绝对应该停止等待并发出一些警报。
但他的论点是,恢复应该包括修复失败的部分(在这种情况下是恢复网络连接),即使需要花费数小时才能确定网络丢失并修复,软件应该立即透明地继续运行重新连接 LAN 电缆后。
在这次讨论之前,我永远不会认真考虑永恒的协议。
哪一方的论点是正确的?“快速失败”还是“永不失败”?
编辑:失败的例子是通信丢失,通常由 TCP 层检测到。这部分也进行了讨论。如果 TCP 层返回错误,更高的自定义协议层将重试发送,并且没有关于它的参数。问题是:让下层继续尝试多久?
编辑接受的答案:答案比 2 个选择更复杂:“最常见的方法是永远不要放弃连接,直到实际尝试发送失败并确认连接已长期丢失。要计算连接已长期丢失,请使用心跳,但请保持损失年龄仅用于此确认,不用于立即警报“。
示例:当进行 telnet 会话时,您可以永远保持终端运行,并且您永远不知道在按 Enter 之间是否存在可被较低级别例程检测到的故障。