首先给出标准的书上的概念,摘自 谢希仁著《计算机网络第6版》:

三次握手的全过程:

建立与释放TCP连接的过程-LMLPHP

 

四次挥手的全过程:

建立与释放TCP连接的过程-LMLPHP

 

以下是经过总结、提取后在笔试题和面试题的回答:

三次握手:

1.客户端发送SYN请求,进入SYN-SEND(同步发送状态)

2.服务端收到请求,回复ACK报文并发送SYN请求,进入SYN-RECV(同步接收状态)

--为什么说建立连接至少三次握手,是因为这里发送ACK报文和SYN请求可以分开两次发送,只是我们一般简化为一步完成--

3.客户端收到回复和SYN请求,然后向服务端发送ACK报文,接着进入ESTABLISH(连接建立状态),服务端收到客户端的ACK后也进入了ESTABLISH(连接建立状态)

至此,两端的通信连接建立完毕。

 

四次挥手:

1.客户端向服务端发送FIN请求,然后进入FIN-WAIT1(终止等待1状态)

2.服务端收到FIN请求后,回复ACK报文并通知高层应用进程,然后进入CLOSE-WAIT(关闭等待状态);客户端收到应答后随即进入FIN-WAIT2(终止等待2状态)

至此,从客户端到服务端单方向的连接已释放,但服务端仍然可以向客户端发送数据。此时的TCP连接处于半关闭状态,并且这种状态可能会保持一段时间。

3.服务端在发送完最后一部分数据后,向客户端发送FIN请求,然后进入LAST-ACK(最后确认状态)

4.客户端收到FIN请求后,向服务端回复ACK报文,然后进入TIME-WAIT(时间等待状态);服务端正常接收到客户端的应答后,进入CLOSED(关闭状态);当过了2倍的最长报文寿命后,若没有出现异常(即服务端已接收到ACK应答),则客户端也进入CLOSED(关闭状态)

至此,两端的通信连接释放完毕。

 

补充:

ps1:不管是建立连接还是释放连接的过程,都是C-S模式,并且都是由客户端主动发起请求。

ps2:如果没有收到应答,数据包都会根据TCP的重传机制进行重传。

ps3:释放连接时,客户端需等待2MSL才进入关闭状态,这样做除了能够防止服务端收不到最后一次ACK的应答,还有一个原因:“已失效的连接请求报文段”——A在发送完最后一个ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间内所产生的所有报文段都从网络消失。这样就可以使下一次新的连接不会出现这种旧的连接请求报文段。

 

10-06 17:41