HTTP协议基础
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于在客户端和服务器之间传输超文本(如网页)数据。
基本概念
- 客户端-服务器模型:HTTP基于请求-响应模式,客户端(通常是浏览器)向服务器发送请求,服务器返回响应。
- 无状态协议:HTTP本身不保留之前的请求或响应信息,每个请求都是独立的。
- 应用层协议:HTTP工作在TCP/IP协议栈的应用层,默认使用80端口(HTTPS使用443端口)。
主要特点
- 简单快速:请求方法简单(GET、POST等),通信速度快
- 灵活:可以传输任意类型的数据对象
- 无连接:每次连接只处理一个请求
- 支持B/S模式:Browser/Server(浏览器/服务器)模式
HTTP版本发展
- HTTP/0.9:最初版本,极其简单
- HTTP/1.0:增加了请求头、响应头和状态码
- HTTP/1.1:持久连接、管道化、缓存控制等改进
- HTTP/2:二进制协议、多路复用、头部压缩
- HTTP/3:基于QUIC协议,解决队头阻塞问题
会话保持
在一定时间内,保证同一个用户的请求调度同一个节点上
连接保持
保持的是三次握手(保证的是数据的正常传输)
HTTP请求
http请求报文
位于报文第一行,包含三个部分:
GET /index.html HTTP/1.1- 请求方法:GET、POST、PUT、DELETE等
- 请求URI:要访问的资源路径
- HTTP版本:如HTTP/1.1或HTTP/2
核心头字段
- Host (必填,HTTP/1.1要求) 指定请求的目标域名和端口,例如:
Host: example.com:8080 - User-Agent 标识客户端类型(浏览器、操作系统等),例如:
User-Agent: Mozilla/5.0 (Windows NT 10.0) - Accept 声明客户端可接受的响应数据类型(MIME类型),例如:
Accept: text/html, application/json - Accept-Encoding 支持的压缩算法(如gzip、deflate):
Accept-Encoding: gzip, deflate - Accept-Language 优先的语言(如
en-US, zh-CN):Accept-Language: en-US - Connection 控制连接行为(如
keep-alive或close)。
内容相关头字段
- Content-Type (用于POST/PUT请求) 指定请求体的数据类型,例如:
Content-Type: application/json - Content-Length 请求体的字节大小,例如:
Content-Length: 348 - Content-Encoding 请求体的压缩格式(如
gzip)。
缓存控制
- Cache-Control 缓存策略(如
no-cache或max-age=3600)。
认证与安全
- Authorization 携带认证凭据(如Bearer Token或Basic Auth):
Authorization: Bearer xxxxx - Cookie 发送服务器设置的Cookie:
Cookie: name=value; token=abc123 - Referer 表示请求来源页面的URL(可能被隐私设置屏蔽)。
- Origin 用于CORS请求,标识请求来源。
自定义头字段
- 以
X-开头的非标准头(如X-API-Key):X-API-Key: 123456
HTTP响应报文
响应报文的基本结构
HTTP/1.1 200 OK
Server: nginx/1.18.0
Content-Type: application/json
Content-Length: 89
Connection: keep-alive
{"status": "success", "data": "example"}- 状态行:协议版本、状态码和状态描述(如
HTTP/1.1 200 OK)。 - 响应头:服务器的元数据(如
Content-Type)。 - 空行:分隔头和体(
\r\n)。 - 响应体:实际数据(如JSON、HTML等)。
状态码
| 状态码 | 状态码范围 | 类别 | 描述 |
|---|---|---|---|
| 1xx | 100-199 | 信息性 | 请求已接收,继续处理 |
| 2xx | 200-299 | 成功 | 请求已成功处理 |
| 3xx | 300-399 | 重定向 | 需要进一步操作 |
| 4xx | 400-499 | 客户端错误 | 请求包含错误或无法完成 |
| 5xx | 500-599 | 服务器错误 | 服务器处理请求失败 |
常见状态码示例
| 状态码 | 状态短语 | 类别 | 说明 |
|---|---|---|---|
| 200 | OK | 成功 | 请求成功,响应中包含请求的结果数据 |
| 201 | Created | 成功 | 请求成功且服务器创建了新资源 |
| 204 | No Content | 成功 | 请求成功,但响应中没有内容(通常用于 DELETE 请求) |
| 301 | Moved Permanently | 重定向 | 请求的资源已永久移动到新位置(浏览器会自动重定向) |
| 302 | Found | 重定向 | 请求的资源临时从不同位置响应(浏览器会自动重定向) |
| 304 | Not Modified | 重定向 | 资源未修改,可使用缓存的版本 |
| 400 | Bad Request | 客户端错误 | 服务器无法理解请求的语法 |
| 401 | Unauthorized | 客户端错误 | 请求需要身份验证 |
| 403 | Forbidden | 客户端错误 | 服务器理解请求但拒绝执行(无权限访问) |
| 404 | Not Found | 客户端错误 | 服务器找不到请求的资源 |
| 405 | Method Not Allowed | 客户端错误 | 请求方法不被目标资源支持 |
| 408 | Request Timeout | 客户端错误 | 服务器等待请求时超时 |
| 429 | Too Many Requests | 客户端错误 | 用户在给定时间内发送了过多请求(限流) |
| 500 | Internal Server Error | 服务器错误 | 服务器遇到错误,无法完成请求 |
| 502 | Bad Gateway | 服务器错误 | 作为网关或代理的服务器从上游服务器收到无效响应 |
| 503 | Service Unavailable | 服务器错误 | 服务器暂时不可用(通常由于过载或维护) |
| 504 | Gateway Timeout | 服务器错误 | 作为网关或代理的服务器未能及时从上游服务器收到响应 |
常见响应头字段
| 头字段 | 示例 | 作用 |
|---|---|---|
| Content-Type | text/html; charset=UTF-8 | 响应体的MIME类型和编码。 |
| Content-Length | Content-Length: 1024 | 响应体的字节大小。 |
| Server | Server: Apache/2.4.41 | 服务器软件信息。 |
| Cache-Control | Cache-Control: max-age=3600 | 控制缓存行为。 |
| Set-Cookie | Set-Cookie: sessionId=abc123 | 服务器设置Cookie。 |
| Location | Location: /new-page | 重定向目标URL(3xx响应)。 |
| Access-Control-Allow-Origin | * | CORS跨域权限控制。 |
响应体(Response Body)
- 格式:由
Content-Type决定,常见类型:application/json:JSON数据。text/html:HTML页面。image/png:二进制图片。
- 压缩:若请求头包含
Accept-Encoding: gzip,响应体可能被压缩,并通过Content-Encoding: gzip声明。
HTTP方法
| HTTP 方法 | 说明 | 是否幂等 | 是否安全 | 典型应用场景 |
|---|---|---|---|---|
| GET | 获取指定资源 | 是 | 是 | 获取网页、查询数据 |
| POST | 向服务器提交数据,可能导致状态变化或副作用 | 否 | 否 | 提交表单、创建新资源 |
| PUT | 替换目标资源的所有当前表示形式 | 是 | 否 | 完整更新资源(替换全部字段) |
| PATCH | 对资源进行部分修改 | 否 | 否 | 部分更新资源(仅修改指定字段) |
| DELETE | 删除指定资源 | 是 | 否 | 删除服务器上的资源 |
| HEAD | 与 GET 相同,但不返回响应体(仅获取响应头) | 是 | 是 | 检查资源是否存在或验证其元数据 |
| OPTIONS | 获取服务器支持的 HTTP 方法 | 是 | 是 | CORS 预检请求、API 能力查询 |
| CONNECT | 建立到目标资源的隧道(用于 SSL 隧道) | - | 否 | HTTPS 代理连接 |
| TRACE | 回显服务器收到的请求(用于诊断) | 是 | 是 | 调试和诊断网络问题 |
HTTP资源
HTTP资源是Web架构中的核心概念,指可以通过统一资源标识符(URI)定位的任何信息、数据或服务。
资源的基本概念
- 定义:网络上的任何可识别实体,如HTML文档、图像、视频、API端点等
- 标识:通过URI(统一资源标识符)唯一标识,常见形式为URL
- 表现形式:同一资源可能有不同表现形式(如JSON/XML)
资源与URI的关系
URI,全称Uniform Resource Identifier,中文翻译为统一资源标识符,是一个用于标识某一互联网资源名称的字符串。这个字符串在世界范围内唯一标识并定位某一个信息资源。互联网上每个可用的数据资源,如HTML,图片,视频等皆通过统一资源标识符进行定位。
| 协议 | 分隔符 | IP或域名 | 分隔符 | 资源地址 |
|---|---|---|---|---|
| http | 😕/ | api.example.com | / | index.html |
网站资源类型
| 特性 | 静态网站 | 动态网站 | 伪静态网站 |
|---|---|---|---|
| 定义 | 由纯HTML/CSS/JS文件组成,内容固定 | 内容由服务器实时生成,基于数据库 | 动态网站通过URL重写模拟静态结构 |
| 资源类型 | .html, .css, .js, 图片等 | .php, .jsp, .asp等后端文件 | 实际为动态脚本,但URL显示为静态 |
| 服务器处理 | 直接返回文件 | 执行脚本+数据库查询生成页面 | 先URL重写再执行动态脚本 |
| 典型技术 | Hugo, Jekyll, 纯前端框架 | WordPress, Django, Laravel | Apache/Nginx的rewrite规则 |
| URL示例 | /about.html | /product.php?id=123 | /product/123.html |
| 性能 | ⚡️ 极快(无服务器计算) | 🐢 较慢(需实时计算) | 🚀 接近静态(缓存优化后) |
| SEO友好度 | ★★★★☆ | ★★☆☆☆(原始动态URL) | ★★★★☆(伪装静态URL) |
| 内容更新 | 需手动修改文件 | 通过CMS后台实时更新 | 通过CMS后台更新(本质仍是动态) |
| 扩展性 | 差(每页需单独维护) | 强(模板化+数据库驱动) | 强(保留动态特性) |
| 安全风险 | 低(无后端交互) | 中(需防SQL注入等攻击) | 中(同动态网站) |
| 适用场景 | 企业官网、文档站 | 电商、社交平台 | 需要SEO优化的动态网站 |
| 部署成本 | 低(可托管到CDN) | 高(需服务器环境) | 中(需配置重写规则) |
网站访问量统计
核心指标对比表
| 指标 | 定义 | 统计方式 | 特点 | 局限性 | 适用场景 |
|---|---|---|---|---|---|
| IP | 独立IP访问数 | 24小时内相同公网IP计1次 | 反映网络设备规模 | 受NAT/代理影响大 | 基础流量评估 |
| PV | 页面浏览量 | 每次页面加载/刷新计1次 | 体现内容热度 | 易受自动刷新干扰 | 内容运营分析 |
| UV | 独立访客数 | 24小时内相同客户端计1次 | 接近真实用户量 | 依赖Cookie/设备识别 | 用户规模统计 |
技术原理深度解析
IP统计机制
NAT场景示例:某公司局域网50台电脑通过1个公网IP访问百度 → 计为1IP
动态IP场景:用户拨号上网3次(不同IP)访问 → 计为3IP
统计方法:
bash# 服务器日志分析示例(去重统计) awk '{print $1}' access.log | sort | uniq | wc -l
PV统计逻辑
- 计数规则:
- 打开页面(即使未完全加载)→ +1PV
- 刷新页面 → +1PV
- AJAX局部更新 → 通常不计PV
UV识别技术
IP+UserAgent组合识别(误差率约15%-30%)
并发连接
什么是并发
- A种理解:网站服务器每秒能够接收的最大用户请求数
- B种理解:网站服务器每秒能够响应的最大用户请求数。
- C种理解:网站服务器在单位时间内能够处理的最大连接数。
虽然A,B的理解占IT人员中的大多数,但是,C理解更为准确一些。
关键性能指标
| 指标 | 计算公式/命令 | 行业基准 | 优化建议 |
|---|---|---|---|
| QPS | 总请求数/秒 | MySQL单机:1k-10k | 增加缓存/分库分表 |
| TPS | 事务数/秒 | 支付系统:500+ | 优化事务逻辑 |
| IOPS | fio -name=test -ioengine=libaio -direct=1 | SSD:5k-100k | 使用RAID0/升级NVMe |
| 连接数 | `netstat -ant | grep EST | wc -l` |
本章重点回顾
用户访问网站基本流程
DNS系统解析原理
HTTP协议通信原理,包括HTTP协议,请求报文,响应报文,状态码等相关知识
动态,静态概念特点以及伪静态技术;
动态转静态Web优化方案
IP,PV,UV的概念和区别
并发的概念理解
本章知识相关面试考试题
请描述DNS系统的解析原理?
回答要点: DNS(Domain Name System)是将域名转换为IP地址的分布式数据库系统,解析过程如下:
- 浏览器缓存:检查浏览器是否缓存过该域名的IP。
- 系统缓存:查询本地Hosts文件或操作系统DNS缓存(如Windows的
ipconfig /displaydns)。 - 路由器缓存:检查路由器或本地网络设备的DNS缓存。
- ISP DNS服务器:向互联网服务提供商(ISP)的递归DNS服务器发起请求。
- 根域名服务器:若ISP无缓存,递归DNS向根域名服务器(如
.com、.org)查询。 - TLD服务器:根服务器返回顶级域(TLD)服务器地址(如
.com的权威服务器)。 - 权威DNS服务器:TLD服务器返回域名注册的权威DNS服务器(如
example.com的NS记录)。 - 返回IP:权威DNS返回域名对应的IP地址,递归DNS缓存并返回给客户端。
示例回答:
"当访问
www.example.com时,DNS解析会依次查询浏览器缓存→系统Hosts→本地DNS服务器→根域名服务器→.com顶级域服务器→最终权威DNS服务器,获取IP后建立连接。"
请描述HTTP协议的工作原理?
回答要点: HTTP(HyperText Transfer Protocol)是无状态的请求-响应协议,基于TCP/IP,工作流程如下:
- 建立连接:客户端(浏览器)通过TCP三次握手与服务器建立连接(默认端口80,HTTPS为443)。
- 发送请求:客户端发送HTTP请求报文,包含:
- 请求行(方法+URL+协议版本,如
GET /index.html HTTP/1.1) - 请求头(
Host、User-Agent、Cookie等) - 请求体(POST/PUT时提交的数据)
- 请求行(方法+URL+协议版本,如
- 服务器处理:服务器解析请求,执行后端逻辑(如查询数据库),生成响应。
- 返回响应:服务器返回HTTP响应报文,包含:
- 状态行(如
HTTP/1.1 200 OK) - 响应头(
Content-Type、Set-Cookie等) - 响应体(HTML/JSON等实际数据)
- 状态行(如
- 关闭连接:HTTP/1.1默认保持连接(Keep-Alive),HTTP/2支持多路复用。
示例回答:
"用户在浏览器输入URL后,HTTP协议会先建立TCP连接,发送
GET /index.html请求,服务器返回状态码200和HTML内容,浏览器渲染页面。如果是POST请求,数据会放在请求体中提交。"
请问你的公司的网站访问量是多少?
回答框架:
新手/无数据权限:
"由于保密协议无法透露具体数据,但根据公开资料,类似规模的电商网站日均UV约X万,PV约Y万。我们通过Nginx日志分析和Google Analytics统计,确保数据准确性。"
有经验者:
"我负责的XX系统日均UV 5万,PV 25万(PV/UV≈5),峰值QPS 200。使用ELK分析日志,结合Prometheus监控,数据库采用读写分离支撑流量。"
注意:避免夸大(如“PV 1亿”但架构简单),保持数据与架构合理性。
请说出http状态吗200,301,403,404,500,502,504代表的意义?
示例回答:
"200表示成功;301/302用于重定向;403是权限不足;404是页面不存在;500是服务器代码错误;502/504通常由后端服务崩溃或超时引起。"
