跳到主要内容

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 (设置链路信息)