一)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的协商状态机相关推荐

  1. ethernet调试工具_开发者分享 | 如何调试10G/25G以太网IP自协商/Link Training

    点击"蓝字"关注我们 *此调试过程亦适用于10G, 25G, 40G, 50G, 100G以太网IP核,每个IP可能会有些细节上的不同,但整个自协商和LinkTraining过程是 ...

  2. simple fsm状态机模板应用笔记(二)——simple fsm语法规则

    原文地址:https://www.amobbs.com/thread-5668532-1-1.html 如何使用 1. 如何定义一个状态机 语法: simple_fsm( <状态机名称>, ...

  3. 反应式系统实现MQTT客户机

    反应式系统实现MQTT客户机 Implementing an MQTT client for reactive systems MQTT Reactive是从LiamBindle的MQTT-C库派生的 ...

  4. 【转】C#与C++的发展历程第一 - 由C#3.0起

    C#5.0作为第五个C#的重要版本,将异步编程的易用度推向一个新的高峰.通过新增的async和await关键字,几乎可以使用同编写同步代码一样的方式来编写异步代码. 本文将重点介绍下新版C#的异步特性 ...

  5. 【Unity入门计划】Unity2D动画(1)-动画系统的组成及功能的使用

    目录 Unity动画 1 Unity动画系统:MEcanim 该动画系统中常见的术语 2 游戏对象的Animator组件 组件属性 Controller 控制器 Avatar 骨骼 Apply Roo ...

  6. LAN8742 教程(1) 数据手册 中文翻译

    LAN8742 教程(1) 数据手册 中文翻译 LAN8742 教程(1) LAN8742 教程(1) 数据手册 中文翻译 文章目录 LAN8742 教程(1) 数据手册 中文翻译 前言 1.0 介绍 ...

  7. 【整理】PJSIP开源库详解

    PJSIP是一个包含了SIP.SDP.RTP.RTCP.STUN.ICE等协议实现的开源库.它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次.抽象的多媒体通信API,这套API能够很容易 ...

  8. 「论文自译」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 ...

  9. SGMII调试及丢包问题

    使用88E1514和FPGA连接做以太网通信,走的是LVDS接口 ip核使用:GMII转SGMII的桥,使用了同步SGMII模式,需要提供一路125MHz的同步时钟,并固定在1G模式. ------- ...

最新文章

  1. R语言应用实战-基于R的C4.5算法和C5.0算法原理解析及应用案例
  2. 销售订单定价-客户取值
  3. Ubuntu下 Tomcat + JSF + Ant + eclipse 开发环境搭建
  4. android view moveto,android – cursor.moveToPosition(i)的速度有多快?
  5. hdu 4908 BestCoder Sequence
  6. Shell常用快捷键
  7. QCC3040----SOC模块
  8. 深入浅出推荐系统(四):召回:向量化的潮流
  9. 浅谈数据与网络安全--对网络安全的基础知识了解
  10. allegro里面由于shape out of date
  11. 关于 NM_CONTROLLED和Network Manager
  12. 企业微信小程序_获取准确定位的方法及解决定位不准确的问题
  13. MySQL之SELECT函数
  14. 二进制与十进制科学记数法举例
  15. 华为OD岗位机试指南
  16. 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
  17. JavaScript—节点
  18. 正则表达式在线生成器(txt2re)
  19. Word2vec浅显的理解
  20. MySQL数据库--01--一头扎进大沙漠-数据库概述

热门文章

  1. lan接口 - 局域网接口
  2. 蚂蚁森林自动收能量的最新脚本
  3. 小醜发布伤感QQ日志_失去你,我还剩下什么
  4. KBEngine(CBE)引擎研究 (二) C++ Python 混合调试
  5. EHR系统中,给员工误操作离职,处理方法
  6. 专访拼命玩三郎|在别人的世界里游荡,不如自己构建一个世界
  7. ubuntu16.04安装教程(包含分区和BCD)
  8. Apache添加PHP模块重启apache服务报错
  9. python编写函数,计算两个矩阵的乘积。
  10. 涨粉最快的抖音情感类账号,引流+变现超详细教程丨国仁猫哥