3. 协议概述 (Protocol Overview)
L2TP 使用两种类型的消息: 控制消息和数据消息。控制消息用于隧道和呼叫的建立、维护和清除。数据消息用于封装通过隧道承载的 PPP 帧。控制消息在 L2TP 内使用可靠的控制通道来保证传递 (详见第 5.1 节)。当发生数据包丢失时, 数据消息不会重传。
+-------------------+
| PPP 帧 |
+-------------------+ +-----------------------+
| L2TP 数据消息 | | L2TP 控制消息 |
+-------------------+ +-----------------------+
| L2TP 数据通道 | | L2TP 控制通道 |
| (不可靠) | | (可靠) |
+------------------------------------------------+
| 数据包传输 (UDP, FR, ATM 等) |
+------------------------------------------------+
图 3.0 描述了 L2TP 控制和数据通道上 PPP 帧和控制消息的关系。PPP 帧通过不可靠的数据通道传递, 首先由 L2TP 头部封装, 然后由数据包传输 (如 UDP、帧中继、ATM 等) 封装。控制消息通过可靠的 L2TP 控制通道发送, 该通道在同一数据包传输上带内传输数据包。
所有控制消息中都需要存在序列号, 用于在控制通道上提供可靠传递。数据消息可以使用序列号来重新排序数据包和检测丢失的数据包。
所有值都放入各自的字段中, 并以网络顺序 (高位八位字节在前) 发送。
3.1 L2TP 头部格式 (L2TP Header Format)
控制通道和数据通道的 L2TP 数据包共享公共头部格式。在每种情况下, 如果字段是可选的, 如果字段标记为不存在, 则其空间不存在于消息中。注意, 虽然在数据消息上是可选的, 但下面标记为可选的 Length、Ns 和 Nr 字段在所有控制消息上都必须存在。
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|T|L|x|x|S|x|O|P|x|x|x|x| Ver | Length (opt) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Tunnel ID | Session ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ns (opt) | Nr (opt) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset Size (opt) | Offset pad... (opt)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
类型 (T) 位: 指示消息的类型。数据消息设置为 0, 控制消息设置为 1。
长度 (L) 位: 如果为 1, 则存在 Length 字段。控制消息必须 (MUST) 将此位设置为 1。
x 位: 保留供将来扩展使用。所有保留位在发出消息时必须 (MUST) 设置为 0, 在接收消息时忽略。
序列 (S) 位: 如果设置为 1, 则存在 Ns 和 Nr 字段。控制消息的 S 位必须 (MUST) 设置为 1。
偏移 (O) 位: 如果为 1, 则存在 Offset Size 字段。控制消息的 O 位必须 (MUST) 设置为 0。
优先级 (P) 位: 如果为 1, 此数据消息应在其本地排队和传输中获得优先处理。此功能仅用于数据消息。所有控制消息的 P 位必须 (MUST) 设置为 0。
Ver: 必须 (MUST) 为 2, 表示本文档中描述的 L2TP 数据消息头部的版本。收到 Ver 字段未知的数据包必须 (MUST) 被丢弃。
Length 字段: 指示消息的总长度 (以八位字节为单位)。
Tunnel ID: 指示控制连接的标识符。L2TP 隧道由仅具有本地意义的标识符命名。每条消息中的 Tunnel ID 是预期接收方的, 而不是发送方的。
Session ID: 指示隧道内会话的标识符。L2TP 会话由仅具有本地意义的标识符命名。每条消息中的 Session ID 是预期接收方的, 而不是发送方的。
Ns: 指示此数据或控制消息的序列号, 从零开始, 每发送一条消息递增一 (模 2**16)。
Nr: 指示下一条要接收的控制消息中预期的序列号。因此, Nr 设置为最后一条按序接收的消息的 Ns 加一 (模 2**16)。
3.2 控制消息类型 (Control Message Types)
消息类型 AVP (见第 4.4.1 节) 定义了正在发送的控制消息的具体类型。
本文档定义了以下控制消息类型:
控制连接管理 (Control Connection Management)
- 0 (保留)
- 1 (SCCRQ) Start-Control-Connection-Request (启动控制连接请求)
- 2 (SCCRP) Start-Control-Connection-Reply (启动控制连接回复)
- 3 (SCCCN) Start-Control-Connection-Connected (启动控制连接已连接)
- 4 (StopCCN) Stop-Control-Connection-Notification (停止控制连接通知)
- 5 (保留)
- 6 (HELLO) Hello (保活)
呼叫管理 (Call Management)
- 7 (OCRQ) Outgoing-Call-Request (呼出请求)
- 8 (OCRP) Outgoing-Call-Reply (呼出回复)
- 9 (OCCN) Outgoing-Call-Connected (呼出已连接)
- 10 (ICRQ) Incoming-Call-Request (呼入请求)
- 11 (ICRP) Incoming-Call-Reply (呼入回复)
- 12 (ICCN) Incoming-Call-Connected (呼入已连接)
- 13 (保留)
- 14 (CDN) Call-Disconnect-Notify (呼叫断开通知)
错误报告 (Error Reporting)
- 15 (WEN) WAN-Error-Notify (WAN 错误通知)
PPP 会话控制 (PPP Session Control)
- 16 (SLI) Set-Link-Info (设置链路信息)