HTTP 与 HTTPS 的三次握手与四次挥手详解

文章目录

      • [HTTP 与 HTTPS 的三次握手与四次挥手详解](#HTTP 与 HTTPS 的三次握手与四次挥手详解)
      • [一、HTTP 的三次握手与四次挥手](#一、HTTP 的三次握手与四次挥手)
        • [1. HTTP 三次握手](#1. HTTP 三次握手)
        • [2. HTTP 四次挥手](#2. HTTP 四次挥手)
      • [二、HTTPS 的三次握手与四次挥手](#二、HTTPS 的三次握手与四次挥手)
        • [1. HTTPS(无证书)的三次握手与 SSL/TLS 握手](#1. HTTPS(无证书)的三次握手与 SSL/TLS 握手)
        • [2. HTTPS(有证书)的三次握手与 SSL/TLS 握手](#2. HTTPS(有证书)的三次握手与 SSL/TLS 握手)
        • [3. HTTPS 的四次挥手](#3. HTTPS 的四次挥手)
      • 总结

HTTP 与 HTTPS 的三次握手与四次挥手详解

在互联网的世界中,HTTP(HyperText Transfer Protocol)和 HTTPS(HTTP Secure)是我们常见的两种网络协议。HTTP 是一种用于传输网页数据的协议,而 HTTPS 是在 HTTP 基础上加入了 SSL/TLS 加密层以确保数据安全的协议。两者都基于 TCP/IP 协议,因此在建立和断开连接时,都会经历"三次握手"与"四次挥手"的过程。本文将详细讲解这两种协议的三次握手与四次挥手的过程,并对 HTTPS 中有证书与无证书的情况进行区分。


我们先看看基本的计算机网络中的TCP连接建立和断开的过程。

一、HTTP 的三次握手与四次挥手

HTTP 基于 TCP 协议,使用 TCP 的三次握手建立连接,使用四次挥手断开连接。由于 HTTP 不涉及加密或证书,因此整个连接流程相对简单,直接使用 TCP 进行通信。

1. HTTP 三次握手

HTTP 的三次握手过程如下:

  1. 第一次握手(SYN)

    • 客户端发送一个 SYN(同步序列编号)包,请求建立连接。
    • 此时,客户端进入 "SYN_SENT" 状态。
  2. 第二次握手(SYN + ACK)

    • 服务器收到 SYN 包后,回复一个 SYN + ACK 包,表示确认收到客户端的请求,并发送了自己的 SYN 请求。
    • 服务器进入 "SYN_RECV" 状态。
  3. 第三次握手(ACK)

    • 客户端收到服务器的 SYN + ACK 包后,再次发送一个 ACK(确认)包给服务器,表示连接建立成功。
    • 此时,客户端和服务器都进入 "ESTABLISHED" 状态,可以进行数据传输。
2. HTTP 四次挥手

HTTP 的四次挥手用于安全地断开 TCP 连接,确保双方的数据传输完毕,并安全释放资源。

  1. 第一次挥手(FIN)

    • 客户端发送一个 FIN(结束)包给服务器,表示自己已经没有数据要发送了,要求断开连接。
    • 发送完 FIN 后,客户端进入 "FIN_WAIT_1" 状态。
  2. 第二次挥手(ACK)

    • 服务器收到 FIN 包后,回复一个 ACK 包给客户端,表示确认收到断开请求,但服务器可能还有数据要传输。
    • 服务器进入 "CLOSE_WAIT" 状态,客户端进入 "FIN_WAIT_2" 状态。
  3. 第三次挥手(FIN)

    • 服务器确认数据传输完毕后,向客户端发送 FIN 包,表示同意断开连接。
    • 服务器进入 "LAST_ACK" 状态。
  4. 第四次挥手(ACK)

    • 客户端收到服务器的 FIN 包后,回复一个 ACK 包给服务器,表示确认断开连接。
    • 客户端进入 "TIME_WAIT" 状态,等待一段时间(通常是 2 倍的最大报文段生存时间),确保服务器收到了 ACK 包后再彻底关闭连接。
    • 服务器收到 ACK 包后进入 "CLOSED" 状态,连接正式关闭。

二、HTTPS 的三次握手与四次挥手

HTTPS 在 HTTP 的基础上增加了 SSL/TLS 层进行加密通信。HTTPS 不仅仅是 TCP 的三次握手,还涉及 SSL/TLS 握手,用于确定双方使用的加密协议和密钥。因此,我们需要区分有证书和无证书的情况。

1. HTTPS(无证书)的三次握手与 SSL/TLS 握手

在一些特殊情况下(例如本地测试环境中),可能不会使用正式的 SSL/TLS 证书。此时的流程主要依赖于 TCP 三次握手和简单的加密协议协商,证书验证的部分被简化或跳过。

TCP 三次握手

  • 无证书情况下,HTTPS 的 TCP 三次握手步骤与 HTTP 相同,先通过 TCP 连接建立通信。

TLS 握手过程

  • SSL/TLS 握手开始在 TCP 三次握手之后,负责协商加密算法和生成加密密钥。无证书情况下,流程相对简化,跳过证书验证部分。

    1. ClientHello :客户端发送一个 ClientHello 消息,其中包含支持的加密算法和随机数。
    2. ServerHello :服务器响应 ServerHello,确认加密算法,并提供另一随机数。
    3. 密钥生成:双方基于这两个随机数,结合协商的加密算法生成共享密钥,用于后续通信的数据加密。
2. HTTPS(有证书)的三次握手与 SSL/TLS 握手

在正式应用中,HTTPS 通常需要服务器端证书,客户端也可能需要证书。在这种情况下,SSL/TLS 握手会更加复杂,涉及证书的验证过程。

TCP 三次握手

  • HTTPS 有证书情况下,TCP 三次握手的步骤与 HTTP 相同,先建立 TCP 连接。

SSL/TLS 握手过程

  • 连接建立后,SSL/TLS 握手开始,其主要目的是在双方之间建立安全的加密通道,以下是详细步骤:

    1. ClientHello

      • 客户端发送 ClientHello 消息,包含支持的 TLS 版本、加密算法、一个客户端随机数等。
    2. ServerHello

      • 服务器收到 ClientHello 后,回复 ServerHello 消息,确认 TLS 版本、加密算法,并提供一个服务器随机数。
    3. 服务器发送证书

      • 服务器发送其数字证书(通常是 CA 签发的),用于验证其身份。
    4. 客户端验证证书

      • 客户端验证服务器证书的合法性,确保其是由可信的证书颁发机构(CA)签发的,并且证书没有过期或被篡改。
      • 如果证书验证成功,继续握手流程;如果验证失败,握手失败,连接中断。
    5. 生成预主密钥

      • 客户端生成一个称为预主密钥的随机数,并使用服务器的公钥加密该随机数,发送给服务器。只有服务器可以使用其私钥解密该密钥。
    6. 双方生成主密钥

      • 服务器和客户端使用之前生成的随机数和预主密钥,基于协商的加密算法,生成主密钥。该密钥用于对接下来的通信进行加密。
    7. ClientFinished & ServerFinished

      • 客户端和服务器分别发送 Finished 消息,通知对方握手过程已完成,此时双方可以使用对称加密进行通信。
3. HTTPS 的四次挥手

HTTPS 的四次挥手与 HTTP 的四次挥手基本相同,因为它们都依赖于 TCP 的连接断开机制。唯一的区别在于 HTTPS 在断开连接前,确保所有加密数据都已成功传输且解密完成,之后才进行四次挥手的过程。


总结

HTTP 的三次握手和四次挥手:

  • 直接基于 TCP 进行通信,无加密层。
  • TCP 三次握手建立连接,四次挥手断开连接。

HTTPS 的三次握手和四次挥手:

  • 增加了 SSL/TLS 握手过程,确保数据的加密传输。
  • 有证书情况下,SSL/TLS 握手涉及证书验证和密钥交换过程。
  • 无证书情况下,SSL/TLS 握手流程简化,可能跳过证书验证,但仍然需要协商加密协议和密钥。

通过三次握手和四次挥手,HTTP 和 HTTPS 确保了可靠的连接建立与关闭,而 HTTPS 进一步通过 SSL/TLS 协议实现了数据加密和安全性提升。在实际应用中,HTTPS 应用广泛,因为它能够有效保护数据隐私,确保数据的安全传输。理解三次握手和四次挥手的机制,有助于我们更好地把握网络协议的工作原理,为开发和维护网络应用打下坚实的基础。

相关推荐
速盾cdn1 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
网络安全-老纪8 小时前
iOS应用网络安全之HTTPS
web安全·ios·https
Lws12 小时前
CS144 lab0(个人理解)
网络协议
C++忠实粉丝16 小时前
计算机网络socket编程(2)_UDP网络编程实现网络字典
linux·网络·c++·网络协议·计算机网络·udp
添砖java_85716 小时前
UDP数据报套接字编程
网络·网络协议·udp
lxkj_202418 小时前
修改ffmpeg实现https-flv内容加密
网络协议·https·ffmpeg
千羽星弦18 小时前
Apache和HTTPS证书的生成与安装
网络协议·https·apache
程序猿小D21 小时前
第三百三十节 Java网络教程 - Java网络UDP服务器
java·开发语言·网络·网络协议·udp·多线程
是理不是里_1 天前
常见的网络协议汇总(涵盖了不同的网络层次)
网络·网络协议
Peter_chq1 天前
【计算机网络】HTTP协议
linux·c语言·开发语言·网络·c++·后端·网络协议