如果我通过 ssh 进入服务器,那么从发出 ls 命令到获取结果之间的时间几乎为零。
但是,如果我在浏览器中对同一台服务器上的简单 html 页面(仅包含单词“hello”)发出 http 请求,则至少需要一秒钟。
为什么是这样?
答案1
我对 SSH 的工作原理了解不多,但据我所知,它基本上接收键盘输入并将其传输到远程控制台的 shell 中。一旦建立连接并交换密钥,就相当轻量了。
HTTP 是一种完全不同的协议。它的工作原理有点像这样,假设它只是一个静态 HTML 页面:
- 建立 TCP/IP 会话(这可能涉及 DNS 查找)
- 发送 HTTP 标头
- 发送 HTTP 请求正文(GET、POST、PUT 等)
- Web 服务器接收 HTTP 请求
- Web 服务器检查其处理程序映射以确定如何处理请求
- Web 服务器获取静态 HTML 文件
- Web 服务器制定响应标头并将其发送到网络上
- Web 服务器将静态 HTML 文件推送到网络上
- 您的浏览器接收标头
- 您的网络浏览器收到响应
- 您的网络浏览器正在等待关闭连接
- 然后你的网络浏览器解析 HTML
- 然后,你的网络浏览器将 HTML 呈现到显示器上
这是非常基本的概述,但 HTTP 中还有很多内容。与 SSH 不同,它不是“轻量级”协议。
此外,与 SSH 不同的是,大多数 HTTP 请求都是独立的,并且您的 TCP 连接会重新建立。SSH 会保持您的 TCP 会话打开,这意味着每次按下按键时,您都不必重新建立连接。这就是为什么您的 Web 浏览器可以在断电几分钟后继续运行,但一旦您失去连接,您的 SSH 会话就会断开。
答案2
我刚刚对 SSH 连接和 wget 进行了计时。
$ time ssh (host) echo "" > /dev/null
real 0m0.461s
user 0m0.004s
sys 0m0.012s
$ time wget (host)
(deletia)
real 0m0.013s
user 0m0.008s
sys 0m0.000s
“更快”是相对的。
答案3
您正在比较苹果和橘子。
下载单词网页的时间主要包括实际建立连接所需的时间:查找主机的 DNS 记录,然后与其建立 TCP 连接,然后请求文档。
这与您建立 ssh 连接所需的时间更加相似:查找主机的 DNS 记录,然后与其建立 TCP 连接,然后进行身份验证,这实际上要长得多,因为 ssh 是一种更复杂的协议(并且必须设置加密)。
ssh 会话中的交互式响应时间主要取决于实际建立连接后您与远程服务器之间的延迟量。HTTP 中没有一对一的类似物,尽管 HTTP 确实有一个默认启用的保持活动选项,并保持与服务器的连接打开,以便可以下载多个资源而无需再次设置连接的开销。
答案4
不要忘记,交互式 SSH 设置套接字 TCP NODELAY 选项以减少延迟,但会占用带宽,因此几乎您的每个击键都会立即发送到服务器。