Files
cs-note/hhs/NETWORK/README.md
T
2026-05-24 11:42:38 +08:00

269 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [计算机网络, 网络协议, TCP/IP, HTTP, 网络安全, 运维]
create time: 2026-05-17 22:00
---
# 计算机网络知识索引
## 概述
计算机网络是现代软件工程的基石——从浏览器发出一个请求到服务器返回响应,中间经历了 DNS 解析、TCP 三次握手、TLS 握手、HTTP 报文传输等十几道工序。本知识库从零开始,沿着 **OSI / TCP-IP 模型**的层次逐层深入,同时覆盖工程实践中不可或缺的工具链和安全体系。
> [!QUESTION] 为什么学网络这么重要?
> - 排查线上问题(连接超时、延迟飙升、SSL 错误)需要理解协议底层行为
> - API 设计、服务间通信选择(HTTP/gRPC/WebSocket/gRPC-TCP)依赖于对协议的深度理解
> - 高并发场景下的连接复用、零拷贝、epoll 等技术本质都是网络问题的解法
> - 安全审计、渗透防御需要掌握攻击面和各层漏洞原理
## 文档统计
| 章节 | 文档数 | 文件路径前缀 |
|------|--------|-------------|
| 一、基础概念与分层模型 | 4 | `01-基础概念/` |
| 二、链路层 | 5 | `02-链路层/` |
| 三、网络层 | 8 | `03-网络层/` |
| 四、传输层 | 6 | `04-传输层/` |
| 五、应用层协议 | 6 | `05-应用层协议/` |
| 六、Socket 编程 | 3 | `06-Socket编程/` |
| 七、网络工具与诊断 | 2 | `07-网络工具与诊断/` |
| 八、网络安全 | 4 | `08-网络安全/` |
| 九、性能优化 | 2 | `09-性能优化/` |
| 十、前沿与进阶 | 4 | `10-前沿与进阶/` |
| **总计** | **44** | — |
## 知识体系
### 一、基础概念与分层模型
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 1.1 | OSI 七层 vs TCP/IP 四层模型 | [[hhs/NETWORK/01-基础概念/01-OSI与TCP-IP模型对比]] | 两种模型的对比、每层职责映射、为什么现实中使用五层模型 |
| 1.2 | 数据封装与解封装 | [[hhs/NETWORK/01-基础概念/02-数据封装与解封装]] | 发送端逐层加头 → 网线比特流 → 接收端逐层剥头 |
| 1.3 | 寻址体系:MAC / IP / Port | [[hhs/NETWORK/01-基础概念/03-寻址体系MAC-IPTPort]] | 三层地址 vs 四层端口,`ip:port = 进程` 的经典比喻 |
| 1.4 | 带宽、延迟、RTT、吞吐量 | [[hhs/NETWORK/01-基础概念/04-带宽延迟RTT与吞吐量]] | 核心性能指标定义与关系公式 `BDP = 带宽 × 延迟` |
```mermaid
flowchart TD
subgraph "应用层 L5"
A["HTTP / DNS / SMTP / FTP"]
end
subgraph "传输层 L4"
B["TCP — 可靠面向连接"]
C["UDP — 无连接尽最大努力"]
end
subgraph "网络层 L3"
D["IP (v4/v6) / ICMP / ARP / NAT"]
end
subgraph "链路层 L2"
E["Ethernet / Wi-Fi / VLAN / ARP*"]
end
subgraph "物理层 L1"
F["双绞线 / 光纤 / 无线电波"]
end
A --> B
A --> C
B --> D
C --> D
D --> E
E --> F
```
> [!tip] 记住一句话
> 每一层只管自己的事,不知道上层在传什么内容,也不关心下层怎么搬。这就是 **分层解耦** 的威力。
### 二、链路层
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 2.1 | Ethernet 帧结构 | [[hhs/NETWORK/02-链路层/01-Ethernet帧结构]] | MAC 地址、EtherType、Payload 长度、FCS 校验 |
| 2.2 | CSMA/CD 与以太网退避 | [[hhs/NETWORK/02-链路层/02-CSMA-CD与以太网退避]] | 碰撞检测、二进制指数退避算法 |
| 2.3 | MAC 地址与广播域 | [[hhs/NETWORK/02-链路层/03-MAC地址与广播域]] | 全球唯一性、OUI 查询、二层广播 vs 三层组播 |
| 2.4 | Switch vs Hub vs Router | [[hhs/NETWORK/02-链路层/04-Switch与路由器]] | 冲突域隔离、MAC 表学习、VLAN 划分 |
| 2.5 | VLAN 与 Trunk | [[hhs/NETWORK/02-链路层/05-VLAN与Trunk]] | 802.1Q 标签、不同 Switch 间的 VLAN 透传 |
> [!question] ARP 为什么跨不了网段?
> ARP 走的是 **二层广播**(目的 MAC `ff:ff:ff:ff:ff:ff`),路由器不转发广播包,因此跨网段必须靠网关做 **ARP 代理**或发起 **Gratuitous ARP**。
### 三、网络层(核心)
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 3.1 | IPv4 首部与分段重组 | [[hhs/NETWORK/03-网络层/01-IPv4首部与分段重组]] | TTL、Identification、DF/MF 标志、MTU 概念 |
| 3.2 | CIDR 与子网划分 | [[hhs/NETWORK/03-网络层/02-CIDR与子网划分]] | 无类编址、子网掩码计算、超网聚合 |
| 3.3 | IPv6 地址与扩展头部 | [[hhs/NETWORK/03-网络层/03-IPv6地址与扩展头部]] | 简化首部、128位地址空间、SLAAC 自动配置 |
| 3.4 | ARP 协议完整流程 | [[hhs/NETWORK/03-网络层/04-ARP协议完整流程]] | 免费 ARP(Gratuitous ARP)、ARP 缓存老化、ARP Spoofing 防护 |
| 3.5 | ICMP 与 Ping / Traceroute | [[hhs/NETWORK/03-网络层/05-ICMP与Ping-Traceroute]] | Echo Request/Reply、TTL 超时机制实现路由追踪 |
| 3.6 | 静态路由与默认网关 | [[hhs/NETWORK/03-网络层/06-静态路由与默认网关]] | route 命令、路由表优先级、多网卡策略路由 |
| 3.7 | 动态路由协议 | [[hhs/NETWORK/03-网络层/07-动态路由协议OSPF-BGP]] | OSPF 区域内/区域间/LSA、BGP 选路规则 |
| 3.8 | NAT 原理与应用 | [[hhs/NETWORK/03-网络层/08-NAT原理与应用]] | SNAT / DNAT / PAT(端口复用)、NAT 对 TCP 的影响、穿透技术(STUN/TURN/ICE) |
```mermaid
sequenceDiagram
participant Client as 客户端<br/>192.168.1.100
participant GW as 网关/NAT<br/>203.0.113.5:12345
participant Server as 服务端<br/>93.184.216.34:80
Client->>GW: SYN 192.168.1.100:54321 → 93.184.216.34:80
Note over GW: SNAT: 源地址改写
GW->>Server: SYN 203.0.113.5:12345 → 93.184.216.34:80
Server-->>GW: SYN-ACK ack=1
Note over GW: DNAT: 端口反向映射
GW-->>Client: SYN-ACK ack=1
Client->>GW: ACK ack=2
GW->>Server: ACK ack=2
```
> [!warning] NAT 的陷阱
> NAT 破坏了端到端原则——它在修改 IP 甚至端口,相当于在网络中间强行「翻译」数据包。某些协议(如 FTP 主动模式、P2P)在 NAT 后无法正常工作,需要 ALG 或打洞技术。
### 四、传输层(重点)
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 4.1 | TCP 段结构与状态机 | [[hhs/NETWORK/04-传输层/01-TCP段结构与状态机]] | 34 字节最小首部、11 种状态、全图详解 |
| 4.2 | 三次握手与四次挥手 | [[hhs/NETWORK/04-传输层/02-TCP三次握手与四次挥手]] | 为什么不能两次?TIME_WAIT 的意义和代价 |
| 4.3 | 可靠传输机制 | [[hhs/NETWORK/04-传输层/03-TCP可靠传输机制]] | 序列号/确认号、重传策略、快重传/快恢复 |
| 4.4 | 流量控制与拥塞控制 | [[hhs/NETWORK/04-传输层/04-TCP流量控制与拥塞控制]] | 滑动窗口、BBR vs Cubic 算法对比 |
| 4.5 | TCP 粘包与拆包 | [[hhs/NETWORK/04-传输层/05-TCP粘包与拆包]] | 边界的成因、应用层解决方案(定长/分隔符/长度前缀)|
| 4.6 | UDP 协议与 SCTP | [[hhs/NETWORK/04-传输层/06-UDP协议与SCTP]] | UDP 低延迟特性、SCTP 多流独立有序 |
```mermaid
stateDiagram-v2
[*] --> CLOSED
CLOSED --> LISTEN: Accept / Connect
LISTEN --> SYN_RCVD: Accept
SYN_RCVD --> ESTABLISHED: 3-Way Handshake Complete
ESTABLISHED --> FIN_WAIT_1: Application closes
ESTABLISHED --> CLOSE_WAIT: Remote close
CLOSE_WAIT --> LAST_ACK: Local close
FIN_WAIT_1 --> FIN_WAIT_2: Local ACK received
FIN_WAIT_1 --> CLOSING: Simultaneous close
FIN_WAIT_2 --> TIME_WAIT: Remote close
CLOSING --> TIME_WAIT: Remote ACK
TIME_WAIT --> CLOSED: 2MSL timeout
LAST_ACK --> CLOSED: Final ACK received
note right of TIME_WAIT
等待 2 * MSL
确保最后一个 ACK 到达
防止旧连接的重复报文干扰新连接
end note
```
> [!question] 为什么 TCP 挥手需要 TIME_WAIT?
> 如果服务端直接关闭,客户端的 ACK 丢失会导致 RST。TIME_WAIT(2MSL)给时间让 ACK 重试,同时也让旧连接的报文在网络中自然消亡。但这意味着高并发服务器的 TIME_WAIT 堆积是常态而非异常。
### 五、应用层协议
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 5.1 | HTTP/1.1 完全指南 | [[hhs/NETWORK/05-应用层协议/01-HTTP-1-1完全指南]] | Method/Status/Header/Payload、Keep-Alive、管道化缺陷 |
| 5.2 | HTTP/2 多路复用 | [[hhs/NETWORK/05-应用层协议/02-HTTP-2多路复用]] | 二进制分帧、Header 压缩(HPACK)、Server Push、Stream Priority |
| 5.3 | HTTP/3 与 QUIC | [[hhs/NETWORK/05-应用层协议/03-HTTP-3与QUIC]] | 基于 UDP、内置拥塞控制、0-RTT 握手、Head-of-Line 消除 |
| 5.4 | HTTPS 与 TLS 握手 | [[hhs/NETWORK/05-应用层协议/04-HTTPS与TLS握手]] | 对称+非对称混合加密、证书链验证、Cipher Suite 协商 |
| 5.5 | DNS / DHCP / WebSocket | [[hhs/NETWORK/05-应用层协议/05-DNS与DHCP与WebSocket]] | 递归 vs 权威查询、DORA 四步、握手升级 |
| 5.6 | SSH 与邮件协议 | [[hhs/NETWORK/05-应用层协议/06-SSH与邮件协议]] | 密钥交换、公钥认证、端口转发、SMTP/IMAP/POP3 三大协议对比 |
```mermaid
sequenceDiagram
participant B as Browser
participant S as Server
participant CA as CA/证书机构
B->>S: TCP 三次握手
B->>S: ClientHello (cipher suites, extensions)
S->>B: ServerHello + Certificate (含公钥)
CA-->>B: 证书验签通过 (可选 OCSP/Stapling)
B->>S: ClientKeyExchange + Finished
S->>B: ServerFinished
Note over B,S: TLS 握手完成 ✨ 后续通信全部加密
B->>S: HTTP Request (TLS 保护下)
S->>B: HTTP Response (TLS 保护下)
```
> [!tip] HTTPS 为什么叫「双重握手」?
> TCP 三次握手建通道 → TLS 握手协商加密参数并验证书 → 之后才是真正的 HTTP 请求。完整的 HTTPS 页面加载至少需要 2~3 个 RTT。
### 六、Socket 编程
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 6.1 | Socket API 与 backlog | [[hhs/NETWORK/06-Socket编程/01-SocketAPI与backlog详解]] | socket/bind/listen/accept 映射到 TCP 状态,backlog 双队列机制 (SYN Queue + Accept Queue) |
| 6.2 | I/O 多路复用:select → poll → epoll | [[hhs/NETWORK/06-Socket编程/02-epoll深度解析ETvsLT]] | 三阶段进化,ET vs LT 模式深度对比,最小可用 epoll 框架 |
| 6.3 | 零拷贝技术与 Go netpoller | [[hhs/NETWORK/06-Socket编程/03-零拷贝与GoNetpoller]] | sendfile/sendmmsg/io_uring,Go M:N 调度模型,net/http.Server 超时配置 |
```mermaid
flowchart LR
App["应用程序"] -->|"accept()"| FD["file descriptor"]
FD -->|"register"| EPOLL["epoll instance<br/>红黑树 + 就绪链表"]
EPOLL -->|"wait"| App
FD -.->|"内核回调加入就绪链表"| EPOLL
style EPOLL fill:#DDA0DD,color:#000
```
> [!tip] Go 的优势
> Go 不需要像 C 那样手动维护 epoll + callback 地狱。每个连接挂起一个 goroutine(栈 2KB 起步),CPU 和内存效率极高。这被称为 **"C10K problem solved by goroutines"**。
### 七、网络工具与诊断
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 7.1 | 连通性与状态探测 | [[hhs/NETWORK/07-网络工具与诊断/01-连通性与状态探测工具]] | ping 指标解读、nc/telnet 端口测试、ss 连接状态快照(含全状态速查表)、traceroute |
| 7.2 | 抓包、HTTP 与 DNS 诊断 | [[hhs/NETWORK/07-网络工具与诊断/02-抓包HTTPDNS诊断工具]] | tcpdump BPF 表达式精选、curl 计时分解、dig 查询模式、iptables 规则排查 |
> [!tip] 排错黄金思路
> `ping`(通不通?)→ `telnet port`(端口通不通?)→ `tcpdump`(报文到了没?)→ `ss`(本地连接状态如何?)→ `traceroute`(哪一跳丢了?)→ 读应用日志
### 八、网络安全
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 8.1 | DDoS 与 MitM 防御 | [[hhs/NETWORK/08-网络安全/01-DDoS与MITM防御]] | L3/L4/D7 攻击矩阵,Linux 内置防御命令,ARP 欺骗 MITM 全流程,DNS 劫持检测,Slowloris |
| 8.2 | SSRF 与 DNS 安全 | [[hhs/NETWORK/08-网络安全/02-SSRF与DNS安全]] | Go SSRF 完整防御代码(含 DNS Rebinding),NAT 穿透 (STUN/TURN/ICE),DNSSEC / DoH / DoT |
| 8.3 | CSRF / XSS / XXE 防御 | [[hhs/NETWORK/08-网络安全/03-CSRFxss与XXE防御]] | 三巨头对比表,SameSite Cookie,CSP,html/template 自动转义,CORS vs CSRF |
| 8.4 | JWT 认证与 TLS 安全 | [[hhs/NETWORK/08-网络安全/04-JWT认证与TLS安全]] | JWT 六大漏洞+修复,Refresh Token 模式,OAuth 2.0 vs OIDC,Cipher Suite 选择,OCSP Stapling,mTLS |
### 九、网络性能优化
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 9.1 | TCP 内核调优与连接复用 | [[hhs/NETWORK/09-性能优化/01-TCP内核调优与连接复用]] | sysctl 二十余参数生产级配置,BBR 启用,TCP Buffer BDP 适配,HTTP/gRPC/Nginx Keep-Alive 全栈方案 |
| 9.2 | CDN、负载均衡与 Go Server 调优 | [[hhs/NETWORK/09-性能优化/02-CDN负载均衡与GoServer调优]] | Cache-Control 速查,L4 vs L7 LB 选型决策树,Nginx upstream 策略,Go http.Server 终极配置 |
### 十、前沿与进阶
| # | 主题 | 链接 | 说明 |
|---|------|------|------|
| 10.1 | QUIC 协议深度解析 | [[hhs/NETWORK/10-前沿与进阶/01-QUIC协议深度解析]] | Connection ID NAT 迁移,Stream 独立性消除队头阻塞,0-RTT + 重放攻击风险,QPACK vs HPACK |
| 10.2 | eBPF 与 Service Mesh | [[hhs/NETWORK/10-前沿与进阶/02-eBPF与ServiceMesh]] | XDP/TC/kprobe 三层次架构,bpftrace/bcc/cilium-hubble 实战,Istio sidecar + VirtualService 路由 |
| 10.3 | WireGuard VPN 原理与实践 | [[hhs/NETWORK/10-前沿与进阶/03-WireGuardVPN原理与实践]] | Curve25519 + ChaCha20-Poly1305 AEAD,三重加密手风琴握手,运维命令全解,性能对比实测 |
| 10.4 | SDN / SRv6 与 Go 网络编程最佳实践 | [[hhs/NETWORK/10-前沿与进阶/04-SDNSRv6与网络编程最佳实践]] | Segment Routing over IPv6 包结构,OpenFlow/P4 可编程数据平面,Go 高性能 Server 模板 |
## 学习路径建议
```mermaid
flowchart LR
BASE["一、基础概念<br/>OSI/TCP-IP/地址"] --> LINK["二、链路层<br/>Ethernet/ARP/Switch"]
LINK --> NET["三、网络层<br/>IPv4/IPv6/Routing/NAT"]
NET --> TRANSP["四、传输层<br/>TCP/UDP/状态机/拥塞控制"]
TRANSP --> APP["五、应用层<br/>HTTP/DNS/TLS/WebSocket"]
TRANSP --> SOCKETS["六、Socket编程<br/>epoll/零拷贝"]
APP --> TOOLS["七、网络工具<br/>tcpdump/curl/dig"]
TOOLS --> SEC["八、网络安全"]
SEC --> PERF["九、性能优化"]
PERF --> FRONTIER["十、前沿进阶"]
style BASE fill:#DDA0DD
style TRANSP fill:#FFD700
style APP fill:#98FB98
style PERF fill:#FFA07A
style FRONTIER fill:#B0C4DE
```
## 关联笔记
- [[hhs/gRPC/README]] — gRPC 底层的 HTTP/2 + Protobuf 与网络层强相关
- [[hhs/Redis/README]] — Redis 客户端的网络连接池与持久化 TCP 通信
- [[hhs/GORM/README]] — Web 框架底层依赖 HTTP 协议栈