TCP连接释放过程

  通常使用tcp协议进行数据通信的客户端和服务端都可以关闭连接,一般来说,都是由客户端主动发起关闭连接请求。目前来说,大多数tcp实现允许在连接释放时有两种选择:三次挥手和支持半关闭的四次挥手。

  对于支持半关闭的tcp连接释放的整个过程有个很形象的叫法,即tcp四次挥手,如图1所示。

21-tcp连接释放
图1-tcp四次挥手

  确认号是主机为了确认对方主机是否收到消息的一种机制,也是tcp协议可靠的特征。


第一次挥手

  正常情况下,主机A的应用进程会发送一个FIN报文段,该报文段会携带一个随机产生的初始序号,表示用来关闭主机A到主机B的连接,然后主机A进入FIN_WAIT_1状态。

  注意:tcp规定,FIN报文段可以携带最后一块数据,如果没有数据,那么FIN报文段也要消耗一个序号。


第二次挥手

  主机B收到主机A发送的FIN报文段后,就会通知应用进程发送了ACK报文段,表示主机B确认收到主机A发送的FIN报文段,即:ACK,seq=v,ack=u+1。然后服务端进入CLOSE_WAIT状态,同时主机A会进入FIN_WAIT2状态,即等待主机B发送FIN报文段释放连接

ACK:表示主机B确认收到主机A发送的FIN报文段。
seq = v:表示主机B携带的一个序号,这个序号是主机B前面传送过的数据的最后一个字节的序号+1得到的。
ack = u + 1: 表示主机B确认收到主机A发送的FIN报文段。

  此时主机A到主机B方向的tcp连接就释放了(但是主机B到主机A方向的tcp连接还没释放),这时主机A连接会处于一个半关闭(FIN_WAIT2)的状态,此时A仍可以接收数据,但不能发送数据。相当于A向B说:“我已经没有数据要发送了,如果B你还发送数据的话,我仍然会接收你发送的数据”。


第三次挥手

  因为主机A现在处于半关闭状态,所以主机B的应用进程会发送一个FIN的报文段,表示主机B的数据已经发送完毕,用于关闭主机B到主机A方向的连接了,主机B进入LAST_ACK状态(最后确认状态),即等待主机A发送最后的确认

FIN : 其实就代表主机B最后的数据已经发送完毕了,现在要关闭连接了。
ACK:主机B重复上一次的确认。
seq = w:表示主机B发送的FIN报文段所携带的一个序号
ack = u + 1:表示主机B必须重复上一次发送的确认号ack = u +1


第四次挥手

  主机A收到主机B发送的FIN + ACK报文段后,主机A会发送一个ACK报文段进行确认,然后主机A进入TIME_WAIT状态(时间等待状态),此时tcp连接还没完全释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后(MSL叫做最大报文生存时间),主机A才会进入CLOSED状态,然后服务器进入CLOSED状态,完成四次挥手过程。此时主机B的连接也关闭了,主机A和主机B的连接也就全部都关闭了。

  后面将会专门针对TIME_WAIT状态详细介绍,这是tcp状态中一个非常重要的状态。

ACK:表示主机A对于主机B的FIN报文段的确认,相当于主机A告诉主机B可以关闭连接了
seq = u + 1:表示主机A携带的序号(即主机B所携带的序号(即ack = u+1)期望主机A发送的序号)
ack = w + 1:表示对于主机B所发送的序号的确认(即seq = w的确认)


tcp连接释过程中的半关闭状态

  从tcp的连接建立和释放过程来看,建立一个tcp连接需要三次握手,而终止一个tcp连接需要4次挥手,这是因为tcp支持半关闭造成的,因为tcp连接是全双工通信(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这种原则就是当一方发送完所有的数据就可以发送一个FIN来关闭终止这个方向的连接,当连接关闭,这个方向就不能发送数据了,但是仍能接收数据。

  当一端收到FIN,它必须通知应用层的另一端(发送FIN的一端)终止这个方向上的数据传输,这意味着就不能再接收到数据了,但是仍然能发送数据。

相关文章:

  • 2021-04-02
  • 2021-10-15
  • 2021-08-27
  • 2021-08-04
  • 2021-12-07
  • 2021-11-14
  • 2021-06-07
猜你喜欢
  • 2021-08-21
  • 2021-11-19
  • 2021-10-08
  • 2021-05-11
  • 2021-09-19
相关资源
相似解决方案