三次握手和四次挥手

1.三次握手

(1)建立连接时,客户端发送SYN包(同步序列编号)到服务器,客户端进入SYN_SENT状态,等待服务器的确认;
(2)服务端收到SYN包,并且确认客户端的SYN之后,发送SYN+ACK包给客户端等待确认,服务器进入SYN_RECV状态;
(3)客户端收到SYN+ACK包,向服务端发送确认包ACK,此包发送完毕,客户端和服务端进入ESTABLISHED状态

2.四次挥手

(1)客户端发送连接中断请求,也就是FIN报文;
(2)服务端收到FIN报文后,以防服务端传给客户端的数据没有结束,并不立即用FIN报文回复客户端,而是发送确认序号ACK给客户端,客户端进入FIN_WAIT状态,继续等待服务端的FIN报文,服务端进入CLOSE_WAIT状态;
(3)当服务端确定数据已发送完成之后,向客户端发送FIN报文,进入LAST_ACK状态;
(4)客户端收到FIN报文后,向服务端发送一个ACK包进入TIME_WAIT状态,并且等待2MSL,没有任何的回复表示连接彻底释放

3.整个过程

(1)客户端所经历的状态
三次握手和四次挥手_第1张图片

(2)服务端所经历的状态
三次握手和四次挥手_第2张图片

4.经典问题

问题一:为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为服务端收到客户端的SYN连接请求报文之后,可以直接发送SYN+ACK报文,其中SYN报文是用来同步的,ACK报文是用来应答的。但是关闭连接时,当服务端收到FIN关闭请求后,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,表示客户端发送过来的FIN报文已经收到。只有等到服务端所有数据都已发送,才能再发送FIN报文给客户端,因此不能一起发送,故需要四次挥手。

问题二:为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按常规的,四个报文发送完毕,可以直接进入CLOSE状态,但是如果网络中断,最后客户端发送的ACK报文丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

你可能感兴趣的:(计算机网络)