STUN(Session Traversal Utilities for NAT)是一个网络协议,用于帮助客户端发现其在 NAT(网络地址转换)之后的公共 IP 地址和端口,从而实现 NAT 穿越。STUN 协议在 WebRTC、VoIP 和其他实时通信系统中广泛使用。下面是对 STUN 交互过程中涉及的数据包的详细分析。
STUN 交互的基本流程
STUN 的工作原理主要包括以下几个步骤:
- 客户端向 STUN 服务器发送请求。
- STUN 服务器处理并响应。
- 客户端接收响应并解析公共 IP 和端口。
- 客户端根据收到的公共 IP 和端口进行 NAT 穿越和路径选择。
数据包分析
1. STUN Binding Request(绑定请求)
当客户端向 STUN 服务器发送一个 STUN 请求时,这个请求被称为 Binding Request
。这个请求的目标是让 STUN 服务器返回客户端的公共 IP 地址和端口。
示例 STUN Binding Request 数据包:
STUN Message Header:
- Message Type: 0x0001 (Binding Request)
- Message Length: 0x0000
- Magic Cookie: 0x2112A442
- Transaction ID: 0x63f96d584f90a32d18b68202
STUN Attributes (Optional):
- Username: <username>
- Integrity: <HMAC-SHA1 signature>
- Fingerprint: <CRC-32C of the message>
字段解释:
- Message Type: 指明这是一个 Binding Request(类型代码为
0x0001
)。 - Magic Cookie: 一个固定的值(
0x2112A442
),用于区分 STUN 消息。 - Transaction ID: 唯一标识该请求的 ID,用于匹配响应。
- Attributes: 包含附加信息,比如用户名、消息完整性检查等。
2. STUN Binding Response(绑定响应)
STUN 服务器接收到 Binding Request
后,会返回一个 Binding Response
,其中包含了客户端在 NAT 后的公共 IP 地址和端口。
示例 STUN Binding Response 数据包:
STUN Message Header:
- Message Type: 0x0101 (Binding Response)
- Message Length: 0x000C
- Magic Cookie: 0x2112A442
- Transaction ID: 0x63f96d584f90a32d18b68202
STUN Attributes:
- Mapped Address:
Family: IPv4
Address: 203.0.113.1
Port: 3478
- Username: <username>
- Integrity: <HMAC-SHA1 signature>
- Fingerprint: <CRC-32C of the message>
字段解释:
- Message Type: 表明这是一个 Binding Response(类型代码为
0x0101
)。 - Mapped Address: 包含客户端的公共 IP 地址和端口(例如
203.0.113.1:3478
)。 - Transaction ID: 与请求中的 Transaction ID 匹配,用于关联请求和响应。
3. 连接检查
STUN 还可以用于连接检查,即验证两个端点之间的路径是否可达。这通常是在交换候选地址之后进行的。在 WebRTC 中,ICE 代理使用 STUN 来测试不同路径的可达性。
示例连接检查请求:
STUN Message Header:
- Message Type: 0x0001 (Binding Request)
- Message Length: 0x0008
- Magic Cookie: 0x2112A442
- Transaction ID: 0x63f96d584f90a32d18b68202
STUN Attributes:
- Username: <peer-username>
- Message Integrity: <HMAC-SHA1 signature>
示例连接检查响应:
STUN Message Header:
- Message Type: 0x0101 (Binding Response)
- Message Length: 0x0008
- Magic Cookie: 0x2112A442
- Transaction ID: 0x63f96d584f90a32d18b68202
STUN Attributes:
- Mapped Address:
Family: IPv4
Address: 203.0.113.10
Port: 3479
字段解释:
- Message Type: 连接检查请求是
Binding Request
(0x0001
),响应是Binding Response
(0x0101
)。 - Magic Cookie: 与之前相同,标识为 STUN 消息。
- Transaction ID: 唯一标识请求和响应的关联,确保消息匹配。
- Mapped Address: 在响应中包含对端的公共 IP 地址和端口,表明路径可用。
总结
STUN 在客户端和服务器之间通过 Binding Request
和 Binding Response
消息进行通信,以帮助客户端获取其公共 IP 地址和端口。连接检查的过程中,STUN 请求和响应在端对端之间进行交换,以验证不同路径的可达性。这些信息对于 NAT 穿越和路径选择至关重要,特别是在 WebRTC 和其他实时通信协议中。