上图左为tcp链接的状态机,每一个圆矩形为一个状态,每一个状态有一行或者两行,第一行为该状态的名称, 第二行(有的话)为该状态能(或者须要)发送的报文。 虚线箭头路径为服务器的常见状态转移路线。虚线框为关闭链接的状态集合。每一个状态转移都是经过事件 触发,通常为收到一些特定的报文。 上图右为时间线下的状态转移示意图,分为常见和特殊状况。服务器
端口未打开时为此状态。至关于初始状态和终止状态。tcp
当服务器打开端口监听时,服务器等待客户端进行链接(被动)。事件
客户端主动对服务器进行链接,会向服务器发送SYN报文。
有时候,服务器也会从LISTEN状态转到该状态,说明服务器端进行主动链接,可是__极为罕见__。 此外,主动关闭链接或者客户端在必定时间范围内彻底没有接到任何报文(超时)时,该状态会进入 CLOSED状态,结束链接。图片
服务器处于LISTEN状态,当收到客户端发送的SYN报文时,变为该状态。服务器处于该状态时须要完成 与客户端的握手流程,将会发送SYN和对此前客户端发送SYN报文的ACK确认。
当服务器收到客户端发送的RST报文后,说明客户端但愿取消链接,此时服务器会回到LISTEN状态; 此外,服务器在必定时间范围内彻底没有接到任何报文(超时)时,会关闭监听端口,到达CLOSED终止状态, 服务器主动关闭端口监听时,会进入FIN_WAIT_1状态。it
客户端(服务器)收到服务器(客户端)对本身此前的SYN报文的ACK确认后,进入此状态,代表已经创建了链接。服务器端
创建链接双方中的一方主动关闭链接时,会发送FIN报文,进入该状态。请求
主动关闭链接的一方收到被动方的对FIN的ACK确认报文后,进入该状态。im
主动关闭链接的一方在监听对本身FIN报文的ACK确认报文期间收到对方的FIN报文时进入该状态。
该状态说明双方都在此段时间段内主动请求关闭。客户端
主动请求关闭的一方收到对方的FIN报文后,会对该FIN报文进行ACK确认,那么此时进入该状态。
该状态等待2MSL的时间,若收不到对方的FIN报文,说明对方已经收到本身发出的ACK确认报文,最终 链接关闭,进入CLOSED。
有时候,FIN_WAIT_1会直接进入该状态,状况在于被动方恰好在发送ACK(FIN)的同时捎带了FIN,代表本身也 要关闭了,不过此状况也__比较罕见__,而且能够经过先进入FIN_WAIT_2在进入TIME_WAIT来代替。img
被动关闭的一方收到FIN报文时,进入该状态,该状态须要发送对FIN报文的ACK确认。
被动一方也关闭链接时,将发送FIN报文,进入该状态。收到本身发出的FIN的ACK确认报文后,关闭链接, 进入CLOSED