先上如何使用telnet的方法,然后研究原理。为什么telnet可以验证端口的连通性?为啥只能验证TCP端口的连通性?UDP协议端口的连通性如何验证?方法只需要看看Rfc854有关telnet协议或者看telnet源码。
如何使用telnet方法
telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式,虽然telnet支持许多命令,但大部分情况下,只是使用它查看目标主机是否打开了某端口(默认是23)。
端口未打开没响应
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
端口打开但被拒绝连接
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
telnet: connect to address 101.199.97.65: Connection refused
端口打开并建立连接
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
此时命令未退出。
根据提示Escape character is '^]'.可知退出字符为'^]'(CTRL+])。此时输入其它字符不能使其退出,CTRL+C都不行。输入CTRL+]后会自动执行,进入命令模式:
^]
telnet>
此时再运行quit才会真正退出。
sleep 2使得telnet输出结果后,停留2秒后退出命令模式。
$ sleep 2 | telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
Connection closed by foreign host.
命令模式下Telnet 客户端常用命令:
open : 使用openhostname建立到主机的Telnet连接。
close : 使用命令close命令关闭现有的Telnet连接。
display : 使用display命令可以查看Telnet客户端的当前设置。
send : 使用 send 命令可以向 Telnet 服务器发送命令。支持以下命令:
ao : 放弃输出命令。
ayt : “Are you there”命令。
esc : 发送当前的转义字符。
ip : 中断进程命令。
synch : 执行 Telnet 同步操作。
brk : 发送信号。
quit :使用 quit 命令可以退出 Telnet 客户端。
telnet协议
https://tools.ietf.org/html/rfc854
INTRODUCTION
telnet协议的目的是提供一个相对通用的,双向的,面向八位字节的通信机制。它的主要目标是允许界面终端设备和面向终端的进程能通过一个标准方法进行互相交互。该协议可以应用到终端到终端通信(“连接”)和进程到进程通信(分布计算)中。
GENERAL CONSIDERATIONS
一个telnet连接是一个基于传输控制协议TCP (Transmission Control Protocol ),用来传输带有TELNET控制信息数据的连接。
telnet协议的建立基于这样三个主要想法: 1) 网络虚拟终端的概念NVT (Network Virtual Terminal); 2)可谈判选项的原理(the principle of negotiated options) ;3) 在终端和进程间进行均衡(a symmetric view of terminals and processes)。
1.一个telnet连接建立时,通信的两端假设在同一个网络虚拟终端NVT上开始和结束操作。一个NVT可以提供标准的、在网络范围内的、规范终端的中间代表者(中间对接)的虚拟设备。这表示无需客户端和服务端彼此保留对方终端的特性信息以及终端处理约定。所有主机包括客户端和服务端,把它们自己的本地设备属性和协商约定映射到同一个网络上的NVT。
NVT在过度受限(没有提供给主机足够的词汇来映射他们的本地字符集)和过度包含(使用适当的终端来处罚用户)之间进行平衡。
The NVT is intended to strike a balance between being overly restricted (not providing hosts a rich enough vocabulary for mapping into their local character sets), and being overly inclusive (penalizing users with modest terminals).
2.可谈判选项的原则基于这样一个事实:许多主机都希望能够在NVT之上提供更多的服务,而许多用户将会拥有一个更复杂的终端,并且希望能够得到一流的,而不是极少的一点服务。尽管相互独立,但建立在telnet协议中的是许许多多的”选项”参数,这些选项将同”DO,DON’T,WILL, WON’T”结构一起使用,允许用户和服务器在telnet连接上使用更精致的协议集合。这些选项包括改变字符集,回显,等等。
设置选项参数的基本策略,是让任意一方(或双方)初始化一个设置选项参数的请求,另一方可以接受或拒绝该请求。如果该请求被接受了,选项立即生效;如果该请求被拒绝,连接的另一端仍然保留NVT的特性。很显然,一方经常可以通过拒绝一个请求来设置选项有效,而从来不能通过拒绝一个请求来取消一些选项,因为这些选项是双方为了支持NVT而准备的。
所思所想:详细想下为何不能取消这些选项参数呢?取消了会怎样?这些选项参数都是给谁使用的?既然这次协商的客户端和服务端之间不使用这些选项参数,那么有没有这个客户端有没有和其他的服务端之间协商时会用到这些选项参数呢?毕竟客户端只有一个,服务端是多个。想想蛮有意思的,互联网这些设置不是平白无故的,可以客户端对多个服务端,设置一些参数,抓包验证看看。
我们已经建立了一套谈判选项的规则,假如双方同时请求一个相同选项的时候,任意一方都可以把对方的请求当作对自己的请求的肯定回应。
3. 谈判句法的对称性可能会导致无穷尽的应答循环--每一方都把对方发送过来的命令当作必须回答的请求而不是对方的应答(each party seeing the incoming commands not as acknowledgments but as new requests which must be acknowledged. )。为防止这种循环,可以应用下面这些规则:
a.一方只能请求改变选项的状态。也就是一方不能只发送宣布它所使用的模式的请求。
b.如果一方所接收到的请求是要求它进入当前它所在的状态,那么该请求将不会被应答。这种不应答对防止无穷尽的循环是非常重要的。对于那些改变模式的请求,都需要一个应答--尽管该模式不一定改变。
C.无论何时,只要一方给另一方发送一个选项命令,不管该命令是请求还是应答,该选项的使用对从第一方发送到第二方的数据的处理生产影响,必须把该命令插到数据流中希望它开始起作用的点上。(注意:在传送请求和接收到需要一些时间,因为可能是否定的应答过程。因此,一台主机可能在发出一个选项的请求后希望缓冲要发送的数据,直到它知道该请求是被接受还是被拒绝,来隐藏这段对用户来说是"不确定"的时间。)
协议其余内容后续待学习
参考(如有侵权请通知删除)
https://tools.ietf.org/html/rfc854
http://www.cnpaf.net/rfc/rfc854.txt