以下是场景:
A<->B
我在A和B(基于linux的机器)上都使用了非阻塞Sockets。A和B有TCP连接,但连接它们的链路突然中断(该链路可能不是直接链路)。现在,在链路断开后,当在A端调用send()函数向B发送一些数据时,它会成功返回(即返回要发送的字节数)。
当我们知道当链路断开时,远程端将无法接收此数据时,这种行为的原因是什么?
发布于 2013-06-27 04:51:12
这是正常的和预期的行为。
当我们知道远程端将无法接收此数据时
嗯,也许您知道,因为您就是那个拔出电缆的人,您不会再插回电缆,但是计算机(或者,特别是TCP堆栈)不知道。
它不知道数据不会成功的第一个原因是,当send()调用完成时,数据还没有传输到网络上:它们只在缓冲区中排队。
第二个原因是,它无法(至少在一开始)区分简单丢弃数据包的链路和尝试重新传输数据包时数据包可能通过的链路,而不是已经完好且真正被切断的电缆。即使电缆被切断,TCP也会继续重新传输一段时间,希望(1)链路恢复,或(2)路由器汇聚到另一条正常工作的网络路径上。
即使您可以立即知道链路何时断开(尽管在某些非常特殊的情况下,您通常不能,您必须等待超时才能弄清楚这一点),您也不会希望TCP在每次发生连接中断时都立即断开连接:如果TCP连接在网络中每次丢失一个数据包时都断开,那么它将非常脆弱。
https://stackoverflow.com/questions/17326918
复制相似问题