当前位置: 首页 > news >正文

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

文章目录

      • HTTP 与 HTTPS 的三次握手与四次挥手详解
      • 一、HTTP 的三次握手与四次挥手
        • 1. HTTP 三次握手
        • 2. HTTP 四次挥手
      • 二、HTTPS 的三次握手与四次挥手
        • 1. HTTPS(无证书)的三次握手与 SSL/TLS 握手
        • 2. HTTPS(有证书)的三次握手与 SSL/TLS 握手
        • 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 应用广泛,因为它能够有效保护数据隐私,确保数据的安全传输。理解三次握手和四次挥手的机制,有助于我们更好地把握网络协议的工作原理,为开发和维护网络应用打下坚实的基础。

相关文章:

  • android.bp cc_defaults
  • react中的ref三种形式
  • 单细胞miloR分析(基于 KNN 图的细胞差异丰度分析方法)
  • 初始C++模板
  • Solidity智能合约中的异常处理(error、require 和 assert)
  • 【CAM350】使用总结 <一>{ 光绘Gerber 对齐 }
  • 【JavaScript】尾递归优化
  • BaoStock 的安装
  • 内网攻击思路流程与信息收集
  • 【Element-UI】实现el-drawer抽屉的左右拖拽宽度
  • Docker torchserve workflow部署流程
  • 数据文件(0)
  • excel快速入门(二)
  • Windows C++:MoveFile、MoveFileEx、MoveFileWithProgress、CopyFile、CopyFileEx。
  • S32K312 RTD 4.0.0 版本 OCU 例程配置流程说明
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 10个最佳ES6特性 ES7与ES8的特性
  • CentOS7 安装JDK
  • centos安装java运行环境jdk+tomcat
  • DataBase in Android
  • ES6 ...操作符
  • Otto开发初探——微服务依赖管理新利器
  • React as a UI Runtime(五、列表)
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 产品三维模型在线预览
  • 服务器从安装到部署全过程(二)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 问题之ssh中Host key verification failed的解决
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 在Mac OS X上安装 Ruby运行环境
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 回归生活:清理微信公众号
  • 选择阿里云数据库HBase版十大理由
  • ​520就是要宠粉,你的心头书我买单
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #《AI中文版》V3 第 1 章 概述
  • #pragma data_seg 共享数据区(转)
  • (floyd+补集) poj 3275
  • (k8s中)docker netty OOM问题记录
  • (二)linux使用docker容器运行mysql
  • (二)Optional
  • (分布式缓存)Redis持久化
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (三)c52学习之旅-点亮LED灯
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)VC++中ondraw在什么时候调用的
  • .net core 的缓存方案
  • .NET gRPC 和RESTful简单对比