tcp 中fsm简化版的编写

本文介绍了一种使用JavaScript实现的TCP状态机模型。该模型通过数组形式定义了从初始状态到目标状态的所有转换,并通过遍历事件列表来更新状态。文章提供了一个具体的实现案例,包括状态转移逻辑和错误处理。
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
代码如下:
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;

}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值