fsm 是当前状态+输入=末状态
参数表
Format is INITIAL_STATE: EVENT -> NEW_STATE
CLOSED: APP_PASSIVE_OPEN -> LISTEN
CLOSED: APP_ACTIVE_OPEN -> SYN_SENT
LISTEN: RCV_SYN -> SYN_RCVD
LISTEN: APP_SEND -> SYN_SENT
LISTEN: APP_CLOSE -> CLOSED
SYN_RCVD: APP_CLOSE -> FIN_WAIT_1
SYN_RCVD: RCV_ACK -> ESTABLISHED
SYN_SENT: RCV_SYN -> SYN_RCVD
SYN_SENT: RCV_SYN_ACK -> ESTABLISHED
SYN_SENT: APP_CLOSE -> CLOSED
ESTABLISHED: APP_CLOSE -> FIN_WAIT_1
ESTABLISHED: RCV_FIN -> CLOSE_WAIT
FIN_WAIT_1: RCV_FIN -> CLOSING
FIN_WAIT_1: RCV_FIN_ACK -> TIME_WAIT
FIN_WAIT_1: RCV_ACK -> FIN_WAIT_2
CLOSING: RCV_ACK -> TIME_WAIT
FIN_WAIT_2: RCV_FIN -> TIME_WAIT
TIME_WAIT: APP_TIMEOUT -> CLOSED
CLOSE_WAIT: APP_CLOSE -> LAST_ACK
LAST_ACK: RCV_ACK -> CLOSED
我的处理方案 当前状态+输入=末状态 2个状态一个输入恰好可以构成一个字符串用|连接,刚好组成一个数组,再遍历数组各个元素搜索状态,搜索输入 若匹配则将第3个赋予state
代码如下:
参数表
Format is INITIAL_STATE: EVENT -> NEW_STATE
CLOSED: APP_PASSIVE_OPEN -> LISTEN
CLOSED: APP_ACTIVE_OPEN -> SYN_SENT
LISTEN: RCV_SYN -> SYN_RCVD
LISTEN: APP_SEND -> SYN_SENT
LISTEN: APP_CLOSE -> CLOSED
SYN_RCVD: APP_CLOSE -> FIN_WAIT_1
SYN_RCVD: RCV_ACK -> ESTABLISHED
SYN_SENT: RCV_SYN -> SYN_RCVD
SYN_SENT: RCV_SYN_ACK -> ESTABLISHED
SYN_SENT: APP_CLOSE -> CLOSED
ESTABLISHED: APP_CLOSE -> FIN_WAIT_1
ESTABLISHED: RCV_FIN -> CLOSE_WAIT
FIN_WAIT_1: RCV_FIN -> CLOSING
FIN_WAIT_1: RCV_FIN_ACK -> TIME_WAIT
FIN_WAIT_1: RCV_ACK -> FIN_WAIT_2
CLOSING: RCV_ACK -> TIME_WAIT
FIN_WAIT_2: RCV_FIN -> TIME_WAIT
TIME_WAIT: APP_TIMEOUT -> CLOSED
CLOSE_WAIT: APP_CLOSE -> LAST_ACK
LAST_ACK: RCV_ACK -> CLOSED
我的处理方案 当前状态+输入=末状态 2个状态一个输入恰好可以构成一个字符串用|连接,刚好组成一个数组,再遍历数组各个元素搜索状态,搜索输入 若匹配则将第3个赋予state
代码如下:
var FSMData=[//构建数组
'CLOSED | APP_PASSIVE_OPEN | LISTEN',
'CLOSED | APP_ACTIVE_OPEN |SYN_SENT',
'LISTEN| RCV_SYN | SYN_RCVD',
'LISTEN| APP_SEND | SYN_SENT',
'LISTEN| APP_CLOSE | CLOSED',
'SYN_RCVD| APP_CLOSE | FIN_WAIT_1',
'SYN_RCVD| RCV_ACK | ESTABLISHED',
'SYN_SENT| RCV_SYN | SYN_RCVD',
'SYN_SENT| RCV_SYN_ACK | ESTABLISHED',
'SYN_SENT| APP_CLOSE | CLOSED',
'ESTABLISHED| APP_CLOSE | FIN_WAIT_1',
'ESTABLISHED| RCV_FIN | CLOSE_WAIT',
'FIN_WAIT_1| RCV_FIN | CLOSING',
'FIN_WAIT_1| RCV_FIN_ACK | TIME_WAIT',
'FIN_WAIT_1| RCV_ACK | FIN_WAIT_2',
'CLOSING| RCV_ACK | TIME_WAIT',
'FIN_WAIT_2|RCV_FIN | TIME_WAIT',
'TIME_WAIT|APP_TIMEOUT | CLOSED',
'CLOSE_WAIT| APP_CLOSE | LAST_ACK',
'LAST_ACK| RCV_ACK | CLOSED']
function traverseTCPStates(eventList){
var state = "CLOSED"; // initial state, always
for(var i=0;i<eventList.length;i++)
{
if(! judge (eventList[i]) ) return state;
//若返回false,不再进行,返回
}
return state;//最终返回
function judge(_eventListPara){
//判断该输入是否有匹配,有的话更改state,返回//true,无返回false 更改state为error
for(var j=0; j<FSMData.length; j++)
{
FSMData [j]=FSMData [j].replace(/\s+/g,'');//去空格因为数组不会自动去空格
var arr=FSMData [j].split("|");//剥离三个东东
if(arr[0]==state && arr[1]==_eventListPara)
{
state= arr[2];
return true;
}
}
state ='ERROR';
return false;
}
}
本文介绍了一种使用JavaScript实现的TCP状态机模型。该模型通过数组形式定义了从初始状态到目标状态的所有转换,并通过遍历事件列表来更新状态。文章提供了一个具体的实现案例,包括状态转移逻辑和错误处理。
806

被折叠的 条评论
为什么被折叠?



