一篇带你掌握TCP连接管理——四次挥手

我们在了解三次握手之后:https://blog.csdn.net/qq_46423166/article/details/113441873,接下来看四次挥手的问题。

TCP时是向连接的协议。运输连接是用来传送TCP报文的。

这里我们讨论TCP连接的释放:四次挥手

首先看图解:

第一次挥手:

  • 客户端向服务器端发送连接释放报文段,并停止再发送数据,主动关闭TCP连接

     此时首部中的终止控制位FIN=1,(当FIN=1,表明此报文段的发送方数据已经发送完毕,并要求释放运输连接)

     同时自己的序号seq=u;

第二次挥手:

  • 服务器收到连接释放报文段后即发出确认,但是可能客户端发来的数据没有接收完,所以不会立即停止,而是会保持这个状态一段时间,也就是半关闭状态

      包含确认ACK=1(确认ACK为1,是确认号字段才有用)

      然后返回确认号ack=u+1,(确认号字段,表示希望接收的下一个服务器端报文段开头序列,同时也是上一个服务器发送的数据的最后一个字节的序号加1)

      同时自己的序列号seq=y

第三次挥手:

  • 如果服务器已经完全接收了数据之后,其应用进程才会通知TCP释放连接

      首先包含释放报文段FIN=1

      还是返回确认ACK=1,

      返回确认号还是上次的,因为还是那一段数据的最后一次自己序号加一,即ack=y+1。

      同时自己的序号seq=w,因为在半关闭状态可能又发送了一些数据

第四次挥手:

  • 客户端收到连接释放报文段后,还需要对此发出确认。

       首先还是确认ACK=1

       然后确认好ack=w+1

       自己的序列号变成seq=u+1

上面就是TCP的四次挥手的过程


四次握手的原因?

由于连接的关闭控制权在应用层,所以被动关闭的一方在接收到FIN包时,TCP协议栈会直接发送一个ACK确认包,优先关闭一端的通信。

然后通知应用层,由应用层决定什么时候发送FIN包。应用层可以使用系统调用函数read==0来帕努但对端是否关闭连接。

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/113446457