TCP:通过断开连接提高可靠性

时间:2017-08-07 08:32:10

标签: linux sockets tcp

我正在开发一个应用程序,我需要确保即使网络出现故障,消息仍然可靠,有序和未修改地到达目的地。我一直在使用TCP,到目前为止,我只是采用了以下策略:

  • 如果发送/接收失败,请再次执行,直到没有错误。

  • 如果遥控器断开连接,请等到下一次连接并将我发送/接收的插座替换为新的插座(通过一些线程和阻塞来实现,以确保它干净地交换)。

我最近意识到这不起作用,因为send无法报告指示遥控器未收到消息的错误(引用例如。here)。

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

问题:在客户端/服务器端(使用setsockoptSO_KEEPALIVE选项)将超时时间设置得更高是一种可行的策略,以便连接“永不超时” “?我必须处理与内核缓冲区填充相关的错误,但这应该相对简单。

还有其他失败案例吗?

1 个答案:

答案 0 :(得分:1)

如果两端没有明确断开连接,即使拔掉电缆,tcp连接仍会保持永久。 TCP中没有超时。

但是,我会在tcp之上使用(或设计)应用程序协议,从而可以在重新连接后恢复数据传输。例如,您可以使用HTTP

那会更加稳定,因为根据缓冲区的不同,正如你所说,在某些时候耗尽缓冲区,但缓冲区也会因为断电而丢失。