链接在TCP连接中关闭时发送()函数行为

以下是场景:

A B.

我在A和B(基于Linux的机器)上使用非阻塞套接字。 A和B有一个TCP连接,突然连接它们的链接断开(链接可能不是直接链接)。 现在链接断开后,当在A侧调用send()函数向B发送一些数据时,它会成功返回(即它返回要发送的字节数)。

当链接断开时,当我们知道远程端无法接收此数据时,这种行为的原因是什么?

这是正常和预期的行为。

当我们知道远程端将无法接收此数据时

好吧,也许知道,因为你是拉电缆的那个人,你不打算再把它重新插入,但计算机(或者,特别是TCP堆栈)不知道。

它不知道数据的第一个原因是,当send()调用完成时,数据还没有进入线路:它们只是在缓冲区中排队。

它不知道数据的第二个原因是它不能(至少在开始时)告诉简单丢弃数据包的链接和数据包在尝试时可能通过的区别重新传输它,而不是一根经过良好切割的电缆。 即使对于电缆切断,TCP也会保持一段时间的重传,希望(1)链路回来,或者(2)路由器会聚在另一个有效的网络路径上。

即使您可以立即知道链接何时关闭(尽管您可以在某些特定情况下,通常情况下,您必须等待超时才能解决此问题),您不希望TCP立即断开连接每次发生时:如果每次数据包在网络中丢失时TCP连接都会中断,那就太脆弱了。