【PPPoE】PPPoE拨号流程
简介
PPPoE(Point-to-Point Protocol over Ethernet)是一种在以太网上封装PPP协议的方式,常用于在宽带接入中进行拨号。
PPPoE的拨号原理如下:
- 客户端发起PPPoE Active Discovery Initiation (PADI)报文,广播到网络中的所有PPPoE服务器,表示客户端想要建立连接。
- PPPoE服务器收到PADI报文后,回复PPPoE Active Discovery Offer (PADO)报文,告知客户端当前服务器的信息,包括服务名、会话ID等。
- 客户端从PADO报文中选择一个服务器,并发送PPPoE Active Discovery Request (PADR)报文,请求连接到该服务器。
- PPPoE服务器收到PADR报文后,向客户端发送PPPoE Active Discovery Session-confirmation (PADS)报文,告知客户端连接成功。
- 客户端和服务器建立PPPoE会话,并进行身份认证、配置等工作。
- PPPoE会话建立后,客户端和服务器开始进行数据传输。
在PPPoE会话建立之前,客户端必须先完成物理层和数据链路层的连接,也就是完成以太网的连接。此时,客户端和服务器之间还没有IP地址和路由信息,只能通过PPP协议进行数据传输。在建立了PPPoE会话之后,客户端和服务器可以互相分配IP地址,并通过路由协议交换路由信息,完成最终的数据传输。
需要注意的是,不同的ISP可能会有不同的PPPoE参数设置,例如MTU大小、认证方式等,因此在进行PPPoE拨号时,需要按照ISP的要求进行设置。
PPPOE拨号流程
PADI
在PPPoE中,PPPoE客户端需要发送PADI(PPPoE Active Discovery Initiation)消息以寻找PPPoE服务器。PADI消息包含以下字段:
- Version:一个1字节的字段,用于指示PADI消息使用的PPPoE版本。目前的版本号为1。
- Type:一个1字节的字段,用于指示PADI消息的类型。在PADI消息中,该字段的值为1。
- Code:一个1字节的字段,用于指示PADI消息的代码。在PADI消息中,该字段的值为0。
- Session ID:一个2字节的字段,用于标识PPPoE会话。在PADI消息中,该字段的值为0。
- Payload:一个可变长度的字段,用于包含PADI消息的有效载荷。在PADI消息中,有效载荷为空。
PADI消息的详细解释如下:
- Version字段:该字段用于指示PADI消息所使用的PPPoE版本。目前,PPPoE版本号为1,因此在PADI消息中,Version字段的值为1。
- Type字段:该字段用于指示PADI消息的类型。在PADI消息中,Type字段的值为1,表示该消息是一个发现消息。
- Code字段:该字段用于指示PADI消息的代码。在PADI消息中,Code字段的值为0,表示该消息是一个发现请求消息。
- Session ID字段:该字段用于标识PPPoE会话。在PADI消息中,Session ID字段的值为0,因为在这个阶段还没有建立PPPoE会话。
- Payload字段:该字段用于包含PADI消息的有效载荷。在PADI消息中,Payload字段为空,因为在发现阶段不需要任何数据。
PADO
当PPPoE服务器收到PPPoE Active Discovery Initiation (PADI) 消息后,会返回一个PPPoE Active Discovery Offer (PADO) 消息。PADO消息用于向PPPoE客户端提供PPPoE服务器的相关信息,以便客户端选择一个服务器与之建立PPPoE会话。
PADO消息包含以下字段:
- Version:一个1字节的字段,用于指示PADO消息使用的PPPoE版本。目前的版本号为1。
- Type:一个1字节的字段,用于指示PADO消息的类型。在PADO消息中,该字段的值为2。
- Code:一个1字节的字段,用于指示PADO消息的代码。在PADO消息中,该字段的值为0。
- Session ID:一个2字节的字段,用于标识PPPoE会话。在PADO消息中,该字段的值与客户端在PADI消息中发送的Session ID字段的值相同。
- Payload:一个可变长度的字段,用于包含PADO消息的有效载荷。在PADO消息中,有效载荷包含服务器提供的信息,例如服务器的MAC地址、服务名称、最大传输单元(MTU)等。
PADO消息的详细解释如下:
- Version字段:该字段用于指示PADO消息所使用的PPPoE版本。目前,PPPoE版本号为1,因此在PADO消息中,Version字段的值为1。
- Type字段:该字段用于指示PADO消息的类型。在PADO消息中,Type字段的值为2,表示该消息是一个提供消息。
- Code字段:该字段用于指示PADO消息的代码。在PADO消息中,Code字段的值为0,表示该消息是一个提供成功消息。
- Session ID字段:该字段用于标识PPPoE会话。在PADO消息中,Session ID字段的值与客户端在PADI消息中发送的Session ID字段的值相同。
- Payload字段:该字段用于包含PADO消息的有效载荷。在PADO消息中,有效载荷包含服务器提供的信息,例如服务器的MAC地址、服务名称、最大传输单元(MTU)等。PPPoE客户端可以使用这些信息来选择一个合适的PPPoE服务器并建立PPPoE会话。
PADR
当PPPoE客户端收到PPPoE Active Discovery Offer (PADO) 消息后,会发送PPPoE Active Discovery Request (PADR) 消息来选择一个PPPoE服务器并建立PPPoE会话。PADR消息包含以下字段:
- Version:一个1字节的字段,用于指示PADR消息使用的PPPoE版本。目前的版本号为1。
- Type:一个1字节的字段,用于指示PADR消息的类型。在PADR消息中,该字段的值为1。
- Code:一个1字节的字段,用于指示PADR消息的代码。在PADR消息中,该字段的值为0。
- Session ID:一个2字节的字段,用于标识PPPoE会话。在PADR消息中,该字段的值与客户端在PADI消息中发送的Session ID字段的值相同。
- Payload:一个可变长度的字段,用于包含PADR消息的有效载荷。在PADR消息中,有效载荷包含客户端选择的PPPoE服务器的相关信息,例如服务器的MAC地址、服务名称等。
PADR消息的详细解释如下:
- Version字段:该字段用于指示PADR消息所使用的PPPoE版本。目前,PPPoE版本号为1,因此在PADR消息中,Version字段的值为1。
- Type字段:该字段用于指示PADR消息的类型。在PADR消息中,Type字段的值为1,表示该消息是一个请求消息。
- Code字段:该字段用于指示PADR消息的代码。在PADR消息中,Code字段的值为0,表示该消息是一个请求成功消息。
- Session ID字段:该字段用于标识PPPoE会话。在PADR消息中,Session ID字段的值与客户端在PADI消息中发送的Session ID字段的值相同。
- Payload字段:该字段用于包含PADR消息的有效载荷。在PADR消息中,有效载荷包含客户端选择的PPPoE服务器的相关信息,例如服务器的MAC地址、服务名称等。客户端发送这些信息以请求与服务器建立PPPoE会话。
PADS
当PPPoE服务器收到PPPoE Active Discovery Request (PADR) 消息后,如果服务器可以接受该请求并准备好与客户端建立PPPoE会话,则服务器会返回一个PPPoE Active Discovery Session-confirmation (PADS) 消息。PADS消息用于确认PPPoE会话的建立,并向客户端提供会话的相关信息。
PADS消息包含以下字段:
- Version:一个1字节的字段,用于指示PADS消息使用的PPPoE版本。目前的版本号为1。
- Type:一个1字节的字段,用于指示PADS消息的类型。在PADS消息中,该字段的值为3。
- Code:一个1字节的字段,用于指示PADS消息的代码。在PADS消息中,该字段的值为0。
- Session ID:一个2字节的字段,用于标识PPPoE会话。在PADS消息中,该字段的值与客户端在PADR消息中发送的Session ID字段的值相同。
- Payload:一个可变长度的字段,用于包含PADS消息的有效载荷。在PADS消息中,有效载荷包含服务器提供的信息,例如客户端的IP地址、服务器的IP地址、最大传输单元(MTU)等。
PADS消息的详细解释如下:
- Version字段:该字段用于指示PADS消息所使用的PPPoE版本。目前,PPPoE版本号为1,因此在PADS消息中,Version字段的值为1。
- Type字段:该字段用于指示PADS消息的类型。在PADS消息中,Type字段的值为3,表示该消息是一个会话确认消息。
- Code字段:该字段用于指示PADS消息的代码。在PADS消息中,Code字段的值为0,表示该消息是一个会话确认成功消息。
- Session ID字段:该字段用于标识PPPoE会话。在PADS消息中,Session ID字段的值与客户端在PADR消息中发送的Session ID字段的值相同。
- Payload字段:该字段用于包含PADS消息的有效载荷。在PADS消息中,有效载荷包含服务器提供的信息,例如客户端的IP地址、服务器的IP地址、最大传输单元(MTU)等。客户端接收这些信息以确认会话的建立,并使用它们来配置PPPoE接口以实现数据传输。
PPP身份验证
PPPoE建立连接后,后续的验证流程包括PPP身份验证和PPPoE会话阶段。
PPP身份验证是在PPP协议层进行的。PPP身份验证是为了验证客户端是否有访问服务器资源的权限。PPP身份验证分为PAP和CHAP两种方式。
PAP
PAP(Password Authentication Protocol)是一种简单的密码认证协议。PAP验证流程如下:
- 客户端将用户名和密码以明文形式发送给服务器。
- 服务器接收到用户名和密码后,将其与存储在服务器上的用户名和密码进行比较。
- 如果用户名和密码匹配,则服务器发送一个认证成功消息给客户端。否则,服务器发送一个认证失败消息给客户端。
CHAP
CHAP(Challenge-Handshake Authentication Protocol)是一种更加安全的密码认证协议。CHAP验证流程如下:
- 客户端向服务器端发送身份认证请求,请求认证自己的身份。
- 服务器端接收到请求后,生成一个随机数作为挑战,发送给客户端。
- 客户端收到挑战后,将挑战和密码通过某种加密算法(如MD5)进行加密,得到一个响应值,并将响应值发送给服务器端。
- 服务器端收到响应值后,使用相同的加密算法对挑战和密码进行加密,如果加密结果与客户端发送的响应值相同,则认证通过。
在这个过程中,客户端和服务器端需要协商使用哪种加密算法。CHAP协议定义了三种加密算法:MD5、SHA-1和Windows NT Hash。这些算法是在协议中被硬编码的,客户端和服务器端在协商加密算法时,会根据协议规定的算法列表进行选择。
具体来说,在CHAP协议中,挑战和响应值都是通过加密算法进行处理的。客户端和服务器端在进行加密时,会使用预共享的密码或密钥作为加密密钥。在这个过程中,客户端和服务器端都知道密码,但密码并不会在通信中明文传输,而是在加密过程中进行处理,以保证通信的安全性。
总的来说,CHAP协议的加密算法是在客户端和服务器端的挑战-响应过程中进行协商的,客户端和服务器端会根据协议定义的加密算法列表选择一种算法,并使用预共享的密码进行加密,以实现身份认证和通信的安全性。
PPP LCP Configure
在PPP链路层会话建立的过程中,客户端和服务器端之间需要进行链路参数的协商。协商的内容包括数据压缩、最大传输单元(MTU)、错误检测和校验、协议类型等等。协商的过程需要双方相互发送LCP Configure-Request和LCP Configure-Ack或LCP Configure-Nak或LCP Configure-Reject消息,直到双方都同意使用相同的链路参数为止。
当PPP客户端想要和PPP服务器端建立PPP链路层会话时,它会向服务器端发送LCP Configure-Request消息。这个消息包含了客户端希望协商的链路参数,例如MTU大小、最大协商值等等。PPP服务器收到Configure-Request消息后,会向客户端回复Configure-Ack、Configure-Nak或Configure-Reject消息,告知客户端是否接受这些链路参数或提供可选的链路参数值。如果接收到的是Configure-Ack消息,则说明链路参数已经协商完成,PPP链路层会话建立成功;如果接收到的是Configure-Nak或Configure-Reject消息,则说明链路参数协商失败,需要重新协商。
- 客户端接收到PADS消息后,向服务器发送一个PPP LCP Configure-Request消息,以协商PPP连接的配置参数。
- 服务器接收到客户端发送的Configure-Request消息后,向客户端发送一个PPP LCP Configure-Ack消息,以确认协商结果。
- 客户端和服务器通过发送PPP NCP Configure-Request和Configure-Ack消息来协商网络控制协议(NCP)的配置参数,以完成PPPoE会话的建立。
相关文章:
【PPPoE】PPPoE拨号流程
简介 PPPoE(Point-to-Point Protocol over Ethernet)是一种在以太网上封装PPP协议的方式,常用于在宽带接入中进行拨号。 PPPoE的拨号原理如下: 客户端发起PPPoE Active Discovery Initiation (PADI)报文,广播到网络…...
django项目实战(django+bootstrap实现增删改查)
目录 一、创建django项目 二、修改默认配置 三、配置数据库连接 四、创建表结构 五、在app当中创建静态文件 六、页面实战-部门管理 1、实现一个部门列表页面 2、实现新增部门页面 3、实现删除部门 4、实现部门编辑功能 七、模版的继承 1、创建模板layout.html 1&…...
Lesson4---Python语言基础(2)
4.1 内置数据结构 4.1.1 序列数据结构(sequence) 成员是有序排列的每个元素的位置称为下标或索引通过索引访问序列中的成员Python中的序列数据类型有字符串、列表、元组 “abc” ≠ “bac” 4.1.1.1 创建列表和元组 Python中的列表和元组,…...
NCHW - NHWC - CHWN 排列
TensorFlow有两种数据格式NHWC和NCHW,默认的数据格式是NHWC,可以通过参数data_format指定数据格式。这个参数规定了 input Tensor 和 output Tensor 的排列方式。 1、data_format 设置为 “NHWC” 时,排列顺序为 [batch, height, width, channels] 设置为 “NCHW” 时,排…...
2019蓝桥杯真题矩阵切割(填空题) C语言/C++
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。 当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正…...
Java线程池的创建以及原理
一、为什么要使用线程池 在外面的日常开发中,也使用了不少池化技术,比如线程池、数据库连接池、HTTP连接池等等都是对这个思想的应用。 池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。 线程池提供了一种限制和管理资…...
Java集合学习之Map
1.什么是Map Java里的Map接口是一个集合根接口,表示一个 键值对(Key-Value) 的映射。 简单来说就是键和值是一对的,每一个 Key都有唯一确定的 Value对应。 其中要求 键(Key) 唯一,因为是按照…...
java 基于maven多模块合并打包部署
项目环境 jdk 1.8spring 2.7.xmaven 3.6 项目结构 模块功能 client – 对外service common – 共用工具切面等 main – 启动类 goods – 子模块具体实现 模块间依赖关系 client – 无依赖 common – 无依赖 main – client、common、goods goods – client、common 具体P…...
Kubernetes是个什么东东?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语,意…...
【go语言grpc之client端源码分析三】
go语言grpc之server端源码分析三newClientStreamnewAttemptLocked上一篇在介绍了grpc.Dial之后,然后再介绍一下后面的 //创建RPC客户端client : pb.NewGreetsClient(conn)//设置超时时间_, cancel : context.WithTimeout(context.Background(), time.Second)defer c…...
Android 基础知识4-2.6LinearLayout(线性布局)
一、LinearLayout的概述 线性布局(LinearLayout)主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能…...
补充前端面试题(三)
图片懒加载<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, in…...
.net开发安卓入门-自动升级(配合.net6 webapi 作为服务端)
文章目录思路客户端权限清单(AndroidManifest.xml)权限列表(完整内容看 权限清单(AndroidManifest.xml))打开外部应用的权限(完整内容看 权限清单(AndroidManifest.xml))添加文件如下…...
分享111个HTML艺术时尚模板,总有一款适合您
分享111个HTML艺术时尚模板,总有一款适合您 111个HTML艺术时尚模板下载链接:https://pan.baidu.com/s/1sYo2IPma4rzeku3yCG7jGw?pwdk8dx 提取码:k8dx Python采集代码下载链接:采集代码.zip - 蓝奏云 时尚理发沙龙服务网站模…...
spring之Spring AOP基于注解
文章目录前言一、Spring AOP基于注解的所有通知类型1、前置通知2、后置通知3、环绕通知4、最终通知5、异常通知二、Spring AOP基于注解之切面顺序三、Spring AOP基于注解之通用切点三、Spring AOP基于注解之连接点四、Spring AOP基于注解之全注解开发前言 通知类型包括&#x…...
LeetCode题目笔记——6362. 合并两个二维数组 - 求和法
文章目录题目描述题目链接题目难度——简单方法一:常规双指针遍历代码/Python方法二:字典\哈希表代码/Python总结题目描述 给你两个 二维 整数数组 nums1 和 nums2. nums1[i] [idi, vali] 表示编号为 idi 的数字对应的值等于 vali 。nums2[i] [idi, …...
【C#基础】C# 常用语句讲解
序号系列文章3【C#基础】C# 数据类型总结4【C#基础】C# 变量和常量的使用5【C#基础】C# 运算符总结文章目录前言语句概念1,迭代语句1.1 for 语句1.2 foreach 语句1.3 while 语句1.4 do 语句2,选择语句2.1,if 语句2.2,else 语句2.3…...
腾讯云——负载均衡CLB
负载均衡 CLB 提供四层(TCP 协议/UDP 协议/TCP SSL 协议)和七层(HTTP 协议/HTTPS 协议)负载均衡。您可以通过 CLB 将业务流量分发到多个后端服务器上,消除单点故障并保障业务可用性。CLB 自身采用集群部署,…...
6.关于系统服务的思考—— native vs java
文章目录native服务 以sensor service为例Native 服务java 服务, 以vibrate为例java 服务 以一个demo为例native服务 以sensor service为例 service启动 SystemServer.startBootstrapServices---->>>mSystemServiceManager.startService—>>>Sen…...
SQL语句创建视图:
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍数据库中有关视图的知识,参考学校作业. 金句分享:…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
