-
首先客户端发送带有 SYN 标志的数据包到服务端
-
然后服务端发送带有 SYN/ACK 标志的数据包到客户端
-
最后客户端发送带有带有 ACK 标志的数据包到服务端
👨💻面试官打断问:为什么要三次握手?一次,两次不行吗?
三次握手的目的是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的,可以从以下两个方面考虑(我们这里假设客户端是首先发起连接请求):
- 假设建立TCP连接仅需要两次握手,那么如果第二次握手时,服务端返回给客户端的确认报文丢失了,客户端这边认为服务端没有和他建立连接,而服务端却以为已经和客户端建立了连接,并且可能向服务端已经开始向客户端发送数据,但客户端并不会接收这些数据,浪费了资源。如果是三次握手,不会出现双方连接还未完全建立成功就开始发送数据的情况。
- 如果服务端接收到了一个早已失效的来自客户端的连接请求报文,会向客户端发送确认报文同意建立TCP连接。但因为客户端并不需要向服务端发送数据,所以此次TCP连接没有意义并且浪费了资源。
所以三次握手就能确认双发收发功能都正常,缺一不可
👨💻面试官又问:第 2 次握手传回了 ACK,为什么还要传回 SYN?
接收端传回发送端所发送的 ACK 是为了告诉客户端,我接收到的信息确实就是你所发送的信号了,这表明从客户端到服务端的通信是正常的。而回传 SYN也就是同步序列编号则是为了建立并确认从服务端到客户端的通信
再来说四次挥手
断开一个 TCP 连接则需要四次挥手:
-
第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含
标志位FIN=1,序列号seq=u
。此时客户端只能接收数据,不能向服务端发送数据。 -
第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含
标志位ACK=1,序列号seq=v,确认号ack=u+1
。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。 -
第三次挥手:服务端发送完数据后向客