📜  点对点协议(PPP)套件(1)

📅  最后修改于: 2023-12-03 14:56:11.533000             🧑  作者: Mango

点对点协议(PPP)套件

PPP是一种数据链路层协议,用于在两个网络节点之间建立并维护数据链路连接。PPP提供了一种可靠的、专门设计用于串行介质(例如电话线、光纤电缆等)的点对点连接协议。

PPP协议套件包括三个部分:LCP(链路控制协议)、NCP(网络控制协议)和PAP/CHAP(用户认证协议)。

LCP(链路控制协议)

链路控制协议(LCP)负责协商和验证两个节点之间的连接,并配置建立的连接。以下是LCP的一些特性:

  • 握手过程:PPP的连接建立始于LCP协议会话的握手过程。LCP会向另一端发送一个连接请求,获得确认后,就可以开始与另一端进行数据通信。

  • 单点检测:当一端探测到链路中断时,就会向另一端发送“终止请求”,停止数据的传输。

  • 时延检测:LCP可以在连接周期中发送Echo请求,以检测链路时延情况。

NCP(网络控制协议)

网络控制协议(NCP)的任务是协商和配置属于一个PPP连接的网络层协议。这个网络层协议可以是IP、IPX等协议。

  • PPP over Ethernet(PPPoE):PPPoE利用NCP来允许PPP运行在以太网上。通过将LCP和NCP信息放在以太网帧中,PPPoE将PPP协议封装在以太网中。
PAP/CHAP(用户认证协议)

点对点协议(PPP)提供了两种认证协议:密码认证协议(PAP)和挑战通信协议(CHAP)。

  • PAP: PAP是最简单的PPP认证协议。它在连接建立阶段中向对端发送明文密码作为身份验证的凭据,因此安全性较差。

  • CHAP: CHAP使用基于哈希函数的挑战和响应协议为每个用户名和密码对进行一次性身份验证。它的安全性更高。

# 使用Python的asyncio库实现一个简单的PPP协议连接

import asyncio

async def start_ppp():
    transport, protocol = await asyncio.serial_connect('/dev/ttyUSB0', baudrate=38400, bytesize=8, parity=None, stopbits=1)
    # 和 PPP server 握手, 配置 LCP 和 NCP 协议
    await asyncio.gather(
        protocol.lcp_handshake(),
        protocol.ncp_configure()
    )
    # PPP 用户认证
    await authentication()
    # PPP 连接成功
    print('PPP connection established!')
    async for data in protocol.read():  # 读取 PPP server 发来的数据
        # 处理从 PPP server 发来的数据
        print(data)

async def authentication():
    # PAP 认证
    await protocol.pap_authenticate(username='foo', password='bar')
    # CHAP 认证
    await protocol.chap_authenticate(username='foo', secret=b'secret_key')

if __name__ == '__main__':
    asyncio.run(start_ppp())

以上是一个使用Python的asyncio库实现的例子,它连接到一个串行端口,进行LCP、NCP协议的协商后,使用PAP或CHAP协议进行用户认证。一旦连接建立,就可以读取PPPoE server 发来的数据。