第3周:计算机网络夯实——从包到连接
目标:深入理解 TCP/IP 协议栈各层,能通过 Wireshark 抓包分析协议行为。
1. TCP 三次握手与四次挥手
1.1 状态机
1 | 客户端 服务器 |
1.2 各状态含义
| 状态 | 含义 | 持续时间 |
|---|---|---|
| LISTEN | 监听连接请求 | 长期 |
| SYN_SENT | 已发 SYN,等待确认 | 通常 < 1s |
| SYN_RCVD | 收到 SYN,已回复 SYN+ACK | 通常 < 1s |
| ESTABLISHED | 连接已建立 | 通信期间 |
| FIN_WAIT_1 | 已发 FIN,等待 ACK | 通常 < 1s |
| FIN_WAIT_2 | FIN 已确认,等待对方 FIN | 取决于应用 |
| CLOSE_WAIT | 收到 FIN,等待本地关闭 | 取决于应用 |
| LAST_ACK | 已发 FIN,等待最后 ACK | 通常 < 1s |
| TIME_WAIT | 主动关闭方等待 2MSL | 2×MSL(通常 1-4 分钟) |
| CLOSED | 连接完全关闭 | — |
1.3 TIME_WAIT 详解
为什么需要 TIME_WAIT?
1 | 原因1:确保最后的 ACK 能被对方收到 |
大量 TIME_WAIT 问题:
1 | # 查看 TIME_WAIT 数量 |
2. Wireshark 抓包分析
2.1 抓包实战步骤
1 | # 1. 选择网卡 |
2.2 TCP 字段详解
1 | TCP Header (通常 20 字节,不含选项): |
标志位:
| 标志 | 位置 | 含义 |
|---|---|---|
| URG | bit 5 | 紧急指针有效 |
| ACK | bit 4 | 确认号有效 |
| PSH | bit 3 | 推送数据 |
| RST | bit 2 | 重置连接 |
| SYN | bit 1 | 同步序列号(连接建立) |
| FIN | bit 0 | 发送方已无数据 |
3. TCP 重传机制
3.1 快速重传
1 | 发送方 接收方 |
3.2 SACK(选择性确认)
1 | 接收方:我有 0-100, 300-500 |
3.3 抓包验证重传
1 | # Wireshark 过滤重传 |
4. TCP 拥塞控制
4.1 核心参数
1 | cwnd (Congestion Window):拥塞窗口,发送方能发多少数据 |
4.2 慢启动与拥塞避免
1 | 慢启动阶段(cwnd < ssthresh): |
4.3 抓包观察拥塞控制
1 | # 提取 TCP 序列号和窗口大小 |
5. 抓包解析工具
1 | // pcap_stats.c |
1 | gcc -o pcap_stats pcap_stats.c -lpcap |
6. TCP 滑动窗口
6.1 工作原理
1 | 发送窗口: |
6.2 Zero Window 问题
1 | 接收方缓冲区满了: |
6.3 TCP 延迟确认
1 | 接收方策略: |
7. 网络分层模型速查
1 | ┌─────────────┐ |
| 层 | 协议 | 关键数据单元 |
|---|---|---|
| 应用层 | HTTP, DNS | 消息 (Message) |
| 传输层 | TCP, UDP | 段 (Segment) / 数据报 (Datagram) |
| 网络层 | IP, ICMP | 包 (Packet) |
| 链路层 | Ethernet | 帧 (Frame) |
| 物理层 | — | 比特 (Bit) |
各层封装
1 | [Application Data] |
8. 关键命令速查
1 | # === 网络接口与路由 === |
9. IP 地址与端口
1 |
|
10. 字节序转换函数速查
1 |
|
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/01/第3周:计算机网络夯实——从包到连接/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!