# re: 关于TCP丢包,断开的疑问 回复 更多评论
2009-08-10 12:07 by
TCP提供可靠的连接的意义是指他尽力的提供可靠的连接,但并不到等于永远不会失败。
对于丢包重发,TCP是有限度的,而不是不断的重发,重发了X次后仍无响应,TCP就认为中断了。
对于拔网线这种极端的测试方式,OS一般会在某次调用send/recv/select的时候直接通知应用层,而不是继续愚钝的试图继续保障连接。
# re: 关于TCP丢包,断开的疑问 回复 更多评论
2009-08-10 16:55 by
楼上说的不错啊。拔网线在用轮训select时很容易就能检测出来。
还有关于丢包,send不是任何时候都可以全部发送成功的,如果window buffer填满了,send会只发送一部分,还有在send前,最好先select一下是否可以write的标志,这样更安全些。
# re: 关于TCP丢包,断开的疑问 回复 更多评论
2009-08-10 17:17 by
@foxriver
严重同意。
需要补充的一点是,有时候send调用貌似完全成功,也不代表真的成功了,此时数据包只是提交给了OS的协议栈而已。很多时候,虽然socket明显已经断了,app执行send调用却并不知道,而是在调recv的时候才发觉。
select一下还是保险一些(虽然即使这样也并非万无一失)。