【问题标题】:How does telnet differ from a raw tcp connectiontelnet 与原始 tcp 连接有何不同
【发布时间】:2012-09-25 16:01:42
【问题描述】:

我正在尝试通过 python 脚本向服务器发送命令。我可以看到正在服务器上建立套接字连接。但是我发送的命令似乎没有通过(服务器对套接字进行读取)。 服务器当前支持 telnet 命令解释器。即:你telnet到命令地址和端口,你就可以开始发送了 字符串命令。 我的问题是,与使用 telnet 相比,通过 tcp 套接字发送字符串有什么根本不同。 我使用了原始套接字和 Twisted 框架。

【问题讨论】:

  • 区别就像汽车和发动机的区别一样。 Telnet 可以使用 TCP 套接字实现,就像汽车可以使用特定类型的引擎制造一样。

标签: python sockets network-programming telnet


【解决方案1】:

Telnet 是一种传递有关通信通道的控制信息的方法。它定义了行缓冲、字符回显等,并在连接开始时(以及在极少数情况下,在会话期间)通过一系列 will/wont/do/dont 消息完成。

这可能不是您的服务器文档的意思。相反,这可能意味着您可以使用诸如“Telnet”之类的程序打开到端口的 TCP 套接字,并与服务器上的命令解释器进行交互。

当 Telnet 程序连接时,它通常会在实际响应之前侦听这些控制消息,因此将使用实际上不使用 telnet 协议的 TCP/socket 连接,恢复为简单的原始管道。服务器必须做所有的字符回显、行缓冲等。

所以在你的的情况下,服务器很可能使用一个没有 telnet 转义序列的原始 TCP 流,因此没有区别。

【讨论】:

  • python 在这方面非常出色。有一个 telnetlib。
  • @Brian_White,您能否提供“恢复为简单的原始管道”的文档参考?
  • 我不确定它是否属于任何 RFC。该声明来自我编写telnet 客户端并将其与现有客户端的行为进行比较的经验,因此是“典型”限定词。当然,它不会完全是原始的,因为不能直接传递IAC 字符,但这对于控制台用户界面来说通常不是问题。您可以使用telnet 连接到任何开放端口(例如web 端口80)自行检查,并观察客户端没有发送IAC 控制序列。
  • 第三句没看懂。如果我跟踪连接,它看起来很原始。
  • 假设您的意思是第三个段落:唯一的区别是流中嵌入了一些控制序列。 IAC FOO BAR(二进制,而不是 ascii)如果服务器从不发送它们(并且许多系统没有),那么您将拥有与原始连接非常相似的东西。我说“相似”是因为它不是完全 8 位干净的;任何IAC (0xFF) 字符都应转义为IAC IAC
【解决方案2】:

请记住,Telnet 是一个应用层协议,而 TCP 是一个传输层协议。 Telnet 使用 TCP 来传输数据。这是 Telnet 和 TCP 之间的一个很大的根本区别。

见:OSI Model wikipedia page

【讨论】:

    【解决方案3】:

    来自Wikipedia page telnet

    ...用户数据与 Telnet 控制信息散布在带内...

    所以,回答你的问题,是的,telnet 确实不同于原始套接字。

    RFC 854 描述了 telnet 协议,如果您想尝试实现它,或者如果您更喜欢现有的 python 客户端,可以使用telnetlib

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2019-11-30
      • 2011-08-23
      • 2012-05-30
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多