2017-08-07 23 views
1

我工作的一个应用程序,我需要确保即使在网络中断时,消息仍将到达他们的目的地可靠,有序,和不变。我一直在使用TCP,而到现在为止,我只是使用的策略:TCP:提高可靠性与断开连接

  • 如果发送/接收失败,做一遍,直到没有错误。

  • 如果远程连接断开,请等到下一次连接,然后用这个新连接替换我发送/接收的套接字(通过一些线程和阻塞实现以确保它完全交换)。

最近我意识到,这是不行的,因为send无法报告表明远程尚未接收到的信息错误(如举。here)。

我也了解到,TCP连接可以在短暂的网络中断后继续存在,因为内核会缓冲数据包,直到连接在超时时间后宣布死亡(引用。 here)。

的问题是:它是一个可行的策略,以刚刚杀青的超时时间(使用setsockoptSO_KEEPALIVE选项)包括客户端/服务器端waaaay更高,从而使连接“永不超时”?我不得不处理与内核缓冲区填充相关的错误,但这应该相对简单。

是否还有其他失败的案例?

回答

1

如果两端没有明确断开连接,即使您拔下电缆,tcp连接也会永远保持打开。 TCP中没有超时。

然而,我会使用(或设计)的应用协议在TCP之上,使得可以重新接通后恢复数据传输。例如,您可以使用HTTP

这将是更稳定,因为这取决于缓冲区会像你说的,在一段时间内排出的缓冲区,但缓冲区会也正在对我们说停电丢失。

+0

好吧,只是为了确认 - 如果我'sent'一些字节和节点之间的网络下楼在发送的任何点/接收周期,只要这两个节点不明确断开,字节将被接收正确的时候网络恢复了吗? – hnefatl

+0

只要'send()'不会给你一个错误代码,是的。如果你得到一个错误代码(不是100%确定这个atm),你需要迭代(有耐心,没有无尽的循环锤击)尝试再次发送它,但是你*不需要*重新连接套接字 - 只要另一只手不会明确关闭连接。 – hek2mgl