之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问:
- 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN的时机是什么?
- 第三次握手,如果服务器永远不会收到ACK,服务器就永远都留在 Syn-Recv 状态了吗?退出此状态的时机是什么?
- 第三次挥手,如果客户端永远收不到 FIN,ACK,客户端永远停留在 Fin-Wait-2状态了吗?退出此状态时机是什么时候呢?
- 第四次挥手,如果服务器永远收不到 ACK,服务器永远停留在 Last-Ack 状态了吗?退出此状态的时机是什么呢?
- 如果客户端 在 2SML内依旧没收到 FIN,ACK,会关闭链接吗?服务器那边怎么办呢,是怎么关闭链接的呢?
可以看到,这些问题都是关于 TCP 是如何处理这些异常场景的,我们在学 TCP 连接建立和断开的时候,总是以为这些过程能如期完成。
可惜理想很丰满,现实很骨感,事实预料呀。
TCP 当然不傻,对以上这些异常场景都是有做处理的。
这些内容在我的「图解网络 PDF」 也有说过。
当时也用做实验的方式带大家看 TCP 是如何处理这些异常场景的。
不过,当时这些知识分散到了多个章节,这次就针对读者问的这一系列问题,来详细说说 TCP 是怎么处理这些异常的?
这些异常场景共分为两大类,第一类是 TCP 三次握手期间的异常,第二类是 TCP 四次挥手期间的异常。
TCP 三次握手期间的异常
我们先来看看 TCP 三次握手是怎样的。