以下是该场景:
A< ------------------------->乙
我在A和B(基于Linux的机器)上使用非阻塞套接字。 A和B有一个TCP连接,突然连接它们的链接断开(链接可能不是直接链接)。 现在链接断开后,当在A侧调用send()函数向B发送一些数据时,它会成功返回(即它返回要发送的字节数)。
当链接断开时我们知道远程端无法接收此数据时,这种行为的原因是什么?
答案 0 :(得分:5)
这是正常和预期的行为。
当我们知道远程端将无法接收此数据时
好吧,也许你知道,因为你是拉电缆的那个人,你不打算再把它插回去,而是电脑(或者特别是TCP堆栈) )不知道。
它不知道数据的第一个原因是,在send()
调用完成时,数据还没有在线上传输:它们只是排队了在一个缓冲区。
它不知道数据的第二个原因是它不能(至少在开始时)告诉简单丢弃数据包的链接与数据包可能通过的链接之间的区别它试图重新传输它,而不是一条经过良好切割的电缆。即使对于电缆切断,TCP也会保持一段时间的重传,希望(1)链路返回,或(2)路由器会聚在另一个有效的网络路径上。
即使您可以立即知道链接何时关闭(尽管您可以在某些特定情况下,通常情况下,您必须等待超时才能解决此问题),您不希望TCP到每次发生时立即断开连接:如果每次数据包在网络中丢失时TCP连接都会中断,那就太脆弱了。