【问题标题】:How HTTP servers accepts TelnetHTTP 服务器如何接受 Telnet
【发布时间】:2011-06-11 12:24:43
【问题描述】:

我知道 Telnet 与 HTTP 一样是一种协议。我的想法是,在建立初始 TCP 连接后,Telnet 客户端会将一些特定于 telnet 的代码发送到另一端的服务器,在这种情况下是 HTTP 服务器。但是由于 HTTP 服务器不理解 Telnet 特定代码,它应该会抛出错误或断开连接等。但实际上,如果我们输入正确的 HTTP 标头并发送它们,我们可以 telnet 到 HTTP 服务器并获取页面。怎么会这样?维基百科条目真的没有帮助我理解这一点。 (http://en.wikipedia.org/wiki/Telnet#Telnet_data)

【问题讨论】:

    标签: telnet


    【解决方案1】:

    Telnet 只是一种简单的交互式方式来打开与侦听套接字的 TCP 连接。因为 telnet 客户端盲目地将您键入的内容发送到该套接字,所以理论上它可以在 TCP 之上模拟任何其他协议。实际上,键盘驱动程序解释不可打印字符的事实是唯一的限制。

    HTTP 不使用不可打印的字符,除了用两个连续的“换行符”(即“空白行”)在 HTTP 标头和正文之间进行分隔。
    请注意,这里我说的不是 HTML 正文标记,而是有效负载(例如 SOAP 正文)。

    这里基本上没有魔法。

    让我们看看事物的动态。
    HTTP 支持许多命令,如 GET、POST、PUT 等... 每个命令都有它的语法,并且有一个相关的响应,带有约定的语法和明确定义的错误代码。 当您使用 telnet 连接到 HTTP 服务器时,您打开套接字连接并且服务器分叉一个线程来管理与您的客户端的对话。然后,您可以通过键入浏览器将发送的命令来模仿浏览器。每次按下 CR 键时,客户端都会将该行提交给服务器。如果一个命令包含多行,您可以输入多行,每行对应于命令头的一行。一旦你连续敲击了两个 CR(即一个空行),服务器就认为命令头是完整的,并且将响应放在一起并发回给你的客户端。因为 telnet 客户端的生活目标是回显接收到的字符(除非另有说明),所以您可以在终端窗口上看到响应标头和正文。 Telnet 停在那里。浏览器会呈现 HTML(如果响应是 HTML 页面)。
    我希望这能澄清一切。

    【讨论】:

      【解决方案2】:

      您说 telnet 是它自己的协议是对的,这在几个 RFC 中有描述。您可以查看wikipedia 以了解具体是哪些以及解释该协议的其他一些资源。

      基本上它的工作原理是这样的:当您使用 telnet 连接到服务器时,它会显示服务器发送给您的每个可打印字符。您键入的所有内容都将被发送回服务器。这就是您在连接到 Web 服务器时检索网页的方式:您发送一个 http 服务器接受的命令并获得正确的结果。

      现在,有一些 telnet 特定选项。 IIRC,除非服务器先发送它们,否则您不会将它们发送到服务器。这些选项用于启用/禁用本地回显(考虑密码,您不希望在登录时显示这些密码)、协商终端大小、协商行尾类型。这些是几个字节长的命令,以字节 255 开头(称为 IAC,解释为命令)。当您连接到 telnet 服务器时,您的客户端将在后台自动解释这些内容并做出相应的回复,而不会向您显示这些命令。

      虽然不是特定于 telnet,但 telnet 服务器也可以发送ANSI escape sequences。这些用于颜色、粗体、光标定位,...... telnet 客户端也会解释这些(或者只是将它们传递给您正在使用的终端仿真器,例如 xterm)。

      如果您想要比 telnet 更“低级”的东西,它不会解释 telnet 选项并实际显示您获得的内容,您可能需要查看netcat

      【讨论】:

      • 第二段适用于任何基于文本的应用层协议。问题是如果客户端和服务器使用不同的协议(服务器上的 http 和客户端上的 telnet),客户端和服务器如何就零和一的解释达成一致。这不是答案。
      【解决方案3】:

      您可以使用 telnet 查询 http 服务器,我经常这样做是一种快速而讨厌的测试 telnet 不发送任何代码。它只是建立连接,但如果需要,您可以发送特定于 telnet 的代码

      这样做...

      telnet server.com 80
      GET http/1.0 /^m
      host: server.com^m
      ^m
      
      ... servers response
      

      ^m = 输入键

      我已经这样做了,这是在 linux 中在 windows 中完成的,它可能会有所不同。

      直流

      【讨论】:

      • 好吧,如果我理解正确的话 Telnet 客户端只是创建套接字连接并等待服务器发送一些 Telnet 特定的东西。如果服务器发送一些东西,它会用特定的代码做出反应来协商 NVT 东西。如果不是,它就会挂在那里,直到用户输入一些东西来将它中继到服务器。
      • 据我了解,这取决于您如何启动 telnet。如果您像我在上面所做的那样使用主机和可选端口启动它,它会直接连接到主机并等待命令(您键入的内容)如果您在没有主机的情况下启动它,它将进入命令模式。看看这里 linux.about.com/od/commands/l/blcmdl1_telnet.htm 和 windows 这里 technet.microsoft.com/en-us/library/c.aspx 我无法让上面的示例在 windows 上工作,所以我会尝试找出原因。
      • linux.about.com/od/commands/l/blcmdl1_telnet.htm 解决了我的问题。这取决于您如何启动 Telnet 客户端,尽管我发现 Linux 客户端没有那个特定的开关。
      猜你喜欢
      • 2013-11-22
      • 2014-09-15
      • 2023-03-03
      • 2018-12-25
      • 1970-01-01
      • 2011-07-26
      • 2016-11-18
      • 1970-01-01
      • 2013-11-10
      相关资源
      最近更新 更多