这是正常和预期的行为.
当我们知道远程端将无法接收此数据时
好吧,也许你知道,因为你是拉电缆的那个人,你不打算再把它插回去,但计算机(或者,特别是TCP堆栈)不知道.
它不知道数据的第一个原因是,当send()调用完成时,数据还没有进入线路:它们只是在缓冲区中排队.
它不知道数据的第二个原因是它不能(至少在开始时)告诉简单地丢弃数据包的链接和数据包在尝试时可能通过的链接之间的区别重新传输它,而不是一根经过精心切割的电缆.即使对于电缆切断,TCP也会保持一段时间的重传,希望(1)链路回来,或(2)路由器会聚在另一个有效的网络路径上.
即使您可以立即知道链接何时关闭(尽管您可以在某些特定情况下,通常情况下,您必须等待超时才能解决此问题),您不希望TCP立即断开连接每次发生时:如果每次数据包在网络中丢失时TCP连接都会中断,那就太脆弱了.