【问题标题】:Is validation necessary with TCP?TCP 是否需要验证?
【发布时间】:2012-07-31 03:10:54
【问题描述】:

我必须实现一个应用程序,该应用程序每隔几秒钟就向服务器发送一次数据包,当服务器收到它们时,它会向客户端发送响应,然后客户端才会继续发送另一个数据包。这听起来不错,但我们使用的是 TCP,服务器收到数据包后立即响应,而不是后处理或类似的东西。所以这让我想知道,你为什么要做这样的事情?客户端有一个队列,我在其中保存所有数据包并执行以下操作:

try {
    send packet // exception is thrown if connection is lost
    remove packet from queue
} catch exception {
    try to reconnect 
}

所以在这种情况下,只有当 发送 成功时,数据包才会从队列中删除。

对此有任何想法吗?这是最佳实践吗?如果有人能帮我解决这个问题,我将不胜感激。

谢谢

【问题讨论】:

  • 问:你的问题是什么? “解雇并忘记”(而不是维持队列)会更好吗?答:很有可能。使用 UDP 而不是 TCP 会更好(只要我们保留一个队列并可能管理重试)?答:很有可能。检测“发送”错误(没有某种“ACK”)有问题吗?答:是的。任何这些(潜在)问题的答案都是:“视情况而定”。 ;) 恕我直言...
  • TCP 保证传输和排序。因此使用 UDP,您可能会丢失排序,您必须自己进行重新发送、重新排序和分段。
  • 如果你只需要知道连接是否正常,有一个选项叫 TCP_KEEPALIVE ,它会发送数据包以保持连接处于活动状态,如果丢失则超时。这自然不能保证说明另一端的软件正在运行,只是 TCP 连接还活着。
  • 查询也是幂等的吗? IE。即使它们已经被处理而没有造成任何损坏,你可以重新发送它们吗?这将对您的设计产生影响。
  • 我不完全确定服务器如何处理它们,但数据包有一个时间戳,不应该搞砸任何东西。

标签: tcp


【解决方案1】:

一种选择是将数据包放入队列并发送。发送后将它们移动到“待定”队列中。一旦另一端处理它们,您将它们标记为已完成。然后你就会遇到其他问题。如果另一端处理它们但 ack 永远不会到达你的端怎么办?这是一个相对研究的问题,如果需要确定,我建议您研究分布式事务和两阶段提交。

【讨论】:

    【解决方案2】:

    在某些情况下,发送是不够的。如果必须接收到您推出的数据绝对至关重要,那么您应该等待确认数据包已被远程端接收/处理。

    即使网络级别的东西运行良好并且数据包到达目的地,该目的地机器仍可能崩溃或以其他方式丢失数据。如果您在发送时删除,那么该数据就消失了。等待来自远程端的确认至少可以让您重新发送损坏/丢失的数据包。

    【讨论】:

    • 您是否认为服务器可能崩溃并且连接仍然存在?也许如果它以某种方式保持在一个线程中?
    • 软件可能会失败但不会死机。例如它可能会死锁
    • 你说的很对。我从一个非常幼稚的角度看待这个问题。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2018-08-10
    • 2018-03-29
    • 2016-03-01
    • 2017-02-10
    • 2017-06-11
    相关资源
    最近更新 更多