为什么我访问google.com:8000浏览器就挂了,但是访问google.com:443却出错呢?

为什么我访问google.com:8000浏览器就挂了,但是访问google.com:443却出错呢?

我正在学习端口,并且四处乱逛。我发现当我访问http://google.com:8000(我随机选择的端口),我的浏览器挂了一段时间后就超时了。

但当我访问http://google.com:443,我立即收到错误。(错误文本似乎是特定于浏览器的 - Chrome 说“空响应”,而 Safari 声称服务器“意外断开了连接”。)

我知道 443 是 HTTPS 协议的默认端口,所以我猜想这可能与此有关,但我对这些概念不够熟悉,无法找出原因。特别是,有人可以告诉我当我指定错误的端口号并且我的浏览器在超时前挂起(大约 1 分钟)时会发生什么吗?

答案1

当您使用浏览器前往某个地方并指定某个端口时,您正在尝试与该端口建立 (TCP) 连接。

当您运行服务(例如 Web 服务器)时,它会在特定端口上运行。如果您尝试连接到某台计算机,但该端口没有运行任何程序(正确的术语是与端口绑定),或者该计算机有防火墙,则连接将超时。

当您通过端口 8000 访问 Google 时,该端口上没有运行任何服务,因此超时。(实际上,它会尝试连接几次,以防前几次出现错误,从而使连接更加可靠)

当您通过端口 443 访问 Google 时,您成功建立了连接,因为 443 通常用于 HTTPS(即安全连接)。由于您没有按照 HTTPS 协议启动安全连接,因此 Chrome 和 Firefox 的行为就是这样的。

高级答案

在 TCP 上建立连接时,会有一个“三次握手”过程 - 客户端向服务器发送一个“SYN”数据包。服务器接收该数据包,然后假设有一个程序正在运行,它会发回一个“SYN-ACK”确认,然后客户端向服务器发送一个“ACK”数据包 - 此时系统已建立连接。

在连接到端口 8000 的情况下,客户端没有得到对 SYN 数据包的响应,因此它会尝试几次,然后放弃并超时。

如果连接到端口 443,则在 TCP 级别建立连接。此时,服务器希望协商 SSL 连接以确保安全(因为它已在端口 443 上配置为这样做)。您不懂如何使用 SSL,因此失败了。

奖励积分

如果您安装了 TELNET - 大多数系统都安装了,您可以通过执行以下操作假装自己是一个浏览器(或邮件客户端,或者其他,如果您知道协议的话)。

1.  type "telnet www.google.com 80"
(wait for a few seconds)
2.  Type GET / HTTP/1.1<enter>
host www.google.com<enter><enter>

步骤 1 告诉 Telnet 在端口 80 上创建到 Google 服务器的 TCP 连接,步骤 2 说明要获取的内容(GET / 表示获取根文件),“host”行说明您要连接到哪个服务器 - 您需要这个是因为许多网站共享一个服务器 - 第二行告诉服务器是哪个站点。按两次回车键表示您已完成发送标头,然后返回 HTTP 响应。(如果您是网络浏览器,您将发送更多信息,包括浏览器详细信息、cookie 等 - 但出于解释目的,我们没有这样做。)

相关内容