知方号

知方号

TCP连接的建立和释放过程详解(三次握手、四次挥手)

TCP连接的建立和释放过程详解(三次握手、四次挥手)

1. TCP是基于连接的协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。所谓面向连接,是指通信双方在进行通信之前,事先在双方之间建立起一个完整的、可以彼此沟通的通道,这个通道就是连接。

TCP是基于连接的协议,也就是说,在正式收发数据之前,必须和对方建立可靠的连接。一个TCP连接的建立要经过三次握手,释放连接一般需要四次挥手。

2. 连接的建立

建立连接的过程一般需要三次握手,如下图所示:

在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段。随后进入三次握手阶段:

(1)首先客户端向服务器发送一个SYN包,并等待服务器确认

标志位为SYN,表示请求建立连接序号为Seq = x(x一般为1)随后客户端进入SYN-SENT阶段

(2)服务器接收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文

标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接序号为Seq = y确认号为Ack = x + 1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值,随后服务器端进入SYN-RECV阶段

(3)客户端接收到发送的SYN + ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文

标志位为ACK,表示确认收到服务器端同意连接的信号序号为Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值确认号为Ack= y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号Ack的值随后客户端进入ESTABLISHED

当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,从而完成三次握手。

为什么是「三」次握手?

因为三次是保证client和server端均让对方知道自己具备发送和接收能力的最小次数:

client > server:client具备发送能力server > client:server具备接收和发送能力client > server:client具备接收能力 2. 连接的释放

释放连接的过程一般需要四次挥手,如下图所示:

这里假设客户端主动释放连接。在挥手之前主动释放连接的客户端结束ESTABLISHED阶段,随后开始四次挥手:

(1)首先客户端向服务器发送一段TCP报文表明其想要释放TCP连接

标记位为FIN,表示请求释放连接序号为Seq = u随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止向服务端发送通信数据

(2)服务器接收到客户端请求断开连接的FIN报文后,结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段TCP报文

标记位为ACK,表示接收到客户端释放连接的请求序号为Seq = v确认号为Ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号Ack的值随后服务器开始准备释放服务器端到客户端方向上的连接

客户端收到服务器发送过来的TCP报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端进入FIN-WAIT-2阶段。

(3)服务器端在发出ACK确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完成后即经过CLOSE-WAIT阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出一段TCP报文

标记位为FIN和ACK,表示已经准备好释放连接了序号为Seq = w确认号Ack = u + 1,表示是在收到客户端报文的基础上,将其序号Seq的值加1作为本段报文确认号Ack的值

随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段,并且停止向客户端发送数据。

(4)客户端收到从服务器发来的TCP报文,确认了服务器已经做好释放连接的准备,于是进入TIME-WAIT阶段,并向服务器发送一段报文

标记位为ACK,表示接收到服务器准备好释放连接的信号

序号为Seq= u + 1,表示是在已收到服务器报文的基础上,将其确认号Ack值作为本段序号的值

确认号为Ack= w + 1,表示是在收到了服务器报文的基础上,将其序号Seq的值作为本段报文确认号的值

随后客户端开始在TIME-WAIT阶段等待2 MSL。服务器端收到从客户端发出的TCP报文之后进入CLOSED阶段,由此正式确认管关闭服务器端到客户端方向上的连接。客户端等待完2 MSL之后,进入CLOSED阶段,由此完成四次挥手。

为什么是「四」次挥手?

因为TCP是一个全双工协议,必须单独拆除每一条信道,两个方向的接收、发送都需要单独关闭。

参考:

《LeetBook》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。