网站慢、掉线?可能是TCP/IP在“闹情绪”

全局视角:我们到底在优化什么?

从操作系统到网卡,从交换机到路由器,从 TCP 拥塞控制到 TLS 加密,统称为「协议栈」参与了每一次网络通信。

用一张思维导图先把主题展开:
TCP/IP 协议栈
分层模型
OSI vs TCP/IP
封装与解封装
各层解析
链路层
IP
TCP/UDP
HTTP/DNS/...
深入 TCP
三次握手 & 四次挥手
可靠传输
滑动窗口
拥塞控制
端到端示例
一次 HTTP 请求的旅程
性能优化
应用层策略
TCP 配置与内核调优
网卡 & 零拷贝
架构级优化
安全实践
各层攻击向量
防火墙与 ACL
TLS & IPsec
DDoS 防护
调试与观测
ping/traceroute/mtr
tcpdump/Wireshark
ss/ip/ebpf


1. 分层模型与数据封装

1.1 OSI vs TCP/IP 对照

OSI 层 TCP/IP 层 典型协议/概念
7 应用层 应用层 HTTP, DNS, SSH, gRPC, MQTT
6 表示层 (并入应用层) 编码、加密、序列化
5 会话层 (并入应用层) 会话、重连、心跳
4 传输层 传输层 TCP, UDP, QUIC(基于 UDP)
3 网络层 网络层 IPv4, IPv6, ICMP, 路由协议
2 数据链路层 链路层 以太网(Ethernet), PPP, VLAN
1 物理层 (物理层) 网线、电信号、光纤、Wi-Fi 射频

在工程实践中常说「四层/七层」,基本都是在这个对照下讨论。

1.2 数据封装/解封装:从应用到网线

应用发数据时,每一层会"套一层头"(Header):

text 复制代码
应用数据:DATA
↓(应用层协议头,比如 HTTP 头)
[APP_HDR | DATA]
↓(传输层,加 TCP/UDP 头)
[TRANSPORT_HDR | APP_HDR | DATA]
↓(网络层,加 IP 头)
[IP_HDR | TRANSPORT_HDR | APP_HDR | DATA]
↓(链路层,加以太网头 + 校验尾)
[ETH_HDR | IP_HDR | TRANSPORT_HDR | APP_HDR | DATA | FCS]
↓
电信号/射频在物理介质上传输

接收端反向操作:链路层剥以太网头 → 网络层剥 IP 头 → 传输层剥 TCP/UDP 头 → 应用层解析协议。


2. 链路层:本地网络的基础

2.1 主要职责

  • 点对点或同一二层网络内的传输
  • 基于 MAC 地址寻址(以太网)
  • 帧的组装/拆解、检测错误(FCS)
  • 同一广播域内的通信(交换机转发)

2.2 以太网帧结构(简化)

text 复制代码
+---------+---------+---------+---------+------+
| 目的MAC | 源MAC   | 类型    | 数据 ...| FCS  |
| 6B      | 6B      | 2B      | 46-1500 | 4B   |
+---------+---------+---------+---------+------+
  • MTU:典型是 1500(字节),超过就要在更上一层分片或调整 MTU。
  • 类型字段示例:0x0800 = IPv4,0x86DD = IPv6,0x0806 = ARP。

2.3 ARP:IP → MAC 映射

IP 是三层地址,要在二层发包前,需要知道对方的 MAC。

  • 若目标在同一网段:发 ARP 请求广播,目标回复自己的 MAC。
  • 若目标不在本地网段:发给网关(网关 IP 对应的 MAC)。

常见问题:

  • ARP 欺骗(ARP Spoofing / Poisoning) → 中间人攻击
  • ARP 表过期导致首次访问延迟(需要 ARP 请求)

3. 网络层:IP、路由与 NAT

3.1 IP 的主要职责

  • 逻辑寻址(IP 地址)
  • 选路(Routing):根据路由表决定下一跳
  • 分片与重组(IPv4 支持中间路由器分片,实践中尽量避免)

3.2 IPv4 头部关键字段(简化)

text 复制代码
+--------+--------+---------------------+
| 版本   | 头长度 | TOS                  |
+--------+--------+---------------------+
| 总长度                            |
+----------------------------------------+
| 标识 | 标志(DF/MF) | 片偏移            |
+----------------------------------------+
| TTL  | 协议(TCP=6,UDP=17,ICMP=1)      |
+----------------------------------------+
| 源IP                               |
+----------------------------------------+
| 目的IP                             |
+----------------------------------------+
| (选项, 可选)                        |
+----------------------------------------+
  • TTL:每过一跳减 1,到 0 则丢弃并返回 ICMP 超时报文(用于 traceroute)
  • DF(Don't Fragment):禁止中间路由器分片
  • 协议字段:告诉上一层是 TCP、UDP 还是 ICMP

3.3 路由 & 子网

  • CIDR 表示:192.168.1.0/24
  • 路由查找:Longest Prefix Match(最长前缀匹配)
    • 更精细的前缀优先:192.168.1.128/25 > 192.168.1.0/24

3.4 NAT(网络地址转换)

  • 目的:省 IPv4 地址、隐藏内网结构
  • SNAT:内网出网时改源 IP(和端口)
  • DNAT:外网访问时改目的 IP(和端口)

典型场景:家用路由器、公司网关、云服务商的公网访问。

影响:

  • 连接跟踪(conntrack)必须维护五元组(源/目的 IP、端口、协议)
  • 会对调试和安全分析带来复杂度(真实源 IP 隐藏)

3.5 ICMP:诊断利器

  • Echo Request/Reply:ping
  • Time Exceeded:traceroute/mtr 构建路径
  • Destination Unreachable:目的主机/端口不可达

4. 传输层:TCP 与 UDP

4.1 UDP:简单、不可靠、无连接

特征:

  • 无连接,无状态,数据报(Datagram)
  • 不保证到达、不保证顺序、不重传
  • 头开销小,适合:
    • 实时音视频(延迟敏感)
    • DNS 查询
    • 自定义可靠层(如 QUIC 在 UDP 之上实现可靠传输)

4.2 TCP:可靠、有序、面向连接

4.2.1 TCP 头部关键字段(简化)
text 复制代码
+---------+---------+
| 源端口  | 目的端口 |
+-------------------+
| 序列号 (Seq)      |
+-------------------+
| 确认号 (Ack)      |
+--------+----------+
| 窗口  | 标志位    |  (SYN/ACK/FIN/RST...)
+-------------------+
| 选项 (MSS, SACK, TS...) |
+-------------------------+
4.2.2 三次握手 & 四次挥手

三次握手(连接建立):
Server Client Server Client SYN, Seq = x SYN+ACK, Seq = y, Ack = x+1 ACK, Ack = y+1

  • 目的:
    • 同步双方初始序列号
    • 确认对方收发能力正常
    • 避免历史连接报文干扰(ISN 随机 + 三次确认)

四次挥手(连接关闭):
Server Client Server Client FIN (我发完了) ACK (我知道了) FIN (我也发完了) ACK (我知道了) -->> 进入 TIME_WAIT

  • TIME_WAIT
    • 存在于主动关闭方(通常是客户端或服务端,看谁先发 FIN)
    • 持续 2MSL,防止迟到包污染后续新连接
4.2.3 TCP 状态机(核心状态)

常见状态:

  • LISTEN:服务端在监听端口
  • SYN_SENT:客户端发出 SYN 等待响应
  • SYN_RECV:服务端收到 SYN,回 SYN+ACK
  • ESTABLISHED:连接已建立
  • FIN_WAIT1/2:主动关闭方发 FIN 后
  • CLOSE_WAIT:被动关闭方等应用层关闭
  • LAST_ACK:被动关闭方发 FIN 等 ACK
  • TIME_WAIT:最后确认 ACK 后等待一段时间

状态爆炸常见故障:

  • CLOSE_WAIT 大量堆积 → 应用层没有正确 close socket
  • TIME_WAIT 太多 → 高并发短连接场景下要调优(谨慎)
4.2.4 可靠性:重传与 SACK
  • 基础机制:
    • 每个字节有序列号(Seq)
    • 对方用确认号(Ack)告知已收到的下一个期望字节
    • Timeout + 重传
  • 快速重传:
    • 收到 3 个重复 ACK 时,不等超时就重传
  • SACK(Selective Acknowledgment):
    • 接收方告诉发送方「哪些片段丢了、哪些收到了」
    • 大大提高丢包环境下的效率
4.2.5 流量控制:滑动窗口
  • 目的:避免发送方把接收方的缓冲区冲爆
  • 接收方广告窗口(Advertised Window):
    • 告诉发送方"我一次最多还能收多少字节"
  • 滑动窗口:
    • 已确认数据 -> 窗口左侧滑出
    • 可发送但未确认 -> 窗口中
    • 暂不可发送 -> 窗口右侧之外
4.2.6 拥塞控制:避免把网络挤爆

核心算法(以传统 Reno/CUBIC 为例):

  • 慢启动(Slow Start):
    • 初始化拥塞窗口(cwnd)较小,每收到一个 ACK cwnd 翻倍
  • 拥塞避免(Congestion Avoidance):
    • 到达慢启动阈值后,改为线性增长
  • 丢包处理:
    • 超时重传:认为发生严重拥塞,cwnd 降得更狠
    • 快速重传:cwnd 减小但没那么激进

现代 Linux 默认使用 CUBIC,兼顾高带宽长 Fat Pipe 链路。

4.2.7 Nagle 与延迟 ACK
  • Nagle 算法:
    • 将小包合并发送,减少网络开销
    • 弊端:对低延迟小包场景(RPC、游戏)会增加延迟
    • 可通过 TCP_NODELAY 禁用
  • 延迟 ACK:
    • 为了可能合并 ACK 与响应数据,等待一小段时间再发 ACK
    • 在某些交互场景会放大延迟

5. 应用层:从 HTTP 到 HTTP/3

5.1 典型协议

  • HTTP/1.1: 文本协议,默认 keep-alive,可复用连接但串行
  • HTTP/2:
    • 基于单 TCP 连接多路复用 stream
    • 头压缩(HPACK),优先级,服务器推送
    • 存在队头阻塞:TCP 丢包会阻塞同连接所有流
  • HTTP/3:
    • 基于 QUIC (UDP 上实现的带流、多路复用、拥塞控制的可靠协议)
    • 解决了 TCP 层面的队头阻塞问题
  • DNS:UDP + 部分 TCP(长响应/传输限制)

5.2 长连接 vs 短连接

  • 短连接:每个请求都建连 + 发送 + 关闭
    • 握手成本高(TCP + TLS)
  • 长连接(Keep-Alive/Connection Pool):
    • 摊薄握手成本、减少端口与状态开销
    • 需要健康检查与空闲超时策略

6. 一次 HTTP 请求的旅程(端到端视角)

用一个简化时序图描述从浏览器到服务器:
Web服务器 权威DNS 本地DNS 浏览器 Web服务器 权威DNS 本地DNS 浏览器 询问 www.example.com 递归查询 返回 A/AAAA 记录 返回 IP TCP SYN SYN+ACK ACK (TCP 连接建立) TLS ClientHello ServerHello, Certificate, ... Finished Finished (TLS 握手完成,建立安全通道) HTTP GET /index.html HTTP 200 OK + Body (空闲或关闭) FIN FIN+ACK

每一步背后都在走完整的链路层、网络层、传输层流程。


7. 协议栈性能优化实践

7.1 应用层层面

  1. 减少 RTT:

    • 连接复用(HTTP/2、HTTP/3)
    • 使用连接池(gRPC、数据库客户端)
    • 避免无谓的重定向(301/302)
  2. 减少数据量:

    • 压缩(gzip/br)
    • 静态资源合并 & 缓存(ETag、Last-Modified、Cache-Control)
  3. 合理的超时设置:

    • connect timeout、read timeout、write timeout
    • 防止连接资源长时间被僵尸请求占用

7.2 TCP 层与内核调优(以 Linux 为例)

7.2.1 Socket 选项(应用可直接控制)

常见关键选项:

  • SO_REUSEADDR / SO_REUSEPORT
    • 多进程多监听端口/快速重启
  • SO_KEEPALIVE
    • TCP keepalive 探测空闲连接,配合内核 tcp_keepalive_* 参数
  • SO_SNDBUF / SO_RCVBUF
    • 发送/接收缓冲区大小(影响窗口、吞吐)
  • TCP_NODELAY
    • 关闭 Nagle,小包低延迟
  • TCP_FASTOPEN(TFO)
    • 在握手阶段就开始发送数据(需要客户端/服务端和中间设备支持)
7.2.2 典型 sysctl 调优点(需谨慎)

以下为「常见但要理解后再动」的一些参数:

bash 复制代码
# 提升 backlog能力
net.core.somaxconn = 1024          # listen() backlog 的上限
net.core.netdev_max_backlog = 5000 # 网卡队列未及时处理时的队列长度

# SYN 洪泛与半连接队列
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syncookies = 1

# TIME_WAIT 相关(非常谨慎)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 端口范围(短连接极多时)
net.ipv4.ip_local_port_range = 1024 65000

经验原则:

  • 在「观察到瓶颈」后,有针对性调优,而不是一上来就套网文"神配置"。
  • 搭配 ss -sss -antnetstat -s 观察 TCP 状态与重传等统计。
7.2.3 零拷贝与内核路径优化
  • sendfile():文件→socket 直接从页缓存写网卡缓冲,避免用户态拷贝
  • splice() / tee():在内核中在不同 fd 间转移数据
  • mmap():减少文件 I/O 复制开销

现代高性能服务器(Nginx、Envoy 等)大量利用 sendfile/零拷贝。

7.2.4 网卡与硬件 offload
  • Checksum Offload:由网卡计算/验证校验和
  • TSO(TCP Segmentation Offload):大报文在网卡中分段
  • LRO/GRO(Large/Generic Receive Offload):网卡/内核聚合多个小包
  • RSS(Receive Side Scaling):多队列网卡 + CPU 亲和,分散中断负载

验证与调优命令:

bash 复制代码
ethtool -k eth0      # 查看 offload 功能
ethtool -K eth0 tso on gro on gso on # 例:开启部分 offload

7.3 MTU 与碎片

  • 建议:避免路径中发生 IP 分片
    • 某些设备对分片处理不友好,会导致神秘丢包
  • 场景:
    • VPN/隧道(overlay) 中,外层包头会占用 MTU
    • 需要调小内层 MTU (比如 1450、1400)

调试:

bash 复制代码
ping -M do -s 1472 目标IP   # 1472 + 28(IP+ICMP) ≈ 1500,试探可用MTU

7.4 架构层面的优化

  • L4 负载均衡(LVS、内核 IPVS):
    • 转发效率高,工作在传输层
  • L7 负载均衡(Nginx、Envoy、Ingress):
    • 可以基于 URL/Host/Header 做路由与策略
  • CDN:
    • 静态内容边缘缓存,极大降低 RTT 与源站压力
  • 多活与就近接入:
    • GSLB(全局负载均衡)、Anycast、边缘节点

8. 安全实践:按层看攻击与防御

8.1 按层常见威胁

  1. 链路层:

    • ARP 欺骗、中间人攻击
    • MAC flooding 诱导交换机退化为 hub
  2. 网络层:

    • IP spoofing(伪造源地址)
    • Smurf 攻击(利用广播放大 ICMP flood)
  3. 传输层:

    • SYN Flood:耗尽半连接队列
    • TCP RST 注入:强行断开连接
    • TCP 会话劫持:预测 Seq/Ack
    • 端口扫描(nmap 等)
  4. 应用层:

    • HTTP Flood、Slowloris(慢请求占连接)
    • 各种业务逻辑攻击、SQL 注入、XSS 等

8.2 网络与主机边界防护

8.2.1 防火墙与 ACL
  • Linux:iptables / nftables
  • 路由器/交换机:ACL(访问控制列表)

简单示例(只允许 80/443):

bash 复制代码
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许已有连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80  -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
8.2.2 SYN Flood 防御
  • 内核:
    • 开启 SYN cookies:net.ipv4.tcp_syncookies = 1
    • 调大 tcp_max_syn_backlog
  • 前置防护:
    • 硬件防火墙 / 云厂商 Anti-DDoS
    • 清洗 + 限速 + 按源 IP/网段过滤
8.2.3 TCP 安全配置要点
  • 随机化初始序列号(现代系统默认已经做)
  • 增大 ephemeral port 范围,避免端口耗尽
  • 严格处理 RST 包,避免 RST 注入:
    • net.ipv4.tcp_rfc1337 = 1 等相关配置

8.3 TLS / HTTPS:传输层加密

  • 提供:
    • 机密性:中间人无法看明文
    • 完整性:防篡改
    • 身份认证:证书验证服务器身份

实践要点:

  • 使用现代协议版本:TLS 1.2 / 1.3
  • 合理的 Cipher Suite:优先 AEAD(如 AES-GCM, ChaCha20-Poly1305)
  • 开启 HSTS,强制使用 HTTPS
  • 使用 OCSP Stapling,减轻 CRL/OCSP 带来的延迟

8.4 IPsec / VPN / WireGuard

  • IPsec:在 IP 层加密与认证(隧道模式常用于站点到站点)
  • SSL VPN:在传输/应用层(如 OpenVPN)
  • WireGuard:
    • 基于 UDP,简洁现代,Key 管理简单
    • 内核实现性能优秀

8.5 DDoS 防护思路

  • 前移:在运营商/云厂商边缘清洗
  • 分布:Anycast + 多地域节点
  • 智能:行为分析、速率限制、自动扩容
  • 应用层:WAF 防护 HTTP 层攻击

9. 调试与可观测性

9.1 常用工具一览

  • 连通性/路径:
    • ping:检测基本连通、RTT、丢包
    • traceroute / mtr:路径与某一跳的丢包、延迟
  • DNS:
    • dig / nslookup:解析详情,区分 DNS 问题还是网络问题
  • Socket/连接状态:
    • ss -ant / netstat -ant:查看 TCP 连接状态(ESTABLISHED/TIME_WAIT 等)
    • ss -s:统计信息,观测重传、队列状态
  • 抓包:
    • tcpdump:CLI 抓包,配合 Wireshark 分析

      bash 复制代码
      tcpdump -i eth0 tcp port 80 -w http.pcap
    • Wireshark:图形化协议解析,查看三次握手、重传、窗口变化等

  • 现代可观测:
    • eBPF 工具(bcc/bpftrace):内核态观测 TCP RTT、重传、队列

9.2 简单排查路径示例

  1. 无法访问服务:

    • ping IP:基本连通?
    • traceroute:在哪一跳断?
    • dig 域名:DNS 是否解析正确?
    • ss -lntp:服务是否在监听预期端口?
    • iptables -L:有没有被防火墙拦截?
  2. 延迟高/抖动:

    • ping RTT 波动?
    • mtr 查看哪一跳抖动大?
    • tcpdump 看是否大量重传?
    • ss 查看 send/recv queue 是否堆积?

10. 总结 & 学习路径建议

10.1 协议栈要点回顾

  • 分层是为了「解耦」:应用只关心自己的协议,底层负责可靠传输与路由。
  • TCP 的核心:
    • 三次握手 & 四次挥手 → 连接管理
    • Seq/Ack + 重传 + SACK → 可靠性
    • 窗口 + 拥塞控制 → 性能与公平共存
  • 优化要点:
    • 优先从「架构与应用层」下手,减少 RTT/连接/数据量
    • 然后在「TCP、内核、网卡」层面精准调优
  • 安全要点:
    • 各层都有攻击面:从 ARP 到 DDoS
    • 最小暴露面 + 分层防御(防火墙 + TLS + WAF + 行为分析)

10.2 推荐一个循序渐进的学习与实战顺序

  1. 基础概念 :读一本网络基础书(或优质博客系列):
    • 分层概念、IP 子网、TCP 基本机制
  2. 实验验证
    • tcpdump + Wireshark 抓一次完整的 TCP/TLS/HTTP 会话,自己标注握手、窗口变化、重传
  3. 性能实践
    • 在测试环境压测一个简单 HTTP 服务
    • 逐步应用:keep-alive → HTTP/2 → sendfile → TCP 参数优化
  4. 安全实践
    • 配置基础防火墙规则
    • 配置 HTTPS(Let's Encrypt),观察 TLS 握手过程
    • 在受控环境模拟简单 SYN Flood,观察内核参数变化和防御效果
  5. 向下深入
    • 学习拥塞控制细节(CUBIC、BBR 等)
    • 关注内核网络栈实现(Linux net/ipv4/ 等源码)
相关推荐
2301_780789662 小时前
高防 IP 部署实战:DDoS 大流量攻击下的业务连续性保障策略
网络协议·tcp/ip·ddos
Gofarlic_oms12 小时前
跨国企业Cadence许可证全球统一管理方案
java·大数据·网络·人工智能·汽车
txinyu的博客3 小时前
(续篇):手写 C++ 完整 HTTP/1.1 服务器
服务器·网络协议·http
网安CILLE3 小时前
Wireshark 抓包实战演示
linux·网络·python·测试工具·web安全·网络安全·wireshark
YYYing.4 小时前
【计算机网络 | 第八篇】计网之传输层(二)—— TCP的可靠传输与流量控制
网络·网络协议·tcp/ip·计算机网络
呉師傅4 小时前
东芝3525AC彩色复印机打印配件寿命和打印错误记录方法【实际操作】
运维·服务器·网络·windows·电脑
weixin_468466854 小时前
通信与网络基础知识简记
网络·网络协议·系统架构·信息与通信·软考·香农公式·网络结构
上海云盾-高防顾问4 小时前
源站IP泄露防护:高防CDN“隐形斗篷”技术详解
网络·tcp/ip·安全
十月南城4 小时前
Kubernetes入门地图——核心对象、网络与存储的抽象关系与心智模型
网络·容器·kubernetes