用最通俗的语言帮你真正理解什么是TCP三次握手和四次挥手

之所以写这篇博客,是因为网上介绍三次握手和四次挥手的概念已经看了无数遍,但总是过一段时间就忘记,最主要的原因是网上所有的文章基本只介绍原理,而不介绍为什么,导致自己没有真正理解其中的含义。

本文不再介绍三次握手和四次挥手的概念,而只回答几个问题:

1、TCP建立连接为什么要三次握手?
三次握手的目的就是客户端和服务端双方都需要确认我能连接对方:
(1)客户端必须确认他能连接服务端,那他要干的事就是他先发送一个包给服务端,服务端收到之后回复给客户端告知客户端我已收到;
(2)服务端也必须确认他能连接客户端,那他要干的事就是他也得发送一个包给客户端,客户端收到之后回复给服务端告知服务端我已收到;

2、握手次数为什么是三次,而不是两次或者四次或者其他?
(1)从问题1的解答可以初步看出,实际上要完成握手,正常来说应该是需要四次握手。那实际为什么是三次而不是四次,这是因为其中第一步服务端回复客户端的消息的同时顺便主动发送了一个包,即把第二步的第一个操作也做了,所以总共通信次数是三次;
(2)为什么不是两次,这个问题,可以参考网上其他文章,介绍较多,这儿只是复制粘贴下来(参考https://www.jellythink.com/archives/240):为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
例如:
“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”
这就防止了服务器端的一直等待而浪费资源。

3、TCP断开连接为什么要四次挥手?
四次挥手的目的就是两个主机都得告知对方我不再发送数据了,而是准备关闭连接了:
(1)主机A必须告知主机B,他不再发送数据而需要关闭连接了,则他发送一个报文给主机B告知主机B我不发数据了,主机B收到后需要回复主机A说我知道了;
(2)主机B也必须告知主机A,他不再发送数据而需要关闭连接了,则他也需要发送一个报文给主机A告知主机A我不发数据了,主机A收到后需要回复主机B说我知道了;

4、挥手次数为什么是四次,而不是三次或者五次或者其他?
(1)从问题3的解答可以初步看出,挥手需要四次,为什么不是跟建立连接时握手一样三次就可以的原因是,当主机B在回复主机A的消息,他可能还有数据要发给主机A,所以他现在还不能立刻断开连接,所以他不能在回复主机A的同时也告知主机A我不再发数据了;

猜你喜欢

转载自blog.csdn.net/maidabu/article/details/88784066
今日推荐