例子
TCP三次握手就像和朋友打电话:
- 客户端: 喂, 你听到到我说话吗
- 服务器: 可以,你听到得到我吗
- 客户端: 我也听得到,开传!
为什么两次不行?
如果客户端第一次发送的请求,因为某些原因滞留了,没法给服务器。过了好久好久,才发到服务器。此时客户端早就重新发请求,建立好了连接(甚至已经结束会话了)。那么这时候服务器收到,会以为客户端发来了一个新的请求,于是回复客户端。但是客户端觉得自己并没有发消息(之前那个消息因为超时,已经del掉了),所以就不会理会服务器端。
因为两次握手,只要服务器回复,就算建立连接。所以服务器自以为已经建立了连接,就会一直等待客户端发消息。这样就占用了服务器的资源;
三次为啥就能避免?
还是上面的场景,服务器收到超时的请求,还是会照常回信;客户端收到服务器的这个回信,还是会扔掉,因为那个超时的请求已经删掉了。因为三次握手,必须要有客户端的回信才行,所以服务器因为收不到客户端的回信,就不会认为建立了连接,就不会傻等,浪费资源。
另一个角度理解为什么要三次?
对于通信双方来说,建立通信前,要分别确保自己能说能听,对方也能说能听。
即,A与B通信,那么
A这边要确认A能说能听;以及B能说能听
B这边也要确认A能说能听;以及B能说能听
A第一次发消息给B时,B收到了,那么B这边确定了:
- A能说
- B能听
B给A回信,A收到了,那么A这边确定了: - A能说,能听
- B能说,能听
A再给B回信,B收到了,那么B这边确定了: - A能听
- B能说
至此,两边分别确定了A和B的能听能说,从而可以建立连接。
所以两次不够,而四次及以上就多余了(因为没啥需要再确定的了