那么telnet到底是一个协议还是一个软件呢?

写点轻松的好玩的事,所谓轻松的好玩的事,那就是既不怕犯错,又不用背锅的事,完全不用负责任,那就说说telnet吧。

如题目,这个问题曾经困扰了我好多年,初识这个问题是在2003年,那时的老师也没有讲清楚。后来我想清楚了,但一直没有时间总结,好像发过朋友圈,但真的是忘了。

早上班车上刷到一篇相关的知乎问题挺有意思:
https://www.zhihu.com/question/22733033
不过仅有的几个回答都没有回答到点子上,包括最长的那个也只是介绍了下telnet而已。倒是提问者自己解释的比较到位:

如果我来回答,我会说 “是的,你的理解很对!”

但本人比较讨厌知乎的那种带着怼天怼地的嘲讽,好多没文化装懂强答的互动氛围,于是基本都是看笑话潜水不参与的状态。还是记录到这里吧。

我最初对这个问题的疑问的缘起是这样的。

我们大专生在学习网络课程的第一课时,老师就讲了 telnet是一个远程登录协议 ,紧接着老师就演示了telnet如何工作。毕竟我们大专生的课程是以实践为主线。但本科网络教材一般不会这么讲的,本科教材一般肯定是撸OSI/RM。

嗯,我第一次接触网络的时候,知道了 “telnet是一个远程登录协议” 这么一个结论。

第二节课我们大专生就开始直接操作TCP/IP了,牛逼了。这节课过后,还是这位老师,告诉我们 “使用telnet可以测试端口通不通” 。有点和第一节课的结论矛盾了…

一个拥有自己特定端口的应用层协议,怎么可以用来测试别的协议端口通不通???

后面我们紧接着学习了HTTP,DNS,FTP等协议,越学越懵…看谢希仁的《计算机网络》本科教材是不会有这种懵逼的感觉的,所以很少有本科生,研究生去纠结这个问题。

不纠结不代表彻底理解。

我是后来工作实践中发现大专两年学的那些操作性的东西完全不够,又自学的本科,研究生教材,才解开这个看似非常简单的疑问。

如果telnet是一个协议,那么它大概和HTTP是并列的,只不过HTTP使用80端口来标示,而telnet使用22端口罢了。这无可厚非。但是事实还有另一面。

所有的应用层协议端口标示都只是一个默认端口而已。

HTTP并不是一定要用80端口,SSH也并不一定要用22端口,任何使用这些协议的软件都会提供一个端口配置参数让你可以修改端口,比如Apache tomcat默认就使用8080端口来标示Web服务,当然,你必须在浏览器里显式输入8080端口:

那么telnet到底是一个协议还是一个软件呢?

同理,ssh登录也允许你使用不同于22的其它端口:

我们之所以可以用非80端口访问Web服务,可以使用非22端口远程ssh登录,完全是因为在这些服务器上显式配置了这些非默认的端口,比如上面我用60022登录了ssh,那是因为我修改了sshd的配置文件并且重启了服务:

不管你把端口改成什么,只要对应客户端访问了该端口,那么得到就是对应的服务,你完全可以让Web服务器侦听22端口,让sshd使用80,然后浏览器里输入:22访问网页,ssh命令行加入-p 80来远程登录。

然而,你不能交叉访问服务,比如我用22访问Web:

那么telnet到底是一个协议还是一个软件呢?

你也不能用8080访问ssh:


如果不把telnet扯进来,这些都是很容易理解的。

单单看telnet这个命令,它长得就和ssh命令差不多,在TCP的C/S模型看来,它也和浏览器属于同一档位,但是telnet的表现和它们都不同。

telnet占用默认的23端口,这个道理和Web占用默认的80端口,ssh占用默认的22端口是一致的。

但是, 你几乎从来没有登录过23端口! 也就是说, 你几乎从来没有“不带端口参数”使用过telnet命令!

想想看是不是呢?

如果我使用ssh,携带了端口参数(-p $port指示),上面讲了,那是因为我的服务器配置文件中将侦听端口改成了那个端口,如果不使用那个端口,便不通!那么对应到telnet,我们使用下面的命令:

[[email protected] ~]# telnet 192.168.56.110 8080

是不是意味着telnet服务器的侦听端口改成了8080,如果没有改成8080,这个访问就不通呢?

根本不是!

192.168.56.110上的8080端口是Tomcat的Web服务端口,根本不是telnet服务器的端口,这台机器上甚至没有安装telnet服务器程序!然而,回车键敲下去,还是通的:

[[email protected] ~]# telnet 192.168.56.110 8080
Trying 192.168.56.110...
Connected to 192.168.56.110.
Escape character is '^]'.

并没有因为telnet服务器的配置不是8080而导致不通,它甚至可以解释HTTP!当我按照HTTP 1.X的规范输入get /并连续敲入回车(注意,不是HTTP规范中的两个回车!)后,tomcat的报错html页面竟然返回了:

[[email protected] ~]# telnet 192.168.56.110 8080
Trying 192.168.56.110...
Connected to 192.168.56.110.
Escape character is '^]'.
get /
<!doctype html><html lang="en"><head><title>HTTP Status 405 – Method Not Allowed</title><style type="text/css">h1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} h2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} h3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} body {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} b {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} p {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;} a {color:black;} a.name {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 405 – Method Not Allowed</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Message</b> JSPs only permit GET POST or HEAD</p><p><b>Description</b> The method received in the request-line is known by the origin server but not supported by the target resource.</p><hr class="line" /><h3>Apache Tomcat/8.5.37</h3></body></html>