📅  最后修改于: 2023-12-03 15:30:13.481000             🧑  作者: Mango
当我们使用 Curl 连接到一个服务器时,它将执行 TCP 握手和 SSL 握手过程。这些握手过程可以影响我们的连接速度,因此了解它们的时间是很有用的。
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.879615
到 14:09:23.961550
的时间差等于 0.081935 秒。
一旦建立了 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 hello
到 SSL_connect:SSLv3/TLS read server done
的时间差等于 SSL 握手时间。
在本文中,我们学习了如何使用 Curl 的“--trace”选项来检查 TCP 握手和 SSL 握手时间。这些检查对于排除网络连接问题和调试应用程序时非常有用。