第 1 章 - Azure RTOS NetX Duo 点对点协议 (PPP) 简介

通常,NetX 应用程序通过以太网连接到实际的物理网络。 这提供了快速、高效的网络访问。 但是,在某些情况下,应用程序无法访问以太网。 在这种情况下,应用程序仍然可以通过直接连接到另一个网络成员的串行接口连接到网络。 用于管理此类连接的最常见软件协议是点对点协议 (PPP)。

尽管串行通信相对简单,但 PPP 却有点复杂。 PPP 实际上是由多个协议组成的,如链接控制协议 (LCP)、Internet 协议控制协议 (IPCP)、密码身份验证协议 (PAP) 和质询握手身份验证协议 (CHAP)。 LCP 是 PPP 的主要协议。 其中,链接的基本组件以点对点的方式进行动态协商。 一旦成功协商链接的基本特征,就会使用 PAP 和/或 CHAP 来确保连接的对等方有效。 如果两个对等方都有效,则使用 IPCP 来协商对等方使用的 IP 地址。 在 IPCP 完成后,PPP 就能发送和接收 IP 数据包。

NetX 主要将 PPP 视为设备驱动程序。 nx_ppp_driver 函数提供给 NetX IP 创建函数 nx_ip_create。 否则,NetX 对 PPP 没有任何直接的了解。

PPP 串行通信

NetX PPP 包要求应用程序提供串行通信驱动程序。 此驱动程序必须支持 8 位字符,也可以使用软件流控制。 应用程序负责初始化此驱动程序,这应在创建 PPP 实例之前完成。

为了发送 PPP 数据包,必须将串行驱动程序输出字节例程提供给 PPP(在 nx_ppp_create 函数中指定)。 为了传输整个 PPP 数据包,此串行驱动程序字节输出例程将被重复调用。 串行驱动程序负责缓冲输出。 在接收端,只要有新字节到达,应用程序的串行驱动程序就必须调用 PPP nx_ppp_byte_receive 函数。 这通常是在中断服务例程 (ISR) 的上下文中完成的。 nx_ppp_byte_receive 函数将传入字节置于循环缓冲区中,并提醒 PPP 接收线程它的存在。

基于以太网的 PPP 通信

NetX PPP 也可以通过以太网传输 PPP 消息,在这种情况下,NetX PPP 包需要应用程序提供以太网通信驱动程序。

为了通过以太网发送 PPP 数据包,必须将输出例程提供给 PPP(在 nx_ppp_packet_send_set 函数中指定)。 为了传输整个 PPP 数据包,将反复调用此输出例程。 在接收端,只要有新数据包到达,应用程序的接收器就必须调用 PPP nx_ppp_packet_receive 函数。

PPP 数据包

PPP 利用 AHDLC 帧(HDLC 的子集)来封装所有 PPP 协议控制和用户数据。 AHDLC 帧如下所示:

标记 Addr Ctrl 信息 CRC 标记
7E FF 03 [0-1502 字节] 2 字节 7E

每个 PPP 帧都有这样的整体外观。 信息字段的前两个字节包含 PPP 协议类型。 有效值的定义如下:

  • C021:LCP
  • 8021:IPCP
  • C023:PAP
  • C223:CHAP
  • 0021:IP 数据包

如果有 0x0021 协议类型,则 IP 数据包紧随其后。 否则,如果存在其他协议之一,则以下字节对应于相应的特定协议。

为了确保唯一的 0x7E 开始/结束帧标记并支持软件流控制,AHDLC 使用转义序列来表示各种字节值。 0x7D 值指定对后面的字符进行编码,这基本上是与 0x20 互斥的原始字符。 例如,头中 Ctrl 字段的 0x03 值由两个字节序列表示:7D 23。 默认情况下,小于 0x20 的值以及“信息”字段中的 0x7E 和 0x7D 值都被转换为转义序列。 请注意,转义序列也适用于 CRC 字段。

LCP 既是主要的 PPP 协议,也是第一个运行的协议。 LCP 负责协商各种 PPP 参数,包括最大接收单元 (MRU) 和要使用的身份验证协议(PAP、CHAP 或 NONE)。 在 LCP 的两端都同意 PPP 参数之后,身份验证协议(若有)就开始运行。

密码身份验证协议 (PAP)

PAP 是一种相对简单的协议,它依赖于连接一端所提供的用户名和密码(如在 LCP 期间所协商)。 然后,另一端验证此信息。 如果正确,接受消息就会返回给发送方,然后 PPP 可以进入 IPCP 状态机。 否则,如果用户名或密码不正确,连接就会被拒绝。

注意

接口的两端都可以请求 PAP,但 PAP 通常只在一个方向上使用。

质询握手身份验证协议 (CHAP)

CHAP 是一种比 PAP 更复杂的身份验证协议。 CHAP 身份验证器向它的对等方提供名称和值。 然后,对等方使用所提供的名称来查找两个实体之间的共享“机密”。 然后,对 ID、值和“机密”进行计算。 此计算的结果在响应中返回。 如果正确,PPP 就可以进入 IPCP 状态机。 否则,如果结果不正确,连接就会被拒绝。

CHAP 的另一个有趣的地方是,它可以在连接建立后以随机的间隔发生。 这用来防止连接在经过身份验证后被劫持。 如果质询在这些随机时间之一失败,那么连接会立即终止。

注意

接口的两端都可以请求 CHAP,但 CHAP 通常只在一个方向上使用。

Internet 协议控制协议 (IPCP)

IPCP 是在 PPP 通信可用于 NetX IP 数据传输之前要执行的最后一个协议。 此协议的主要目的是让一个对等方将其 IP 地址告知给另一对等方。 在 IP 地址设置后,NetX IP 数据传输就启用了。

数据传输

如前所述,NetX IP 数据包驻留在协议 ID 为 0x0021 的 PPP 帧中。 所有收到的数据包都放置在一个或多个 NX_PACKET 结构中,并传输到 NetX 接收处理。 在传输时,NetX 数据包内容将放入 AHDLC 帧并传输。

PPP RFC

NetX PPP 符合 RFC1332、RFC1334、RFC1661、RFC1994 和相关 RFC。