三次握手的目的,是为了防止A端已经失效的连接请求突然又传到B端,被误认为是A端再次发出的一个新的连接请求,如果B端这时又再次向A发出确认报文,表示同意建立连接,就会产生错误。
第一次是A端向B端发送请求,如果是只有一次握手的话,A端不知道B端是不是收到了这个请求。
第二次是B端确认收到A端请求,如果只有两次的话,B端不确定A端是否收到了确认消息,这个确认消息有可能会在半路丢了。
第三次是A端确认收到了B的确认消息,A和B双方都是通的,然后AB就可以建立连接相互通信了。
![](https://gitee.com/chenyy-2017/pic/raw/master/note/59bd6d1dff4f17d36c9446fa87e1f9cf_.jpg)
四次挥手的本质原因是tcp是全双公的,通信是双向的, A到B是一个通道,B到A又是另一个通道。
A端确认没有数据发送后,发出结束报文,此时B端返回确认后,B端也不会接收A端数据。
但是此时B端可能还有数据没有传输完,A端还是可以接收数据。
只有当B端数据发送完之后,才能发出结束报文,并且确认A端接收到的时候,两边才会真正的断开连接,双方的读写分开。
![](https://gitee.com/chenyy-2017/pic/raw/master/note/eccc7a3872de7084fd0f7a2b43f8838b_.jpg)
第 一,为了保证A发送的最有一个ACK报文段能够到达B。
这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN和ACK 报文段的确认。B会超时重传这个FIN和ACK报文段,而A就能在2MSL时间内收到这个重传的ACK+FIN报文段。接着A重传一次确认。
第二,就是防止上面提到的已失效的连接请求报文段出现在本连接中。
A在发送完最有一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。
参考:
tcp建立连接为什么需要三次握手:https://www.jianshu.com/p/e7f45779008a
TCP三次握手四次挥手详解:https://www.cnblogs.com/zmlctt/articles/3690998.html