TCP 为什么三次握手而不是两次握手(正解版)
Socket编程详解_小羊的预备程序员的博客-CSDN博客_socket
1、TCP为什么需要三次握手,采用两次握手可以吗?
假设主机A为客户端,主机B为服务端
采用三次握手是为了:防止失效的连接请求报文突然又传送到主机B,因而产生错误。
考虑这种情况:主机A第一次发送的连接请求没有丢失,而是因为网络结点导致延迟到达主机B,主机B以为是主机A又发起新的连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B浪费资源。
2、为什么建立连接协议是三次握手,而关闭连接却是四次握手?
服务器收到客户端的连接请求后,可以把ACK和SYN(ACK起到应答作用,而SYN起到同步作用)放在一个报文里来发送。
但是关闭连接时,当收到对方的FIN报文通知时,仅表示对方没有数据发送给你了;但未必你所有的数据全部发送给对方了,所以你未必会马上关闭SOCKET,你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示同意现在可以关闭连接了。
所以这里的ACK报文和FIN报文都是分开发送的。