网络网络层之(7)PPPOE协议

news2024/12/23 6:56:56

网络网络层之(7)PPPOE协议


Author: Once Day Date: 2024年4月7日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客。

参考文章:

  • RFC 1661 - The Point-to-Point Protocol (PPP)
  • RFC 2516 - A Method for Transmitting PPP Over Ethernet (PPPoE)
  • RFC 3817 - Layer 2 Tunneling Protocol (L2TP) Active Discovery Relay for PPP over Ethernet
    (PPPoE)
  • RFC 4638 - Accommodating a Maximum Transit Unit/Maximum Receive Unit (MTU/MRU) Greater Than 1492 in the Point-to-Point Protocol over
    Ethernet (PPPoE)
  • RFC 4938 - PPP Over Ethernet (PPPoE) Extensions for Credit Flow and Link Metrics
  • RFC 5578 - PPP over Ethernet (PPPoE) Extensions for Credit Flow and Link Metrics
  • PPPoE(Point-to-Point Protocol over Ethernet)技术-腾讯云开发者社区-腾讯云 (tencent.com)
  • 彻底搞懂PPP协议 & PPPoE协议 - 知乎 (zhihu.com)
  • 网络链路层之(2)PPP协议_ppp协议工作状态传输数据-CSDN博客
  • 什么是PPPoE?PPPoE解决了哪些问题? - 华为 (huawei.com)
  • PPPoE技术白皮书-新华三集团-H3C
  • PPPoE报文格式及交互详解-CSDN博客
  • pppoe(8): user-space PPPoE client - Linux man page (die.net)
  • pppoe-server(8): user-space PPPoE server - Linux man page (die.net)

文章目录

  • 网络网络层之(7)PPPOE协议
        • 1. 概述
          • 1.1 PPPoE介绍
          • 1.2 常见拓扑场景
        • 2. PPPoE报文
          • 2.1 PPPoE报文格式
        • 3. PPPOE工作过程
        • 4. PPPoE和IPoE和区别和联系
        • 5. Linux ubuntu上配置PPPoE服务器
          • 5.1 Linux内核支持pppoe协议
          • 5.2 检查Ubuntu的PPPoE支持情况
          • 5.3 ubuntu上配置PPPoE服务器
          • 5.4 PPPoE服务器和客户端的交互流程
        • 6. 总结

1. 概述
1.1 PPPoE介绍

PPPoE,全称为点对点协议通过以太网(Point-to-Point Protocol over Ethernet),是一种在以太网上运行的封装协议,它允许将点对点协议(PPP)帧通过以太网封装并传输。这种技术最早是为了实现通过简单的以太网连接来接入互联网的宽带接入服务,尤其是在DSL(数字用户线)服务中得到了广泛应用。

PPPoE结合了以太网和PPP的特点,既有以太网简单的网络搭建特性,又有PPP支持的认证、加密和压缩功能

PPPoE协议允许用户在现有的网络架构上进行小改动即可接入互联网,这大大降低了成本和技术门槛。用户通过PPPoE连接到互联网时,会经历认证过程,这通常需要账号和密码,确保了连接的合法性和安全性。这种认证机制让宽带服务商能够轻松管理用户的接入,并且提供计费服务。

PPPoE一般具有如下优点:

  • 易于部署和维护,只需要在用户端和服务器端分别设置账户信息即可。
  • 支持多种网络协议,并且可以提供一定程度的数据加密,提高数据传输的安全性。
  • 支持每个用户的会话管理(每个会话有唯一的Session ID),使得个别用户的网络问题不会影响到其他人的网络连接。

然而,PPPoE也有其局限性,如下所示:

  • 每次连接互联网时都需要进行拨号操作,这对于想要实现始终在线的用户来说可能会有些不便。
  • PPPoE会话需要保持心跳,以维持连接的活跃状态,这可能会消耗一些额外的带宽。
  • 会引入额外的延迟和开销,因为需要对数据包进行封装和解封装。

在欧洲一些老建筑内,PPPoE可以最大程度利用原有电信线路来实现高性能网络通信。在国内的网吧和公司里面,运营商的专线也需要该技术提供支撑。对于运营商而言,则可以通过访问控制功能对用户的身份进行确认,以及通过计费功能对用户进行计费,同时对用户的网络行为进行监控。

1.2 常见拓扑场景

PPPoE一般有两种部署场景,如下所示:

在这里插入图片描述

第一种部署场景是运营商部署场景。在这个模型中,运营商负责部署PPPoE服务器。用户通过电话线路连接到DSLAM(Digital Subscriber Line Access Multiplexer,数字用户线接入复用器),DSLAM再通过高速互联网连接至运营商的PPPoE服务器。

用户端则需要一个DSL调制解调器(Modem),其负责将电话线路的模拟信号转换成数字信号,然后通过PPPoE协议进行认证,建立网络连接。一旦认证成功,用户的电脑便通过DSL调制解调器连接到互联网。

运营商部署方式常见于家庭或小型办公室,可以将单一的互联网连接共享给多个设备使用

第二种部署场景是是将PPPoE客户端拨号的责任下放到用户的每一台主机(Host)上。每个Host作为一个PPPoE客户端,都需要进行单独的验证和会话管理。

一旦建立连接,运营商的路由器就能识别出来自该主机的流量,并根据用户的账号进行相应的计费和流量控制。

PPPoE客户端下放部署方式通常用于小型办公室、网吧或者学校等环境,这些场合需要对用户进行严格的带宽和使用时间控制

2. PPPoE报文
2.1 PPPoE报文格式

PPPoE报文基本上由两部分组成:以太网头部和PPP会话数据。以太网头部用于识别数据包类型和目的地,而PPP会话数据则承载了实际的PPP通信内容。

PPP报文的格式可以参考文章:网络链路层之(2)PPP协议_ppp协议工作状态传输数据-CSDN博客。

PPPoE协议是基于以太网的,而以太网本身已经具有帧控制和地址指定的功能,因此PPP的地址和控制字段被省略了。所以PPPoE报文主要包含以下几个部分:

  • 以太网头部,类型字段被设置为0x88630x8864,分别表示PPPoE发现阶段和PPPoE会话阶段(数据报文)。
  • PPPoE头部,包括版本号、类型、会话ID、PPPoE负载长度和PPPoE代码。
  • PPP会话数据,包含PPP协议字段和PPP有效载荷。协议字段标识了PPP数据包的类型,例如IP数据包、IPX数据包或其他。

PPPoE报文具体格式如下图所示:

在这里插入图片描述

PPPoE报文各字段解释如下:

  • 目的MAC地址,一个以太网单播目的地址或者以太网广播地址(0xffffffff),广播地址是PPPoE Discovery阶段在使用。
  • 以太网负载类型(Ether Type),设置为0x8863(Discovery阶段或拆链阶段),或者0x8864(Session阶段)。
  • 版本(Version),4比特,指定PPPoE协议的版本号,当前版本号固定为1。
  • 类型(Type),4比特,指定PPPoE协议的类型,对于PPPoE Discovery阶段取值为1,对于PPPoE Session阶段取值为0。
  • 代码(Code),8比特,指定PPPoE协议的消息类型,如下所示:
    • Code值为0x00,表示会话数据。
    • Code域为0x09,表示PADI(PPPoE Active Discovery Initiation)报文。
    • Code域为0x07,表示PADO(PPPoE Active Discovery Offer)或PADT(PPPoE Active Discovery Terminate)报文。
    • Code域为0x19,表示PADR(PPPoE Active Discovery Request)报文。
    • Code域为0x65,表示PADS(PPPoE Active Discovery Session-confirmation)报文。
  • 会话ID(Session ID),16比特,唯一标识一个PPPoE会话,由服务器端在PADS报文中分配,在同一个会话中保持不变。值0xffff为将来的使用保留,不允许使用。
  • 长度(Length),16比特,指定PPPoE负载(Payload)的长度,即PPPoE头部后面的数据长度。

PPP报文里的协议字段内容和PPPoE是互不相干的,这部分可以直接参考标准PPP协议内容。

3. PPPOE工作过程

PPPoE可分为三个阶段,即Discovery阶段、Session阶段和Terminate阶段。

可以参考华为IP知识百科里面的一张时序图(什么是PPPoE?PPPoE解决了哪些问题? - 华为 (huawei.com)):

在这里插入图片描述

在发现(Discovery)阶段,PPPoE客户端(通常是家庭网络中的路由器或个人计算机)向本地网络发送一个广播消息,寻找PPPoE服务提供商的接入集中器(Access Concentrator,AC),如下所示:

  1. PPPoE Client广播一个PADI(PPPoE Active Discovery Initiation)报文,其中包含用户想要得到的服务类型信息。
  2. PPPoE Server收到PADI报文之后,根据自身配置情况,回复一个PADO(PPPoE Active Discovery Offer)报文,该报文为单播以太帧。
  3. PPPoE Client从收到的PADO报文(可能有多个server回复)中选择一个符合条件的PPPoE Server,并发送一个PADR(PPPoE Active Discovery Request)单播以太帧,其中封装所需服务信息。
  4. PPPoE Server收到PADR报文后,生成一个唯一会话标识(Session ID),并回复PADS(PPPoE Active Discovery Session-confirmation)报文。

如果发现阶段一切正常,PPPoE就会根据最后生成的Session ID创建一个点对点会话,并开始会话阶段。

在会话(Session)阶段,首先进入PPP会话协商阶段,包括LCP协商、用户认证和网络配置协商(IP地址等)等。完成PPP协商之后,便可以开始传输IP数据报文。

最后一个是终止(Terminate)阶段。PPPoE Client和PPPoE Server都可以通过发送PADT报文的方式来结束PPPoE连接。PADT报文可以在会话建立以后的任意时刻单播发送。

4. PPPoE和IPoE和区别和联系

可参考华为IP知识文档: 什么是PPPoE?PPPoE解决了哪些问题? - 华为 (huawei.com)。

PPPoE(PPP over Ethernet )和IPoE(IP over Ethernet )是两种常见的宽带接入方法:

  • PPPoE结合了PPP的特性,如身份验证和加密。PPPoE需要用户输入用户名和密码来建立连接,这通常是由ISP提供的。
  • IPoE,或者称为DHCP over Ethernet,使用动态主机配置协议(DHCP)来为用户分配IP地址,通常不需要用户进行身份验证。

下面是一个对比表格,简单列出了PPPoE与IPoE的主要区别和联系:

特性PPPoEIPoE
身份验证需要用户名和密码通常不需要身份验证
协议封装PPP封装在以太网帧中直接使用IP封装在以太网帧中
IP分配通过PPP协议通常通过DHCP协议
连接建立分阶段过程(发现、会话、关闭)直接通过DHCP进行
使用场景常用于DSL宽带连接适用于更广泛的以太网连接
安全性较高,支持多种身份验证方法依赖于网络其他安全机制
配置复杂度较复杂,需要客户端软件支持较简单,通常不需要额外配置
性能影响由于封装,可能会有轻微性能损失通常性能损失较小
兼容性需要支持PPPoE的设备和软件以太网设备通常默认支持
功能支持支持更多PPP特性,如压缩、加密等侧重于简洁的IP层连接

PPPoE具备认证能力,因此常用于运营商提供宽带接入端点。IPoE能自主管理IP地址使用,未限制组播能力,常用于局域网范围内提供网络接入端。IPoE需要配合其他协议提供认证能力,同时也需要其他网络设备(网关、防火墙等)提供安全能力支持。

5. Linux ubuntu上配置PPPoE服务器
5.1 Linux内核支持pppoe协议

PPPoE (Point-to-Point Protocol over Ethernet) 需要内核支持以下几个主要配置:

功能配置宏描述
PPP (Point-to-Point Protocol)CONFIG_PPPPPPoE 基于 PPP 协议,因此内核必须启用通用的 PPP 支持。
PPP over EthernetCONFIG_PPPOE专门启用 PPPoE 功能,允许 PPP 数据包通过以太网传输。
PPP 异步控制字符映射CONFIG_PPP_ASYNC启用此选项可支持异步 PPP 链路,这是 PPPoE 所必需的。
PPP 同步控制字符映射CONFIG_PPP_SYNC_TTY此选项为同步 PPP 链路提供支持,某些 PPPoE 实现可能需要它。
PPP 压缩支持(可选)CONFIG_PPP_DEFLATE
CONFIG_PPP_BSDCOMP
启用 PPP 压缩功能,可以提高 PPPoE 连接的效率,但不是必需的。
PPP over L2TP 支持(可选)CONFIG_PPPOL2TP如果需要通过 L2TP 隧道传输 PPPoE,则需要启用此选项。

在 Linux 内核的 make menuconfig 配置界面中,这些选项通常位于以下位置:

Device Drivers  --->
  [*] Network device support  --->
    <*>   PPP (point-to-point protocol) support
    <*>     PPP over Ethernet
    <*>     PPP support for async serial ports
    <*>     PPP support for sync tty ports
    <*>     PPP Deflate compression
    <*>     PPP BSD-Compress compression
    <*>   PPP over L2TP

在实际运行的ubuntu服务器上,可以检查/boot目录下配置文件,如下:

onceday@ubuntu2:~$ cat /boot/config-5.15.0-100-generic |grep PPP
CONFIG_PPP=y
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=m
CONFIG_PPP_MULTILINK=y
CONFIG_PPPOATM=m
CONFIG_PPPOE=m
CONFIG_PPPOL2TP=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_HDLC_PPP=m

这是VirtualBox虚拟机里的ubuntu 22.04服务器,PPPoE内核相关支持非常完整,如果缺少这些配置,需要重新编译内核才行。

5.2 检查Ubuntu的PPPoE支持情况

首先检查内核中是否支持了PPPoE协议,查看/proc/net/protocols文件,如下:

onceday@ubuntu2:~$ cat /proc/net/protocols
protocol  size sockets  memory press maxhdr  slab module
PACKET    1600      1      -1   NI       0   no   kernel
MPTCPv6   2008      0       1   no       0   yes  kernel
PINGv6    1208      0      -1   NI       0   yes  kernel
RAWv6     1208      1      -1   NI       0   yes  kernel
UDPLITEv6 1344      0       2   NI       0   yes  kernel
UDPv6     1344      1       2   NI       0   yes  kernel
TCPv6     2384      1       1   no     320   yes  kernel
XDP       1024      0      -1   NI       0   no   kernel
UNIX-STREAM 1088    109      -1   NI       0   yes  kernel
UNIX      1088     43      -1   NI       0   yes  kernel
UDP-Lite  1152      0       2   NI       0   yes  kernel
MPTCP     1848      0       1   no       0   yes  kernel
PING      1000      0      -1   NI       0   yes  kernel
RAW       1008      0      -1   NI       0   yes  kernel
UDP       1152      2       2   NI       0   yes  kernel
TCP       2224      3       1   no     320   yes  kernel
NETLINK   1136     20      -1   NI       0   no   kernel

一般默认情况下,ubuntu都是未加载PPPoE模块到内核中,因此上述是没有PPPoE协议。如果已经存在PPPoE协议,可以直接跳过这一节

接下来,直接使用modprobe加载PPPoE内核模块,如下:

onceday@ubuntu2:~$ sudo modprobe pppoe
onceday@ubuntu2:~$ lsmod
Module                  Size  Used by
pppoe                  20480  0 
pppox                  16384  1 pppoe
...(省略)...
onceday@ubuntu2:~$ cat /proc/net/protocols
protocol  size sockets  memory press maxhdr  slab module     
PPPOE      960      0      -1   NI       0   no   pppoe 
...(省略)...

Shell输出中已经包含PPPoE相关信息,说明内核已加载相应的模块,目前可支持PPPoE功能。

注意,上面只是让内核支持 PPPoE,要看到PPPoE连接和接口,还需要正确使用用户空间工具配置PPPoE客户端或者服务器。

5.3 ubuntu上配置PPPoE服务器

参考文档:

  • pppoe-server(8): user-space PPPoE server - Linux man page (die.net)

  • pppoe(8): user-space PPPoE client - Linux man page (die.net)

首先安装PPPoE服务器软件包ppp和pppoe,然后就可以看到一系列相关的命令工具:

onceday@ubuntu2:~$ sudo apt install ppp pppoe
onceday@ubuntu2:~$ ppp
pppd             pppoe            pppoe-discovery  pppoe-server     pppoe-start      pppoe-stop       
pppdump          pppoe-connect    pppoe-relay      pppoe-sniff      pppoe-status     pppstats    

然后编辑/etc/ppp/pppoe-server-options文件,配置PPPoE服务器选项:

# 启用调试模式
debug

# 服务器名称
name "My PPPoE Server"

# 启用身份验证
login
auth

# 要求客户端使用CHAP身份验证
require-chap

# 设置空闲超时时间为600秒
idle 600

# 为客户端分配DNS服务器
ms-dns 8.8.8.8

编辑/etc/ppp/pppoe-allowed文件,添加允许登录的用户名:

onceday

编辑/etc/ppp/chap-secrets文件,添加PPPoE用户认证信息:

onceday  *   "123456"  *

启动 PPPoE 服务,设置服务器实际使用的网卡接口名,并且指定PPPoE服务器的本地IP地址和远程IP地址:

sudo pppoe-server -I enp0s9 -L 192.168.0.103 -R 192.168.0.200 -N 10

完成以上配置操作之后,用户onceday就可以使用账号onceday,密码123456拨号连接到该PPPoE服务器了。

客户端需要编辑对应的配置文件

# PPPoE客户端配置文件

# 使用debug模式
DEBUG=1

# 以太网接口名称,根据实际情况修改
ETH=enp0s9

# PPPoE用户名
USER="onceday"

# PAP/CHAP身份验证的密码
PASSWORD="123456"

# 不启用默认路由
DEFAULTROUTE=no

# 接受服务器分配的DNS服务器地址
PEERDNS=yes

# 启用持久化连接
PERSIST=yes

# 设置 LCP echo 请求帧发送的时间间隔(以秒为单位)
LCP_INTERVAL=1

# 设置在多少个 LCP echo 请求失败后断开连接
LCP_FAILURE=10

# 最大报文负载, 不指定
CLAMPMSS=no

# PPPOE会话超时时间
PPPOE_TIMEOUT=3600

在客户端上,也要编辑/etc/ppp/chap-secrets文件,添加PPPoE用户认证信息:

onceday  *   "123456"  *

然后启动pppoe-connect连接到服务端,等待自动配置完全即可,如下:

onceday@ubuntu1:~$ sudo pppoe-connect 
/usr/sbin/pppoe-connect: 121: test: Illegal number: 
/usr/sbin/pppoe-connect: 307: cannot create : Directory nonexistent
Using interface ppp0
Connect: ppp0 <--> /dev/pts/5
CHAP authentication succeeded: Access granted
CHAP authentication succeeded
local  LL address fe80::844d:9f7c:662a:4617
remote LL address fe80::7c4f:5d0c:3ecd:7c08
BSD-Compress (15) compression enabled
local  IP address 192.168.0.209
remote IP address 192.168.0.103
primary   DNS address 8.8.8.8
secondary DNS address 8.8.8.8
CCP terminated by peer (Lost compression sync)
Compression disabled by peer.

到此,这条PPPoE隧道就正常搭建完成,可以在客户端上Ping服务端IP测试连通性,如下:

onceday@ubuntu1:~$ ping 192.168.0.103
PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=1.27 ms
64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.703 ms

如果想在服务端进行隧道报文转发,还需配置路由和开启相关的网络配置,这些就不继续深究了,感兴趣的可以自行研究。

5.4 PPPoE服务器和客户端的交互流程

在PPPoE拨号连接建立过程中,服务器和客户端都会主动发送数据包。

首先是客户端(PPPoE Client)发起连接,客户端广播发送 PPPoE Active Discovery Initiation (PADI) 数据包,寻找可用的PPPoE服务器。服务器(PPPoE Server)响应连接请求:

17:04:52.902923 PPPoE PADI [Service-Name] [Host-Uniq "112b"]
        0x0000:  ffff ffff ffff 0800 2793 6f37 8863 1109
        0x0010:  0000 000c 0101 0000 0103 0004 3131 3262
17:04:52.903557 PPPoE PADO [AC-Name "ubuntu2"] [Service-Name] [AC-Cookie 0x1C1FBC31407E62C34EEB9047F2315AF556430000] [Host-Uniq "112b"]
        0x0000:  0800 2793 6f37 0800 2756 7b06 8863 1107
        0x0010:  0000 002f 0102 0007 7562 756e 7475 3201
        0x0020:  0100 0001 0400 141c 1fbc 3140 7e62 c34e
        0x0030:  eb90 47f2 315a f556 4300 0001 0300 0431
        0x0040:  3132 62
17:04:52.903600 PPPoE PADR [Service-Name] [Host-Uniq "112b"] [AC-Cookie 0x1C1FBC31407E62C34EEB9047F2315AF556430000]
        0x0000:  0800 2756 7b06 0800 2793 6f37 8863 1119
        0x0010:  0000 0024 0101 0000 0103 0004 3131 3262
        0x0020:  0104 0014 1c1f bc31 407e 62c3 4eeb 9047
        0x0030:  f231 5af5 5643 0000
17:04:52.914654 PPPoE PADS [ses 0x3] [Service-Name] [Host-Uniq "112b"]
        0x0000:  0800 2793 6f37 0800 2756 7b06 8863 1165
        0x0010:  0003 000c 0101 0000 0103 0004 3131 3262
        0x0020:  0000 0000 0000 0000 0000 0000 0000 0000
        0x0030:  0000 0000 0000 0000 0000 0000

从抓包可以看到这个过程,首先是客户端发送一个广播报文,然后服务端发送单播报文回应请求。接下来,客户端从收到的PADO包中选择一个服务器,单播发送 PPPoE Active Discovery Request (PADR) 数据包给选中的服务器,请求建立连接。

PADS包中包含会话ID等信息,后续数据包都使用该ID标识相应的PPPoE会话,完成认证阶段和网络层配置之后,就可以进行正常的数据报文传输了。下面是服务端的日志信息,能清晰看到配置协商过程:

pppd[17696]: Connect: ppp0 <--> /dev/pts/1
pppd[17696]: sent [LCP ConfReq id=0x1 <mru 1492> <auth chap MD5> <magic 0x7a0751d7>]
pppd[17696]: rcvd [LCP ConfReq id=0x1 <mru 1492> <magic 0x6a2ef77b>]
pppd[17696]: sent [LCP ConfAck id=0x1 <mru 1492> <magic 0x6a2ef77b>]
pppd[17696]: rcvd [LCP ConfAck id=0x1 <mru 1492> <auth chap MD5> <magic 0x7a0751d7>]
pppd[17696]: sent [LCP EchoReq id=0x0 magic=0x7a0751d7]
pppd[17696]: sent [CHAP Challenge id=0xb2 <4a478a7ef6cc9b30b6143f24eaf79f7dd8645fc3>, name = "My PPPoE Server"]
pppd[17696]: rcvd [LCP EchoReq id=0x0 magic=0x6a2ef77b]
pppd[17696]: sent [LCP EchoRep id=0x0 magic=0x7a0751d7]
pppd[17696]: rcvd [LCP EchoRep id=0x0 magic=0x6a2ef77b]
pppd[17696]: rcvd [CHAP Response id=0xb2 <87e5fd4d32629e5725456db7f991a3e9>, name = "onceday"]
pppd[17696]: sent [CHAP Success id=0xb2 "Access granted"]
pppd[17696]: Initializing PAM (2) for user onceday
pppd[17696]: ---> PAM INIT Result = 0
pppd[17696]: Attempting PAM account checks
pppd[17696]: PAM Account OK for onceday
pppd[17696]: PAM Session opened for user onceday
pppd[17696]: user onceday logged in on tty  intf ppp0
kernel: [ 8279.438121] PPP BSD Compression module registered
pppd[17696]: local  LL address fe80::7c4f:5d0c:3ecd:7c08
pppd[17696]: remote LL address fe80::844d:9f7c:662a:4617
kernel: [ 8279.445750] PPP Deflate Compression module registered
kernel: [ 8279.448512] ppp0: ppp: compressor dropped pkt
systemd-networkd[15451]: ppp0: Link UP
systemd-networkd[15451]: ppp0: Gained carrier
pppd[17696]: BSD-Compress (15) compression enabled
systemd-networkd[15451]: ppp0: Gained IPv6LL
pppd[17696]: local  IP address 192.168.0.103
pppd[17696]: remote IP address 192.168.0.209
pppd[17696]: Lost compression sync: disabling compression

在客户端的接口信息如下:

50: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 192.168.0.209 peer 192.168.0.103/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 fe80::844d:9f7c:662a:4617 peer fe80::7c4f:5d0c:3ecd:7c08/128 scope link 
       valid_lft forever preferred_lft forever

服务端接口信息如下:

48: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 192.168.0.103 peer 192.168.0.209/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 fe80::7c4f:5d0c:3ecd:7c08 peer fe80::844d:9f7c:662a:4617/128 scope link 
       valid_lft forever preferred_lft forever
6. 总结

虽然PPPoE是很久远的技术,并且目前除了特定的运营商场所,其他场景下使用频率较低。但是作为初代的点对点协议,PPPoE影响了很多后续的VPN和隧道协议设计工作。理解PPPoE的工作原理,对掌握GRE/IPsec/SSLVPN/L2TP等新一代VPN隧道协议有较大帮助。

PPPoE会话建立工作流程主要包括四步:

  • 第一阶段是PPPoE发现阶段,通过广播报文找寻可用的服务端。
  • 第二阶段是PPP协议LCP协商,超时、压缩、MRU以及同步/异步等配置字段协商。
  • 第三阶段是PPP协议认证,客户端和服务端双方都可以要求认证或者免认证。
  • 第四阶段是PPP协议NCP协商,IP分配、域名服务器以及路由等网络配置协商。

完成以上四步之后,便可以开始传递会话数据了,这个阶段也会有LCP协议报文传输,并不全都是数据报文。

如果发生了异常或者特殊情况,PPPoE双方都可以发送PADT终止报文,一旦收到这个报文,相关会话便会被清除掉。

在PPPoE会话建立之后,通常设备上也会出现pppx接口,作为一个虚拟三层IP子接口,用于承接实际的网络数据流量和各种配置。

受限于个人水平和能力,上述内容难免存在错误,还请各位大佬海涵,并不吝赐教,感谢支持!







Alt

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搜维尔科技:Patchwork 3D工业仿真实时渲染,将CAD 数据转换成真实感的3D模型以用于工业用途

Patchwork 3D工业仿真 实时渲染点击跳转官网 从实时渲染到真实照片 根据工作阶段所需的逼真度&#xff0c;您可以使用三个渲染引擎&#xff0c;从最快的&#xff08;OpenGL&#xff0c;交互式&#xff09;到最逼真的&#xff08;光线跟踪&#xff0c;Iray物理逼真&#xff09;…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长&#xff0c;有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中&#xff0c;信息技术已深入渗透各行业&#xff0c;逐渐融入企业的日常运营。然而&#xff0c;企业在信息化建设中面临了一系列困境和挑战&#xf…

皮灵顿靶机1

1 先在kali上扫描靶机ip地址 .1、.2、.254、.138都是kali自身的一些ip地址&#xff0c;所以在此确认要进行攻击的靶机的ip地址为&#xff1a;192.168.84.132 再查看端口&#xff0c;一个22端口一个80端口 我这里使用dirb&#xff0c;查看网站的信息 最特别的是robots.txt …

python如何去掉换行符

使用strip()函数去掉每行结束的\n。 strip()函数 声明&#xff1a;str为字符串&#xff0c;chars为要删除的字符序列。 str.strip(chars&#xff09;&#xff1a;删除s字符串中开头、结尾处&#xff0c;位于chars删除序列的字符。 str.lstrip(chars)&#xff1a;删除s字符串…

vue中使用axios获取不到响应头Content-Disposition的解决办法

项目中&#xff0c;后端返回的文件流; 前端需要拿到响应头里的Content-Disposition字段的值&#xff0c;从中获取文件名 在控制台Headers中可以看到相关的字段和文件名&#xff0c;但是在axios里面却获取不到 如果想要让客户端访问到相关信息&#xff0c;服务器不仅要在head…

maxpool long数据类型报错

报错&#xff1a; RuntimeError: “max_pool2d” not implemented for ‘Long’ 源码&#xff1a; import torch from torch import nn from torch.nn import MaxPool2dinput torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1…

python爬虫-----爬虫解析—xpath(第十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

JVM—垃圾收集器

JVM—垃圾收集器 什么是垃圾 没有被引用的对象就是垃圾。 怎么找到垃圾 引用计数法 当对象引用消失&#xff0c;对象就称为垃圾。 对象消失一个引用&#xff0c;计数减去一&#xff0c;当引用都消失了&#xff0c;计数就会变为0.此时这个对象就会变成垃圾。 在堆内存中主…

环境监测站升级选择ARM网关驱动精准数据采集

物联网技术的深入发展和环保需求的不断攀升&#xff0c;API调用网关在环境监测领域的应用正成为科技创新的重要推手。其中&#xff0c;集成了API调用功能的ARM工控机/网关&#xff0c;以其出色的计算性能、节能特性及高度稳定性&#xff0c;成功搭建起连接物理世界与数字世界的…

MySQL分库分表的方式有哪些

目录 一、为什么要分库分表 二、什么是分库分表 三、分库分表的几种方式 1.垂直拆分 2. 水平拆分 四、分库分表带来的问题 五、分库分表技术如何选型 一、为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域&#xff0c;比较常用的轻量化软件交付方式&#xff0c;该技术是将3D应用等大模型的算力执行放在了服务器端&#xff0c;而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多&#xff0c;实时云渲染平台的国产信创化…

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中&#xff0c;受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质&#xff0c;其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…

在【Cencos7】中安装【Nacos】并适配【PostgreSQL】数据库

在【Cencos7】中安装【Nacos-2.3.0】并适配【PostgreSQL】数据库 安装JDK wget命令下载&#xff1a; wget https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz解压 tar -xzvf jdk-7u80-linux-x64.tar.gz将解压后的目录移动到/opt下 sudo mv jdk…

Spring与Spring Boot的区别:从框架设计到应用开发

这是我自己开发的一款小程序&#xff0c;感兴趣的可以体验一下&#xff1a; 进入正题&#xff1a; 在Java开发领域&#xff0c;Spring和Spring Boot都是备受推崇的框架&#xff0c;它们为开发人员提供了丰富的功能和便捷的开发体验。然而&#xff0c;许多人对它们之间的区别仍…

无影云电脑不能连接到本机的调试串口的解决方案

目录 概述 解决方案 云端电脑中的操作 本地USBDK驱动程序的更新 概述 我从1月份开始使用阿里的无影云电脑进行嵌入式开发板的测试&#xff0c;主要的原因有两个&#xff1a;一是平时使用的笔记本资源过于紧张&#xff0c;二是方便移动办公&#xff0c;这样我只要平时拿着开…

PyTorch|搭建分类网络实例、nn.Module源码学习

系列文章目录 PyTorch|Dataset与DataLoader使用、构建自定义数据集 文章目录 系列文章目录一、Transforms二、构建神经网络模型三、模型分层&#xff08;一&#xff09;模型输入&#xff08;二&#xff09;nn.Flatten&#xff08;三&#xff09;nn.Linear&#xff08;四&#…

spring boot admin搭建,监控springboot程序运行状况

新建一个spring boot web项目&#xff0c;添加以下依赖 <dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.3.0</version></dependency> <dependency&…

大语言模型如何工作?

此为观看视频How Large Language Model works的笔记。 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一个大语言模型&#xff08;LLM&#xff09;&#xff0c;可以生成类似人类的文本。本文阐述&#xff1a; 什么是LLMLLM如何工作LLM的应用场景 什么是…

【算法】双指针算法

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 283. 移动零1.1 分析1.2 代码 2. 1089. 复写零2.1 分析2.2 代码 3. 202. 快乐数3.1 分析3.2 代码 4. 11. 盛最多水的容器4.1 分析4.2 代码 5. LCR 179. 查找总价格为目标值的两个商品5.1 分析5.2 代码 6. 15. 三数之和…

【前端】es-drager 图片同比缩放 缩放比 只修改宽 只修改高

【前端】es-drager 图片同比缩放 缩放比 ES Drager 拖拽组件 (vangleer.github.io) 核心代码 //初始宽 let width ref(108)//初始高 let height ref(72)//以下两个变量 用来区分是单独的修改宽 还是高 或者是同比 //缩放开始时的宽 let oldWidth 0 //缩放开始时的高 let o…