TCP为什么要三次握手?

时间:2024-03-03 17:57:05

TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接,三次握手可以确保两端的发送和接收能力都是正常的。
那么,为什么是三次而不是二次或四次握手呢?

为什么不是二次握手?

如果是二次握手,即客户端发送一个SYN到服务器,服务器回复一个SYN-ACK给客户端,此时就建立连接。

这种情况下,如果第一个SYN请求在网络中延迟了,并且客户端重新发送了SYN后建立了连接,那么当延迟的SYN请求到达服务器后,服务器会认为是新的连接请求,而此时客户端不会理会服务器的回应,导致服务器一直等待,浪费资源。

为什么不是四次握手?

四次握手会增加额外的延迟和复杂性,并且第四个握手并没有提供三次握手已经解决的问题的任何额外保证。

三次握手已经能够确认双方的发送和接收能力都是正常的,进一步的确认只会增加一次往返时间,降低建立连接的效率。

三次握手建立连接的过程:

  1. 客户端发送SYN:客户端选择一个随机的序列号x发送一个SYN报文,并进入SYN_SENT状态。

  2. 服务器发送SYN-ACK):服务器收到SYN报文,选择自己的序列号y,并发送一个SYN-ACK报文,服务器进入SYN_RCVD状态。

  3. 客户端发送ACK:客户端收到SYN-ACK报文后,会发送一个ACK报文,然后进入ESTABLISHED状态。

&nbsp

数据传输结束之后的四次挥手:

TCP的连接终止则需要四次挥手,这是因为TCP连接是全双工的,即通信双方都可以同时发送和接收信息。终止连接时,每个方向都需要单独关闭,所以就需要四次挥手。

  1. 客户端发送FIN:客户端决定数据发送完毕后,发送一个FIN报文。

  2. 服务器ACK:服务器收到这个FIN报文,发送一个ACK报文确认,并进入CLOSE_WAIT状态。

  3. 服务器发送FIN:服务器准备好关闭连接时,发送一个FIN报文。

  4. 客户端ACK:客户端收到FIN后,发送一个ACK报文,然后进入TIME_WAIT状态。经过一段时间后确保服务器收到ACK报文之后,客户端关闭连接。

&nbsp

生活中的例子:

可以将三次握手比作电话通话。当你拨打一个电话号码时,对方接听(第一次握手),你们开始互相问候确认对方能听到(第二次握手),然后你们开始对话(第三次握手)。
如果只问候一次,你可能不确定对方是否真的听到你;如果问候多次,就显得冗余和不效率。

通话结束后,你说“再见”挂断电话(第一次挥手),对方说“再见”后也挂断(第二次挥手),这样确保了双方都明白通话结束。

在电话通话快结束的时候:

你先说“你还什么别的吗,没有我就要挂了”(第一次挥手),等待对方回应,相当于发送了FIN包。

对方回应“等我想想还有什么”(第二次挥手),相当于对方发送了ACK包,但对方可能还有点儿事要处理,所以通话还未立刻结束。

过了一会儿,对方确认说“好了,我也没话了,那挂了”(第三次挥手),这时候对方发送了FIN包。

你回应“知道了,挂了”(第四次挥手),对应发送ACK包,之后双方都可以挂断电话,结束通话。

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程