一、题目描述
谈谈你对TCP三次握手和四次挥手的理解。
分析:
关于TCP的三次握手和四次挥手,已经被面试官问烂了。然而,并不是所有人都能很好地回答这个问题,尤其是一些细节上的点,很容易被忽略。
三次握手:
这张图展示了建立TCP连接所需的三次握手过程。
首先需要明确,三次握手的目的是建立可靠的通信信道,即双方确认彼此的信息发送与接收是正常的。
其次需要明确,客户端与服务器的身份并不是固定的,在某些情况下的客户端,在另外的情况下可能会承担服务器的角色。
下面我们依次来看三次握手的过程和目的。
第一次握手:客户端向服务端发送SYN。此时客户端什么都不能确认;服务端确认对方发送正常,自己接收正常。
第二次握手:服务端向客户端发送SYN/ACK。此时客户端确认自己发送、接收正常,对方发送、接收正常;服务端确认对方发送正常,自己接收正常。
第三次握手:客户端向服务端发送ACK。此时客户端确认自己发送、接收正常,对方发送、接收正常;服务端确认自己发送、接收正常,对方发送、接收正常。
综上所述,当且仅当三次握手之后,双方都能够确认收发功能正常。
四次挥手:
这张图展示了断开TCP连接所需的四次挥手过程。
下面我们依次来看四次挥手的过程和目的。
第一次挥手:客户端向服务端发送FIN。用来关闭客户端到服务器的数据传送。
第二次挥手:服务器向客户端发送ACK。表示服务端收到了客户端的连接释放通知。
第三次挥手:服务器向客户端发送FIN。用来关闭与客户端的数据传送。
第四次挥手:客户端向服务端发送ACK。表示客户端收到了服务端的连接释放通知。
同样,这里所说的客户端和服务器并不是一个固定的概念。事实上,建立TCP连接的任何一方都可以在数据传送结束后发出连接释放通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
另外,值得注意的是,在第四次挥手之后,客户端并非立马进入关闭状态,而是会进入TIME-WAIT状态,在等待2MSL时间后,才会进入关闭状态。这样做的原因主要有以下两点:
第一,防止客户端发送的最后一个ACK报文丢失而引起服务端不能正常关闭。
第二,防止已经失效的连接请求报文段对新连接造成影响。