引言
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是明文传输协议,存在三大安全隐患:
-
窃听:数据包在网络上传输可被截获。
-
冒充:无法确认通信对方是否是真实的服务器。
-
篡改:数据可能被中间人修改。
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握手过程(简化版)
-
客户端发起请求:客户端(浏览器)向服务器发起HTTPS请求,连接到443端口。
-
服务器返回证书 :服务器将自己的数字证书发送给客户端,证书中包含服务器的公钥、颁发机构、有效期等信息。
-
客户端验证证书 :客户端用内置的CA公钥验证证书签名,确认服务器身份可信。验证通过后,客户端生成一个随机的对称密钥 (会话密钥),并用证书中的公钥加密该密钥,发送给服务器。
-
服务器解密得到密钥 :服务器用自己的私钥解密,获得对称密钥。
-
加密通信:双方使用该对称密钥进行后续数据的加密传输。
关键点:私钥始终由服务器保管,从不传输;公钥通过证书公开,即使被截获也无法解密对称密钥,因为只有私钥能解密。这样就实现了安全密钥交换。
3.3 公钥、私钥与加密方式示意图

图中:公钥加密,私钥解密;私钥签名,公钥验签。
4. 数字签名与数字证书
数字签名的生成过程
-
对网站的公钥、身份信息等内容进行Hash运算,得到消息摘要。
-
CA机构用自己的私钥对消息摘要加密,生成数字签名。
-
将公钥、身份信息、数字签名组合成数字证书。
证书验证过程
-
浏览器收到证书后,用CA机构的公钥解密数字签名,得到原始的消息摘要。
-
同时对证书中的公钥和身份信息进行同样的Hash运算,得到新的消息摘要。
-
对比两个摘要是否一致:一致则证明证书未被篡改,且确实是该CA签发。
这样,我们就解决了对网站的信任问题:即使攻击者伪造了证书,由于没有CA的私钥,无法生成合法签名,浏览器会发出安全警告。
5. DNS解析过程
当你在浏览器输入www.baidu.com,DNS解析会经历以下步骤(以递归查询为例):
-
浏览器缓存:首先检查浏览器自身DNS缓存,若有则直接返回IP。
-
本地DNS缓存:若无,则向本地DNS服务器(如路由器或ISP提供的)发起请求,本地DNS也有缓存。
-
根域名服务器 :若本地DNS无记录,则向根域名服务器查询,根服务器返回负责
.com的顶级域名服务器地址。 -
顶级域名服务器 :本地DNS再向
.com顶级服务器查询,它返回负责baidu.com的权威域名服务器地址。 -
权威域名服务器 :最后向权威域名服务器查询,得到
www.baidu.com的IP地址。 -
返回并缓存:本地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为例:
-
DNS解析:获取IP地址。
-
TCP连接:客户端与服务器建立TCP连接(三次握手)。
-
发送HTTP请求:客户端发送请求报文(包含请求行、头部、可能的消息体)。
-
服务器处理并返回:服务器处理请求,返回HTTP响应报文(状态行、头部、消息体)。
-
浏览器渲染:浏览器解析HTML,并根据其中的资源链接(JS、CSS、图片等)再次发起请求(复用TCP连接或新建)。
-
连接关闭:若为短连接,服务器在响应后关闭TCP连接(四次挥手);若为长连接,则保持一段时间。