状态机简述
计算机里讲的是有限状态机(Finite-state machine)。人生就是一个有限状态机,出生即open,死亡即close。当然人是一个复杂的有限状态机,在人的一生当中可以有很多个状态转换。比如你有一个(男)女朋友,和(他)她吵架即输入动作,分手成单身了即结果状态。当然也有动作的结果是不会让现有状态发生发生迁移的,取而代之的是同一状态的变化。比如和(男)女友吵架的这一动作虽没有造成分手,即还是非单身的状态,但你的心境可能发生了变化...
简而言之,有始有终,有有限次状态迁移即为有限状态机。参考 http://en.wikipedia.org/wiki/Finite-state_machine
TCP的三次握手和四次断开
建立TCP连接的三次握手:
我:你好!
MM:呵呵,你好!
我:呵呵
断开TCP连接的四次握手:
我:再见!
MM:呵呵
MM:再见!
我:呵呵
而所谓的状态机是指MM等待有人搭话,搭话已发送,等待MM回复,收到回复,已说再见,等MM说再见。。。。这些状态而已。
TCP有效状态机简述
tcp有效状态机
根据上图,红色虚线箭头代表服务器端的状态,而绿色实现箭头代表客户端的状态。
CLOSED状态:服务器端跟客户端均关闭,处于CLOSED状态。其实开始并未规定谁是服务器端,谁是客户端,根据需求而定;
LISTEN状态:由于某些情况,其中一个端口被动打开处于监听状态(LISTEN),而另外一个向监听端发起会话请求,TCP三次握手开始。(ps 被动打开:指系统的应用程序需要打开一个端口,希望建立一个传人的链接,接受外部的请求,所以需要打开一个套接字监督该端口。);
SYN_SENT状态:客户端有连接需求,需要于服务器端第一次建立链接,这时候向服务器端发送请求,SYN=1,客户端处于SYN_SENT状态;
SYNRECVD状态:服务器端收到SYN请求后,自身处于SYNRECVD状态;
ESTABLISHED状态:服务器端发送SYN ACK=1回馈请求之后,转换为ESTABLISHED态, SYN_SENT在收到SYN ACK,发送ACK,状态为ESTABLISHED。双方连接建立完成;
FIN_WAIT_1状态:当双方通信完成,客户端向服务器发送FIN信号,准备断开连接,自身从ESTABLISHED状态转换为FIN_WAIT_1状态;
CLOSE_WAIT状态:服务器端在收到FIN后,发送ACK确认,状态为CLOSE_WAIT状态,等待关闭;
LAST_ACK状态:等待数据传输完成之后,服务器端发送FIN,自身状态变为LAST_ACK状态;
FIN_WAIT_2状态:客户端只收到服务器端得ACK信号,并没有收到FIN信号;说明服务器端还有数据传输,那么此时为半连接;
TIME_WAIT状态:有两种方式进入 该状态:1、FIN_WAIT_1进入:此时应用程序端口收到FIN+ACK(而不是像FIN_WAIT_2那样只收到ACK,说明数据已经发送完毕)并向服务器端口发送ACK;2、FIN_WAIT_2进入:此时应用程序端口收到了FIN,然后向服务器端发送ACK;TIME_WAIT是为了实现TCP 全双工连接的可靠性关闭,用来重发可能丢失的ACK报文;需要持续2个MSL(最大报文生存时间):假设应用程序端口在进入TIME_WAIT后,2个 MSL时间内并没有收到FIN,说明应用程序最后发出的ACK已经收到了;否则,会在2个MSL内在此收到ACK报文;
码字很辛苦,转载请注明来自http://www.zaizai.org.cn的《TCP有效状态机简述 》
转载于:https://blog.51cto.com/zaizai1993/1636032