Files
cs-note/hhs/NETWORK/README.md
T

269 lines
15 KiB
Markdown
Raw Normal View History

2026-05-24 11:42:38 +08:00
---
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 协议栈