HTTP与HTTPS整理

引言

HTTP(超文本传输协议)是互联网的基石,我们每天浏览网页、使用App都离不开它。然而随着网络安全问题日益突出,HTTPS逐渐取代HTTP成为主流。本文将围绕HTTP的核心特性、长连接机制、HTTPS的加密原理、数字证书、DNS解析以及WebSocket等话题,带你彻底搞懂这些网络基础知识。

1. HTTP如何实现长连接,以及什么时候生效

什么是HTTP的长连接?

HTTP本身是应用层协议,其长连接本质上是指底层的TCP长连接。TCP连接是一个双向通道,可以保持一段时间不关闭。在短连接模式下,每次HTTP请求都需要新建TCP连接(三次握手)和断开(四次挥手),开销很大。而长连接允许在一个TCP连接上发送多次HTTP请求,显著减少延迟和资源消耗。例如浏览器请求一个HTML页面后,后续的CSS、JS文件可以复用同一个TCP连接获取。

如何设置长连接?

在HTTP/1.0中,长连接默认是关闭的,需要在请求头中显式添加:

复制代码
Connection: keep-alive

服务器响应时也会返回同样的头。从HTTP/1.1开始,长连接成为默认行为,除非指定Connection: close

长连接什么时候超时?

  • HTTP层超时 :服务器(如Apache、Nginx)可以配置keep-alive timeout,表示TCP连接空闲超过该时间后关闭。

  • TCP层超时:操作系统内核参数控制TCP自身的保活探测。例如Linux中有三个参数:

    • tcp_keepalive_time:连接闲置多少秒后开始探测(默认7200秒)。

    • tcp_keepalive_intvl:探测包发送间隔(默认75秒)。

    • tcp_keepalive_probes:最多发送多少个探测包未响应则断开(默认9次)。

这些参数可以在/etc/sysctl.conf中调整。

2. HTTP和HTTPS的区别

HTTP是明文传输协议,存在三大安全隐患:

  1. 窃听:数据包在网络上传输可被截获。

  2. 冒充:无法确认通信对方是否是真实的服务器。

  3. 篡改:数据可能被中间人修改。

HTTPS = HTTP + SSL/TLS,即用SSL/TLS协议对数据进行加密和身份验证,解决上述问题。主要区别如下:

特性 HTTP HTTPS
协议 HTTP HTTP + SSL/TLS
默认端口 80 443
安全性 明文传输,不安全 加密传输,安全
证书 不需要 需要数字证书
速度 较快 较慢(加解密开销)
SEO 无影响 搜索引擎优先收录HTTPS站点

3. HTTPS的工作流程(公钥、私钥、数字证书)

HTTPS的核心是混合加密:使用非对称加密安全地交换对称密钥,后续通信使用对称加密提高效率。

3.1 基本概念

  • 对称加密:加密和解密使用同一个密钥(如AES),速度快但密钥分发困难。

  • 非对称加密:一对密钥------公钥和私钥。公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密(用于数字签名)。

  • 数字证书:将公钥与网站身份绑定的电子文件,由权威CA机构签发,防冒充。

3.2 HTTPS握手过程(简化版)

  1. 客户端发起请求:客户端(浏览器)向服务器发起HTTPS请求,连接到443端口。

  2. 服务器返回证书 :服务器将自己的数字证书发送给客户端,证书中包含服务器的公钥、颁发机构、有效期等信息。

  3. 客户端验证证书 :客户端用内置的CA公钥验证证书签名,确认服务器身份可信。验证通过后,客户端生成一个随机的对称密钥 (会话密钥),并用证书中的公钥加密该密钥,发送给服务器。

  4. 服务器解密得到密钥 :服务器用自己的私钥解密,获得对称密钥。

  5. 加密通信:双方使用该对称密钥进行后续数据的加密传输。

关键点:私钥始终由服务器保管,从不传输;公钥通过证书公开,即使被截获也无法解密对称密钥,因为只有私钥能解密。这样就实现了安全密钥交换。

3.3 公钥、私钥与加密方式示意图


图中:公钥加密,私钥解密;私钥签名,公钥验签。

4. 数字签名与数字证书

数字签名的生成过程

  1. 对网站的公钥、身份信息等内容进行Hash运算,得到消息摘要

  2. CA机构用自己的私钥对消息摘要加密,生成数字签名

  3. 将公钥、身份信息、数字签名组合成数字证书

证书验证过程

  1. 浏览器收到证书后,用CA机构的公钥解密数字签名,得到原始的消息摘要。

  2. 同时对证书中的公钥和身份信息进行同样的Hash运算,得到新的消息摘要。

  3. 对比两个摘要是否一致:一致则证明证书未被篡改,且确实是该CA签发。

这样,我们就解决了对网站的信任问题:即使攻击者伪造了证书,由于没有CA的私钥,无法生成合法签名,浏览器会发出安全警告。

5. DNS解析过程

当你在浏览器输入www.baidu.com,DNS解析会经历以下步骤(以递归查询为例):

  1. 浏览器缓存:首先检查浏览器自身DNS缓存,若有则直接返回IP。

  2. 本地DNS缓存:若无,则向本地DNS服务器(如路由器或ISP提供的)发起请求,本地DNS也有缓存。

  3. 根域名服务器 :若本地DNS无记录,则向根域名服务器查询,根服务器返回负责.com的顶级域名服务器地址。

  4. 顶级域名服务器 :本地DNS再向.com顶级服务器查询,它返回负责baidu.com的权威域名服务器地址。

  5. 权威域名服务器 :最后向权威域名服务器查询,得到www.baidu.com的IP地址。

  6. 返回并缓存:本地DNS将IP返回给浏览器并缓存,浏览器再根据IP发起HTTP请求。

6. WebSocket和HTTP的区别和联系

WebSocket是一种全双工通信协议,它与HTTP的关系密切:

  • 握手阶段 :WebSocket连接通过HTTP Upgrade机制建立,请求头中包含Upgrade: websocket,服务器同意后切换协议。

  • 通信模式:HTTP是单向请求-响应模式,客户端必须主动发起;WebSocket连接建立后,双方可以随时主动发送消息。

  • 连接状态:HTTP默认无状态,短连接;WebSocket是有状态的长连接。

  • 头部开销:HTTP每次请求都携带大量头部;WebSocket握手时头部较大,但后续通信头部极小(仅2字节)。

适用场景

  • HTTP适合无状态、请求-响应的场景(如REST API)。

  • WebSocket适合实时性要求高的场景(如在线聊天、游戏、股票推送)。

7. WebSocket和Socket的区别和联系

  • Socket(套接字)是操作系统提供的一套网络编程接口,封装了TCP/IP协议,用于进程间通信。它本身不是协议,而是"IP地址+端口+协议"的组合。

  • WebSocket是应用层协议,基于TCP,专门为Web浏览器和服务器设计,提供全双工通信。

简单来说,Socket是编程接口 ,WebSocket是通信协议。你可以用Socket实现任何TCP/UDP应用,而WebSocket则是建立在HTTP握手之上的高级协议。

8. HTTP的完整请求过程

以访问http://www.example.com为例:

  1. DNS解析:获取IP地址。

  2. TCP连接:客户端与服务器建立TCP连接(三次握手)。

  3. 发送HTTP请求:客户端发送请求报文(包含请求行、头部、可能的消息体)。

  4. 服务器处理并返回:服务器处理请求,返回HTTP响应报文(状态行、头部、消息体)。

  5. 浏览器渲染:浏览器解析HTML,并根据其中的资源链接(JS、CSS、图片等)再次发起请求(复用TCP连接或新建)。

  6. 连接关闭:若为短连接,服务器在响应后关闭TCP连接(四次挥手);若为长连接,则保持一段时间。

相关推荐
爱丽_2 小时前
把 HTTP 讲清楚
网络·网络协议·http
六元七角八分2 小时前
学习笔记二《JavaScript 流程控制》
javascript·笔记
佛系菜狗2 小时前
AI+python学习笔记及思考
笔记·学习
遥遥晚风点点2 小时前
JAVA http请求报错:unable to find valid certification path to requested target
java·网络·网络协议·http
云边散步2 小时前
godot2D游戏教程系列二(17)
笔记·学习·游戏
宵时待雨2 小时前
C++笔记归纳12:二叉搜索树
开发语言·数据结构·c++·笔记·算法
条tiao条2 小时前
TypeScript 入门学习笔记:从零开始掌握核心概念
笔记·学习·typescript
2501_916008893 小时前
移动应用上架到应用商店的完整指南:原理与详细步骤
android·ios·小程序·https·uni-app·iphone·webview
XiaoYu1__3 小时前
算法笔记·其一:从递归到回溯——以全排列与N皇后问题为例
c++·笔记·算法·深度优先遍历