TCP 传输链接的释放

会有一股神秘感。 提交于 2020-10-10 01:59:02

摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
1. IPV4数据报头部格式
2. IPv6数据报头部格式
3. IPv4数据报的封装与解封装
4. IPv4数据报的分段与重组
5. ARP协议报文格式及ARP表
6. ARP地址解析原理
7. ICMP协议及报文格式
8. IPv6协议族的其它协议
9. TCP的主要特性
10. TCP的套接字
11. TCP端口
12. TCP连接状态转移
13. TCP传输的建立

TCP 传输链接的释放

当 TCP 连接建立以后,就可以在两个方向传送数据流。当 TCP 的网络应用进程再没有数据需要发送的时候,就可以发出关闭连接命令,释放连接。TCP 是通过发送 FIN 字段置1的数据段来作为关闭传输连接的命令,从而关闭本端数据流的,但是本端仍还可以继续接收来自对端的数据,直到对端也使用了同样的方法关闭那个方向的数据流为止,,这时整个双方传输连接就彻底关闭了。

单方面主动关闭的 TCP 连接释放过程

相对 TCP 传输连接建立的三次握手过程来说,TCP 传输连接的释放过程要稍微复杂一些,需要经过四次握手过程。这是由 TCP 的半关闭(half-closed)特性造成的,因为这一个 TCP 连接是全双工(即数据在两个方向上能同时传递),每个方向必须单独进行关闭。TCP 传输连接关闭原则如下:当一端完成它的数据发送任务后就可以发送一个 FIN 字段值置1的数据段来终止这个方向的数据发送;当另一端收到这个 FIN 数据段后,必须通知它的应用层“对端已经终止了这个方向的数据发送”。而 FIN 数据段的发送是由应用层调用 CLOSE 服务原语的结果。TCP 连接释放的四次握手过程如下图所示,具体描述如下。


TCP传输连接释放的四次握手过程
TCP传输连接释放的四次握手过程

 

  1. 一开始,通信双方都处于 ESTABLISHED (连接建立)状态。如果客户端认为数据全部发送完了,想结束本次传输连接,则由应用层的对应应用调用 CLOSE 服务原语,然后向服务器发送一个 FIN 字段值置1的数据段(假设此数据段的序号为m),客户端进入 FIN WAIT 1 状态,等待服务器的确认。
  2. 服务器在收到客户端发来的 FIN 数据之后,确认客户端没有新的数据要发送了,向客户端发送一个 ACK 字段值置1、确认号为 m+1 的数据段(假设此数据段的序号为 w,服务端与客户端的数据段序号可以不一样),表示前面的数据已全部收到了,然后进入 CLOSE WAIT (关闭等待)状态。与此同时,服务器的TCP实体通知对应的应用进程,释放从客户端到服务器方向的传输连接,进入半关闭状态。但此时服务器仍可以向客户端发送数据段,客户端也可以接受来自服务器的数据,而且这可能持续一段时间,直到服务器的数据也全部发送完毕。
  3. 当客户端收到服务器的 ACK 数据段之后,进入 FIN WAIT 2 状态,进一步等待服务器发出连接释放的数据段。
  4. 当服务器发送完全部的数据后,其对应的应用进程也会通知 TCP 实体释放此方向的TCP传输连接,向客户端发送 FIN 字段置1、ack = m+1(假设此时的数据段序号已变为 w)的确认数据段。这时服务器进入 LAST ACK (最后确认)状态,等待客户端的确认。
  5. 客户端在收到服务器的 FIN+ACK 数据段后,,向服务发送一个 ACK 字段值为1、ack = w+1、序号为m+1 的数据段,进入 TIME WAIT 状态。但此时 TCP 连接还没有释放,必须等待 2MSL 时间(RFC793 建议设置 MSL 为2分钟)后,客户端才进入到 CLOSED 状态,彻底释放了 TCP 连接。
  6. 服务器在接收到客户端发来的 ACK 数据段后,也进入 CLOSED, 彻底释放连接。此时,已经完成了这个 TCP 传输连接过程。

双方主动关闭的 TCP 连接释放流程

与可以双方同时建立 TCP 传输连接一样,TCP 传输连接关闭也可以由双方同时主动进行(正常情况下都是由一方发送第一个 FIN 数据段进行主动连接关闭,另一方被动接受连接关闭),如下图所示。具体描述如下。


主动同时关闭TCP连接过程]
主动同时关闭TCP连接过程]

 

当两端对应的网络应用层进程同时调用 CLOSE 原语,并发送 FIN 数据段执行关闭命令时,两端均从 ESTABLISHED 状态转变为 FIN WAIT 1 状态。任意一端收到对端发来的 FIN 数据段后,其状态均由 FIN WAIT 1 转变到 CLOSING 状态,并发送最后的 ACK 数据段。当收到最后的 ACK 数据段后,状态转变为 TIME_WAIT,在等待 2MSL 后进入到 CLOSED 状态,最终释放这个TCP连接。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!