Skip to content

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
  │                              │
  │        连接建立               │

为什么是三次握手?

  1. 第一次握手:客户端发送SYN,服务器知道客户端能发送
  2. 第二次握手:服务器发送SYN-ACK,客户端知道服务器能发送和接收
  3. 第三次握手:客户端发送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=1000

3. 快速重传

  • 收到3个重复ACK立即重传
  • 不等超时
发送 seq=1000, 1500, 2000, 2500
收到 ack=1500 (正常)
收到 ack=1500 (重复1)
收到 ack=1500 (重复2)
收到 ack=1500 (重复3)
立即重传 seq=1500

4. 累积确认

  • 一次确认多个连续的数据包
收到 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=8

2. 拥塞避免(Congestion Avoidance)

  • 达到阈值(ssthresh)后,cwnd线性增长
  • 每个RTT增加1个MSS
cwnd = ssthresh后
每RTT: cwnd += 1

3. 快速重传和快速恢复

  • 收到3个重复ACK时触发
  • 立即重传丢失的数据包
  • cwnd减半(而不是降到1)
拥塞检测

快速重传

cwnd = cwnd / 2
ssthresh = cwnd

快速恢复

拥塞控制算法对比

             cwnd

              |        拥塞避免(线性增长)
   ssthresh   |       /
              |      /
              |     /
              |    /  慢启动(指数增长)
              |   /
              |  /
              | /
              |/
              +──────────────────→ time

UDP协议

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

特性TCPUDP
连接面向连接无连接
可靠性可靠传输不可靠传输
速度
头部开销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相关内容。

基于 VitePress 构建