PPP資料幀的編碼與解碼

2021-04-17 23:20:30 字數 2890 閱讀 1089

一、摘要 

ppp協議是在atm網路裡常用的鏈路協議,基於ppp協議的pppoa,pppoe在xdsl數據機中不可或缺。本文簡單描述ppp協議的幀封裝格式,並給出了乙個簡單的ppp編碼與解碼演算法,以期望能對需要者有所幫助。 

二、ppp協議簡介

ppp資料幀的格式看上去很像iso的hdlc(高層資料鏈路控制)標準。如圖是ppp資料

幀的格式。

每一幀都以標誌字元0x7e開始和結束。緊接著是乙個位址位元組,值始終是0xff,然後是一

個值為0x03的控制位元組。

接下來是協議字段,類似於乙太網中型別欄位的功能。當它的值為0x0021時,表示資訊

欄位是乙個ip資料報;值為0xc021時,表示資訊欄位是鏈路控制資料;值為0x8021時,表示

資訊欄位是網路控制資料。

crc欄位(或fcs,幀檢驗序列)是乙個迴圈冗餘檢驗碼,以檢測資料幀中的錯誤。

由於標誌字元的值是0x7e,因此當該字元出現在資訊欄位中時, ppp需要對它進行轉義。

在同步鏈路中,該過程是通過一種稱作位元填充(bit stuffing )的硬體技術來完成的[ tanenbaum

1989 ]。在非同步鏈路中,特殊字元0x7d用作轉義字元。當它出現在ppp資料幀中時,那麼緊接

著的字元的第6個位元要取其補碼,具體實現過程如下:

1) 當遇到字元0x7e時,需連續傳送兩個字元: 0x7d和0x5e,以實現標誌字元的轉義。

2) 當遇到轉義字元0x7d時,需連續傳送兩個字元: 0x7d和0x5d,以實現轉義字元的轉義。

3 ) 預設情況下,如果字元的值小於0x20(比如,乙個ascii控制字元),一般都要進行轉

義。例如,遇到字元0x01時需連續傳送0x7d和0x21兩個字元(這時,第6個位元取補碼後變為

1,而前面兩種情況均把它變為0)。

這樣做的原因是防止它們出現在雙方主機的序列介面驅動程式或數據機中,因為有

時它們會把這些控制字元解釋成特殊的含義。另一種可能是用鏈路控制協議來指定是否需要

對這32個字元中的某一些值進行轉義。預設情況下是對所有的32個字元都進行轉義。

--摘自《tcp/ip詳解》卷1·協議 (w. richard stevens)

三、編碼與解碼

1。編碼

編碼就是按照前面所說的對需要轉義的字元進行變換,下面是簡單的實現**:

001#define

ppp_frame_flag  0x7e /* 標誌字元 */

002#define

ppp_frame_esc   0x7d /* 轉義字元 */

003#define

ppp_frame_enc   0x20 /* 編碼字元 */

004#define

buf_len 1500

005/*

return: bytes encoded 

*/006

intpppencode(unsigned 

char

*buf, 

intlen) 

013memset(obuf, 

0, buf_len);

014pi 

=buf;

015po 

=obuf;

016olen 

=len;

017for(i=

0; i

<

len; i

++) 

028else

031pi++;

032po++;

033}

034memcpy(buf, obuf, olen);

035return

olen;

036}

001~003: 定義標誌字元,轉義字元和編碼字元。

010~012: 檢查要編碼的字元長度,按最壞情況,乙個字元會編碼成兩個字元,所以這裡只能編碼最大緩衝區長度一半。

018~027: 編碼的主要實現,遇到標誌字元,轉義字元和小於0x20的控制字元,都要進行編碼。方法就是在其前面插入乙個轉義字元0x7d,然後對其第6位取補碼。

028~030: 其他字元,不做任何修改。

034~035: 修改緩衝區,返回編碼後的字元長度。

2。 解碼

解碼實際上就是編碼的逆運算,它除去轉義字元,並對轉義字元之後的字元的第6位去補碼。

001/*

return: bytes decoded 

*/002

intpppdecode(unsigned 

char

*buf, 

intlen) 

009memset(obuf, 

0, buf_len);

010pi 

=buf;

011po 

=obuf;

012olen 

=len;

013for(i=

0; i

<

len; i

++) 

021else

024pi++;

025po++;

026}

027memcpy(buf, obuf, olen);

028return

olen;

029}

006~008: 檢查要解碼的字元長度。

014~020: 解碼的主要實現,遇到轉義字元,將其跳過,對緊接其後的字元的第6位去補碼。

021~023: 其他字元,不做處理。

027~028: 修改緩衝區,返回解碼後的字元長度。

此編譯碼**以易讀為主,需要者可自行優化。 

---------------

MAC幀與PPP幀的區別

ip位址是tcp ip網路層的定址機制,mac是802.3 ethernet鏈路層的定址機制,他們是不同層次的東西,不是併排關係,想一想資料發出去走到網線上最終還是變成了電脈衝,tcp ip是沒有物理層定義的,ip包最終變成電訊號之前需要乙太網來處理,當ip的資料給予了乙太網之後,乙太網就用屬於它自...

IPB幀編碼順序(解碼順序)與顯示順序

通常,更換場景後的第一幀就是i幀,i幀應當全幀傳送。從壓縮的程度來看,i畫面的壓縮量最少 p畫面次之,它是以i畫面為基礎 b畫面壓縮最多。為了加大壓縮比,通常在i幀後面相隔2幀 最多3幀 設定1個p幀,在i p幀之間都是b幀,在兩個p幀之間也是設定2 3幀b幀。b幀傳送它與i幀或p幀之間的差值資訊,...

IPB幀編碼順序(解碼順序)與顯示順序

ipb幀編碼順序 解碼順序 與顯示順序 通常,更換場景後的第一幀就是i幀,i幀應當全幀傳送。從壓縮的程度來看,i畫面的壓縮量最少 p畫面次之,它是以i畫面為基礎 b畫面壓縮最多。為了加大壓縮比,通常在i幀後面相隔2幀 最多3幀 設定1個p幀,在i p幀之間都是b幀,在兩個p幀之間也是設定2 3幀b幀...