防止重复连接初始化问题:假设没有三次握手,而是两次握手,那么可能会出现一种情况:客户端发送了一个连接请求(SYN),但由于网络问题,服务器没有及时收到或者耽误了。客户端在等待了一段时间后认为请求失败,重新发送了一个新的 SYN,而此时第一个 SYN 报文耽误到达服务器,服务器误认为客户端又发起了一次新的连接请求,从而产生混乱。通过三次握手,能够有效避免这种问题,确保连接的一致性。
包管双方数据完整性:在关闭连接之前,双方需要确认全部数据已经被成功接收。第一次挥手时,客户端发送 FIN 报文,表示自己不再发送数据,但仍旧可以接收数据。第二次挥手时,服务器确认收到这个 FIN,并且可以继续发送数据。第三次挥手时,服务器发送自己的 FIN 报文,表示自己也不再发送数据。最后,客户端确认服务器的 FIN,确保双方都完成了数据传输。
由于当服务端收到客户端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。
但是关闭连接时,当服务端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉客户端,“你发的 FIN 报文我收到了”。只有比及我服务端全部的报文都发送完了,我才气发送 FIN 报文,因此不能一起发送。故需要四步握手。
7. 如果已经建立了连接,但是客户端忽然出现故障了怎么办?
SYN(Synchronize)是 TCP 协议中的一个标志位,用于在建立连接时举行通信的同步。在三次握手的第一次交互中,客户端发送一个 SYN=1,ACK=0 标志的数据包给服务端,请求建立连接。这个 SYN 包的作用是向服务端发起连接请求,并附带一个序列号(Sequence Number),用于标识后续发送的数据包。SYN 标志位的设置表示客户端盼望建立一个新的连接或确认一个连接请求;
ACK(Acknowledgement)是确认标志,用于确认接收到的数据包。在第二次握手中,服务端收到客户端的 SYN 包后,会发送一个 SYN=1,ACK=1 标志的数据包给客户端。这个 SYN+ACK 包的作用是告诉客户端,服务端已经收到了连接请求,并答应建立连接。同时,ACK=1 表示服务端对客户端发送的 SYN 包举行了确认。此外,服务端也会发送自己的序列号给客户端,用于后续的数据传输。