Skip to main content

3. Protocol Overview (协议概览)

L2TP 使用两种类型的消息:控制消息 (control messages) 和数据消息 (data messages)。控制消息用于隧道和呼叫的建立、维护和清除。数据消息用于封装通过隧道传输的 PPP 帧。控制消息使用 L2TP 内的可靠控制通道 (reliable Control Channel) 来保证传递(详见第 5.1 节)。当发生数据包丢失时,数据消息不会被重传。

+-------------------+
| PPP Frames |
+-------------------+ +-----------------------+
| L2TP Data Messages| | L2TP Control Messages |
+-------------------+ +-----------------------+
| L2TP Data Channel | | L2TP Control Channel |
| (unreliable) | | (reliable) |
+------------------------------------------------+
| Packet Transport (UDP, FR, ATM, etc.) |
+------------------------------------------------+

图 3.0 L2TP 协议结构

图 3.0 描绘了 PPP 帧和控制消息在 L2TP 控制和数据通道上的关系。PPP 帧通过不可靠的数据通道传递,首先由 L2TP 头部封装,然后由数据包传输层(如 UDP、帧中继、ATM 等)封装。控制消息通过可靠的 L2TP 控制通道发送,该通道在同一数据包传输层上带内传输数据包。

所有控制消息中都必须 (MUST) 存在序列号,用于在控制通道上提供可靠传递。数据消息可以使用序列号来重新排序数据包和检测丢失的数据包。

所有值都以网络顺序(高位字节优先)放入各自的字段并发送。

3.1 L2TP Header Format (L2TP 头部格式)

控制通道和数据通道的 L2TP 数据包共享一个公共的头部格式。在每种情况下,如果字段是可选的,那么当字段被标记为不存在时,该字段的空间在消息中不存在。请注意,虽然在数据消息中是可选的,但下面标记为可选的 Length、Ns 和 Nr 字段在所有控制消息中都必须 (MUST) 存在。

该头部格式如下:

 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)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

图 3.1 L2TP 消息头部

Type (T) 位指示消息的类型。数据消息设置为 0,控制消息设置为 1。

如果 Length (L) 位为 1,则 Length 字段存在。对于控制消息,此位必须 (MUST) 设置为 1。

x 位为未来扩展保留。所有保留位在传出消息中必须 (MUST) 设置为 0,在传入消息中忽略。

如果 Sequence (S) 位设置为 1,则 Ns 和 Nr 字段存在。对于控制消息,S 位必须 (MUST) 设置为 1。

如果 Offset (O) 位为 1,则 Offset Size 字段存在。对于控制消息,O 位必须 (MUST) 设置为 0(零)。

如果 Priority (P) 位为 1,则此数据消息应在其本地队列和传输中接收优先处理。例如,用作链路保活的 LCP 回显请求通常应将此位设置为 1 发送。如果没有它,本地拥塞的临时间隔可能会干扰保活消息并导致不必要的链路丢失。此功能仅用于数据消息。对于所有控制消息,P 位必须 (MUST) 设置为 0。

Ver 必须 (MUST) 为 2,表示本文档中描述的 L2TP 数据消息头部的版本。值 1 被保留,以便在 L2F [RFC2341] 数据包与 L2TP 数据包混合到达时能够检测到。接收到 Ver 字段未知的数据包必须 (MUST) 被丢弃。

Length 字段指示消息的总长度(以八位字节为单位)。

Tunnel ID 指示控制连接的标识符。L2TP 隧道由仅具有本地意义的标识符命名。也就是说,隧道的每一端将给同一隧道不同的 Tunnel ID。每个消息中的 Tunnel ID 是预期接收者的 ID,而不是发送者的 ID。Tunnel ID 在隧道创建期间作为 Assigned Tunnel ID AVP 选择和交换。

Session ID 指示隧道内会话的标识符。L2TP 会话由仅具有本地意义的标识符命名。也就是说,会话的每一端将给同一会话不同的 Session ID。每个消息中的 Session ID 是预期接收者的 ID,而不是发送者的 ID。Session ID 在会话创建期间作为 Assigned Session ID AVP 选择和交换。

Ns 指示此数据或控制消息的序列号,从零开始,每发送一个消息递增一(模 2**16)。有关使用此字段的更多信息,请参见第 5.8 和 5.4 节。

Nr 指示要接收的下一个控制消息中预期的序列号。因此,Nr 设置为最后一个按序接收的消息的 Ns 加一(模 2**16)。在数据消息中,Nr 是保留的,如果存在(由 S 位指示),则必须 (MUST) 在接收时被忽略。有关在控制消息中使用此字段的更多信息,请参见第 5.8 节。

Offset Size 字段(如果存在)指定 L2TP 头部之后有效载荷数据预期开始的八位字节数。偏移填充内的实际数据未定义。如果存在偏移字段,则 L2TP 头部在偏移填充的最后一个八位字节之后结束。

3.2 Control Message Types (控制消息类型)

Message Type AVP(参见第 4.4.1 节)定义正在发送的控制消息的特定类型。回忆第 3.1 节,这仅适用于控制消息,即 T 位设置为 1 的消息。

本文档定义了以下控制消息类型(有关每个消息的构造和使用的详细信息,请参见第 6.1 至 6.14 节):

控制连接管理 (Control Connection Management)

  • 0 (reserved) 保留
  • 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 (reserved) 保留
  • 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 (reserved) 保留
  • 14 (CDN) Call-Disconnect-Notify (呼叫断开通知)

错误报告 (Error Reporting)

  • 15 (WEN) WAN-Error-Notify (WAN 错误通知)

PPP 会话控制 (PPP Session Control)

  • 16 (SLI) Set-Link-Info (设置链路信息)