没有keepalive的物理断开的tcp套接字的生命周期

时间:2013-08-11 11:30:37

标签: c linux sockets tcp

在没有keep-alive选项的TCP连接上,如果我物理断开线路 - 所以没有FIN / ACK可能性,这个套接字会愉快地接受我的所有应用程序数据,将它放入发送缓冲区并尝试永久发送?

如果没有,它何时以及如何死亡=哪些错误将返回给我的应用程序发送小块数据?我们谈论Linux和c。

谢谢

3 个答案:

答案 0 :(得分:3)

如果套接字处于阻塞模式,(1)最终发送缓冲区将填满,因此下一个发送调用将阻塞,并且(2)最终TCP将由于没有接收到ACK而超时发送尝试并重置连接,并向阻止发送呼叫发送错误。

答案 1 :(得分:1)

在发送方,它将填满发送(或输出)队列(位于TCP层),因为它无法将数据发送到客户端。传出数据包(由拥塞窗口和对等体接收队列中的可用缓冲区允许的数据包)将简单地位于重传队列中,TCP将最终重新传输它们。

网址:http://linux.die.net/man/2/send

如果套接字阻塞,则send()调用将只是阻塞,应用程序将最终等待此调用。如果套接字是非阻塞的,则send()调用将返回-1并将errno设置为EAGAIN或EWOULDBLOCK。

设置SO_KEEPALIVE肯定是此类套接字的主要选项。此外,您还可以使用/ proc / sys / net / ipv4 /中提到的tcp_retries1和tcp_retries2值。当发送方由于达到tcp_retries2限制而终止连接时,下一个阻塞调用将返回值-1,并且errno将设置为ETIMEDOUT。请注意,这些选项全局应用于包装盒上的所有插座 - 因此我们应谨慎使用它们。

答案 2 :(得分:0)

没有做任何事情,如果没有收到FIN,套接字将永远保持打开状态。您甚至可以在不拔下电缆的情况下对其进行测试:在建立连接后对端口进行防火墙处理。

您需要使用linux内核的keep alive功能来清理此类连接。请检查此article