TCP/IP协议详解
TCP协议
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输层协议。
TCP特点
- ✅ 面向连接:通信前需要建立连接
- ✅ 可靠传输:保证数据完整、有序到达
- ✅ 流量控制:防止发送方发送过快
- ✅ 拥塞控制:防止网络拥塞
- ❌ 开销大:头部至少20字节
- ❌ 速度慢:需要建立连接和确认
TCP头部结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+重要字段:
- 序列号(Sequence Number):标识发送的数据字节
- 确认号(Acknowledgment Number):期望收到的下一个字节
- 标志位:
- SYN:建立连接
- ACK:确认
- FIN:结束连接
- RST:重置连接
- PSH:推送数据
- URG:紧急数据
- 窗口大小(Window):流量控制
TCP三次握手
建立连接的过程。
客户端 服务器
│ │
│────── SYN (seq=x) ──────────>│ 1. SYN
│ │
│<─── SYN-ACK (seq=y,ack=x+1) ─│ 2. SYN-ACK
│ │
│────── ACK (ack=y+1) ────────>│ 3. ACK
│ │
│ 连接建立 │为什么是三次握手?
- 第一次握手:客户端发送SYN,服务器知道客户端能发送
- 第二次握手:服务器发送SYN-ACK,客户端知道服务器能发送和接收
- 第三次握手:客户端发送ACK,服务器知道客户端能接收
两次握手的问题:
- 服务器无法确认客户端是否收到SYN-ACK
- 可能导致历史连接请求被接受
TCP四次挥手
断开连接的过程。
客户端 服务器
│ │
│────── FIN (seq=u) ──────────>│ 1. FIN
│ │
│<────── ACK (ack=u+1) ────────│ 2. ACK
│ │
│<────── FIN (seq=v) ──────────│ 3. FIN
│ │
│────── ACK (ack=v+1) ────────>│ 4. ACK
│ │
│ 连接关闭 │为什么是四次挥手?
- TCP是全双工通信,双方都需要关闭连接
- 第2、3次可以合并(如果服务器没有数据要发送)
TIME_WAIT状态
- 主动关闭方在发送最后一个ACK后进入TIME_WAIT状态
- 等待2MSL(Maximum Segment Lifetime)后才关闭
- 目的:确保对方收到最后的ACK
MSL:报文最大生存时间,通常为2分钟
TCP可靠传输
1. 序列号和确认号
- 每个字节都有序列号
- 接收方返回确认号(ACK)
发送:seq=1000, data="Hello"
接收:ack=1005 (1000 + 5个字节)2. 超时重传
- 发送数据后启动定时器
- 超时未收到ACK则重传
发送 seq=1000
等待 ACK...
超时!
重传 seq=10003. 快速重传
- 收到3个重复ACK立即重传
- 不等超时
发送 seq=1000, 1500, 2000, 2500
收到 ack=1500 (正常)
收到 ack=1500 (重复1)
收到 ack=1500 (重复2)
收到 ack=1500 (重复3)
立即重传 seq=15004. 累积确认
- 一次确认多个连续的数据包
收到 seq=1000, 1500, 2000
发送 ack=2500 (确认前面所有数据)TCP流量控制
使用滑动窗口机制控制发送速率。
滑动窗口
发送窗口:
┌─────────┬─────────┬─────────┬─────────┐
│ 已发送 │ 可发送 │ 不可发送 │ 未来 │
│ 已确认 │ 未确认 │ │ │
└─────────┴─────────┴─────────┴─────────┘
^ ^
| |
发送窗口 窗口大小接收窗口:
- 接收方告诉发送方自己的缓冲区大小
- 防止发送方发送过快导致接收方缓冲区溢出
TCP拥塞控制
防止网络拥塞的机制。
1. 慢启动(Slow Start)
- 初始cwnd=1(拥塞窗口)
- 每收到一个ACK,cwnd加倍
RTT1: cwnd=1
RTT2: cwnd=2
RTT3: cwnd=4
RTT4: cwnd=82. 拥塞避免(Congestion Avoidance)
- 达到阈值(ssthresh)后,cwnd线性增长
- 每个RTT增加1个MSS
cwnd = ssthresh后
每RTT: cwnd += 13. 快速重传和快速恢复
- 收到3个重复ACK时触发
- 立即重传丢失的数据包
- cwnd减半(而不是降到1)
拥塞检测
↓
快速重传
↓
cwnd = cwnd / 2
ssthresh = cwnd
↓
快速恢复拥塞控制算法对比
cwnd
↑
| 拥塞避免(线性增长)
ssthresh | /
| /
| /
| / 慢启动(指数增长)
| /
| /
| /
|/
+──────────────────→ timeUDP协议
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。
UDP特点
- ✅ 无连接:不需要建立连接
- ✅ 速度快:开销小,延迟低
- ✅ 支持广播和多播
- ❌ 不可靠:不保证数据到达
- ❌ 无流量控制
- ❌ 无拥塞控制
UDP头部结构
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source Port | Destination Port|
+--------+--------+--------+--------+
| Length | Checksum |
+--------+--------+--------+--------+
| Data (variable) |
+-----------------------------------+仅8字节,非常简洁。
UDP应用场景
- 实时音视频通信(RTP)
- DNS查询
- DHCP
- 在线游戏
- 视频直播
- 物联网(IoT)
TCP vs UDP
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 速度 | 慢 | 快 |
| 头部开销 | 20字节+ | 8字节 |
| 流量控制 | 有 | 无 |
| 拥塞控制 | 有 | 无 |
| 应用场景 | 文件传输、Web浏览、邮件 | 实时音视频、DNS、游戏 |
IP协议
IP(Internet Protocol,网际协议)是网络层协议,负责数据包的路由和转发。
IPv4头部结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+重要字段:
- TTL(Time To Live):数据包最大跳数
- Protocol:上层协议(6=TCP, 17=UDP)
- Source/Destination Address:源/目的IP地址
IP分片
- MTU(Maximum Transmission Unit):最大传输单元,通常为1500字节
- 数据包超过MTU需要分片
- 分片在目的地重组
ICMP协议
ICMP(Internet Control Message Protocol,网际控制消息协议)用于网络诊断。
ICMP消息类型
- Echo Request/Reply:ping命令使用
- Destination Unreachable:目标不可达
- Time Exceeded:TTL超时,traceroute使用
- Redirect:路由重定向
ping工作原理
客户端 服务器
│ │
│── ICMP Echo Request (type=8) >│
│ │
│<─ ICMP Echo Reply (type=0) ──│
│ │traceroute工作原理
发送TTL=1的数据包 → 第1跳路由器返回Time Exceeded
发送TTL=2的数据包 → 第2跳路由器返回Time Exceeded
发送TTL=3的数据包 → 第3跳路由器返回Time Exceeded
...
直到到达目标主机ARP协议
ARP(Address Resolution Protocol,地址解析协议)将IP地址解析为MAC地址。
ARP工作流程
1. 主机A要发送数据给主机B(192.168.1.2)
2. 查ARP缓存,没有B的MAC地址
3. 广播ARP请求:"谁是192.168.1.2?"
4. 主机B回应:"我是192.168.1.2,MAC是xx:xx:xx"
5. 主机A记录到ARP缓存
6. 发送数据包ARP缓存
bash
# 查看ARP缓存
arp -a
# Linux
ip neigh show
# 清除ARP缓存
arp -d 192.168.1.1💡 提示
这是一个demo文档,欢迎补充更多TCP/IP相关内容。