在PPP中使用HDLC帧

来源:互联网 发布:金庸小说的写法 知乎 编辑:程序博客网 时间:2024/06/06 18:26

 

在PPP中使用HDLC帧

 

来源:http://ei.szpt.edu.cn/longen/E-K/detaile~k/hdlc-1.htm

 

介绍物理层要求数据链路层面向字节连接的HDLC帧位同步HDLC帧异步到同步的转换附加LCP配置选项

摘要

点对点协议提供了在点-点连接上传送多种协议帧的标准方法。下面将介绍使用HDLC帧发送PPP包。

1. 介绍

下面提供的资料说明了在面向字节和位的同步或异步连接上对八位无奇偶校验数据的帧传输。这些连接必须是全双工的,当然也可以是专用连接或线路交换连接。

同时,也说明了如何使控制信息如XON/XOFF透明地传输和删除由连接相关软硬件加入的高级控制信息的方法。

一些协议希望提供无差错的传输,一些希望提供一定条件上的差错检测,而有些则根本不需要提供差错控制。PPP协议使用HDLC帧检测序列进行差错检测,这易于硬件实现,软件实现也可以。

1.1. 说明

在本文中,大家应该注意以下用法的意义:

必须

 

 

表示一种绝对的需要

 

 

严禁

 

 

表示绝对不准

 

 

应该

 

 

它相当于一种推荐,可能在一种情况下不需要某种东西,但是在作出不需要决定时一定要小心

 

 

可以

 

 

它表示可选的,它表示您可以选择它也可以不选择它。但应该注意,不包括这一功能或选项的系统要和其它包括这一功能和选项的系统一起工作

 

 

1.2. 名词

本文中经常使用以下名词,希望大家了解:

 

 

 

数据报

 

 

在网络层(如IP层)传输的数据单元。一个数据报可以包括在一个或多个包而在数据链路层传输

 

 

 

 

在数据链路层传输的数据单元,它以帧头开始,以帧层结束,中间是数据

 

 

 

 

封装的基本单位,在网络层和数据链路层接口之间传送。通常,一个包对应一个帧,当然也可以多个包对应一个帧

 

 

对方

 

 

点-点连接的另一方

 

 

无回应抛弃

 

 

在系统中不进行任何响应处理就抛弃一个包。但是,系统应该提供记录错误的功能

 

 

 

2. 物理层要求

PPP能够在许多DTE/DCE接口(如EIA RS-232-E,EIA RS-422和CCITT V.35)工作。对它的唯一限制全双工的连接,或者是专用连接,或者是线路交换对PPP数据链路层帧是透明的,PPP可以工作在异步(启停),位同步或字节同步模式下。

接口格式

PPP代表对物理层的八位接口。对于半八位接口是不支持的。

传输速率

PPP对传输速率没有特别的要求。

控制信号

PPP不需要使用控制信号。当提供控制信号时,这样的控制信号可以提供更多的功能,提高效率。因为不需要这些信号,物理层可能与数据链路层脱节,也就隐藏了物理传输的瞬时细节。这可以被用于蜂窝无线网络和其它快速交换连接的场合。当在单元之间移动时,具体的系统可以将整个地区看成是一个链路,即使传输在不同频率上交换了许多次。这链接被认为是和本地区的中心连接在一起的,而不是和单个的接收者在一起。然而,当链路转为到另外不同的管理时,应该重新建立链路设置。

因为数据通信十分多,一些系统选择在不忙时与数据层断开连接,通信再次发生时,再次建立连接,所有这一切对于数据链路层都是不可见的。需要健壮性的系统应该避免过多地使用这一方法。在系统关闭后的“一段时间”内,系统应该通知一个关闭事件。对这一段时间的讨论还在继续,这些讨论主要基于通信量,呼叫建立时间和安装的安全性方面。

 

3. 数据链路层

PPP使用在ISO 3309-1979 HDLC中规定的帧结构,而第四版3309:1991对在异步方式下使用HDLC进行了一些修改。PPP控制过程使用在ISO 4335-1979 HDLC中描述的“控制”域编码进行控制。

3.1. 帧格式

PPP HDLC帧结束如下所示。此表未包括为同步而设置的字符和为透明性而设置的字符。传送时由左向右传送下图的内容。

ppp1.jpg (14758 bytes)

标记序列

每个帧由一个标记序列开始和结束,标记序列就是二进制的: 01111110(十六进制的0x7e)。所有系统不断检测此标记,它用于对帧进行同步。在两帧之间只需要一个这样的标记,两上相继的标记构成一个空帧,它被无响应抛弃弃,而不产生FCS错误。

 

地址域

它是一个字节,包括二进制11111111(十六进制0xff),也就是“所有站”地址。单独站地址未被指定。“所有站”地址必须能够识别并被接受。使用其它地址长度和值在以后讲。不可识别的地址应该被无回应抛弃。

 

控制域

它是一个字节,包括二进制00000011(十六进制0x03),“未编号信息”(UI)命令和选举/结果位被设置为零。使用其它地址长度和值在以后讲。不可识别的地址应该被无回应抛弃。

 

帧检查序列(FCS)域

此域通常包括两个字节(16位)。先传送它的最低位,它指示的是最高系数项。也使用四个字节的FCS,这将在“PPP LCP扩展”中涉及。此域的是由地址、控制、协议、信息和填充域中的所有位运算得到的,不包括开始和停止位或用于数据透明性而插入的位,也不包括标记序列和FCS域本身。在同步控制字符映射中标记的字节在接收时存在,但在计算FCS时会被抛弃(详细情况请见附录)。

其它的域在去除了上述的域之后就会得到。

3.2. 标准帧的修改

通信控制协议允许对标准HDLC帧结构进行修改。但是,修改了的帧应该与标准的帧有所区别。

地址和控制域压缩:

当使用标准HDLC帧时,地址和控制域包括十六进制数0xff和0x03。当使用其它地址或控制域值时,严禁使用地址和控制域压缩。在传输时,压缩的地址和控制域被省略。在接收时,地址和控制域通过检查第一个双字节而解压。如果这两个域包括值0xff和0x03,说明这就是地址和控制域,如果不是,说明这两个域已经被压缩并未被传送。

在定义上,双字节的的协议域中的第一个字节不会是0xff。当地址域压缩启用并且信息位的第一个字节是0x03时,协议域值不应该是0x00ff,以防发生混淆。

 

4. 面向字节连接的HDLC帧

下面说明一下八位异步面向字节连接的HDLC帧。

4.1. 标记序列

标记序列标志帧的开始或结束。字节流在字节到字节的基础上对01111110进行检查。

4.2. 透明性

使用了字节填充过程。控制逃逸字节被定义为01111101(也就是十六进制的0x7d)。作为最小实现,发送必须避免使用标记序列和控制逃逸字节。

在进行FCS运算后,发送者检查在两个标记序列中的帧。每个帧,控制逃逸字节和其它在发送同步控制字符映射中加入的标记都由两个字节替换,这两个字节包括控制逃逸字节和原来的字节与0x20异或的和。也就是从右向左第二位取反。

接收必须能够正确处理所有控制逃逸字节。在接收方进行FCS运算前,每个小于0x20的字节都必须检查一下。如果是在接收ACCM中被标记的,就删除它(它可以是由中继通信设备加入的)。所有控制逃逸字节也被删除,此字节后的数据再和0x20进行异或操作。在标记序列中的数据不进行以上操作。

下面是一些例子:

0x7e 变为 0x7d, 0x5e

0x7d 变为 0x7d, 0x5d

0x03 变为 0x7d, 0x23

一些带有软件流量控制的调制解调器可以中断DC1和DC3的传送而忽略第八位(奇偶校验位)。那么数据就要以以下格式传送:

0x11 变为 0x7d, 0x31

0x13 变为 0x7d, 0x33

0x91 变为 0x7d, 0xb1

0x93 变为 0x7d, 0xb3

4.3. 无效帧

发生以下情况时,帧将被无响应抛弃,而不被记为FCS错误:帧过短(当使用16位FCS时帧小于4个字节),或才帧以控制逃逸字节结束而其后紧跟一个标记序列,或者其中的字节帧无效(在应该接收到1的地方接收到0)。

4.4. 时间空隙

4.4.1. 字节同步

未提供字节内的时间空隙。标记序列必须在时间帧内的时间空隙传送。

4.4.2. 异步

字节内时间空隙必须和连续传送的1一起出现。帧内时间空隙可以看作是扩展的字节时间空隙。这样做对每一帧可以节省一个字节的时间,降低时延增加带宽。正是因为标记序列既可以作为帧开始标记也可以作为帧结束标记使这成为可能。在接收帧后,空闲的接收方总会处于帧开始状态。

健壮的传送方不应该过分使用这一功能,因为降低时延的代价是降低可靠性。线路噪声可能导致接收方接收到无效字符,但认为它们是帧的一部分。如果发送方在帧开始时不发送一个新的标记序列,下一帧和无效无效字符一起将导致这一帧无效。

如果在帧开始时发送时开始标记序列就可以得到比较好的效果。发送方应在“期望时间”结束时发送开始标记序列。“期望时间”的最大值比最慢打字者打字速度快不了多少,大约一秒左右。

4.5. 传输

4.5.1. 字节同步

不同的编码由DTE/DCD负责,这不在本文的讨论范围之内。

4.5.2. 异步

所有字节以最低位优先的方式发送,八位数据,一位停止位。不支持七位同步连接。

5. 位同步HDLC帧

下面总结以位同步连接使用HDLC帧。

 

5.1. 标记序列

 

标记序列用于帧的开始与结束,,它用于帧同步。二进制流在位的基础上检测二进制序列01111110(十六进制0x7e)。

不应该使用“共享零模型”标记序列"011111101111110"。不提供此序列时,系统必须保证第一个检测到的标记序列被立即送到链路层。使用共享零模式妨碍位同步异步转换和位同步字节同步转换的协同进行。

 

5.2. 透明性

 

在FCS计算后,传送方检查整个帧,如果碰到连续五个1就要插入一个零,以免帧内的数据和标记序列混淆。在接收方,在进行FCS计算前,连接五个一后面的0将被抛弃,以保证数据的正确性。

 

5.3. 无效帧

 

帧过短(在16位FCS时少于4个字节),或者帧以一个多于六个1的序列结束时,帧将被无响应抛弃,而不被记为FCS错误。

 

5.4. 时间空隙

 

不支持字节内时间空隙。

标记序列应该在帧内时间空隙传送。然而,特定类型的线路交换连接要求使用空闲标记(连续的1)。当在位同步连接使用空闲标记时,系统必须唯在标记序列间的空闲时间中至少有15个连接的1出现,标记序列通常在一个帧的开始处和空闲时间的结束处产生。这与在ISO 3309中的情况不同,它允许7到14位的空闲标记。

 

5.5. 传输

 

所有字节以最低位优先的方式发送。不同的编码由DTE/DCD负责,这不在本文的讨论范围之内。PPP可以不关心下层的二进制流表示,缺少传送的标准将会象缺少数据链路标准一样妨碍上下两层的协同工作。在速度范围在56 Kbps到2.0 Mbps中,NRZ是当前最广泛使用的,它的标准也被推荐于默认值。

当允许编码配置时,NRZI也被推荐为默认值,相对起来,它能够避免信号转换配置错误。它的连接也不需要昂贵的DSU/CSU设置。但是,NRZI编码使16位FCS中X1分量的缺少的问题变得有出错的可能,这样2**15中(而不是2**16)的错误就无法查觉,三位错误也无法检查。因此,在使用NRZI时,应该使用32位FCS,其中包括X1分量。

当速度大于45 Mbps时,一些设计者会选择ANSI高速同步接口。而这样的经验现在还不成熟,设计者应该在选择传输编码时注意协同使用。

 

6. 异步到同步的转换

 

一些系统会遇到异步到同步的转换,这是由于系统链路的一端可能连接着一个同步子系统而另一端连接着一个异步子系统。而所有操作中的转换工作都应该由转换装置完成。

要启用此功能,同步PPP系统必须以LCP配置确认响应异步控制字符映射配置选项。然而,接受配置选项并不意味着同步系统将所所有的ACCM映射,相反,所有类似的字节映射将由异步到同步转换装置完成。

 

7. 附加LCP配置选项

 

配置选项格式和基本选项已经由LCP定义了。具体的数据请查询相应的文献,这里只讨论异步控制字符映射。

 

7.1. 异步控制字符映射(ACCM)

 

描述

 

此配置选项提供了一种在异步链路上使用控制字符透明的方法。异步链路的两每一端支持两个异步控制字符映射。接收ACCM是32位的,而发送ACCM可以多达256位,也就是说,链路两端有四个不同的ACCM,每端两个。

对于异步链路,默认的接收ACCM是0xffffffff。默认的发送ACCM是0xffffffff加上控制逃逸字符和标记序列本身,再加上将要异步发出的而被标记字符。(因为异步发送,因为要分成一个个单元,所以需要加上标记。)

对于其它类型的连接,默认值是0,因为对其它类型的连接而言,没有必要进行映射。默认的字符(除了0x20外)都能够在所有已知的通信设备上透明传送。

发送方也可能用控制逃逸的格式发送除0x5e外的从0x40到0xff的所有字符,但是这并没有解决发送者不能处理所有非控制字符的问题。同样,现有的技术也不能影响第八位,这也没有解决只能传送7位字节的通信链路问题。

然而,通常不需要映射所有的控制字符,甚至不需要映射任何控制字符。配置选项用来通知双方哪些控制字符在发送时需要映射。一方可能仍然在映射的格式中传送其它字符。此时发送方应该采取措施使接收方在接收时忽略这些字符。下面所示为异步控制字符映射配置选项格式。传送顺序为从左至右。

ppp2.jpg (9461 bytes)

 

类型

 

2

 

长度

 

6

 

ACCM

 

ACCM域有四个字节,说明需要映射的控制字符集。每个被标记的位与相同位置的字节对应。如果位被设置为零,此字节不需要映射。如果此位为1,此字节必须被映射。注意:最低字节的最低位如果是0,对应的映射字符是ASCII控制字符NUL。

 

A. 推荐的LCP选项

 

下面的配置选项是推荐使用的:

 

高速连接时:

 

魔术数;

连接质量监视

不使用地址和控制域压缩

不使用协议域压缩

 

低速或异步连接时:

 

异步控制字符映射

魔术数

使用地址和控制域压缩

使用协议域压缩

 

B. PPP帧的自动识别

 

有时可能需要检测PPP帧。以下面字节开始的就是一个有效的PPP LCP帧:

 

7e ff 03 c0 21

7e ff 7d 23 c0 21

7e 7d df 7d 23 c0 21

 

注意:前两种形式对UNIX而言不是有效的用户名。然而,只有第三种格式产生正确的PPP 帧奇偶校验码,此时03(EXT)和FF(DEL)作为控制符,与奇偶校验无关而被抛弃。

当上面三种模式之一在登录时出现,接口进入包模式时,系统就会如上所述处理。初始到达的PPP帧将被抛弃,而立即发送要求配置帧。

 

C. 快速帧检查序列的实现

 

FCS原来设计时考虑到了硬件的实现。串行二进制流在线路上传输,FCS可以在串行数据送出时计算得到,而附加在串行数据流上,这些数据以标记序列结束,而完成一帧。

接收方在接收到标记序列前不清楚是否完成计算接收到的FCS。因此,应该设计一种帧格式使FCS通过时就产生特定的信息。这样设计的帧就是“好的FCS”。

 

C.1. FCS表产生程序

 

下面的程序用于创建查找表计算FCS-16。

 

/*

* 产生FCS-16表

*/

 

/*

*FCS-16产生多项式:x**0 + x**5 + x**12 + x**16.

*/

#define P 0x8408

 

main()

{

register unsigned int b, v;

register int i;

 

printf("typedef unsigned short u16;/n");

printf("static u16 fcstab[256] = {");

for (b = 0; ; ) {

if (b % 8 == 0)

printf("/n");

 

v = b;

for (i = 8; i--; )

v = v & 1 ? (v >> 1) ^ P : v >> 1;

 

printf("/t0x%04x", v & 0xFFFF);

if (++b == 256)

break;

printf(",");

}

printf("/n};/n");

}

 

C.2. 16位FCS计算方法

 

下面例子的功能:当数据到达接口时,由一个查找表计算32位的帧检查序列。

 

/*

* u16代表16位无符号数

*/

typedef unsigned short u16;

 

/*

* 由表生成子计算而来的FCS查找表

*/

static u16 fcstab[256] = {

0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,

0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,

0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,

0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,

0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,

0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,

0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,

0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,

0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,

0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,

0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,

0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,

0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,

0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,

0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,

0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,

0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,

0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,

0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,

0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,

0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,

0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,

0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,

0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,

0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,

0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,

0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,

0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,

0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,

0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,

0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,

0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78

};

 

#define PPPINITFCS16 0xffff /* Initial FCS value */

#define PPPGOODFCS16 0xf0b8 /* Good final FCS value */

 

/*

* 由给定的当前FCS值和新数据计算新的FCS数值

*/

u16 pppfcs16(fcs, cp, len)

register u16 fcs;

register unsigned char *cp;

register int len;

{

ASSERT(sizeof (u16) == 2);

ASSERT(((u16) -1) > 0);

while (len--)

fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff];

 

return (fcs);

}

 

/*

* 如何使用FCS

*/

tryfcs16(cp, len)

register unsigned char *cp;

register int len;

{

u16 trialfcs;

 

/* add on output */

trialfcs = pppfcs16( PPPINITFCS16, cp, len );

trialfcs ^= 0xffff; /* 取反 */

cp[len] = (trialfcs & 0x00ff); /* 最低位优先 */

cp[len+1] = ((trialfcs >> 8) & 0x00ff);

 

/* check on input */

trialfcs = pppfcs16( PPPINITFCS16, cp, len + 2 );

if ( trialfcs == PPPGOODFCS16 )

printf("Good FCS/n");

}

 

C.3. 32位FCS计算方法

 

下面例子的功能:当数据到达时,由一个查找表计算32位的帧检查序列。

 

/*

* FCS-32产生子多项式:x**0 + x**1 + x**2 + x**4 + x**5

* + x**7 + x**8 + x**10 + x**11 + x**12 + x**16

* + x**22 + x**23 + x**26 + x**32.

*/

 

/*

* u32代表无符号的32位数

*/

typedef unsigned long u32;

 

static u32 fcstab_32[256] =

{

0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,

0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,

0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,

0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,

0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,

0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,

0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,

0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,

0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,

0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,

0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,

0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,

0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,

0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,

0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,

0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,

0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,

0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,

0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,

0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,

0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,

0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,

0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,

0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,

0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,

0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,

0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,

0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,

0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,

0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,

0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,

0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,

0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,

0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,

0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,

0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,

0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,

0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,

0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,

0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,

0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,

0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,

0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,

0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,

0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,

0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,

0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,

0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,

0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,

0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,

0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,

0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,

0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,

0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,

0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,

0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,

0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,

0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,

0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,

0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,

0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,

0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,

0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,

0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d

};

 

#define PPPINITFCS32 0xffffffff /* 初始化FCS值 */

#define PPPGOODFCS32 0xdebb20e3 /* 好的最终FCS值 */

/*

* 由给定的当前FCS值和新数据计算新的FCS数值

*/

u32 pppfcs32(fcs, cp, len)

register u32 fcs;

register unsigned char *cp;

register int len;

{

ASSERT(sizeof (u32) == 4);

ASSERT(((u32) -1) > 0);

while (len--)

fcs = (((fcs) >> 8) ^ fcstab_32[((fcs) ^ (*cp++)) & 0xff]);

 

return (fcs);

}

 

/*

* How to use the fcs

*/

tryfcs32(cp, len)

register unsigned char *cp;

register int len;

{

u32 trialfcs;

 

/* add on output */

trialfcs = pppfcs32( PPPINITFCS32, cp, len );

trialfcs ^= 0xffffffff; /* 取反 */

cp[len] = (trialfcs & 0x00ff); /* 最低位优先 */

cp[len+1] = ((trialfcs >>= 8) & 0x00ff);

cp[len+2] = ((trialfcs >>= 8) & 0x00ff);

cp[len+3] = ((trialfcs >> 8) & 0x00ff);

 

/* check on input */

trialfcs = pppfcs32( PPPINITFCS32, cp, len + 4 );

if ( trialfcs == PPPGOODFCS32 )

printf("Good FCS/n");

}

 

安全问题

 

正如在物理层要求中提到的,链路层在物理层发生变化时可能不清楚这一变化。这是因为过分信赖转发系统的安全和一致性而导致安全上的问题。这可能导致对系统的攻击,使系统身份验证失效。

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 退货忘了填单号怎么办 手机换号了淘宝怎么办 换了手机支付宝怎么办 手机丢了微信登不上去了怎么办 前面手机丢了微信登不上去怎么办 淘宝密码忘了怎么办呢 融e借逾期一天怎么办 拼多多处罚下架怎么办 永久无法解绑支付宝怎么办 淘宝下单购买人数太多怎么办 新浪微博被拉黑暂时无法评论怎么办 闲鱼交易成功后卖家反悔怎么办 闲鱼买家不申请介入怎么办 支付宝安装不上怎么办 无线摄像机离wifi太远怎么办 安卓系统死机了怎么办 安卓手机开不了机怎么办 手机关机键坏了怎么办 华为手机接听电话声音小怎么办 小米6x游戏闪退怎么办 安卓8.0不兼容怎么办 安卓8.0应用闪退怎么办 安卓8.0不兼容的怎么办 游戏全屏只有一个分辨率选项怎么办 安卓6.0吃运行内存怎么办 小米手机王者荣耀录像不支持怎么办 win764位系统不兼容怎么办 安卓版本太高不兼容怎么办 安卓3.2.0不兼容怎么办 手机卡和手机不兼容怎么办 vivo手机下载吃鸡不兼容怎么办 vivox3t不兼容支付宝怎么办 移动sim卡坏了怎么办 cpu和主板不兼容怎么办 主板与cpu不兼容怎么办 cpu跟主板不兼容怎么办 软件与电脑不兼容怎么办 win8系统无限重启怎么办 安装微信旧版本登录提示升级怎么办 手机软件与系统不兼容怎么办 下载旧版本微信闪退登陆不了怎么办