我们在了解三次握手之后: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来帕努但对端是否关闭连接。