我如何能够 telnet 到 HTTP 端口 80?

sps*_*sps 19 networking http telnet

在谷歌搜索后,我发现我们可以telnet将网络服务器连接到其 http 端口并用于GET检索 html 页面。

例如:

$ telnet web-server-name 80
Run Code Online (Sandbox Code Playgroud)

但我无法理解这怎么可能?

我认为如果端口 80 用于 http 服务器,那么端口 80 只会侦听http请求。但是我怎么能telnet到一个HTTP端口呢?

不是telnetHTTP两个不同的协议吗?

del*_*ray 29

恭喜,您刚刚通过意识到端口和协议没有直接相互连接来深入研究网络层的概念。正如其他人所说,telnet 可用于连接到任何 TCP 端口。然而,要理解为什么这是可能的,您需要了解一些关于网络层的知识。如果您听说过OSI 7 层模型,这就是允许您使用 telnet 连接到另一个端口的原因。尽管在 Internet 上,他们只关心其中的 4 层,称为Internet 协议套件. 如果没有层层网络,每个程序不仅需要了解自己的协议,还必须定义自己的 IP 寻址方案和端口系统,这意味着每个路由器都需要了解如何路由这些方案,而不同的协议将很多更难学习和诊断。简而言之,如果没有层,Internet 几乎无法正常工作。

你关心的是传输层和应用层。在传输层,我们有像 TCP 和 UDP 这样的 Internet 协议,每个协议的端口号从 1 到 65535。在应用层,我们有 HTTP、SMTP 和 DNS 等协议。通常,定义协议的每个 Internet 标准文档都指定了该协议默认应使用的默认 TCP 或 UDP 端口。例如:HTTP 使用 TCP 端口 80,SMTP 使用 TCP 端口 25,DNS 使用 UDP 端口 53,Telnet 使用 TCP 端口 23。telnet程序其实讲的是TELNET协议,这是一个标准的协议,但按照目前的标准,大多是古老的。因为它的协议序列是由 8 位字符组成的,所以与其他更现代的协议(如 HTTP 和 SMTP)相比,你很少看到协议本身,而且它大部分是透明的,这些协议使用人类可见的 ASCII 字,如 GET、POST、HELO、LOGIN,等等。

因为它的协议通常不可见,所以 telnet 是一个不错的工具,用于连接到其他 TCP 端口并允许用户手动输入协议。一些网络管理员使用这种技术来诊断服务器问题。但是,由于 telnet 程序仍然有自己的协议,并且有时可能会发送额外的数据位,因此您仍然可能会遇到使用此技术的问题。当您使用 telnet 时,您实际上是在应用层和传输层“建立连接”。碰巧的是,其他应用层协议可以通过它进行大多数诊断,并且不会干扰 telnet 协议。有一个更好的程序可以通过称为 nc(Net Cat。它的名字来自 cat 命令的基于网络的版本)来执行此操作。

$ nc www.stackexchange.com 80
Run Code Online (Sandbox Code Playgroud)

nc 程序不涉及任何应用层协议,当您与它建立连接时,您仅在 Internet 层(IP 地址)和传输层(TCP 或 UDP)“建立连接”。这意味着您可以控制使用的应用层协议。几乎任何事情都是公平的游戏,甚至是二进制协议。这也允许你做一些有用的事情,比如在不损坏文件的情况下传输文件并监听传入流量的端口:

nc -l 9000 < movie.mp4  (Your friend runs this)

nc friends.computer.hostname 9000 > movie.mp4  (you run this)
Run Code Online (Sandbox Code Playgroud)

然后,movie.mp4 完全不使用应用层协议(如 FTP)通过网络传输。应用程序协议实际上是你的朋友告诉你他们已经准备好让你运行你的命令。

nc 还可以处理 UDP 数据包和 UNIX 域套接字。用它来聆听也很有趣。

nc -l 12345
Run Code Online (Sandbox Code Playgroud)

现在在您的 Web 浏览器中访问http://localhost:12345/并且在您的 nc 会话中您应该会看到浏览器的GET / HTTP/1.1请求。在这一点上,您可以输入一些内容并按下Ctrl-D,它应该以纯文本形式显示在您的浏览器中(如果您希望显示 HTML,您必须将正确的 HTTP 协议响应发送回 HTML 代码)。

有时,本机使用一种协议(如 HTTP)的程序可以连接到用于不同协议的其他端口。您通常无法在 GUI 浏览器中执行此操作,因为它们已限制它们连接到某些端口,但是如果您使用 curl 之类的程序连接到端口 25(用于发送邮件的 SMTP),您可能会看到几个关于破坏协议的错误。

$ curl yourispsmtpserverhost.com:25
220 yourispsmtpserverhost.com ESMTP Postfix
221 2.7.0 Error: I can break rules, too. Goodbye.
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 curl 通常使用 HTTP 协议,因此在建立 TCP 握手后,它开始发送数据,如下所示:

GET / HTTP/1.1
Host: yourispsmtpserverhost.com:25
User-agent: curl
Run Code Online (Sandbox Code Playgroud)

但是 SMTP 服务器期望的是 SMTP,它更像是这样:

HELO myhomecomputername.local
Run Code Online (Sandbox Code Playgroud)

此时服务器发回其标识行:

250 yourispsmtpserverhost.com
Run Code Online (Sandbox Code Playgroud)

所以你看到没有什么可以阻止 curl 与 SMTP 服务器建立传输层连接,它只是不能说协议。但是您可以自己使用 telnet 之类的程序或更佳地 nc 来讲述协议。


cas*_*cas 7

telnet 是一个可以连接到任何tcp端口的工具。

默认情况下,它连接到 telnet 端口 (23),但您可以告诉它连接到 http 端口 (80) 或 smtp 端口 (25) 或其他任何端口。

不过,您需要知道如何“说出”远程服务器在该端口上侦听的协议。

例如,如果您想获取网站的标题(域名等已更改以保护犯罪者):

$ telnet www.example.com 80
Trying xxx.xxx.xxx.xxx...
Connected to www.example.com.
Escape character is '^]'.
HEAD http://www.example.com/ HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 30 Oct 2015 09:28:58 GMT
Server: Apache/2.4.17 (Debian)
Last-Modified: Sun, 14 Nov 2010 06:30:26 GMT
ETag: "843-494fd75830480"
Accept-Ranges: bytes
Content-Length: 2115
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

HEAD行是我在连接中输入的内容。请注意,http 协议要求您发送一个空行来指示您的 HEAD 或 GET 或任何请求的结束。这是 HEAD 请求之后的空白行。