展示一下telnetd的协商状态机
一)telnetd选项协商简介
telnet工作在不同的平台上和终端上,为了比较灵活,很多选项和配置采用协商的机制。就是说素未蒙面的终端与主机之间,开始的时候,相互之间协商开启什么配置和选项。telnetc与telnetd协商时是完全平等对称的。
telnet的协商指令 WILL (251) WONT (251) DO (253) DONT (254) ,指令格式是 IAC DO OPT ( 255 253 xx)具体的可以查看这个博客 关于telnet协议的研究及应用 记录的很清楚。
今天主要介绍一个关于协商用的状态机
/** The will/wont/do/dont state machines are based on Dave Borman's* Telnet option processing state machine.** These correspond to the following states:* my_state = the last negotiated state* want_state = what I want the state to go to* want_resp = how many requests I have sent* All state defaults are negative, and resp defaults to 0.** When initiating a request to change state to new_state:* * if ((want_resp == 0 && new_state == my_state) || want_state == new_state) {* do nothing;* } else {* want_state = new_state;* send new_state;* want_resp++;* }** When receiving new_state:** if (want_resp) {* want_resp--;* if (want_resp && (new_state == my_state))* want_resp--;* }* if ((want_resp == 0) && (new_state != want_state)) {* if (ok_to_switch_to new_state)* want_state = new_state;* else* want_resp++;* send want_state;* }* my_state = new_state;*/
解释一下上面的注释my_state是最后一次协商完成后的状态;my_want是正想要协商的状态(可能指令都还没有发送过去之前就更新了这个状态);want_resp是期待有多少个回复(有多少个请求发送了)。
#define MY_STATE_WILL 0x01
#define MY_WANT_STATE_WILL 0x02
#define MY_STATE_DO 0x04
#define MY_WANT_STATE_DO 0x08#define my_state_is_do(opt) (options[opt]&MY_STATE_DO)
#define my_state_is_will(opt) (options[opt]&MY_STATE_WILL)
#define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO)
#define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL)#define his_state_is_do my_state_is_will
#define his_state_is_will my_state_is_do
#define his_state_is_dont my_state_is_wont
#define his_state_is_wont my_state_is_dontvoid send_do(int option, int init) {if (init) {if ((do_dont_resp[option] == 0 && his_state_is_will(option)) ||his_want_state_is_will(option))return;/** Special case for TELOPT_TM: We send a DO, but pretend* that we sent a DONT, so that we can send more DOs if* we want to.*/if (option == TELOPT_TM)set_his_want_state_wont(option);elseset_his_want_state_will(option);do_dont_resp[option]++;}netoprintf((char *)doopt, option);DIAG(TD_OPTIONS, printoption("td: send do", option));
}
原来一直不理解,my_state_is_do 等价于his_state_is_will。不理解只能说审题不严,题目上已经说的很清楚了,就快把答案写在后面了。(老师名言) 其实这是一道小学题,我却看了半天。哈哈
现在A表示my,B表示his,将上面的代码转化成一个小学数学题。注意: All state defaults are negative, and resp defaults to 0
已知A1=0,A2=0, A3= 0, A4=0,B1=0,B2=0,B3=0,B4=0,当且仅当B2=1时,A1=1。现在A1=1,请问B2等于多少?
答案:B2等于1
当且仅当B2=0时,A1=0。现在A1= 0,B2等于多少?
答案:B2等于0
A1和B2,A2和B1产生的一一映射关系,知道任何一方的协商完成后的结果,就知道对方情况。同样A3A4与B3B4也是一样的。你会发现这就是一个小学问题。
解释一下上面的send_do函数,当该选项(option)没有在协商,且对方已经开启个该选项(该选项A是do,那么B一定是WILL)那么就不用再发送do指令进行协商该选项了;或者当 紧挨着的上一次已经发送do对该选项进行协商了,就不要发很多do指令了。除上述2种情况外,更新want_status_do 为 1 ,期待回复数加1, 发送do指令对该选项进行协商。
展示一下telnetd的协商状态机相关推荐
- ethernet调试工具_开发者分享 | 如何调试10G/25G以太网IP自协商/Link Training
点击"蓝字"关注我们 *此调试过程亦适用于10G, 25G, 40G, 50G, 100G以太网IP核,每个IP可能会有些细节上的不同,但整个自协商和LinkTraining过程是 ...
- simple fsm状态机模板应用笔记(二)——simple fsm语法规则
原文地址:https://www.amobbs.com/thread-5668532-1-1.html 如何使用 1. 如何定义一个状态机 语法: simple_fsm( <状态机名称>, ...
- 反应式系统实现MQTT客户机
反应式系统实现MQTT客户机 Implementing an MQTT client for reactive systems MQTT Reactive是从LiamBindle的MQTT-C库派生的 ...
- 【转】C#与C++的发展历程第一 - 由C#3.0起
C#5.0作为第五个C#的重要版本,将异步编程的易用度推向一个新的高峰.通过新增的async和await关键字,几乎可以使用同编写同步代码一样的方式来编写异步代码. 本文将重点介绍下新版C#的异步特性 ...
- 【Unity入门计划】Unity2D动画(1)-动画系统的组成及功能的使用
目录 Unity动画 1 Unity动画系统:MEcanim 该动画系统中常见的术语 2 游戏对象的Animator组件 组件属性 Controller 控制器 Avatar 骨骼 Apply Roo ...
- LAN8742 教程(1) 数据手册 中文翻译
LAN8742 教程(1) 数据手册 中文翻译 LAN8742 教程(1) LAN8742 教程(1) 数据手册 中文翻译 文章目录 LAN8742 教程(1) 数据手册 中文翻译 前言 1.0 介绍 ...
- 【整理】PJSIP开源库详解
PJSIP是一个包含了SIP.SDP.RTP.RTCP.STUN.ICE等协议实现的开源库.它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次.抽象的多媒体通信API,这套API能够很容易 ...
- 「论文自译」MIT 6.824 In Search of an Understandable Consensus Algorithm (Extended Version)
文章目录 Abstract 1 - Introduction 2 - Replicated state machines 3 - What's wrong with Paxos? 4 - Design ...
- SGMII调试及丢包问题
使用88E1514和FPGA连接做以太网通信,走的是LVDS接口 ip核使用:GMII转SGMII的桥,使用了同步SGMII模式,需要提供一路125MHz的同步时钟,并固定在1G模式. ------- ...
最新文章
- R语言应用实战-基于R的C4.5算法和C5.0算法原理解析及应用案例
- 销售订单定价-客户取值
- Ubuntu下 Tomcat + JSF + Ant + eclipse 开发环境搭建
- android view moveto,android – cursor.moveToPosition(i)的速度有多快?
- hdu 4908 BestCoder Sequence
- Shell常用快捷键
- QCC3040----SOC模块
- 深入浅出推荐系统(四):召回:向量化的潮流
- 浅谈数据与网络安全--对网络安全的基础知识了解
- allegro里面由于shape out of date
- 关于 NM_CONTROLLED和Network Manager
- 企业微信小程序_获取准确定位的方法及解决定位不准确的问题
- MySQL之SELECT函数
- 二进制与十进制科学记数法举例
- 华为OD岗位机试指南
- 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
- JavaScript—节点
- 正则表达式在线生成器(txt2re)
- Word2vec浅显的理解
- MySQL数据库--01--一头扎进大沙漠-数据库概述