zoukankan      html  css  js  c++  java
  • ppp详解

    ppp

     
    一   PPP     point to point protocol               数据链路层协议
    PPP session establishment
    1 link establishment phase
    2. authentication phase
    3. network layer protocol phase
     
    点对点协议     
    特点: 
     封装成帧           -----必须要实现的
     透明性     ------
    多种网络层协议 ------(tcp或ipx协议)   
    多种类型链路 ------(光纤或电话线或双绞线或同轴电缆等)    
    差错检测crc    ------
            检测连接状态 ------(提供各种状态的汇报)  例如  欠费了      账号密码不对    电话线断了  等各种不同 状况的汇报
                            MTU      --------最大传输单元      
            网络层地址协商      -------分配ip地址
    数据压缩 ------压缩 实现带宽的节约    算法的支持
     
     
     
      HDLC
    LCP     负责身份验证        ppp中建立链路的组件
    NCP    lcp通过之后     才能用此层分配ip地址    配置上层协议所需的环境     针对上层不同的协议类型   使 用不同的NCP组件     
    如果是ip   则提供  ipcp接口;如果是ipx 则提供ipxcp接口;如果是appletalk 则提供atcp接口。
    PAP     password authentication protocol      口令验证协议
    CHAP   challenge-handshake   authentication protocol     挑战握手验证协议
    在这些协议中比较重要的是LCP   和NCP     前者负责创建,维护或终止一次物理连接       
    后者是一族协议   负责解决物理连接上运行什么网络协议   以及解决上层网络协议发生的问题
     
     
    每一个ppp数据帧都以标志字节7e开始和结束
    地址域 :FF  由于点到点链路可以唯一标识对方      所以此字节无意义    填充为全1的广播地址即可
    控制域:0x03    无意义
     
    协议域:区分ppp数据帧中信息域所承载的数据报文的内容   要求必须为奇数    低字节的最低位为1       高字节的 最低位为0       如果不符合上述规定      则接收端会向发送端发送一个protocol-reject报文     在此报文的 尾部 将完整地填充被拒绝的报文   主要的协议类型有LCP       NCP    及普通的IP报文
    实质上上面的协议类型标示ppp协议运行过程中的不同状态     可以根据此协议域的值来判断所处ppp的 哪个阶段     可以通过抓包   判断ppp的问题  再进行分析和定位  
    范围 代表的含义
    0x0***-0x3***      特殊数据包的网络层协议
    0x8***-0xb*** 属于网络控制协议NCP
    0x4***-0x7*** 用于没有相关NCP的低通信量协议
    0xc***-0xf*** 使用链路层控制协议LCP的包
     
    保留值
    0xc021 LCP
    0xc023 PAP
    0xc025 LINK quality report   链路品质报告
    0xc223 CHAP
    0x8021 IPCP         IP控制协议
    0x0021 ip internet protocol
    0x0001 padding protoco   填料协议
    0x0003-0x001f 保留
    0x007d 保留
    ****
     
    抓包实例:
    ppp和帧中继 - 骡子 - stupidmule@126 的博客

      信息域:缺省不超过1500字节       ppp协议中配置的参数选项MRU    ===MAXimum receive unit

     
    方法一:字节填充    
    信息部分中出现的标志字段的值解决办法    (透明传输)
    a 0x7e转变成2个字节   0x7d   和0x5e
    b 0x7d 转变成2个字节  0x7d   和     0x5d
    c 信息字段中出现ascii码的控制字符   即数值小于0x20的字符
    则在该字符前面要加入一个0x7d字节   同时将该字符的编码加以改变
    方法二:0比特填充
    当用在SONET/SDH链路时    使用同步传输连续连串的比特连续传送    这时ppp协议采用0比特填充方法来 实现透明传输
    在发送端  只要发现有5个连续的1   就立即填入一个0   接收端对帧中的比特流进行扫描。每当发现5个连续1 时,就把这5个连续1后的一个0删除。
    所有的数据链路层协议都不进行编号和确认机制
     
     
    PPP协议的工作状态  
    1.用户拨号接入isp        路由器(isp机房)的调制解调器对拨号确认   建立一条物理连接
    2.pc向路由器发送一系列的LCP分组    封装成多个PPP帧   这些分组及其相应选择一些PPP参数   和进行网络层 配置,NCP给新接入的pC机分配ip地址    (isp购买很多个ip地址)
    3.   通信完毕后,NCP释放网络层的连接   收回原来分配出去的IP 地址.接着,LCP释放数据链路层的连接  最后释 放物理层连接
     
    http://wenku.baidu.com/view/118ad274580216fc700afd5f.html?from=search
    二 LCP协议
    用于HDLC的上层 写生数据链路的选项 制定MRU;lcp包被封装在ppp数据区域内 协议用0xc021表示

      代码指定lcp包的种类   不同格式

    标识符在请求和回复中使用    标识符无效  则该包将被静静丢弃
    长度   制定lcp包长度  包括代码   标识符    长度和数据区域    小于mru
    数据 由0或多个8位字节      
     
    lcp包有3类
    链路配置包 configure-request    匹配请求    代码0x01
    configure-ack 匹配正确应答
    configure-nak 匹配不应答
    configure-reject 匹配拒绝
    链路结束包 terminate-request 终止请求
    terminate-ack 终止应答
    链路维修包 code-reject 代码拒绝
    protocol-reject 协议拒绝
    echo-request 回波请求
    echo-reply 回波应答
    discard-request 抛弃请求
    a: configure-request    匹配请求   :

      选项域格式:1字节类型     + 1字节长度    +数据

    0x01 maximum-receive-unit 最大-接收-单元
    0x02 async-control-character-map 异步-控制-字符-映射
    0x03 authentication-protocol 鉴定-协议
    0x04 quality-protocol 质量-协议
    0x05 magic-number
    0x07 protocol-field-compression 协议-域压缩
    0x08 addresss-and-control-field-compression 地址  控制域   压缩
     
      b configure-ack
    cofnigure-nak
    configure-reject
    terminate-request和terminate-ack
    格式与configure-request格式都相同 不同点位前面的类型字段的值
     
     
    工作流程 建立
    1.客户端打开一个连接 需要传送一个configure-request包
    2.isp router收到configre-request包 如果包中的每个配置选项及其所以值都能接受 就传送一个configure-ack包
    确认包中配置选项必须是接受的configure-request包中的配置选项的拷贝 且标示符必须与configure-reques t包相同以保证匹配
    如果收到的包与以上要求不符的包经被静静的丢弃
    3.如果configre-request包中的每个配置选项及其所以值都能接受 但是配置项目当中的一些值不能被接受 则必 须传送一个configure-nak包 其中选项域仅有收到的request包中不可接受的配置选项所填充
    如果除了对端列出的配置项目之外还有新的项目要求配置 则nak也可以发送新的配置项目和值 以提醒对 端将其列入 request包中 作为下一次发送的请求项目
    nak包中的标识符域必须匹配应答的request包
    4.如果request 包中一些配置项目是不可辨认的或者不被写上所受 则必须传送一个configure-reject包 选项域 仅仅填充不可接受的配置项目 而且不被重定义或修改 标识符域request包相同
    一个新的request包再发送时 必须不包含任何reject中列出的配置项目
     
    终止包发送
    1.发送terminate-request包 数据内容发生改变或接收到对前一个请求的有效应答 标识符域必须改变 对于重传 标识符可以保持不变2.传送ack包 接收到的request包的标识符必须被拷贝到要发送的ack包的标识符
    流程:
    1.接收到request包 后 必须传送一个terminate-ack包 当接收到一个未被引用的terminate-ack包时表示对 端在关闭或停止状态
    2.如果要关闭一个连接 需要不断发送terminate-request 直到收到terminate-ack包 或者收到链路低层 已经关闭的提示;或者已经接收到了足够多的terminate-request包 以至于有充分的理由关闭
     
    code-reject
    在接收到一个带有未知代码的LCP包时 则必须传送一个code-reject包报告回位置代码的发送方。当接收到一个c ode-reject包 则应该报告问题并结束连接。
     
     
    protocol-reject
    当收到未知协议域的ppp包时 此时lcp处于打开状态 所以需要传送一个protocol-reject包回应对端 对端在接 收到protocol-reject包后 必须今早停止发送被指出的协议包
    只能在LCP打开状态下发送
    echo-request和echo-reply
    用于检测数据链路层链路双方是否正常运转 这对调试 链路质量检测 测试和其他众多功能有帮助。
    在LCP打开的情况下发送 在其他状态下 需要被丢弃
    接收到一个echo-request包时 必须传送一个echo-reply包。
    discard-request
    测试远端链路接收器    在LCP打开的情况下发送   接收器丢弃此包
     
    c LCP定时器和计数器
    1.重启定时器 用于计算configure-request和terminate-request包的传输时间 超时事件触发 并通知两个request包需要重发 可配置 默认3s
    2.重启计时器
    max-terminate 需要有一个terminate-request的重启计数器 此项显示request包发送后对端可能不会应答的 没收到的terminate-ack包的个数 可配置 缺省为2次传输
    max-confgure 显示configure-request包发送后对端没应答而没收到configure-ack configure-nak 或config ure-reject包的个数 可配置 缺省为10次传输
    max-failure 显示configure-nak包发送后 ack包发送前的configure-nak包的个数 任何更进一步的用于对 端请求的选项被转换到configure-reject包 必须可配置 缺省为5次传输
     
    三 PAP协议
    密码验证协议 链路双方使用2次握手建立身份验证 明文发送 并且对重复验证和错误攻击没有保护措施  pap包格式 
     
     
    authenticat-request 用来启动pap 不停的发送 直到接收到一个有效的响应包或超时计数器
    收到au-request包 用户名和密码可识别 可接受 则发送一个au-ack包 如果不可接受 则发送一个au-nak包 并且终止链路
     
    四 CHAP协议
     
     
    其中的one-way-hash 单项哈希 就是不可逆的计算过程 例如MD5
    对端发送md5(秘钥) 验证端 用md5(秘钥) 如果两个值匹配则验证成功 秘钥不在链路上传播
    要求双方都知道秘钥 建议为了避免在网络的其他链路上发送秘钥 可以配置一台中心服务器统一管理秘钥
    chap通过使用递增的标识符和可变的挑战值防止会送攻击
    重复挑战目的:验证者控制挑战的频率和时间
    md5最佳秘钥长度16字节
    challenge值应该符合两个标准:唯一性和不可预测性 每个值应该是唯一的
    如果使用相同秘钥联系的chanlenge值的副本可能让攻击者利用前一个截获的响应包响应 如图
     
    每个challenge值也应该是不可预测的,否则攻击者欺骗对端响应一个可预测的未来challenge 然后用这个响 应伪装成对端欺骗验证者 如图
      认证的步骤
    1.链路建立阶段结束后     认证者向对端发送challenge 信息
    2.对端用经过单向哈希函数计算出来的值做应答    md5运算后
    3.认证者根据他自己的预期哈希值来检查应答  如果值匹配   认证得到承认  否则连接应该终止
    4.经过一定的随机间隔   认证者发送一个新的challenge给对端    重复1-3
     
    协商chap认证协议的配置选项格式:类型 长度 认证协议 算法
    chap包格式 封装在ppp数据链路层帧的数据域中 ppp的协议字段只是0xc223
    格式:ppp帧头 ppp协议域 代码 标识符 长度 数据
    代码字段只是chap包的类型:challenge respoonse success failure
    用法:
    chap的开始
    发送chall包
    发送应答包 需要比较应答值和计算的预期值
    发送success或failure包
    挑战包发送时间:有效的应答包成功接收或者计数器满
    对端应该随时为认证阶段和nlp阶段的挑战做好准备
    success包可能丢失 所以需要允许重复的应答包
    终止链路 可以有LCP的终止请求和终止应答来指示认证失败
     ppp详解 - 骡子 - stupidmule@126 的博客
     
    IPCP 协议(对应于IP协议的服务) 和 PPP链路质量监控LQM 以及ccp压缩控制协议(略)
     
    五 ppp链路的各个阶段
     
     
    a 链路死亡阶段 链路一定开始并结束于这个阶段
    b 链路建立阶段 LCP用于交换配置信息报 建立连接
    c 认证阶段 此阶段只有链路控制协议 认证协议 链路质量监视协议的包是被允许的
    d 网络层协议阶段 在前面的阶段完成后 每个网络层协议 ip ipx或appletalk 必须被相对应的NCP分别设定 每个NCP可以随时被打开和关闭
    e 链路终止阶段 ppp可以任意时间终止链路 终止的原因很多 :载波丢失 认证失败 链路质量失败 空闲周 期定时器期满 或者管理员关闭链路
    LCP关闭链路 即可 不需要ncp关闭 相反 一个ncp关闭却不足以引起ppp链路的终止 即使ncp处于 opened状态。
     
     
    ppp自动状态机制
    以LCP有限状态自动机为例       由事件、动作 和状态转换定义
       事件:接受外部命令(打开   关闭   重启定时器)    接受对端包
    动作:启动重启定时器    向对端传包
     
     
    完整ppp协议运转过程的报文举例
     
    以下是一段较完整的PPP协议运转过程的报文� W:7E FF 03 C0 21 01 01 00 14 02 06 00 0A 00 00 05 06 48 43 D3 0A 07 02 08 02 2E 15 7E C021:LCP Configure-Request:ID=1 ACCM:映射ASCII17、19 Magic-Number:4843D30A PFC ACFC 写入配置请求� R:7E FF 03 C0 21 02 01 00 14 02 06 00 0A 00 00 05 06 48 43 D3 0A 07 02 08 02 C5 7C 7E C021:LCP Configure-Ack:ID=1 ACCM:映射ASCII17、19 Magic-Number:4843D30A PFC ACFC 接收方同意请求� R:7E FF 03 C0 21 01 03 00 1D 01 04 07 D0 02 06 00 0A 00 00 07 02 08 02 05 06 A7 A0 42 6F 03 05 C2 23 05 4B F2 7E C021:LCP Configure-Request ID=3 MRU=07D0 ACCM:映射ASCII17、19 PFC ACFC Magic-Number:A7A0426F 认证协议:CHAP MD5 接收方发送请求�有新的配置请求�� W:7E FF 03 C0 21 03 03 00 08 03 04 C0 23 99 7F 7E C021:LCP Configure-Nak:ID=3 认证协议�PAP 提醒接收方将认证协议改为PAP; R:7E FF 03 C0 21 01 05 00 1C 01 04 07 D0 02 06 00 0A 00 00 07 02 08 02 05 06 A7 A0 42 6F 03 04 C0 23 91 AB 7E C021:LCP Configure-Request:ID=5 MRU=07D0 ACCM:映射ASCII17、19 PFC ACFC Magic-Number:A7A0426F 认证协议:PAP 接收方重新发出配置请求�将认证协议改为PAP�� W:7E FF 03 C0 21 02 05 00 1C 01 04 07 D0 02 06 00 0A 00 00 07 02 08 02 05 06 A7 A0 42 6F 03 04 C0 23 A2 F1 7E C021:LCP Configure-Ack:ID=5 MRU=07D0 ACCM:映射ASCII17、19 PFC ACFC Magic-Number:A7A0426F 认证协议:PAP 同意配置请求� W:7E FF 03 C0 21 09 00 00 08 48 43 D3 0A CF AE 7E C021:LCP Echo-Request:ID=0 Magic-Number=48 43 D3 0A 发送回波请求�检测链路� W:7E FF 03 C0 23 01 03 00 0F 03 48 4C 59 06 57 4F 52 4B 45 52 2E 87 7E C023:PAP Request:ID=3 用户名ID=48 4C 59 密码=57 4F 52 4B 45 52 发送用户名和密码�请求认证� R:7E FF 03 C0 21 0A 00 00 08 A7 A0 42 6F 87 F0 7E C021:LCP Echo-Reply:ID=0 Magic-Number=A7 A0 42 6F 接收端发送回波应答� R:7E C0 23 02 03 00 05 00 8B 09 7E C023:PAP Ack:ID=3 接收端通过验证� w:7E FF 03 80 21 01 07 00 10 03 06 00 00 00 00 02 06 00 2D 0F 00 BE 0B 7E 8021:IPCP Configure-Request:ID=7 IP:00.00.00.00�请求对端分配 压缩TCP;最大时间片标识0F;时间片标识符不压缩 发送IP请求和压缩请求� R:7E 80 21 04 07 00 0A 02 06 00 2D 0F 00 6E 85 7E 8021:IPCP Configure-Reject:ID=7 压缩TCP;最大时间片标识0F;时间片标识符不压缩 接收端不同意压缩� W:7E FF 03 80 21 01 08 00 0A 03 06 00 00 00 00 24 1A 7E 8021:IPCP Configure-Request:ID=8 IP:00.00.00.00�请求对端分配 请求IP地址分配� R:7E 80 21 01 01 00 0A 03 06 C0 A8 FE FE 48 CC 7E 8021:IPCP Configure-Request:ID=1 IP:C0.A8.FE.FE W:7E FF 03 80 21 02 01 00 0A 03 06 C0 A8 FE FE 5F 56 7E 8021:IPCP Configure-Ack:ID=1 IP:C0.A8.FE.FE W:7E FF 03 80 21 01 08 00 0A 03 06 00 00 00 00 24 1A 7E 8021:IPCP Configure-Request:ID=8 IP:00.00.00.00 继续发送IP请求 R:7E 80 21 03 08 00 0A 03 06 0A 5F 15 DB E9 3A 7E 8021:IPCP Configure-Nak:ID=8 IP:0A.5F.15.DB 接收端建议采用IP: 0A.5F.15.DB W:7E FF 03 80 21 01 09 00 0A 03 06 0A 5F 15 DB 24 C1 7E 8021:IPCP Configure-Request:ID=9 IP:0A.5F.15.DB 采纳建议�发送IP�0A.5F.15.DB请求 R:7E 80 21 02 09 00 0A 03 06 0A 5F 15 DB 33 5B 7E 8021:IPCP Configure-Ack:ID=9 IP:0A.5F.15.DB 接收端通过请求�分配IP:0A.5F.15.DB
     
    TCP/IP协议过程 W:7E FF 03 C0 21 09 02 00 08 48 43 D3 0A 74 99 7E C021:LCP Echo-Request:ID=2 Magic-Number=48 43 D3 0A 发送回波请求 R:7E FF 03 C0 21 0A 02 00 08 A7 A0 42 6F 3C C7 7E C021:LCP Echo-Request:ID=2 Magic-Number=A7 A0 42 6F 接收端回波应答 W:7E FF 03 C0 21 05 02 00 10 55 73 65 72 65 71 75 65 73 74 53 33 7E C021:LCP Terminate-Request:ID=2 发送链路中断请求� R:7E FF 03 C0 21 06 02 00 10 55 73 65 72 65 71 75 65 73 74 72 A9 7E C021:LCP Terminate-Ack:ID=2 接收端同意中断链路� 7E FF 03 C0 21 05 05 00 04 5C A4 7E C021:LCP Terminate-Request:ID=5 接收端发出中断链路请求� W:7E FF 03 C0 21 06 05 00 04 91 81 7E C021:LCP Terminate-Ack:ID=5 同意中断链路。
     
     
     
     
    广域网QOS设置
    HDLC支持qos不好
    在hdlc基础上的PPP对QOS支持较好
    接口缓冲区叫buffer 存储网络拥塞时候需要转发 但需要等待转发的报文  
    一般需要软队列的排队机制称为FIFO 排在前面的先发 排在后面的等待 先进先出
    另一种称为WFQ 叫做加权的公平队列 相对更高级
    一个队列中有多个片段长度不一致 而且协议不同 可能会造成抖动 titter
    例如:video片段为A VOIP报文为B ftp报文为C
    队列为:AABBAACBBBBAA
    A B C长度都不同 其中C的长度最大 需要进行切片 并拆开 即链路分片及交互的方式 用来解决排队 带来的抖动。
    实验:
      A 链路分段与交错      客户端用多条链路连接isp运营商的路由器    多条链路   Multi-link
    r1:
    #interface s1/1
    #encapsultaion ppp
    #no ip address 注意物理接口不能有ip地址 因为逻辑多线路需要一个ip地址
    #ppp multilink group 12 链路两端的编号需要一致
    #no shudown
    r2配置相同
     
    B 启用多链路
    r1:
    #interface multilink 12
    #encapsulation ppp
    #ppp multilink
    #ppp multilink group 12
    #ip address  12.1.1.1 255.255.255.0
    r2 配置类似
     
    C 检验
    r1#show ip interface brief
    D 配置链路分段
    r1#interface multilink 12
    #ppp multilink fragment delay 10 启用分片 10ms指定发送一个小分片 只是需要10ms即可
    #ppp multilink interleave 开启交互 比如将ftp报文分割成多个小分片后 将voip的报文夹杂在这些小分片中 来一起发送 保证不会产生抖动
    r2相同的配置
    E 配置带宽利用率----压缩
    两端都要配置压缩
    r1#interface multilink 12
    #compress stac 堆栈式压缩
    r2同样配置
  • 相关阅读:
    C# 利用DataTable批处理数据导入数据库
    人员基础信息一体化采集系统建设方案
    定时调用WebService方法同步数据
    进程间通信
    信号
    Linux进程基础
    来自硬件男的《信号与系统》整理笔记
    shell脚本编程(ubantu)
    Linux系统c语言开发环境
    Linux系统用户管理及VIM配置
  • 原文地址:https://www.cnblogs.com/dongguolei/p/7902618.html
Copyright © 2011-2022 走看看