TCP三次握手和四次挥手
我们知道,TCP是主机对主机层的传输控制协议,提供可靠的连接服务,需要三次握手建立连接,而终止一个连接要经过四次挥手。
三次握手
第一次握手:客户端申请连接(SYN=1),发送seq=x的数据包,等待服务器确认。
第二次握手:服务器端申请连接(SYN=1),确认收到客户端的申请(ACK=1).;服务器期望下次收到x+1数据包(ack=x+1),发送seq=y的数据包。
第三次握手:客户端确认收到请求(SYN=1),发送服务器期望的数据包(y+1),完成连接。
四次挥手
第一次挥手:客户端请求断开连接(FIN=1),发送数据(seq=u)。
第二次挥手:确认收到请求(ACK=1),期望收到数据包(ack=u+1),发送数据(seq=v)。
第三次挥手:服务器申请断开连接(FIN=1),确认收到你之前的请求(ACK=1);期望收到数据(ack=u+1),发送数据(seq=w)。
第四次挥手:确认收到请求(ACK=1),发送数据(seq=u+1),断开连接。
为什么需要三次握手?
如果不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送ACK包,但是服务端确认为新的连接开始了,等待客户端发数据,这样就会白白浪费资源。而经过三次握手,客户端和服务器都有应有答,这样可以确保TCP正确连接。
为什么需要四次挥手?
在TCP建立连接时,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中,服务器端向客户端端发送的ACK和FIN是是分两次发送的。因为在服务器端接收到客户端的FIN后,客户端可能还有数据要传输,所以先发送ACK,等客户端处理完自己的事情后就可以发送FIN断开连接了。
为什么四次挥手后有2MSL的时间等待?
MSL(Maximum Segment Lifetime),最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。假定网络不可靠,那么第四次发送的ACK可能丢失,即服务器端无法收到这个ACK,如果服务器端收不到这个确认ACK,服务器端会定时向客户端重复发送FIN,直到服务器端收到客户端的确认ACK。所以这个2MSL就是用来处理这个可能丢失的ACK的。