📜  curl tcp 握手 ssl 握手时间 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:30:13.481000             🧑  作者: Mango

Curl TCP 握手和 SSL 握手时间 - Shell/Bash

当我们使用 Curl 连接到一个服务器时,它将执行 TCP 握手和 SSL 握手过程。这些握手过程可以影响我们的连接速度,因此了解它们的时间是很有用的。

TCP 握手

TCP握手是建立TCP连接时的第一步。它的目的是确保客户端和服务器之间的网络通信是有效的。TCP握手有三个步骤:SYN、SYN-ACK和ACK。

我们可以使用 Curl 中的“--trace”选项来检查 TCP 握手时间。例如,我们可以运行以下命令:

curl --trace-time --trace - https://www.example.com

这将输出 Curl 到服务器的所有网络请求和响应,并显示每个操作的时间戳。我们可以从输出中找到以下行,它们标识了 TCP 握手操作:

# ... 其他操作 ...
14:09:23.879615 IP <client> > <server>: Flags [S], seq <client_seq>, win <client_win>, options [mss <mss_size>]  # 客户端发送 SYN
14:09:23.961456 IP <server> > <client>: Flags [S.], seq <server_seq>, ack <client_seq + 1>, win <server_win>, options [mss <mss_size>] # 服务端回复 SYN-ACK
14:09:23.961550 IP <client> > <server>: Flags [.], ack <server_seq + 1>, win <client_win> # 客户端回复 ACK

上述输出可以看到 TCP 握手完成的时间,例如 14:09:23.87961514:09:23.961550 的时间差等于 0.081935 秒。

SSL 握手

一旦建立了 TCP 连接,服务器和客户端将开始 SSL 握手。它的目的是交换双方的密钥,以加密和解密数据流。

和 TCP 握手一样,我们还可以使用 Curl 中的“--trace”选项来检查 SSL 握手时间。同时需要开启“--insecure”选项,因为我们的示例网站不是受信任的证书。例如,我们可以运行以下命令:

curl --trace-time --trace - --insecure https://www.example.com

这将输出类似以下的行:

# ... 其他操作 ...
14:27:29.791833 SSL_connect:SSLv3/TLS write client hello
14:27:29.884276 SSL_connect:SSLv3/TLS read server hello
14:27:29.884327 SSL_connect:SSLv3/TLS read server certificate
14:27:29.884389 SSL_connect:SSLv3/TLS read server key exchange
14:27:29.884603 SSL_connect:SSLv3/TLS read server done
14:27:29.884638 SSL_connect:SSLv3/TLS write client key exchange
14:27:29.884783 SSL_connect:SSLv3/TLS write change cipher spec
14:27:29.884826 SSL_connect:SSLv3/TLS write finished
14:27:29.885050 SSL_connect:SSLv3/TLS read server session ticket
14:27:29.885078 SSL_connect:SSLv3/TLS read server finished

我们可以看到以上输出中 SSL 握手的所有步骤。在这里,从 SSL_connect:SSLv3/TLS write client helloSSL_connect:SSLv3/TLS read server done 的时间差等于 SSL 握手时间。

总结

在本文中,我们学习了如何使用 Curl 的“--trace”选项来检查 TCP 握手和 SSL 握手时间。这些检查对于排除网络连接问题和调试应用程序时非常有用。