四次挥手


四次挥手

文章插图
四次挥手【四次挥手】四次挥手 , 别名连线终止协定 。其性质为终止协定 。
基本介绍中文名:四次挥手
别名:连线终止协定
类别:初始状态
性质:终止协定
连线终止协定(四次挥手)由于TCP连线是全双工的 , 因此每个方向都必须单独进行关闭 。这原则是当一方完成它的数据传送任务后就能传送一个FIN来终止这个方向的连线 。收到一个 FIN只意味着这一方向上没有数据流动 , 一个TCP连线在收到一个FIN后仍能传送数据 。首先进行关闭的一方将执行主动关闭 , 而另一方执行被动关闭 。(1) TCP客户端传送一个FIN , 用来关闭客户到伺服器的数据传送 。(2) 伺服器收到这个FIN , 它发回一个ACK , 确认序号为收到的序号加1 。和SYN一样 , 一个FIN将占用一个序号 。(3) 伺服器关闭客户端的连线 , 传送一个FIN给客户端 。(4) 客户端发回ACK报文确认 , 并将确认序号设定为收到序号加1 。CLOSED:表示初始状态 。LISTEN:这个也是非常容易理解的一个状态 , 表示伺服器端的某个SOCKET处于监听状态 , 可以接受连线了 。SYN_RCVD:这个状态表示接受到了SYN报文 , 在正常情况下 , 这个状态是伺服器端的SOCKET在建立TCP连线时的三次握手会话过程中的一个中间状态 , 很短暂 , 基本上用netstat你是很难看到这种状态的 , 除非你特意写了一个客户端测试程式 , 故意将三次TCP握手过程中最后一个ACK报文不予传送 。因此这种状态时 , 当收到客户端的ACK报文后 , 它会进入到ESTABLISHED状态 。SYN_SENT:这个状态与SYN_RCVD遥相呼应 , 当客户端SOCKET执行CONNECT连线时 , 它首先传送SYN报文 , 因此也随即它会进入到了SYN_SENT状态 , 并等待服务端的传送三次握手中的第2个报文 。SYN_SENT状态表示客户端已传送SYN报文 。ESTABLISHED:这个容易理解了 , 表示连线已经建立了 。FIN_WAIT_1:这个状态要好好解释一下 , 其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文 。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时 , 它想主动关闭连线 , 向对方传送了FIN报文 , 此时该SOCKET即进入到FIN_WAIT_1状态 。而当对方回应ACK报文后 , 则进入到FIN_WAIT_2状态 , 当然在实际的正常情况下 , 无论对方何种情况下 , 都应该马上回应ACK报文 , 所以FIN_WAIT_1状态一般是比较难见到的 , 而FIN_WAIT_2状态还有时常常可以用netstat看到 。FIN_WAIT_2:上面已经详细解释了这种状态 , 实际上FIN_WAIT_2状态下的SOCKET , 表示半连线 , 也即有一方要求close连线 , 但另外还告诉对方 , 我暂时还有点数据需要传送给你 , 稍后再关闭连线 。TIME_WAIT:表示收到了对方的FIN报文 , 并传送出了ACK报文 , 就等2MSL后即可回到CLOSED可用状态了 。如果FIN_WAIT_1状态下 , 收到了对方同时带FIN标誌和ACK标誌的报文时 , 可以直接进入到TIME_WAIT状态 , 而无须经过FIN_WAIT_2状态 。CLOSING:这种状态比较特殊 , 实际情况中应该是很少见 , 属于一种比较罕见的例外状态 。正常情况下 , 当你传送FIN报文后 , 按理来说是应该先收到(或同时收到)对方的ACK报文 , 再收到对方的FIN报文 。但是CLOSING状态表示你传送FIN报文后 , 并没有收到对方的ACK报文 , 反而却收到了对方的FIN报文 。什幺情况下会出现此种情况呢?其实细想一下 , 也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话 , 那幺就出现了双方同时传送FIN报文的情况 , 也就会出现CLOSING状态 , 表示双方都正在关闭SOCKET连线 。CLOSE_WAIT:这种状态的含义其实是表示在等待关闭 。怎幺理解呢?当对方close一个SOCKET后传送FIN报文给自己 , 你系统毫无疑问地会回应一个ACK报文给对方 , 此时则进入到CLOSE_WAIT状态 。接下来呢 , 实际上你真正需要考虑的事情是查看你是否还有数据传送给对方 , 如果没有的话 , 那幺你也就可以close这个SOCKET , 传送FIN报文给对方 , 也即关闭连线 。所以你在CLOSE_WAIT状态下 , 需要完成的事情是等待你去关闭连线 。LAST_ACK:这个状态还是比较容易好理解的 , 它是被动关闭一方在传送FIN报文后 , 最后等待对方的ACK报文 。当收到ACK报文后 , 也即可以进入到CLOSED可用状态了 。