客户端的源 IP 和端口被编码在固定长度(38 个八位字节长)的标头中,并以下面描述的格式附加到每个代理的 UDP 数据报的有效负载前面。
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic Number | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
| |
+ Client Address +
| |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
+ +
| |
+ Proxy Address +
| |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | Client Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Proxy Port | Payload... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+标头的内容如下:
16 位固定值,对于 SPP 设置为 0x56EC。此字段应该用于识别 SPP 协议及其 SPP 38 字节标头。
代理 UDP 数据报的始发者(即客户端)的 128 位地址。如果客户端使用 IPv6 寻址,则是 IPv6 地址;如果是 IPv4 客户端,则是 IPv4 映射的 IPv6 地址(参阅 RFC 4291 ↗)。
代理 UDP 数据报的接收者(即代理)的 128 位地址。内容应该以与 Client Address 相同的方式进行解释。
代理 UDP 数据报的 16 位源端口号。换句话说,就是客户端用来发送数据报的 UDP 端口号。
代理 UDP 数据报的 16 位目标端口号。换句话说,就是代理接收该数据报的 UDP 端口号。
数据报所携带的标头后面的数据。 Magic number (魔数)、地址和端口号均以网络字节序 (network byte order) 编码。
描述该标头的相应 C 语言结构如下:
struct {
uint16_t magic;
uint8_t client_addr[16];
uint8_t proxy_addr[16];
uint16_t client_port;
uint16_t proxy_port;
};