本文是通过阅读这篇博客并进行了适当的修改而完成的,谢谢这位博主
有很多情况导致连接无法建立。
本文我们分析 2 种情况,分别是针对 Windows 和 Linux 进行讨论,它们是有区别的。
- 第一种情况是连接的主机不在网络中
- 第二种情况是主机在网络中,但是对应的服务未开启
不同版本的 Linux 内核也是有区别的。这里我使用的是 Ubuntu 14.04 LTS 版本。
主机不在网络中
Linux 上的测试
主机是不存在的,但是客户端并不清楚此主机是否在网络中。
我们可以分析出以下结果:
- 客户端发送了 SYN 请求后,因为超时没有 ack 返回,重传了 6 次 SYN,总共进行了7次SYN;最终 connect 超时。
- 每次超时时间都是上一次的 2 倍(指数退避算法)
Window 7 上的测试
从图 3 中可以看到,Windows 第一次发送完 SYN 段后,没有等到对端 ACK,进行了 2 次重传。也就是一共发送了 3 次 SYN 段,如果第 3 次发送的 SYN 还没有收到 ACK,超时后 connect 函数就直接返回错误。
另外,我们发现,第一次的超时时间约为 3 秒,第二次约为 6 秒。
主机在网络中,但是服务未启动
Linux 上的测试

图4 连接 Windows 主机
从图 4 的结果来看,Linux 发送 SYN 段给目标主机后,对端直接丢了个 RST 段过来^_^,然后 connect 函数直接返回错误啦。。。。
在 Windows 上的测试

图5 Windows 上的测试
可以看到,Windows 脸皮是比较厚的,对方丢了个 RST 段过来,仍然不放弃,又发两次 SYN 段。