学习资料:小林 coding:https://www.xiaolincoding.com/
计算机网络(三次握手和四次挥手)

三次握手第一次握手失败了怎么办
三次握手第一次是客户端发送 SYN 报文,报文中有一个序列号,如果第一次握手失败了,那么服务端就没有收到报文,也不会回 ACK 报文。客户端会重发几次 SYN 报文,还没有收到 ACK 的话就关闭连接。

三次握手第二次握手失败了怎么办
第二次握手是服务端给客户端返回一个 SYN + ACK,用来确认服务端收到了信息。如果第二次的握手没有成功,客户端会以为是自己发的 SYN 没有被收到,于是会重发 SYN,服务端发的 SYN + ACK 没有得到回复,也会继续重传。

三次握手第三次握手失败了怎么办
第三次是客户端返回给服务器端一个 ACK,这个不会重传。由于服务器端没有接受到 ACK,则会重发第二次的 SYN + ACK,重发几次之后还是失败,则关闭 TCP 连接。

三次握手能不能简化到两次
不可以,三次握手不能简化到两次。两次握手会导致历史 SYN 建立无效连接的问题。比如说有一个很久以前发的 SYN 包一直没到,有一次突然到了,结果服务器端就回了一个 SYN + ACK 报文,建立连接,那么就会浪费资源。如果有三次握手,客户端在收到这个 SYN + ACK 之后会发现序列号对不上,那么回一个 RST,服务器不建立连接,也不浪费资源。
四次挥手过程

第一次客户端发送一个 FIN 报文给服务器端的意思是客户端没有希望发送的数据了,但是仍然可以接受数据。服务器端接受到了 FIN 报文会回一个 ACK 报文代表它收到了。接下来的 Close_Wait 状态服务器给客户端发送数据。发送完成之后给客户端发送一个 FIN 报文。然后客户端再发一个 ACK 给服务器,之后断开连接。

四次挥手第一次失败了怎么办
第一次的 SYN 报文发送之后客户端会进入 FIN_WAIT 状态,如果 SYN 报文 服务器端一直没有收到的话,那么客户端再重发几次就会断开连接。

四次挥手第二次失败了怎么办
ACK 报文不会重传,由于第二次握手失败了,客户端会重传 FIN 报文,服务器端收到 FIN 报文再回一个 ACK 报文。

四次挥手第三次失败了怎么办
第三次握手是服务器端给客户端发 FIN 报文,通知客户端它的数据传输完了。如果丢失,服务器端收不到 ACK,则会启动重传。

四次挥手第四次失败了怎么办
第四次挥手是客户端回复一个 ACK 给服务器端,由于 ACK 不会重传,服务器端没有收到 ACK,就会一直重传 FIN。

四次挥手能不能变成三次
四次挥手可以变成三次。这个三次将第二次挥手和第三次挥手进行了合并,也就是将第二次 ACK 和 第三次 FIN 进行合并。当没有数据要发并且开启了 TCP 延迟确认之后就会将四次握手恢复成三次。
