PPP协议_基础知识

ppp协议

  • 点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议

一.ppp协议的组成

  • PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
    • 对各种协议数据报的封装方法(封装成帧)
    • 链路控制协议LCP       用于建立、配置以及测试数据链路的连接
    • 一套网络控制协议NCPs     其中的每一个协议支持不同的网络层协议

二. ppp协议的帧格式

帧格式:
在这里插入图片描述

  • 标志(Flag)字段:PPP帧的定界符,取值为0x7E
  • 地址(Address)字段:取值为OxFF,预留(目前没有什么作用)
  • 控制(Control)字段:取值为0x03,预留(目前没有什么作用)
  • 协议(Protocol)字段:指明帧的数据部分送交哪个协议处理
    • 在这里插入图片描述
  • 帧检验序列(Frame Check Sequence)字段:CRC计算出的校验位

注意:ppp是点对点的,并不是总线形的,因此无需使用CSMA/CD协议,自然就没有最短帧,所以信息占0-1500B,而不是46B-1500B

三.PPP协议的特点

  • 提供差错检测但不提供纠错功能,只保证无差错接收
  • 仅支持点对点的链路通信,不支持多点通信
  • 只支持全双工链路
  • ppp的两端可以运行不同的网络层协议,但仍然使用同一个PPP进行通信

四.ppp协议的透明传输与差错检测

(一).传输字节

如果传输的是字节,采用面向字节的异步链路采用插入转义字符的字节填充法.
发送方的处理:
在这里插入图片描述

  • 出现的每一个7E (PPP帧的定界符)字节转变成2字节序列(7D,5E)。
  • 出现的每一个7D(转义字符)字节转变成2字节序列(7D,5D)。
  • 出现的每一个ASCII码控制字符(数值小于0x20的字符),则在该字符前面插入一个7D
    字节,同时将该字符的编码加上Ox20。

接收方的处理:

  • 进行反变换即可恢复出原来的帧的数据部分。

(二).传输比特

面向比特的同步链路采用插入比特0的比特填充法
发送方的处理:

  • 对帧的数据部分进行扫描(一般由硬件实现)。只要发现5个连续的比特1,则立即填充1个比特0。

接收方的处理:

  • 对帧的数据部分进行扫描(一般由硬件实现)。只要发现5个连续的比特1,就把其后的1个比特0删除。
    在这里插入图片描述

(三).差错检测

差错检测-CRC

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是使用lwIP库中的ppp_listen函数的示例代码: ```c #include "ppp.h" #define PPP_DEVICE_NAME "ppp0" /* PPP link status callback */ static void link_status_cb(void *ctx, enum netif_nsc_reason reason, const struct netif *netif) { switch (reason) { case NETIF_NSC_IPV4_CONNECTED: /* IPv4 address has been assigned */ break; case NETIF_NSC_IPV6_CONNECTED: /* IPv6 address has been assigned */ break; case NETIF_NSC_IPV4_DISCONNECTED: case NETIF_NSC_IPV6_DISCONNECTED: /* Link has been disconnected */ break; default: break; } } int main(void) { struct netif ppp_netif; struct ppp_pcb *ppp; /* Initialize lwIP stack */ lwip_init(); /* Create a new PPP control block */ ppp = ppp_new(); /* Set up the PPP options */ ppp_set_auth(ppp, PPP_AUTHTYPE_NONE, NULL, NULL); /* Disable authentication */ ppp_set_default(ppp); /* Use default options */ /* Create a new network interface for PPP */ netif_add(&ppp_netif, NULL, NULL, NULL, ppp, ppp_netif_init, tcpip_input); /* Set up the link status callback */ netif_set_status_callback(&ppp_netif, link_status_cb); /* Start listening for incoming PPP connections */ ppp_listen(ppp); /* Start the lwIP stack */ sys_thread_new("lwip_thread", lwip_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); /* Wait for PPP connection */ while (ppp_link_status(ppp) != PPP_CONNECTED) { sys_msleep(1000); } /* PPP connection established */ printf("PPP connection established!\n"); /* Use the PPP network interface */ netif_set_up(&ppp_netif); /* Wait forever */ while (1) { sys_msleep(1000); } return 0; } ``` 在上面的示例代码中,我们创建了一个PPPD控制块(`ppp_new()`)并设置了PPPD选项(`ppp_set_auth()`和`ppp_set_default()`)。我们还创建了一个新的网络接口并将其与PPP控制块相关联(`netif_add()`)。然后,我们设置了一个回调函数,以便在PPP链路状态更改时得到通知(`netif_set_status_callback()`)。最后,我们调用`ppp_listen()`函数开始监听传入的PPP连接。 在等待PPP连接建立期间,我们可以执行其他操作。例如,启动lwIP堆栈(`lwip_thread()`),并在PPP连接建立后将网络接口设置为活动状态(`netif_set_up()`)。 请注意,上面的代码示例中省略了一些错误检查和清理代码,为了简化示例。在实际应用程序中,您需要添加适当的错误检查和清理代码,以确保代码的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐要考研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值