tags, create time
| tags | 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 = 带宽 × 延迟 |
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) |
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 多流独立有序 |
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 三大协议对比 |
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 超时配置 |
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 模板 |
学习路径建议
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 协议栈