SSH 协议版本交换顺序重要吗?

Does SSH protocol version exchange order matter?

我知道服务器会发送它的 SSH 版本,客户端也会这样做。我想知道顺序是否重要。

此外,我想知道是否可以让 SSH 服务器在发送自己的版本之前从客户端接收 SSH 版本?

您可以使用 Wireshark 连接 SSH 并查看 TCP 级别的通信。 SSH 客户端将在服务器之前首先发送其协议版本。

我认为您没有更改通信顺序的灵活性。使用我的 SSH 客户端(OpenSSH_8.1p1,LibreSSL 2.7.3)我可以看到一旦 SYN-ACK 完成,服务器正在等待 SSH 客户端发送它支持的协议版本。

在这种情况下您不能更改协议的顺序;它在 RFC 中是固定的,顺序确实很重要。服务器将其版本作为打开请求的一部分发送,然后客户端发送其版本。之后,双方交换双方支持的算法列表,选择的算法一般是客户端支持的第一个,服务端也支持的算法。

虽然您无法更改协议版本号公告,但您可以根据客户端发送的版本选择提供不同的算法。例如,某些版本的 OpenSSH 错误地实现了 curve25519-sha256@libssh.org,因此知道这一点的服务器可能会选择不向损坏的 OpenSSH 版本提供该算法。同样,客户端可以根据服务器的版本公告向服务器公告不同的算法。

SSH protocol version exchange 的顺序未指定;它说:

When the connection has been established, both sides MUST send an identification string. This identification string MUST be

SSH-protoversion-softwareversion SP comments CR LF

RFC 可能对协议版本交换顺序保持沉默,因为实际上,这是一场比赛,顺序应该无关紧要。当服务器接受客户端的 TCP 连接时,客户端和服务器发送它们的版本信息...谁先到达对方只是速度、流量等问题。

作为客户端,你不能(或者不应该……)“让”服务器等待;一个特定的服务器实现在发送它自己的信息之前当然有可能等待客户端,但这是一个服务器实现细节。