网络参考模型

OSI七层协议

OSI(开放系统互连)七层模型是网络通信的标准化框架,每一层负责特定的功能,从物理传输到应用交互。以下是七层的名称、功能及常见协议/设备:

物理层(Physical Layer)

  • 功能:传输原始比特流(0和1),定义电气、机械、时序等物理特性(如电压、线缆、光纤、无线频率)。
  • 关键设备/协议
    • 设备:网线(双绞线、光纤)、集线器(Hub)、中继器(Repeater)、调制解调器(Modem)。
    • 协议:IEEE 802.3(以太网)、RS-232、USB物理层。

  • 功能:将比特流组织成,提供物理寻址(MAC地址)、差错检测(CRC校验)、流量控制(如滑动窗口)。
  • 子层
    • LLC(逻辑链路控制):对接网络层。
    • MAC(介质访问控制):控制共享信道(如CSMA/CD)。
  • 关键设备/协议
    • 设备:交换机(Switch)、网桥(Bridge)。
    • 协议:以太网(IEEE 802.3)、Wi-Fi(IEEE 802.11)、PPP、HDLC。

网络层(Network Layer)

  • 功能:通过逻辑寻址(IP地址)选择最佳路径(路由),实现跨网络的数据传输。
  • 关键设备/协议
    • 设备:路由器(Router)、三层交换机。
    • 协议:IP(IPv4/IPv6)、ICMP(Ping)、ARP、OSPF、BGP。

传输层(Transport Layer)

  • 功能:提供端到端(进程到进程)的可靠/不可靠传输,通过端口号区分应用,处理流量控制、差错恢复。
  • 关键协议
    • TCP:可靠传输(三次握手、重传机制)。
    • UDP:不可靠但高效(如视频流、DNS查询)。

会话层(Session Layer)

  • 功能:建立、管理、终止会话(如断点续传、身份验证)。
  • 示例
    • 协议:RPC(远程过程调用)、SSH会话、NetBIOS。
    • 场景:视频会议的连接维持、数据库会话管理。

表示层(Presentation Layer)

  • 功能:数据格式转换(编码/解码、加密/解密、压缩/解压),确保应用层能理解数据。
  • 示例
    • 协议:TLS/SSL(加密)、JPEG/MPEG(多媒体编码)、ASCII/Unicode(字符编码)。

应用层(Application Layer)

  • 功能:直接为用户应用提供网络服务接口(如浏览器、邮件)。
  • 关键协议
    • HTTP/HTTPS(网页)、FTP(文件传输)、SMTP/POP3(邮件)、DNS(域名解析)、DHCP(IP分配)。

简化记忆口诀

“All People Seem To Need Data Processing”
(应用层→表示层→会话层→传输层→网络层→数据链路层→物理层)


与TCP/IP模型的对比

OSI七层TCP/IP四层实际常用协议示例
应用层、表示层、会话层应用层HTTP, FTP, DNS, SMTP
传输层传输层TCP, UDP
网络层网络层IP, ICMP, OSPF
数据链路层、物理层网络接口层Ethernet, Wi-Fi, PPP

注意:TCP/IP模型更简化,将会话层、表示层功能合并到应用层,数据链路层和物理层合并为网络接口层。

TCP/IP体系结构

层级名称功能概述常见协议示例
4应用层为用户提供网络服务接口,支持如电子邮件、文件传输等应用。HTTP、FTP、SMTP、DNS
3传输层提供端到端的可靠数据传输,进行错误检测与恢复。TCP、UDP
2网际层负责数据包的路由选择和转发,进行逻辑地址分配。IP、ICMP、IGMP
1数据链路层处理物理地址的识别、帧的组装与拆解,以及错误检测。以太网、Wi-Fi、ARP

HTTP协议详解

超文本传输协议,是一种无状态(不会存储用户信息),以请求/应答方式运行的协议。

HTTP请求报文格式

面试的时候有个神人问我HTTP请求头字段有哪些,我:?

  • 起始行
    • GET /index.html HTTP/1.1 (请求)
    • HTTP/1.1 200 OK (响应)
  • 头部字段集合(请求头)
    • Connection: Keep-alive
  • (空行)
  • 消息正文
    • 如返回页面HTML

请求行

|请求方法|空格|请求目标|空格|版本号|换行|

请求方法: 如GET/POST/PUT/DELETE,表示对资源的操作
请求目标: 通常是一个URL,标记请求方法要操作的资源
版本号: 报文使用的 HTTP协议版本

响应行

|版本号|状态码|原因|换行|

版本号: 报文使用的HTTP协议版本
状态码: 用3位数代码形式表示请求结果
原因: 状态码的补充


头部字段

以key-value形式,二者之间用:隔开
不区分大小写、字段名里不能出现空格、可以使用连字符-、不能使用下划线、字段后必须紧跟::后的字段值前可以有多个空格、字段原则上不能重复,除非其字段语义允许,如Set-Cookie

常用头字段

  • 请求字段: 如Host、Referer

1.客户端信息

字段说明
Host指定目标主机和端口(HTTP/1.1 必须)
User-Agent客户端身份标识(浏览器、操作系统)
From发起请求的用户邮箱
Referer表示请求的来源页面
Origin请求源(用于跨域请求)
X-Requested-With指示请求是 Ajax 请求(如 XMLHttpRequest

2.接受响应格式

字段说明
Accept指定客户端可处理的内容类型(如 text/html, application/json
Accept-Charset指定可接受的字符编码(如 utf-8
Accept-Encoding指定支持的内容压缩方式(如 gzip, deflate
Accept-Language指定可接受的语言(如 zh-CN, en-US

3.条件请求

字段说明
If-Modified-Since如果资源未被修改,则返回 304
If-Unmodified-Since如果资源被修改则返回 412
If-Match比较实体标签是否匹配
If-None-Match和 ETag 比较,不匹配才返回资源

4.安全认证

字段说明
Authorization提供身份认证信息,如 Basic、Bearer、Digest
Proxy-Authorization用于代理服务器的身份认证

5.Cookie 和会话

字段说明
Cookie发送之前由服务器设置的 cookie 值

  • 响应字段: 如Server

1.响应状态相关头

字段说明
Server表示服务器软件信息,如 nginx/1.20.0
Status显示状态码和文本描述(较少用)

2.实体头部:描述响应体的元信息,如长度、类型、编码

字段说明
Content-Type响应体的 MIME 类型,如 application/jsontext/html
Content-Length响应体的字节长度
Content-Encoding内容压缩方式,如 gzip, br
Content-Language响应内容的语言,如 zh-CN
Content-Location实体的实际地址(资源 URI)
Content-Disposition用于下载文件时指定文件名,如 attachment; filename="file.pdf"
Last-Modified资源的最后修改时间
ETag实体标签,用于缓存验证
Expires内容过期时间(绝对时间)

3.重定向头部

字段说明
Location指定客户端重定向的新地址(配合 3xx 状态码使用)
Refresh指定客户端定时刷新或跳转,如 5; url=/login(非标准)

4.认证和安全相关

字段说明
WWW-Authenticate指定认证方式(如 Basic realm="Access to site"
Set-Cookie设置 cookie 到客户端
Strict-Transport-Security启用 HSTS(仅 HTTPS)
X-Frame-Options防止点击劫持(如 DENY, SAMEORIGIN
X-Content-Type-Options防止 MIME 类型嗅探(如 nosniff
X-XSS-Protection启用浏览器 XSS 过滤器
Access-Control-Allow-OriginCORS 允许的域名
Access-Control-Allow-MethodsCORS 允许的方法
Access-Control-Allow-HeadersCORS 允许的请求头

  • 通用字段: Content-type、Connection
字段说明
Cache-Control指定缓存机制(如 no-cacheno-storemax-age=3600
Connection控制连接是否保持(如 keep-aliveclose
Date请求发送的时间
Pragma用于向后兼容的缓存控制(如 no-cache
Trailer指定头字段在消息体之后出现(分块传输用)
Transfer-Encoding指定消息主体的编码方式,如 chunked
Upgrade请求升级为其他协议,如 HTTP/2.0
Via表示请求/响应经过的代理服务器

  • CORS响应头字段
响应头说明
Access-Control-Allow-Origin允许哪些域发起跨域请求,支持 * 或指定域名
Access-Control-Allow-Methods允许的方法(如 GET, POST, PUT
Access-Control-Allow-Headers允许的自定义请求头
Access-Control-Allow-Credentials是否允许携带 Cookie(必须设置为 true,且 Origin 不能是 *
Access-Control-Max-Age预检请求(OPTIONS)的结果缓存时间(秒)

示例

请求头

1
2
3
4
5
6
7
8
9
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: https://www.google.com/
Cookie: sessionId=abc123

响应头

1
2
3
4
5
6
7
8
9
10
11
HTTP/1.1 200 OK
Date: Sun, 25 May 2025 12:00:00 GMT
Content-Type: application/json
Content-Length: 1234
Connection: keep-alive
Server: nginx/1.24.0
Set-Cookie: sessionId=abc123; HttpOnly; Path=/
Cache-Control: no-store
ETag: "e001a-5c3a9"
X-Content-Type-Options: nosniff
Access-Control-Allow-Origin: *

HTTP响应状态码

HTTP 状态码是服务器对客户端请求的响应结果,用于表示请求的成功、失败或需要进一步操作。以下是常见的 HTTP 状态码及其含义,按类别分类:


1xx(信息性状态码)

表示请求已被接收,继续处理。

  • 100 Continue:客户端应继续发送请求的剩余部分(用于大文件上传)。
  • 101 Switching Protocols:服务器同意客户端请求,切换协议(如 WebSocket)。

2xx(成功状态码)

表示请求已成功被服务器接收、理解并处理。

  • 200 OK:请求成功,响应中包含请求的数据(如 GET 请求返回资源)。
  • 201 Created:请求成功并创建了新资源(如 POST 提交新数据)。
  • 202 Accepted:请求已接受,但尚未处理完成(异步任务)。
  • 204 No Content:请求成功,但响应无内容(如 DELETE 成功)。

3xx(重定向状态码)

表示需要客户端进一步操作以完成请求。

  • 301 Moved Permanently:资源已永久移动到新 URL(浏览器会缓存)。
  • 302 Found(临时重定向):资源临时移动到新 URL(浏览器不会缓存)。
  • 304 Not Modified:资源未修改,客户端可使用缓存(用于缓存优化)。
  • 307 Temporary Redirect:类似 302,但强制保持原请求方法(如 POST 不会变成 GET)。

4xx(客户端错误状态码)

表示客户端请求有误,服务器无法处理。

  • 400 Bad Request:请求语法错误(如参数缺失或格式错误)。
  • 401 Unauthorized:未授权,需身份验证(如未登录)。
  • 403 Forbidden:服务器拒绝请求(权限不足)。
  • 404 Not Found:请求的资源不存在(URL 错误或资源已删除)。
  • 405 Method Not Allowed:请求方法不被允许(如 GET 接口用 POST 访问)。
  • 408 Request Timeout:请求超时(服务器未在指定时间内收到请求)。
  • 429 Too Many Requests:请求过于频繁(限流)。

5xx(服务器错误状态码)

表示服务器处理请求时出错。

  • 500 Internal Server Error:服务器内部错误(代码异常)。
  • 502 Bad Gateway:网关/代理服务器收到无效响应(后端服务不可用)。
  • 503 Service Unavailable:服务暂时不可用(服务器过载或维护)。
  • 504 Gateway Timeout:网关超时(代理服务器未及时收到后端响应)。

常见场景示例

状态码典型场景
200成功获取数据(GET)
201创建新用户(POST)
301网站域名永久更换
304浏览器使用缓存资源
400提交表单缺少必填字段
401访问需登录的API未带Token
403普通用户尝试访问管理员接口
404访问不存在的URL
500服务器数据库连接失败
503服务器维护中

HTTP请求方法

HTTP(HyperText Transfer Protocol)常用的请求方法包括 GET、POST、PUT、DELETE,它们分别对应资源的 查、增、改、删 操作(CRUD)。以下是它们的简要说明及 GET 和 POST 的主要区别


GET

  • 用途:请求获取指定资源(查询数据)。
  • 特点
    • 参数通过URL传递(拼接在?后,如 /user?id=123)。
    • 有长度限制(受浏览器和服务器限制,通常约2048字符)。
    • 可被缓存、保留在浏览器历史记录中。
    • 幂等(多次请求结果相同,无副作用)。

POST

  • 用途:向服务器提交数据(新增或处理数据)。
  • 特点
    • 参数通过请求体(Body)传递,支持多种格式(如JSON、表单数据)。
    • 无长度限制(理论上)。
    • 默认不缓存,不保留在历史记录。
    • 非幂等(多次提交可能产生不同结果,如重复下单)。

PUT

  • 用途:更新指定资源(全量替换)。
  • 特点
    • 参数可通过URL或请求体传递。
    • 幂等(多次更新结果一致)。

DELETE

  • 用途:删除指定资源。
  • 特点
    • 通常通过URL标识资源。
    • 幂等(多次删除结果相同)。

GET 和 POST 的核心区别

特性GETPOST
参数位置URL拼接(明文可见)请求体(可加密)
数据长度有限制(URL长度限制)无限制
安全性较低(暴露在URL和日志中)较高(可隐藏参数)
缓存可缓存默认不缓存
历史记录保留不保留
幂等性幂等(安全方法)非幂等
浏览器回退无害可能重复提交(需警告)
用途获取数据提交/修改数据

使用场景

  • GET:搜索、过滤、分页(如 /search?q=keyword)。
  • POST:登录、注册、文件上传(敏感或大数据量操作)。
  • PUT:更新用户信息(全量替换)。
  • DELETE:删除文章或资源。

其他注意事项

  • 语义化:遵循RESTful规范,合理选择方法(如更新用PUT/PATCH,删除用DELETE)。
  • 安全性:即使POST更安全,敏感数据仍需加密(HTTPS)。
  • 幂等性:GET、PUT、DELETE是幂等的,POST不是(设计API时需注意)。

http和https的区别

HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)是用于在网络上传输数据的协议,二者的主要区别体现在安全性、端口、证书等方面。


安全性

  • HTTP

    • 不加密,数据以明文形式传输,容易被窃听、篡改或中间人攻击。
    • 不适合传输敏感信息(如密码、银行卡号等)。
  • HTTPS

    • 加密传输,通过SSL/TLS协议对数据进行加密,确保数据隐私和完整性。
    • 防止数据被窃取或篡改,适合敏感信息传输。

协议与端口

  • HTTP

    • 基于TCP协议,默认使用端口80
  • HTTPS

    • 在HTTP基础上加入SSL/TLS层,默认使用端口443

证书(CA认证)

  • HTTP

    • 不需要数字证书。
  • HTTPS

    • 需要由受信任的证书颁发机构(CA)签发的SSL证书,用于验证服务器身份并启用加密。
    • 浏览器会显示锁形图标(🔒),若证书无效会提示警告。

性能与速度

  • HTTP

    • 无加密开销,响应速度更快。
  • HTTPS

    • 加密/解密过程会增加少量延迟(现代硬件优化后影响已很小)。
    • 支持HTTP/2协议,可提升多路复用效率,部分场景下性能反而更优。

SEO与浏览器标记

  • HTTPS

    • 被Google等搜索引擎优先收录,影响SEO排名。
    • 现代浏览器(如Chrome)会将HTTP标记为“不安全”(Not Secure)。
  • HTTP

    • 无SEO优势,且可能被浏览器限制部分功能(如地理位置API)。

适用场景

  • HTTP
    • 内部网络、非敏感信息传输(如新闻网站)。
  • HTTPS
    • 所有涉及隐私的场景(登录、支付、API接口等)。
    • 现代Web标准(如PWA、Service Worker)要求必须使用HTTPS。

总结

特性HTTPHTTPS
加密无(明文传输)有(SSL/TLS加密)
端口80443
证书不需要需要CA签发
安全性低(易受攻击)高(防窃听/篡改)
速度更快(无加密开销)略慢(加密开销)
SEO无优势优先收录

:免费证书可通过Let’s Encrypt获取。


HTTP请求过程

浏览器解析 URL

  • 检查 URL 格式
    浏览器解析输入的 URL,判断其协议(http/https)、域名(www.example.com)、路径(/index.html)和查询参数(?id=123)。
  • 处理特殊字符
    如果 URL 包含非 ASCII 字符(如中文),会进行 URL 编码(如 %E4%B8%AD → “中”)。

DNS 解析

浏览器需要通过域名找到服务器的 IP 地址,过程如下:

  1. 浏览器缓存
    检查本地缓存(如 Chrome 的 chrome://net-internals/#dns)。
  2. 系统缓存
    查询操作系统的 hosts 文件(如 Windows 的 C:\Windows\System32\drivers\etc\hosts)。
  3. 路由器缓存
    如果本地无记录,请求路由器或 ISP 的 DNS 缓存。
  4. 递归 DNS 查询
    • 根 DNS 服务器 查询 .com 的权威服务器。
    • .com 顶级域名服务器 查询 example.com 的权威服务器。
    • 最终从 example.com 的权威 DNS 服务器 获取 IP(如 93.184.216.34)。

建立TCP连接

浏览器通过 IP 地址和端口(默认 443 for HTTPS)与服务器建立 TCP 连接:

  1. SYN
    客户端发送 SYN=1, Seq=x 到服务器,进入 SYN_SENT 状态。
  2. SYN-ACK
    服务器回复 SYN=1, ACK=x+1, Seq=y,进入 SYN_RCVD 状态。
  3. ACK
    客户端发送 ACK=y+1,双方进入 ESTABLISHED 状态,连接建立。

HTTPS 额外步骤

  • TLS 握手(协商加密算法、交换密钥、验证证书)。
  • 使用 SSL/TLS 加密后续通信。
1
2
3
4
5
6
7
8
9
10
graph LR
A[输入 URL] --> B[DNS 解析]
B --> C[TCP 三次握手]
C --> D[HTTPS TLS 握手]
D --> E[发送 HTTP 请求]
E --> F[服务器处理]
F --> G[返回 HTTP 响应]
G --> H[浏览器渲染]
H --> I[加载静态资源]
I --> J[执行 JavaScript]

发送 HTTP 请求

浏览器构造 HTTP 请求并发送到服务器,例如:

1
2
3
4
5
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Cookie: session_id=abc123


服务器处理请求

服务器(如 Nginx、Apache)接收到请求后:

  1. 静态资源
    直接返回文件(如 HTML、CSS、JS)。
  2. 动态资源
    转发到后端服务(如 PHP、Node.js),执行逻辑后生成响应。
  3. 数据库查询
    如需数据,可能查询 MySQL、Redis 等。

服务器返回 HTTP 响应

服务器返回响应报文,例如:

1
2
3
4
5
6
7
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Cache-Control: max-age=3600
Set-Cookie: session_id=def456

<!DOCTYPE html>
<html>...</html>


浏览器解析与渲染

浏览器接收到响应后开始渲染页面:

  1. 解析 HTML
    • 构建 DOM 树(Document Object Model)。
    • 遇到 <link><script> 时暂停解析,加载外部资源(CSS/JS)。
  2. 解析 CSS
    • 构建 CSSOM 树(CSS Object Model)。
    • 与 DOM 树合并为 渲染树(Render Tree)
  3. 布局(Layout)
    • 计算每个节点的尺寸和位置(如 width: 100px)。
  4. 绘制(Paint)
    • 将渲染树转换为屏幕上的像素。
  5. 执行 JavaScript
    • 执行 <script> 或异步加载的 JS(可能触发重绘/回流)。
  6. AJAX 请求
    • 页面加载后,JS 可能通过 fetch()XMLHttpRequest 动态获取数据。
  7. WebSocket 长连接
    • 用于实时通信(如聊天室)。
  8. 缓存策略
    • 根据 Cache-ControlETag 决定是否复用缓存资源。

HTTP版本对比

特性HTTP/1.0HTTP/1.1HTTP/2HTTP/3
年代1996199920152022(正式发布)
连接复用❌(每次请求新建连接)✅(支持 keep-alive)✅(多路复用)✅(多路复用)
多路复用
请求阻塞✅ 严重(队头阻塞)✅(部分缓解)✅(彻底解决)✅(彻底解决)
二进制传输❌(纯文本)❌(纯文本)
首部压缩✅(HPACK)✅(QPACK)
加密传输❌(默认无)❌(可用 HTTPS)⬆️ 推荐使用 TLS⬆️ 强制使用 QUIC(加密)
传输协议TCPTCPTCPQUIC (基于 UDP)
服务器推送✅(已弃用)❌(草案中)

TCP/UDP

(未完)