昨天面试的时候被面试官问了TCP的有限状态机,状态机一直听说过,但是没有去了解是什么,当时答的是“我可能知道有这么个东西,但是不清楚它叫有限状态机”,今天去看了一下,果然是知道有这个东西,但是不清楚叫有限状态机。现在整理一下。
以下行文:先介绍状态机,再介绍TCP状态机。
状态机
状态机:顾名思义,状态转换,既然需要状态转换,就需要有状态(State),状态之间转换需要转换条件(Guard)以及事件(Event),这里的条件和事件有点容易混淆,我的理解是:条件指是状态机内部的一些状态,事件是指来自状态机外部的事件,只有内部和外部的条件和事件都满足了,才能够产生迁移(Transition),但是,外部事件并不一定会引起状态的迁移,有可能只是产生一些动作(Action)。(以上是我个人理解,欢迎斧正)。
下面是关于状态机的一些名词解释,可能会比较晦涩。来自https://glumes.com/post/android/understand-state-machine/
- State(状态):状态(State),就是一个系统在其生命周期中某一个时刻的运行情况,此时,系统会执行一些操作,或者等待一些外部输入。并且,在当前形态下,可能会有不同的行为和属性。
- Guard(条件):状态机对外部消息进行响应时,除了需要判断当前的状态,还需要判断跟这个状态相关的一些条件是否成立。这种判断称为 Guard(条件)。Guard 通过允许或者禁止某些操作来影响状态机的行为。
- Event(事件):事件(Event),就是在一定的时间和空间上发生的对系统有意义的事情,事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。
- Action(动作):当一个事件(Event)被状态机系统分发的时候,状态机用 动作(Action)来进行响应,比如修改一下变量的值、进行输入输出、产生另外一个 Event 或者迁移到另外一个状态等。
- Transition(迁移):从一个状态切换到另一个状态被称为 Transition(迁移)。引起状态迁移的事件被称为触发事件(triggering event),或者被简称为触发(trigger)。
TCP的状态机
直接上图:
大家可能对下面这个两个图会比较熟悉:
实际上这两个图就是对TCP状态机的简化。
TCP状态的描述
TCP状态及其描述如下表。
状态 | 描述 |
---|---|
LISTEN | 等待来自远程TCP应用程序的请求 |
SYN_SENT | 发送连接请求后等待来自远程端点的确认。TCP第一次握手后客户端所处的状态 |
SYN-RECEIVED | 该端点已经接收到连接请求并发送确认。 该端点正在等待最终确认。TCP第二次握手后服务端所处的状态 |
ESTABLISHED | 代表连接已经建立起来了。这是连接数据传输阶段的正常状态 |
FIN_WAIT_1 | 等待来自远程TCP的终止连接请求或终止请求的确认 |
FIN_WAIT_2 | 在此端点发送终止连接请求后,等待来自远程TCP的连接终止请求 |
CLOSE_WAIT | 该端点已经收到来自远程端点的关闭请求,此TCP正在等待本地应用程序的连接终止请求 |
CLOSING | 等待来自远程TCP的连接终止请求确认 |
LAST_ACK | 等待先前发送到远程TCP的连接终止请求的确认 |
TIME_WAIT | 等待足够的时间来确保远程TCP接收到其连接终止请求的确认 |
参考资料:
https://www.jianshu.com/p/3c7a0771b67e
https://glumes.com/post/android/understand-state-machine/