关于PPPoE协议

简介:


 

PPPoE英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。本质上,它是一个允许在以太网 广播域中的两个以太网接口间创建点对点隧道的协议。

PPPoE是一种用于将多个客户端连接到远程场点的规范。PPPoE协议在1999年发布在RFC2516中规范。

PPPoE包含两个阶段:发现阶段,会话阶段。

pppoe报头定义的结构体为pppoe_hdr,

位于文件include/uapi/linux/if_pppox.h,定义如下

struct pppoe_hdr {

#if defined(__LITTLE_ENDIAN_BITFIELD)

        __u8 type : 4;

        __u8 ver : 4;

#elif defined(__BIG_ENDIAN_BITFIELD)

        __u8 ver : 4;

        __u8 type : 4;

#else          

#error  "Please fix <asm/byteorder.h>"

#endif                                                   

        __u8 code;

        __be16 sid;    

        __be16 length;

        struct pppoe_tag tag[0];

} __packed;

报头结构体如下:

774222b08b6f44da46153a3d49f477e893ab9019

1.   PPPoE初始化

PPPoE初始化由方法pppoe_init完成,注册两个PPPoE协议处理程序,一个用于处理PPPoE发现数据包,另一个用于处理PPPoE会话数据包。

static int __init pppoe_init(void)

{

    ……

    err = register_pernet_device(&pppoe_net_ops);

    ……

        dev_add_pack(&pppoes_ptype);

        dev_add_pack(&pppoed_ptype);

        register_netdevice_notifier(&pppoe_notifier);

    ……

}

static struct packet_type pppoes_ptype __read_mostly = {

        .type   = cpu_to_be16(ETH_P_PPP_SES),

        .func   = pppoe_rcv,

};

static struct packet_type pppoed_ptype __read_mostly = {

        .type   = cpu_to_be16(ETH_P_PPP_DISC),

        .func   = pppoe_disc_rcv,

};

static struct pernet_operations pppoe_net_ops = {

        .init = pppoe_init_net,

        .exit = pppoe_exit_net,

        .id   = &pppoe_net_id,

        .size = sizeof(struct pppoe_net),

};

       其中pppoe_disc_rcv是发现数据包处理程序,pppoe_rcv是会话数据包处理程序。

PPPoE模块导出了一个procfs条目/proc/net/pppoe。

       register_netdevice_notifier(&pppoe_notifier)函数注册了一个通知链。

static struct notifier_block pppoe_notifier = {

        .notifier_call = pppoe_device_event,

};

2.   PPPoX套接字

PPPox套接字用结构pppox_sock表示,位于include/linux/if_pppox.h,实现了一个通用PPP封装套接字簇。除了PPPoE外,PPP第2层隧道协议L2TP也是用这种套接字。

struct pppox_sock {     

        /* struct sock must be the first member of pppox_sock */

        struct sock sk; 

        struct ppp_channel chan; 

        struct pppox_sock       *next;    /* for hash table */

        union {         

                struct pppoe_opt pppoe;  

                struct pptp_opt  pptp;   

        } proto;

        __be16                  num;

};

其中pppoe_opt包含一个名为pa的成员,是一个pppoe_addr结构实例,表示会话id,远程对等体的MAC地址以及使用的网络设备名称。

 

 

目录
相关文章
|
XML 安全 IDE
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
2763 2
|
机器学习/深度学习 算法 存储
一文读懂大规模图神经网络平台AliGraph
2019阿里云峰会·上海开发者大会于7月24日盛大开幕,本次峰会与未来世界的开发者们分享开源大数据、IT基础设施云化、数据库、云原生、物联网等领域的技术干货, 共同探讨前沿科技趋势。本文整理自开源大数据专场中阿里巴巴资深技术专家李永先生的精彩演讲,将为大家分享AliGraph:大规模图神经网络平台。
8770 0
|
10月前
|
缓存 前端开发 JavaScript
前端开发的秘密花园:这些技巧让你轻松应对各种性能瓶颈问题!
【10月更文挑战第30天】前端开发充满无限可能,但也面临性能瓶颈等挑战。本文介绍几种实用技巧:1. 代码优化,精简与复用;2. 图片优化,压缩与懒加载;3. 缓存策略,提升资源加载速度;4. 减少HTTP请求,合并与压缩;5. 使用CDN加速资源加载;6. 异步加载与代码拆分。通过这些方法,帮助你轻松应对性能瓶颈,提升用户体验。
118 5
|
数据采集 测试技术
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
本文讨论了在使用Selenium和WebDriver自动化测试时常见的执行格式错误(Errno 8 Exec format error)问题。错误通常发生在运行ChromeDriver时,与兼容性或路径配置有关。文章提供了多种解决方案,包括手动更改路径、更新或重新安装webdriver-manager包、下载特定版本的ChromeDriver、修改driver_cache.py文件。此外,还介绍了如何结合代理IP技术使用Selenium进行网页抓取,以提高效率和成功率。示例代码展示了如何配置代理IP并使用Selenium访问网站。通过这些方法,用户可以有效解决执行格式错误,并提高网页自动化测试
1260 1
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
|
存储 缓存 IDE
深度探索Linux操作系统 —— 构建initramfs
深度探索Linux操作系统 —— 构建initramfs
869 5
|
10月前
|
JSON API 数据格式
使用Python和Flask构建简单的Web API
使用Python和Flask构建简单的Web API
|
10月前
|
缓存 负载均衡 监控
如何优化网络传输效率?
如何优化网络传输效率?
1199 2
|
存储 安全 大数据
对象存储的意义:探索数据新纪元的关键基石
在信息爆炸时代,数据成为核心资产,而高效安全的数据存储至关重要。对象存储作为一种新兴技术,起源于20世纪90年代,旨在解决传统文件系统的局限性。随着云计算和大数据技术的发展,它已成为关键技术之一。对象存储具备高可扩展性、高可靠性、低成本、易于管理和多协议支持等优点。它支撑大数据发展、推动云计算繁荣、助力企业数字化转型并保障数据安全。未来,对象存储将进一步提升性能,实现智能化管理,并与边缘计算融合,获得政策支持,成为数据新时代的关键基石。
384 3
|
10月前
|
开发工具 开发者 git
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
本篇将进一步介绍如何在 DevEco Studio 中高效使用各种功能,通过掌握快捷键、代码补全、调试工具等,帮助开发者在鸿蒙应用开发中大幅提升工作效率。
450 1
「Mac畅玩鸿蒙与硬件4」鸿蒙开发环境配置篇4 - DevEco Studio高效使用技巧
|
11月前
|
Java 索引
Java“ArrayIndexOutOfBoundsException”解决
Java中的“ArrayIndexOutOfBoundsException”异常通常发生在尝试访问数组的无效索引时。解决方法包括:检查数组边界,确保索引值在有效范围内;使用循环时注意终止条件;对用户输入进行验证。通过这些措施可以有效避免该异常。
1993 2