三次握手:
三次握手:指建立一个TCP连接时,需要客户端和服务器总共发送3个包,本质上是为了解决网络信道不可靠的问题。
为什么两次握手不行:
为了防止已失效的请求报文,突然又传到服务器引起错误。
假设采用两次握手建立连接,客户端向服务端发送了一个SYN包来请求建立连接,因为某些未知的原因并没有到达服务器,在中间某个网络节点产生了滞留。为了建立连接,客户端会重发SYN包,这次的数据包正常送达,服务端回复SYN+ACK 之后建立起了连接,但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达服务端,这时服务端会误认为是客户端又发起了一个新的连接,从而在两次握手之后进入等待数据状态。服务端认为是两个连接,而客户端认为是一个连接,造成了状态不一致。如果在三次状态的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功。
四次挥手:
TCP 连接的拆除需要发送四个包,因此称为四次挥手,客户端或服务端均可主动发起挥手动作。
为什么要四次挥手,而不是三次:
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这是由TCP的半关闭造成的。
所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。 所以要想终止一个链接,除了客户端发起关闭,还要经过服务器的同意,才能最终终止数据的传输。因此在第三次挥手时,是由服务器向客户端放送包,来告诉它我没有要传输的数据,可以关闭。所以比起三次握手,在挥手的时候,会多一次发送包的过程。
四次挥手释放连接时,等待2MSL的意义:
为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。