Skip to main content

3. 控制连接协议操作 (Control Connection Protocol Operation)

本节描述各种PPTP控制连接功能的操作以及用于支持它们的控制连接消息。控制连接的协议操作被简化, 因为TCP用于提供可靠的传输机制。消息的排序和重传在此级别不是问题。然而, TCP连接本身可能随时关闭, 并且必须提供适当的错误恢复机制来处理这种情况。

某些错误恢复过程对控制连接的所有状态都是通用的。如果预期的回复在60秒内未到达, 则关闭控制连接, 除非另有规定。应实施适当的日志记录, 以便轻松确定问题和关闭控制连接的原因。

应适当记录接收到无效或格式错误的控制连接消息, 并应关闭并重新启动控制连接以确保恢复到已知状态。

3.1. 控制连接状态 (Control Connection States)

控制连接依赖于标准TCP连接来提供其服务。PPTP控制连接协议在PNS和PAC之间没有区别, 但在发起方和接收方之间是可区分的。发起对等方是首先尝试TCP打开的一方。由于PAC或PNS都可能发起连接, 因此可能发生TCP冲突。有关此情况的描述, 请参见第3.1.3节。

3.1.1. 控制连接发起方 (Control Connection Originator) (可以是PAC或PNS)

             TCP Open Indication
/Send Start Control
Connection Request +-----------------+
+------------------------------------>| wait_ctl_reply |
| +-----------------+
| Collision/See (4.1.3) Close TCP V V V Receive Start Ctl
| +-------------------------------+ | | Connection Reply
| | | | Version OK
^ V | V
+-----------------+ Receive Start Ctl | +-----------------+
| idle | Connection Reply | | established |
+-----------------+ Version Not OK | +-----------------+
^ | V Local Terminate
| Receive Stop Control | | /Send Stop
| Connection Request | | Control Request
| /Send Stop Control Reply V V
| Close TCP +-----------------+
+-------------------------------------| wait_stop_reply |
+-----------------+

idle (空闲)

控制连接发起方在空闲状态期间尝试打开到对等方的TCP连接。当TCP连接打开时, 发起方传输发送Start-Control-Connection-Request, 然后进入wait_ctl_reply状态。

wait_ctl_reply (等待控制回复)

发起方检查是否已从同一对等方请求了另一个TCP连接, 如果是, 则处理第3.1.3节中描述的冲突情况。

当收到Start-Control-Connection-Reply时, 检查其版本是否兼容。如果回复的版本低于请求中发送的版本, 则应使用较旧 (较低) 的版本, 前提是它受支持。如果回复的版本较早且受支持, 则发起方移至established状态。如果版本较早且不受支持, 则应当 (SHOULD) 向对等方发送Stop-Control-Connection-Request, 并且发起方移入wait_stop_reply状态。

established (已建立)

已建立的连接可以通过本地条件或接收到Stop-Control-Connection-Request来终止。在本地终止的情况下, 发起方必须 (MUST) 发送Stop-Control-Connection-Request并进入wait_stop_reply状态。

如果发起方收到Stop-Control-Connection-Request, 它应当 (SHOULD) 发送Stop-Control-Connection-Reply并关闭TCP连接, 确保最终的TCP信息已正确"推送"。

wait_stop_reply (等待停止回复)

如果收到Stop-Control-Connection-Reply, 则应当 (SHOULD) 关闭TCP连接, 并且控制连接变为空闲。

3.1.2. 控制连接接收方 (Control connection Receiver) (可以是PAC或PNS)

Receive Start Control Connection Request
Version Not OK/Send Start Control Connection
Reply with Error
+--------+
| | Receive Control Connection Request Version OK
| | /Send Start Control Connection Reply
| | +----------------------------------------+
^ V ^ V
+-----------------+ Receive Start Ctl +-----------------+
| Idle | Connection Request | Established |
+-----------------+ /Send Stop Reply +-----------------+
^ ^ Close TCP V V Local Terminate
| +-------------------------------------+ | /Send Stop
| | Control Conn.
| V Request
| +-----------------+
+-------------------------------------| Wait-Stop-Reply |
Receive Stop Control +-----------------+
Connection Reply
/Close TCP

idle (空闲)

控制连接接收方等待端口1723上的TCP打开尝试。当被通知有打开的TCP连接时, 它应该准备接收PPTP消息。当收到Start-Control-Connection-Request时, 应检查其版本字段。如果版本早于接收方的版本并且接收方可以支持较早的版本, 则接收方应当 (SHOULD) 发送Start-Control-Connection-Reply。如果版本早于接收方的版本并且不能支持该版本, 则接收方应当 (SHOULD) 发送Start-Connection-Reply消息, 关闭TCP连接并保持在空闲状态。如果接收方的版本与对等方的版本相同或早于对等方的版本, 则接收方应当 (SHOULD) 发送带有接收方版本的Start-Control-Connection-Reply并进入established状态。

established (已建立)

已建立的连接可以通过本地条件或接收到Stop-Control-Connection-Request来终止。在本地终止的情况下, 接收方必须 (MUST) 发送Stop-Control-Connection-Request并进入wait_stop_reply状态。

如果接收方收到Stop-Control-Connection-Request, 它应当 (SHOULD) 发送Stop-Control-Connection-Reply并关闭TCP连接, 确保最终的TCP信息已正确"推送"。

wait_stop_reply (等待停止回复)

如果收到Stop-Control-Connection-Reply, 则应当 (SHOULD) 关闭TCP连接, 并且控制连接变为空闲。

3.1.3. 启动控制连接发起请求冲突 (Start Control Connection Initiation Request Collision)

当PAC和PNS同时彼此发起控制连接时, 可能会发生冲突。当发起方处于wait_ctl_reply状态并收到另一个Start-Control-Connection-Request时, 检测到冲突。

当检测到冲突时, 冲突"获胜者"由有序比较两个对等方的IP地址确定。使用更高IP地址的对等方"获胜"。获胜者继续作为发起方 (保持在wait_ctl_reply状态)。失败方关闭其TCP连接, 并作为接收方等待获胜方的TCP Open。

3.1.4. 保活和计时器 (Keep Alives and Timers)

控制连接必须验证对等方的可达性。Echo-Request消息和Echo-Reply消息用于此目的。实现应当 (SHOULD) 定期向其对等方发送Echo-Request。如果发送方在合理的时间内未收到Echo-Reply, 它应当 (SHOULD) 向对等方发送另一个Echo-Request。如果合理数量的连续Echo-Requests (建议值为60秒和3次重试) 没有响应, 则控制连接应当 (SHOULD) 关闭, 隐式释放所有相关会话。

3.2. 呼叫状态 (Call States)

本节描述呼叫状态及其与控制连接协议操作的关系。

3.2.1. 时序考虑 (Timing considerations)

如果在1分钟内未发生状态转换 (除了处于空闲或已建立状态的连接), 则怀疑对等方之间的协议处理的完整性, 并且应当关闭并重新启动整个控制连接。每当启动控制连接时, 所有呼叫ID都在逻辑上被释放。这大概也有助于防止收费呼叫被"丢失"而永远不被清除。

不鼓励使用短计时器。

3.2.2. 呼叫ID值 (Call ID Values)

每个对等方为其请求或接受的每个用户会话分配一个呼叫ID值。此呼叫ID值对于它所属的PAC和PNS之间的隧道必须 (MUST) 是唯一的。到其他对等方的隧道可以使用相同的呼叫ID号, 因此隧道上的数据包的接收方需要将用户会话与特定隧道和呼叫ID关联。建议每个隧道的潜在呼叫ID值的数量至少是给定隧道上预期的最大呼叫数的两倍。

会话由三元组 (PAC, PNS, Call ID) 定义。

3.2.3. 呼入呼叫 (Incoming Calls)

当关联的电话线路响铃时, PAC生成Incoming-Call-Request消息。PAC选择呼叫ID和序列号, 并指示呼叫承载类型。调制解调器应始终指示模拟呼叫类型。ISDN呼叫应在使用非限制数字服务或速率适配时指示数字, 如果涉及数字调制解调器则指示模拟。拨号号码、被叫号码和子地址可能包含在消息中 (如果它们可从电话网络获得)。

一旦PAC发送Incoming-Call-Request, 它就等待来自PNS的响应, 但不接听来自电话网络的呼叫。如果以下情况, PNS可能选择不接受呼叫:

  • 没有可用资源来处理更多会话
  • 拨号、拨入或子地址字段不表示授权用户
  • 不授权或不支持承载服务

如果PNS选择接受呼叫, 它会响应一个Incoming-Call-Reply, 该回复还指示窗口大小 (见第4.2节)。当PAC收到Outgoing-Call-Reply时, 它尝试连接呼叫, 假设呼叫方未挂机。来自PAC到PNS的最终呼叫连接消息指示PAC和PNS的呼叫状态都应进入established状态。

当拨入的客户端挂机时, 呼叫正常清除, PAC发送Call-Disconnect-Notify消息。如果PNS希望清除呼叫, 它发送Call-Clear-Request消息, 然后等待Call-Disconnect-Notify。

3.2.3.1. PAC呼入呼叫状态 (PAC Incoming Call States)

 Ring/Send Incoming Call Request          +-----------------+
+----------------------------------------->| wait_reply |
| +-----------------+
| Receive Incoming Call Reply V V V
| Not Accepting | | | Receive Incoming
| +--------------------------------+ | | Call Reply Accept-
| | +------------------------------+ | ing/Answer call;
| | | Abort/Send Call | Send Call
^ V V Disconnect Notify V Connected
+-----------------+ +-----------------+
| idle |<-----------------------------| established |
+-----------------+ Receive Clear Call Request +-----------------+
or telco call dropped
or local disconnect
/Send Call Disconnect Notify

idle (空闲): PAC在其电信接口之一上检测到呼入呼叫。通常这意味着模拟线路正在响铃或ISDN TE检测到传入的Q.931 SETUP消息。PAC发送Incoming-Call-Request消息并移至wait_reply状态。

wait_reply (等待回复): PAC接收指示不愿意接受呼叫 (一般错误或不接受) 的Incoming-Call-Reply消息, 并返回到空闲状态。如果回复消息指示接受呼叫, PAC发送Incoming-Call-Connected消息并进入established状态。

established (已建立): 通过隧道交换数据。呼叫可能在以下情况下被清除:

  • 电信连接上的事件。PAC发送Call-Disconnect-Notify消息
  • 收到Call-Clear-Request。PAC发送Call-Disconnect-Notify消息
  • 本地原因。PAC发送Call-Disconnect-Notify消息

3.2.3.2. PNS呼入呼叫状态 (PNS Incoming Call States)

Receive Incoming Call Request
/Send Incoming Call Reply +-----------------+
Not Accepting if Error | Wait-Connect |
+-----+ +-----------------+
| | Receive Incoming Call Req. ^ V V
| | /Send Incoming Call Reply OK | | | Receive Incoming
| | +--------------------------------+ | | Call Connect
^ V ^ V------------------------------+ V
+-----------------+ Receive Call Disconnect +-----------------+
| Idle | Notify +- | Established |
+-----------------+ | +-----------------+
^ ^ | V Local Terminate
| +----------------------------+ | /Send Call Clear
| Receive Call Disconnect | Request
| Notify V
| +-----------------+
+--------------------------------------| Wait-Disconnect |
Receive Call Disconnect +-----------------+
Notify

idle (空闲): 收到Incoming-Call-Request消息。如果请求不可接受, 则向PAC发送Incoming-Call-Reply, 并且PNS保持在空闲状态。如果Incoming-Call-Request消息可接受, 则发送Incoming-Call-Reply, 在结果代码中指示接受。会话移至wait_connect状态。

wait_connect (等待连接): 如果会话在PAC上连接, PAC向PNS发送incoming call connect消息, 然后移入established状态。PAC可能发送Call-Disconnect-Notify以指示无法连接传入的呼叫者。例如, 如果电话用户意外地向PAC拨打标准语音呼叫, 导致被叫调制解调器上的握手失败, 则可能发生这种情况。

established (已建立): 会话通过接收来自PAC的Call-Disconnect-Notify消息或发送Call-Clear-Request来终止。一旦发送了Call-Clear-Request, 会话就进入wait_disconnect状态。

wait_disconnect (等待断开): 一旦收到Call-Disconnect-Notify, 会话就返回到空闲状态。

3.2.4. 呼出呼叫 (Outgoing Calls)

呼出消息由PNS发起, 并指示PAC在电信接口上拨打呼叫。呼出呼叫只有两条消息: Outgoing-Call-Request和Outgoing-Call-Reply。PNS发送Outgoing-Call-Request, 指定拨号方电话号码和子地址以及速度和窗口参数。一旦PAC确定以下情况, PAC必须 (MUST) 使用Outgoing-Call-Reply消息响应Outgoing-Call-Request消息:

  • 呼叫已成功连接
  • 由于以下原因发生呼叫失败: 没有可用于拨出的接口、被叫方忙或无应答, 或在为拨号选择的接口上未检测到拨号音

3.2.4.1. PAC呼出呼叫状态 (PAC Outgoing Call States)

Receive Outgoing Call Request in Error
/Send Outgoing Call Reply with Error
|--------+
| | Receive Outgoing Call Request No Error
| | /Off Hook; Dial
| | +-----------------------------------------
^ V ^ V
+-----------------+ Incomplete Call +-----------------+
| idle | /Send Outgoing Call | wait_cs_ans |
+-----------------+ Reply with Error +-----------------+
^ ^ or Recv. Call Clear Req. V V Telco Answer
| | /Send Disconnect Notify| | /Send Outgoing
| +-------------------------------------+ | Call Reply.
| V
| +-----------------+
+-------------------------------------| established |
Receive Call Clear Request +-----------------+
or local terminate
or telco disconnect
/Hangup call and send
Call Disconnect Notify

idle (空闲): 收到Outgoing-Call-Request。如果错误地收到此消息, 则响应带有错误条件集的Outgoing-Call-Reply。否则, 分配物理信道进行拨号。拨打出站呼叫, 等待连接, 并移至wait_cs_ans状态。

wait_cs_ans (等待电路交换应答): 如果呼叫不完整, 发送带有非零错误代码的Outgoing-Call-Reply。如果出站呼叫的计时器过期, 则发送带有非零错误代码的Outgoing-Call-Reply。如果建立了电路交换连接, 则发送指示成功的Outgoing-Call-Reply。

established (已建立): 如果收到Call-Clear-Request, 则应当 (SHOULD) 通过适当的机制释放电信呼叫, 并应当 (SHOULD BE) 向PNS发送Call-Disconnect-Notify消息。如果呼叫被客户端或电信接口断开, 则应当 (SHOULD) 向PNS发送Call-Disconnect-Notify消息。

3.2.4.2. PNS呼出呼叫状态 (PNS Outgoing Call States)

                Open Indication                              Abort/Send
/Send Outgoing Call Call Clear
Request +-----------------+Request
+-------------------------------->| Wait-Reply |----------+
| +-----------------+ |
| Receive Outgoing Call Reply V V Receive Outgoing |
| with Error | | Call Reply |
| +-------------------------------+ | No Error |
^ V V |
+-----------------+ +-----------------+ |
| Idle |<-----------------------------| Established | |
+-----------------+ Receive Call Disconnect +-----------------+ |
^ Notify V Local Terminate |
| | /Send Call Clear |
| | Request |
| Receive Call Disconnect V |
| Notify +-----------------+ |
+---------------------------------| Wait-Disconnect |<---------+
+-----------------+

idle (空闲): 向PAC发送Outgoing-Call-Request消息, 会话移入wait_reply状态。

wait_reply (等待回复): 收到指示错误的Outgoing-Call-Reply。会话返回到空闲状态。没有活动的电信呼叫。如果Outgoing-Call-Reply没有指示错误, 则电信呼叫已连接, 会话移至established状态。

established (已建立): 如果收到Call-Disconnect-Notify, 则电信呼叫已因结果和原因代码中指示的原因而终止。会话返回到空闲状态。如果PNS选择终止会话, 它向PAC发送Call-Clear-Request, 然后进入wait_disconnect状态。

wait_disconnect (等待断开): 会话断开正在等待PAC确认。一旦PNS收到Call-Disconnect-Notify消息, 会话就进入空闲状态。