Skip to content

HTTP协议基础

HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,用于在客户端和服务器之间传输超文本(如网页)数据。

基本概念

  1. 客户端-服务器模型:HTTP基于请求-响应模式,客户端(通常是浏览器)向服务器发送请求,服务器返回响应。
  2. 无状态协议:HTTP本身不保留之前的请求或响应信息,每个请求都是独立的。
  3. 应用层协议: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-aliveclose)。

内容相关头字段

  • Content-Type (用于POST/PUT请求) 指定请求体的数据类型,例如: Content-Type: application/json
  • Content-Length 请求体的字节大小,例如: Content-Length: 348
  • Content-Encoding 请求体的压缩格式(如gzip)。

缓存控制

  • Cache-Control 缓存策略(如no-cachemax-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
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等)。

状态码

状态码状态码范围类别描述
1xx100-199信息性请求已接收,继续处理
2xx200-299成功请求已成功处理
3xx300-399重定向需要进一步操作
4xx400-499客户端错误请求包含错误或无法完成
5xx500-599服务器错误服务器处理请求失败

常见状态码示例

状态码状态短语类别说明
200OK成功请求成功,响应中包含请求的结果数据
201Created成功请求成功且服务器创建了新资源
204No Content成功请求成功,但响应中没有内容(通常用于 DELETE 请求)
301Moved Permanently重定向请求的资源已永久移动到新位置(浏览器会自动重定向)
302Found重定向请求的资源临时从不同位置响应(浏览器会自动重定向)
304Not Modified重定向资源未修改,可使用缓存的版本
400Bad Request客户端错误服务器无法理解请求的语法
401Unauthorized客户端错误请求需要身份验证
403Forbidden客户端错误服务器理解请求但拒绝执行(无权限访问)
404Not Found客户端错误服务器找不到请求的资源
405Method Not Allowed客户端错误请求方法不被目标资源支持
408Request Timeout客户端错误服务器等待请求时超时
429Too Many Requests客户端错误用户在给定时间内发送了过多请求(限流)
500Internal Server Error服务器错误服务器遇到错误,无法完成请求
502Bad Gateway服务器错误作为网关或代理的服务器从上游服务器收到无效响应
503Service Unavailable服务器错误服务器暂时不可用(通常由于过载或维护)
504Gateway Timeout服务器错误作为网关或代理的服务器未能及时从上游服务器收到响应

常见响应头字段

头字段示例作用
Content-Typetext/html; charset=UTF-8响应体的MIME类型和编码。
Content-LengthContent-Length: 1024响应体的字节大小。
ServerServer: Apache/2.4.41服务器软件信息。
Cache-ControlCache-Control: max-age=3600控制缓存行为。
Set-CookieSet-Cookie: sessionId=abc123服务器设置Cookie。
LocationLocation: /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, LaravelApache/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+优化事务逻辑
IOPSfio -name=test -ioengine=libaio -direct=1SSD:5k-100k使用RAID0/升级NVMe
连接数`netstat -antgrep ESTwc -l`

本章重点回顾

  • 用户访问网站基本流程

  • DNS系统解析原理

  • HTTP协议通信原理,包括HTTP协议,请求报文,响应报文,状态码等相关知识

  • 动态,静态概念特点以及伪静态技术;

  • 动态转静态Web优化方案

  • IP,PV,UV的概念和区别

  • 并发的概念理解

本章知识相关面试考试题

请描述DNS系统的解析原理?

回答要点: DNS(Domain Name System)是将域名转换为IP地址的分布式数据库系统,解析过程如下:

  1. 浏览器缓存:检查浏览器是否缓存过该域名的IP。
  2. 系统缓存:查询本地Hosts文件或操作系统DNS缓存(如Windows的ipconfig /displaydns)。
  3. 路由器缓存:检查路由器或本地网络设备的DNS缓存。
  4. ISP DNS服务器:向互联网服务提供商(ISP)的递归DNS服务器发起请求。
  5. 根域名服务器:若ISP无缓存,递归DNS向根域名服务器(如.com.org)查询。
  6. TLD服务器:根服务器返回顶级域(TLD)服务器地址(如.com的权威服务器)。
  7. 权威DNS服务器:TLD服务器返回域名注册的权威DNS服务器(如example.com的NS记录)。
  8. 返回IP:权威DNS返回域名对应的IP地址,递归DNS缓存并返回给客户端。

示例回答:

"当访问www.example.com时,DNS解析会依次查询浏览器缓存→系统Hosts→本地DNS服务器→根域名服务器→.com顶级域服务器→最终权威DNS服务器,获取IP后建立连接。"

请描述HTTP协议的工作原理?

回答要点: HTTP(HyperText Transfer Protocol)是无状态的请求-响应协议,基于TCP/IP,工作流程如下:

  1. 建立连接:客户端(浏览器)通过TCP三次握手与服务器建立连接(默认端口80,HTTPS为443)。
  2. 发送请求:客户端发送HTTP请求报文,包含:
    • 请求行(方法+URL+协议版本,如GET /index.html HTTP/1.1
    • 请求头HostUser-AgentCookie等)
    • 请求体(POST/PUT时提交的数据)
  3. 服务器处理:服务器解析请求,执行后端逻辑(如查询数据库),生成响应。
  4. 返回响应:服务器返回HTTP响应报文,包含:
    • 状态行(如HTTP/1.1 200 OK
    • 响应头Content-TypeSet-Cookie等)
    • 响应体(HTML/JSON等实际数据)
  5. 关闭连接: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通常由后端服务崩溃或超时引起。"