TCP/IP协议栈学习笔记
TCP/IP 协议栈是互联网通信的基石。本文整理 TCP/IP 四层模型与 OSI 七层模型的对应关系,重点记录 TCP 的三次握手、四次挥手以及滑动窗口、拥塞控制等核心机制,是理解网络通信的基础。
一、TCP/IP四层模型与OSI七层模型
两种模型的对应关系:
- 应用层(TCP/IP)对应 OSI 应用层、表示层、会话层:HTTP、DNS、SSH、FTP
- 传输层(TCP/IP)对应 OSI 传输层:TCP、UDP
- 网络层(TCP/IP)对应 OSI 网络层:IP、ICMP、ARP
- 网络接口层(TCP/IP)对应 OSI 数据链路层、物理层:以太网、Wi-Fi
TCP/IP 模型更贴近实际实现,OSI 模型更适合教学分层。
二、TCP与UDP对比
- TCP:面向连接、可靠传输、有序、字节流、有流量控制与拥塞控制。适用于 HTTP、SSH、邮件等要求可靠性的场景。
- UDP:无连接、不可靠、数据报、无流量控制。适用于 DNS、视频流、游戏等追求低延迟、可容忍少量丢包的场景。
三、TCP三次握手
TCP 建立连接需要三次握手:
- 第一次握手:客户端发送 SYN(seq=x)给服务器,进入 SYN_SENT 状态。
- 第二次握手:服务器收到 SYN,回复 SYN+ACK(seq=y, ack=x+1),进入 SYN_RCVD 状态。
- 第三次握手:客户端收到 SYN+ACK,回复 ACK(ack=y+1),双方进入 ESTABLISHED 状态。
为什么是三次而非两次?核心原因是确认"双方都能收发"。两次握手无法防止历史失效的 SYN 报文导致服务器误建立连接。
使用 ss 查看连接状态:
# 查看所有 TCP 连接
ss -tan
# 查看指定端口连接状态统计
ss -tan | awk '{print $1}' | sort | uniq -c
四、TCP四次挥手
TCP 断开连接需要四次挥手:
- 第一次挥手:主动方发送 FIN,进入 FIN_WAIT_1。
- 第二次挥手:被动方收到 FIN,回复 ACK,进入 CLOSE_WAIT;主动方进入 FIN_WAIT_2。
- 第三次挥手:被动方发送 FIN,进入 LAST_ACK。
- 第四次挥手:主动方收到 FIN,回复 ACK,进入 TIME_WAIT;被动方进入 CLOSED。主动方等待 2MSL 后关闭。
TIME_WAIT 状态持续 2MSL(通常 60 秒),目的是确保被动方收到最后的 ACK,并让本次连接的报文在网络中消亡。
五、滑动窗口
滑动窗口是 TCP 流量控制的核心机制。接收方通过 ACK 报文中的窗口大小(rwnd)告知发送方自己能接收的数据量,发送方据此调整发送速度,避免压垮接收方。
- 窗口越大,吞吐量越高
- 窗口为 0 时,发送方暂停发送,定期发送窗口探测报文
- 窗口大小由接收缓冲区剩余空间决定
六、拥塞控制
流量控制解决"接收方处理不了",拥塞控制解决"网络处理不了"。主流算法:
- 慢启动:cwnd 从 1 开始指数增长,达到 ssthresh 后进入拥塞避免
- 拥塞避免:cwnd 线性增长,每个 RTT 增加 1
- 快重传:连续收到 3 个重复 ACK 立即重传丢失报文,不等待超时
- 快恢复:ssthresh 设为当前 cwnd 一半,cwnd 设为 ssthresh,进入拥塞避免
查看与调整拥塞控制算法:
# 查看当前算法
sysctl net.ipv4.tcp_congestion_control
# 查看可用算法
sysctl net.ipv4.tcp_available_congestion_control
# 启用 BBR(适用于高带宽延迟网络)
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
小结
TCP/IP 协议栈的核心在于分层设计与可靠传输机制。理解三次握手、四次挥手是排查连接问题的基础;滑动窗口与拥塞控制解释了 TCP 如何在不稳定的网络中实现高吞吐与公平性。日常运维中,ss、tcpdump、sysctl 是诊断 TCP 问题的常用工具。