因为老是忘记https协议为什么这么安全,就写下这篇文章以此用来记录。
HTTP协议基础
定义与概述
HTTP(Hypertext Transfer Protocol,超文本传输协议)是互联网上应用最广泛的一种网络协议,主要用于客户端(如浏览器)和服务器之间的通信。它是Web数据交换的基础,支持网页浏览、API调用等场景。
工作原理
HTTP协议是一个应用层协议,基于TCP/IP协议(默认端口80/HTTP,443/HTTPS),其工作流程可分为以下几个关键阶段:
连接建立
客户端通过TCP三次握手与服务器建立连接
HTTPS在此基础上还需要完成TLS握手加密过程
请求发送
客户端构造并发送HTTP请求报文,包含:
请求行:方法(GET/POST等)、目标URL、协议版本(如HTTP/1.1)
请求头:附加元数据(如User-Agent、Content-Type)
请求体(可选):如POST方法提交的表单数据
示例请求:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0
服务器处理
服务器解析请求,执行相应操作(如读取资源、调用API)。
响应返回
服务器返回结构化响应报文,包含:
状态行:状态码(如200 OK、404 Not Found)
响应头:元数据(如Content-Type、Set-Cookie)
响应体:实际数据内容(HTML、JSON等)
示例响应:
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1234 <html>...</html>
连接管理
HTTP/1.1默认保持连接复用(避免重复握手)
HTTP/2支持多路复用,进一步提升效率
常见请求方法和状态码分类:
请求方法:
状态码分类:
TCP的三次握手与四次挥手
补充一下TCP的三次握手与四次挥手
所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect()
时。将触发三次握手。
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入
SYN_SEND
状态。第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入
SYN_RCVD
状态。第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入
ESTABLISHED
状态,当服务器端接收到这个包时,也进入ESTABLISHED
状态,TCP 握手结束。
三次握手的过程的示意图如下:
TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),也叫做改进的三次握手。客户端或服务器均可主动发起挥手动作,在 socket 编程中,任何一方执行 close()
操作即可产生挥手操作。
第一次挥手(FIN=1,seq=x)
假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。
发送完毕后,客户端进入
FIN_WAIT_1
状态。第二次挥手(ACK=1,ACKnum=x+1)
服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接。
发送完毕后,服务器端进入
CLOSE_WAIT
状态,客户端接收到这个确认包之后,进入FIN_WAIT_2
状态,等待服务器端关闭连接。第三次挥手(FIN=1,seq=y)
服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为1。
发送完毕后,服务器端进入
LAST_ACK
状态,等待来自客户端的最后一个ACK。第四次挥手(ACK=1,ACKnum=y+1)
客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入
TIME_WAIT
状态,等待可能出现的要求重传的 ACK 包。服务器端接收到这个确认包之后,关闭连接,进入
CLOSED
状态。客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入
CLOSED
状态。
四次挥手的示意图如下:
HTTPS协议
安全基础:TLS协议
HTTPS协议的安全核心在于其内嵌的TLS(Transport Layer Security)协议。TLS在客户端与服务器之间建立了一条加密、认证且保证数据完整性的安全通道,从而全面保护HTTP通信。简而言之:
HTTPS = HTTP + SSL/TLS
SSL/TLS发展历程
SSL(Secure Sockets Layer)
由网景公司(Netscape)于1990年代开发
早期版本(如SSL 3.0)因安全漏洞已被全面弃用
TLS(Transport Layer Security)
作为SSL的标准化升级版本,由IETF组织维护
最新版本TLS 1.3(2018年发布)在安全性和效率上有显著提升
技术注释:斜杠"/"表示两者属于同一技术谱系,TLS是SSL的演进版本
协议分层模型
OSI七层模型 vs TCP/IP四层模型
TLS协议如果归类其中一层的话,那么它属于表示层里面,加密数据的这一层。
但是这是理论上的分层,实际互联网发展过程中,并没有分成这么细,而是将上三层,应用层、表示层、会话层合并成了一层成为了应用层,然后数据链路层和物理层合并成了网络接口层,这就发展成为了TCP/IP四层模型,这也是互联网的真实标准,说明了理论和实际上的差距。
想象很丰满,现实很骨感😂。
关键区别:
OSI模型:理论严谨,适合教学。
TCP/IP模型:实用主义,互联网的真实标准。
实践建议:学习时理解OSI分层思想,实践中聚焦TCP/IP模型+应用层协议
TLS握手流程详解
说完了OSI模型,那么我们继续来说TLS协议。TLS 在 HTTPS 中如何发挥安全作用的呢?当客户端(如浏览器)首次访问一个 HTTPS 网站时,会完整执行 TLS 握手流程:
1.当客户端首次访问HTTPS网站时,完整的TLS握手包含以下关键步骤:
协议协商
客户端与服务器确认支持的最高TLS版本
共同选定最优加密套件(Cipher Suite),指定:
密钥交换算法(如ECDHE)
对称加密算法(如AES-256-GCM)
消息认证算法(如SHA-384)
身份验证
服务器发送数字证书链
客户端验证:
证书签名有效性
有效期检查
域名匹配验证
吊销状态检查
密钥交换
通过非对称加密安全协商出预主密钥
典型方式:
RSA密钥传输(TLS 1.3已不推荐)
ECDHE密钥交换(前向安全)
会话密钥生成
基于预主密钥生成主密钥(Master Secret)
派生实际加密使用的会话密钥
握手验证
交换并验证Finished消息
确认握手过程完整且未被篡改
会话复用优化:
服务器生成唯一Session ID并缓存密钥材料
后续连接可跳过完整验证流程,直接复用会话
三大安全支柱
HTTPS的安全性建立在TLS协议的三大核心机制上:
数据加密(Confidentiality)
实现方式:
握手后使用对称加密(如AES)保护应用层数据
非对称加密(如RSA)仅用于安全交换对称密钥
安全效果:即使通信被截获,攻击者也无法解密内容
身份认证(Authentication)
数字证书机制:
包含服务器公钥和身份信息
由受信任CA机构签发并签名
验证流程:
客户端验证证书链签名
检查域名匹配和有效期
确认颁发CA在可信列表中
数据完整性(Integrity)
实现技术:
HMAC消息认证码
加密哈希校验
保护效果:确保传输数据未被篡改
安全标识解析
当浏览器地址栏显示"https://"和挂锁图标时,表示:
服务器身份已通过权威CA验证
所有通信数据均被高强度加密
传输过程具备防篡改保护
这种端到端的安全保障使得HTTPS成为现代互联网隐私保护的基石。
技术演进提示:随着TLS 1.3的普及,握手过程已优化为1-RTT甚至0-RTT,在保持安全性的同时显著提升性能