返回 网络世界的奇思妙想
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议。它是万维网(World Wide Web)的基础,定义了浏览器(客户端)如何向服务器请求资源,以及服务器如何响应这些请求。
HTTP协议最初由蒂姆·伯纳斯-李(Tim Berners-Lee)于1991年提出,经过多年的发展,已经从最初的HTTP/0.9版本发展到了现在的HTTP/3版本。
- HTTP/0.9:1991年发布,是HTTP的第一个版本,功能非常简单,只有GET方法,没有请求头和响应头,只能传输HTML文档。
- HTTP/1.0:1996年发布,增加了POST和HEAD方法,引入了请求头和响应头,支持多种内容类型,不再局限于HTML。
- HTTP/1.1:1999年发布,是目前使用最广泛的版本。增加了持久连接、管道化、分块传输编码、缓存控制、内容协商等重要特性。
- HTTP/2:2015年发布,基于Google的SPDY协议。主要特性包括:二进制分帧、多路复用、头部压缩、服务器推送等,显著提高了传输效率。
- HTTP/3:2022年正式发布,基于QUIC协议。使用UDP替代TCP作为传输层协议,解决了HTTP/2中的队头阻塞问题,进一步提高了传输速度和安全性。
HTTP采用客户端-服务器(Client-Server)模型,工作流程如下:
- 建立连接:客户端(通常是浏览器)与服务器建立TCP连接(HTTP/3使用UDP)。
- 发送请求:客户端向服务器发送HTTP请求,请求包含请求方法、URL、协议版本、请求头和请求体等。
- 处理请求:服务器接收到请求后,进行处理,可能会查询数据库、读取文件、执行程序等。
- 返回响应:服务器向客户端返回HTTP响应,响应包含协议版本、状态码、响应头和响应体等。
- 关闭连接:响应发送完毕后,连接可能关闭,也可能保持打开以便后续请求使用(持久连接)。
HTTP是一种无状态协议,也就是说,服务器不会保存客户端的状态信息。每次请求都是独立的,服务器不知道之前是否处理过来自同一客户端的请求。为了实现状态管理,通常会使用Cookie、Session等技术。
HTTP定义了多种请求方法,每种方法都有不同的用途,用于表示对资源的不同操作。
GET方法用于请求获取指定的资源。GET请求应该只用于获取数据,不应该修改服务器上的资源,因此GET请求被认为是"安全"和"幂等"的。
特点:
- 请求参数通常附加在URL后面,以?开头,多个参数用&分隔
- 请求参数有长度限制(不同浏览器限制不同)
- 请求参数会显示在浏览器地址栏中,安全性较差
- 可以被浏览器缓存
- 可以被收藏为书签
POST方法用于向服务器提交数据,请求服务器进行处理,通常会导致服务器上的资源状态发生改变。
特点:
- 请求参数放在请求体中,不会显示在URL中
- 请求参数没有长度限制
- 相对GET更安全一些
- 不会被浏览器缓存
- 不能被收藏为书签
- 不是幂等的,多次提交可能会产生不同的结果
PUT方法用于向服务器上传资源,替换指定位置的资源。如果资源不存在,则创建新资源;如果资源已存在,则替换原有资源。
特点:
- 是幂等的,多次执行相同的PUT请求,结果是一样的
- 通常用于更新资源
DELETE方法用于删除服务器上指定的资源。
特点:
- 是幂等的,多次删除同一个资源,结果是一样的(资源被删除)
HEAD方法与GET方法类似,但服务器只返回响应头,不返回响应体。
用途:
- 检查资源是否存在
- 获取资源的元信息(如大小、类型、修改时间等)
- 测试缓存有效性
OPTIONS方法用于获取服务器支持的HTTP方法,以及资源支持的通信选项。
用途:
- 查询服务器支持的请求方法
- 跨域请求中的预检请求(CORS preflight)
PATCH方法用于对资源进行部分更新,只修改资源的一部分内容。
与PUT的区别:
- PUT是整体替换,PATCH是局部修改
- PATCH不是幂等的,多次执行可能会有不同的结果
TRACE方法用于回显服务器收到的请求,主要用于测试或诊断。
CONNECT方法用于建立一个到由目标资源标识的服务器的隧道,通常用于HTTPS代理。
HTTP状态码是服务器在响应中返回的3位数字代码,用于表示请求的处理结果。状态码分为5类:
表示请求已被接收,需要继续处理。
- 100 Continue:继续。客户端应该继续发送请求。
- 101 Switching Protocols:切换协议。服务器根据客户端的请求切换协议。
表示请求已成功被服务器接收、理解、并接受。
- 200 OK:成功。请求已成功,请求所希望的响应头或数据体将随此响应返回。
- 201 Created:已创建。请求成功并且服务器创建了新的资源。
- 204 No Content:无内容。服务器成功处理了请求,但没有返回任何内容。
- 206 Partial Content:部分内容。服务器成功处理了部分GET请求,通常用于断点续传。
表示需要客户端进行附加操作才能完成请求,通常用于重定向。
- 301 Moved Permanently:永久重定向。请求的资源已被永久移动到新位置,以后应该使用新的URL。
- 302 Found:临时重定向。请求的资源临时从不同的URL响应请求,以后还应该使用原来的URL。
- 303 See Other:查看其它地址。对应当前请求的响应可以在另一个URL上被找到,客户端应该使用GET方法去获取那个资源。
- 304 Not Modified:未修改。自从上次请求后,请求的资源未修改过。服务器返回此响应时,不会返回资源的内容。
- 307 Temporary Redirect:临时重定向。与302类似,但要求请求方法和请求体不变。
- 308 Permanent Redirect:永久重定向。与301类似,但要求请求方法和请求体不变。
表示客户端看起来可能发生了错误,妨碍了服务器的处理。
- 400 Bad Request:错误请求。服务器不理解请求的语法。
- 401 Unauthorized:未授权。请求要求用户的身份认证。
- 403 Forbidden:禁止访问。服务器拒绝执行请求。
- 404 Not Found:未找到。服务器找不到请求的资源。
- 405 Method Not Allowed:方法不允许。请求行中指定的请求方法不能被用于请求相应的资源。
- 408 Request Timeout:请求超时。服务器等待客户端发送的请求时间过长,超时。
- 409 Conflict:冲突。由于和被请求的资源的当前状态之间存在冲突,请求无法完成。
- 410 Gone:已删除。请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。
- 413 Payload Too Large:请求实体过大。请求的实体超过了服务器愿意或能够处理的大小。
- 414 URI Too Long:请求的URI过长。请求的URI长度超过了服务器能够解释的长度。
- 415 Unsupported Media Type:不支持的媒体类型。请求的媒体格式不是服务器支持的格式。
- 429 Too Many Requests:请求过多。用户在给定的时间内发送了太多请求。
表示服务器在处理请求的过程中有错误或者异常状态发生。
- 500 Internal Server Error:服务器内部错误。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
- 501 Not Implemented:未实现。服务器不支持当前请求所需要的某个功能。
- 502 Bad Gateway:错误网关。作为网关或代理工作的服务器,从上游服务器收到了无效的响应。
- 503 Service Unavailable:服务不可用。由于临时的服务器维护或者过载,服务器当前无法处理请求。
- 504 Gateway Timeout:网关超时。作为网关或代理工作的服务器,没有及时从上游服务器收到请求。
- 505 HTTP Version Not Supported:HTTP版本不支持。服务器不支持请求中所用的HTTP协议版本。
HTTP请求由四部分组成:请求行、请求头、空行、请求体。
请求行是请求的第一行,包含三个部分:请求方法、URL、协议版本。
示例:
GET /index.html HTTP/1.1
请求头包含许多有关客户端环境和请求正文的有用信息,每一行都是一个键值对。
常见的请求头:
- Host:请求的服务器主机名和端口号
- User-Agent:客户端的浏览器信息
- Accept:客户端能够接收的内容类型
- Accept-Language:客户端接受的语言
- Accept-Encoding:客户端接受的编码方式(如gzip、deflate)
- Content-Type:请求体的媒体类型
- Content-Length:请求体的长度
- Cookie:客户端发送给服务器的Cookie
- Referer:请求的来源页面URL
- Authorization:认证信息
- Cache-Control:缓存控制指令
- Connection:连接选项(如keep-alive)
请求头和请求体之间有一个空行,用于分隔请求头和请求体。
请求体是可选的,包含要发送给服务器的数据。GET请求通常没有请求体,POST、PUT等请求通常有请求体。
HTTP响应也由四部分组成:状态行、响应头、空行、响应体。
状态行是响应的第一行,包含三个部分:协议版本、状态码、状态描述。
示例:
HTTP/1.1 200 OK
响应头包含服务器的相关信息,每一行都是一个键值对。
常见的响应头:
- Server:服务器的软件信息
- Date:响应发送的时间
- Content-Type:响应体的媒体类型
- Content-Length:响应体的长度
- Content-Encoding:响应体的编码方式
- Set-Cookie:服务器设置Cookie
- Cache-Control:缓存控制指令
- Last-Modified:资源的最后修改时间
- ETag:资源的实体标签
- Location:重定向的目标URL
- Access-Control-Allow-Origin:跨域资源共享(CORS)设置
响应头和响应体之间有一个空行,用于分隔响应头和响应体。
响应体是服务器返回的实际数据,可能是HTML页面、图片、JSON数据、文件等。
HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP的安全版本。它在HTTP的基础上增加了SSL/TLS协议,用于加密客户端和服务器之间的通信,保护数据的安全性和完整性。
HTTPS的主要作用:
- 数据加密:传输的数据是加密的,第三方无法窃取和理解
- 身份验证:验证服务器的身份,防止钓鱼网站和中间人攻击
- 数据完整性:确保数据在传输过程中没有被篡改
| 特性 |
HTTP |
HTTPS |
| 端口 |
80 |
443 |
| 安全性 |
明文传输,不安全 |
加密传输,安全 |
| 协议 |
基于TCP/IP |
基于SSL/TLS + TCP/IP |
| 证书 |
不需要 |
需要SSL/TLS证书 |
| 性能 |
较快 |
稍慢(加密解密有开销) |
| SEO |
无特殊优势 |
搜索引擎更偏好 |
在当今的互联网环境中,HTTPS已经变得非常重要:
- 保护用户隐私:防止用户的敏感信息(如密码、银行卡号、个人信息等)被窃取
- 防止数据篡改:确保数据在传输过程中不被中间人篡改
- 验证网站身份:让用户确认自己访问的是真实的网站,而不是钓鱼网站
- SEO优化:Google等搜索引擎会给HTTPS网站更高的排名权重
- 浏览器要求:现代浏览器会标记HTTP网站为"不安全",影响用户信任
- 功能限制:许多新的Web API(如地理位置、摄像头、服务工作者等)只在HTTPS环境下可用
SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)都是用于在两个通信应用程序之间提供保密性和数据完整性的协议。
- SSL:由Netscape公司开发,有SSL 1.0、SSL 2.0、SSL 3.0三个版本,现在都已经被废弃,不再安全。
- TLS:基于SSL 3.0发展而来,由IETF标准化。目前有TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3四个版本。TLS 1.0和TLS 1.1也已经被废弃,推荐使用TLS 1.2或TLS 1.3。
虽然现在实际上使用的是TLS协议,但很多人仍然习惯称之为SSL。
SSL/TLS使用了两种加密方式:对称加密和非对称加密。
对称加密使用同一个密钥进行加密和解密。
优点:
缺点:
常见的对称加密算法:AES、DES、3DES、RC4等。
非对称加密使用一对密钥:公钥和私钥。公钥可以公开,私钥需要保密。用公钥加密的数据只能用私钥解密,用私钥加密的数据只能用公钥解密。
优点:
缺点:
常见的非对称加密算法:RSA、ECC、DSA、Diffie-Hellman等。
SSL/TLS结合了两种加密方式的优点:
- 使用非对称加密来安全地交换对称密钥
- 使用对称密钥来加密实际传输的数据
这样既解决了密钥交换的问题,又保证了加密解密的效率。
当客户端和服务器建立HTTPS连接时,需要进行SSL/TLS握手,协商加密参数、交换密钥、验证证书等。
以TLS 1.2为例,握手过程大致如下:
- 客户端问候(Client Hello):客户端向服务器发送支持的TLS版本、加密套件列表、随机数等信息。
- 服务器问候(Server Hello):服务器选择一个加密套件和TLS版本,生成随机数,返回给客户端。
- 服务器证书(Server Certificate):服务器将自己的数字证书发送给客户端。
- 服务器密钥交换(Server Key Exchange):(可选)如果需要,服务器发送密钥交换相关的信息。
- 服务器问候完成(Server Hello Done):服务器表示问候阶段结束。
- 客户端密钥交换(Client Key Exchange):客户端生成预主密钥,用服务器的公钥加密后发送给服务器。
- 密码规格变更(Change Cipher Spec):客户端通知服务器,后续的消息将使用协商好的密钥加密。
- 客户端握手结束(Client Finished):客户端发送加密的握手结束消息。
- 密码规格变更(Change Cipher Spec):服务器通知客户端,后续的消息将使用协商好的密钥加密。
- 服务器握手结束(Server Finished):服务器发送加密的握手结束消息。
握手完成后,双方就可以开始加密传输数据了。
TLS 1.3对握手过程进行了优化,将握手消息从2-3轮减少到了1轮,甚至支持0-RTT(零往返时间)恢复,显著提高了连接建立的速度。
数字证书(Digital Certificate)是用于证明公钥所有者身份的电子文档。它就像是网络世界中的身份证,由权威的第三方机构(CA)颁发。
数字证书通常包含以下信息:
- 证书持有者的名称
- 证书持有者的公钥
- 证书的序列号
- 证书的有效期
- 颁发证书的CA名称
- CA的数字签名
- 证书的版本号
- 证书的用途等
CA(Certificate Authority,证书颁发机构)是负责颁发和管理数字证书的可信第三方机构。
常见的CA机构:
- DigiCert
- Sectigo(原Comodo)
- GlobalSign
- Let's Encrypt(免费)
- 沃通(WoSign)
- 数安时代(GDCA)
CA的作用:
- 验证证书申请者的身份
- 颁发数字证书
- 管理证书的生命周期(颁发、更新、吊销)
- 维护证书吊销列表(CRL)和在线证书状态协议(OCSP)
当客户端收到服务器的数字证书时,需要验证证书的有效性:
- 检查证书有效期:确认证书是否在有效期内。
- 检查证书吊销状态:确认证书是否被吊销。
- 验证证书签名:用CA的公钥验证证书上的数字签名,确认证书确实是由该CA颁发的,且没有被篡改。
- 检查证书用途:确认证书的用途是否符合当前的使用场景。
- 检查域名匹配:确认证书中的域名与当前访问的域名是否匹配。
如果证书验证通过,客户端就会信任该服务器,并继续进行密钥交换。
根据验证级别,SSL证书可以分为三类:
- 只验证域名的所有权
- 验证方式简单,通常几分钟就能颁发
- 价格便宜,甚至有免费的(如Let's Encrypt)
- 适合个人网站、博客等
- 验证域名所有权和组织的真实存在
- 需要提交组织相关的证明材料
- 验证过程需要几天时间
- 价格中等
- 适合中小企业网站
- 最严格的验证级别
- 验证域名所有权、组织真实存在、组织运营状况等
- 验证过程最复杂,需要的时间最长
- 价格最贵
- 浏览器地址栏会显示组织名称,信任度最高
- 适合银行、电商、金融等对安全性要求高的网站
- 安全性高:数据加密传输,防止窃听和篡改
- 身份验证:验证服务器身份,防止钓鱼和中间人攻击
- 数据完整性:确保数据在传输过程中不被篡改
- SEO优势:搜索引擎更偏好HTTPS网站,有助于提高排名
- 用户信任:用户更信任HTTPS网站,特别是涉及敏感信息的场景
- 功能支持:许多新的Web功能只在HTTPS环境下可用
- 合规要求:某些行业或地区有数据安全合规要求,需要使用HTTPS
- 性能开销:加密解密需要消耗CPU资源,增加了服务器和客户端的负载
- 握手延迟:SSL/TLS握手需要额外的往返时间,增加了连接建立的延迟
- 成本:购买SSL证书需要费用(虽然有免费的,但高级证书仍然很贵)
- 配置复杂:HTTPS的配置比HTTP复杂,需要正确配置证书、加密套件等
- 缓存问题:某些情况下HTTPS内容的缓存可能不如HTTP高效
- 代理问题:某些代理或防火墙可能会对HTTPS连接有限制
不过,随着硬件性能的提升和TLS协议的优化(如TLS 1.3、会话恢复、OCSP装订等),HTTPS的性能开销已经大大降低,现在几乎可以忽略不计。
虽然HTTPS有很多优点,但在某些场景下HTTP仍然有其用武之地:
- 纯静态内容网站:只展示公开信息,不涉及用户隐私和敏感数据
- 内部网络系统:在内网环境中,安全性要求相对较低
- 开发测试环境:本地开发和测试时,使用HTTP更方便
- 缓存加速:某些CDN或缓存场景下,HTTP可能更简单高效
不过,即使是这些场景,也越来越推荐使用HTTPS,因为浏览器对HTTP网站的标记和限制越来越多。
HTTPS适用于所有需要安全传输的场景,特别是:
- 电子商务网站:涉及支付、订单、用户信息等敏感数据
- 银行金融网站:涉及账户、交易、资金等高度敏感信息
- 社交网络:涉及用户个人信息、聊天记录等
- 企业办公系统:涉及企业内部数据、员工信息等
- 登录认证页面:所有需要输入用户名密码的页面
- Web应用:现代Web应用通常都需要HTTPS支持
- API接口:特别是涉及敏感数据的API
- 任何收集用户信息的网站:如注册表单、调查问卷等
实际上,现在的趋势是所有网站都应该使用HTTPS,无论是什么类型的网站。HTTPS已经成为现代网站的标配,而不是可选的增强功能。