NetWork
网络参考模型
OSI七层协议
OSI(开放系统互连)七层模型是网络通信的标准化框架,每一层负责特定的功能,从物理传输到应用交互。以下是七层的名称、功能及常见协议/设备:
物理层(Physical Layer)
- 功能:传输原始比特流(0和1),定义电气、机械、时序等物理特性(如电压、线缆、光纤、无线频率)。
- 关键设备/协议:
- 设备:网线(双绞线、光纤)、集线器(Hub)、中继器(Repeater)、调制解调器(Modem)。
- 协议:IEEE 802.3(以太网)、RS-232、USB物理层。
数据链路层(Data Link Layer)
- 功能:将比特流组织成帧,提供物理寻址(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/json、text/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-Origin | CORS 允许的域名 |
Access-Control-Allow-Methods | CORS 允许的方法 |
Access-Control-Allow-Headers | CORS 允许的请求头 |
- 通用字段: Content-type、Connection
| 字段 | 说明 |
|---|---|
Cache-Control | 指定缓存机制(如 no-cache、no-store、max-age=3600) |
Connection | 控制连接是否保持(如 keep-alive、close) |
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 | GET /index.html |
响应头
1 | 200 OK |
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字符)。
- 可被缓存、保留在浏览器历史记录中。
- 幂等(多次请求结果相同,无副作用)。
- 参数通过URL传递(拼接在
POST
- 用途:向服务器提交数据(新增或处理数据)。
- 特点:
- 参数通过请求体(Body)传递,支持多种格式(如JSON、表单数据)。
- 无长度限制(理论上)。
- 默认不缓存,不保留在历史记录。
- 非幂等(多次提交可能产生不同结果,如重复下单)。
PUT
- 用途:更新指定资源(全量替换)。
- 特点:
- 参数可通过URL或请求体传递。
- 幂等(多次更新结果一致)。
DELETE
- 用途:删除指定资源。
- 特点:
- 通常通过URL标识资源。
- 幂等(多次删除结果相同)。
GET 和 POST 的核心区别
| 特性 | GET | POST |
|---|---|---|
| 参数位置 | 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。
总结
| 特性 | HTTP | HTTPS |
|---|---|---|
| 加密 | 无(明文传输) | 有(SSL/TLS加密) |
| 端口 | 80 | 443 |
| 证书 | 不需要 | 需要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 地址,过程如下:
- 浏览器缓存
检查本地缓存(如 Chrome 的chrome://net-internals/#dns)。 - 系统缓存
查询操作系统的 hosts 文件(如 Windows 的C:\Windows\System32\drivers\etc\hosts)。 - 路由器缓存
如果本地无记录,请求路由器或 ISP 的 DNS 缓存。 - 递归 DNS 查询
- 向 根 DNS 服务器 查询
.com的权威服务器。 - 向 .com 顶级域名服务器 查询
example.com的权威服务器。 - 最终从 example.com 的权威 DNS 服务器 获取 IP(如
93.184.216.34)。
- 向 根 DNS 服务器 查询
建立TCP连接
浏览器通过 IP 地址和端口(默认 443 for HTTPS)与服务器建立 TCP 连接:
- SYN
客户端发送SYN=1, Seq=x到服务器,进入SYN_SENT状态。 - SYN-ACK
服务器回复SYN=1, ACK=x+1, Seq=y,进入SYN_RCVD状态。 - ACK
客户端发送ACK=y+1,双方进入ESTABLISHED状态,连接建立。
HTTPS 额外步骤:
- TLS 握手(协商加密算法、交换密钥、验证证书)。
- 使用
SSL/TLS加密后续通信。
1 | graph LR |
发送 HTTP 请求
浏览器构造 HTTP 请求并发送到服务器,例如:
1 | GET /index.html |
服务器处理请求
服务器(如 Nginx、Apache)接收到请求后:
- 静态资源
直接返回文件(如 HTML、CSS、JS)。 - 动态资源
转发到后端服务(如 PHP、Node.js),执行逻辑后生成响应。 - 数据库查询
如需数据,可能查询 MySQL、Redis 等。
服务器返回 HTTP 响应
服务器返回响应报文,例如:
1 | 200 OK |
浏览器解析与渲染
浏览器接收到响应后开始渲染页面:
- 解析 HTML
- 构建 DOM 树(Document Object Model)。
- 遇到
<link>或<script>时暂停解析,加载外部资源(CSS/JS)。
- 解析 CSS
- 构建 CSSOM 树(CSS Object Model)。
- 与 DOM 树合并为 渲染树(Render Tree)。
- 布局(Layout)
- 计算每个节点的尺寸和位置(如
width: 100px)。
- 计算每个节点的尺寸和位置(如
- 绘制(Paint)
- 将渲染树转换为屏幕上的像素。
- 执行 JavaScript
- 执行
<script>或异步加载的 JS(可能触发重绘/回流)。
- 执行
- AJAX 请求
- 页面加载后,JS 可能通过
fetch()或XMLHttpRequest动态获取数据。
- 页面加载后,JS 可能通过
- WebSocket 长连接
- 用于实时通信(如聊天室)。
- 缓存策略
- 根据
Cache-Control和ETag决定是否复用缓存资源。
- 根据
HTTP版本对比
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 年代 | 1996 | 1999 | 2015 | 2022(正式发布) |
| 连接复用 | ❌(每次请求新建连接) | ✅(支持 keep-alive) | ✅(多路复用) | ✅(多路复用) |
| 多路复用 | ❌ | ❌ | ✅ | ✅ |
| 请求阻塞 | ✅ 严重(队头阻塞) | ✅(部分缓解) | ✅(彻底解决) | ✅(彻底解决) |
| 二进制传输 | ❌(纯文本) | ❌(纯文本) | ✅ | ✅ |
| 首部压缩 | ❌ | ❌ | ✅(HPACK) | ✅(QPACK) |
| 加密传输 | ❌(默认无) | ❌(可用 HTTPS) | ⬆️ 推荐使用 TLS | ⬆️ 强制使用 QUIC(加密) |
| 传输协议 | TCP | TCP | TCP | QUIC (基于 UDP) |
| 服务器推送 | ❌ | ❌ | ✅(已弃用) | ❌(草案中) |
TCP/UDP
(未完)




