PPP协议(详解)
目錄
- PPP協議概述
-
- PPP協議的組成
- PPP協議的幀格式
-
- 標志字段
-
- 字節填充
- 比特填充
- 透明傳輸
- 地址字段和控制字段
- 協議字段
- 有效數據部分
- 幀檢驗序列FCS字段
- PPP協議的工作狀態
-
- LCP協議
-
- 編碼
- 標識
- 長度
- 選項
- 鑒別協議
-
- 口令鑒別協議PAP
- 查詢握手鑒別協議CHAP
- 網絡控制協議NCP
-
- IPCP協議
PPP協議概述
點對點協議(Point-to-Point Protocol, PPP):PPP協議是點對點訪問應用最多的協議。PPP協議其實是一個協議族,包含多個協議(LCP,NCP等)。
PPP協議的組成
PPP協議有三個組成部分:
(1) 一種將封裝了多種協議的數據報傳輸到串行鏈路的方法。
(2)鏈路控制協議(Link Control Protocol, LCP),LCP協議是PPP協議的一部分。它用于建立、配置、測試數據鏈路的連接。
(3)一套網絡控制協議(Network Control Protocol, NCP),NCPs是一系列協議,用于建立和配置不同的網絡層協議。每個NCP協議都支持不同的網絡層協議,比如IP協議,OSI的網絡層,蘋果的Appple Talk等。
PPP協議的幀格式
下圖展示了PPP幀的各個字段:
標志字段
標志(flag):首部的第一個字段和尾部的最后一個字段都是標志字段F(flag),規定的值用十六進制表示為:0x7E = 01111110。標志字段是PPP幀的定界符。連續兩幀之間只有一個標志字段。如果數據字段碰巧出現了標志字段的值,則需要在數據字段進行字節填充,來消除這種歧義。
PPP協議可以應用在異步傳輸或者同步傳輸中,異步傳輸以字節為單位傳輸,同步傳輸以比特為單位傳輸。所以填充方式也分為字節填充和比特填充。
字節填充
字節填充(byte stuffing):當PPP使用異步傳輸時,如果信息字段出現了和標志字段一樣的字節(0x7E),就需要進行字節填充,核心思路是通過在該字節前面填充轉義字符(escape character, ESC)。
PPP協議字節填充的規則如下圖所示:
規則如下:
- 當信息字段出現標志字段的0x7E這個字節時,PPP協議會把0x7E改為0x5E,并且在前面加上規定好的轉義字符0x7D,也就是把0x7E變成0x7D5E。
- 如果轉移字符0x7D本身出現在幀中,就用2字節序列0x7D5D替換,把0x7D變成0x7D5E。也就是先把0x7D變成0x5D,再在前面加上一個0x7D。
- 如果信息字段出現ASCII碼的控制字符(即數值小于0x20 = 小于十進制32的字符),則將該字節加上0x20,比如0x03(ASCII碼的傳輸結束控制字符ETX)就變成0x23。然后再在前面加上轉義字符0x7D。拿0x03舉例,就變成字符序列0x7D23。
當接收點接收到填充后的幀后,就采取相反的變換,恢復填充前的數據信息。
比特填充
比特填充:PPP協議在用在同步光纖網絡等鏈路時,會使用同步傳輸(將一連串的比特連續傳送,而不是按字節為單位傳送)。這時候PPP協議采用比特填充。
PPP協議比特填充的規則如下圖所示:
規則如下:
- 發送端會掃描整個數據字段(用硬件實現),只要發現5個連續的1,就立即填入一個0。這就保證數據字段不會出現6個連續的1,也就不會出現和標志字段0111 1110相同的比特組合。
- 接收方在接受到幀之后,先找到首部的標志字段,然后也用硬件對之后的比特流進行掃描,每當發現5個連續1時,就把5個1之后的0刪除,也就逆向操作還原了數據字段。等再次遇到0111 1110的標志字段后,就說明整個幀結束了。
透明傳輸
不管是字節填充(也叫字符填充)還是比特填充,目標都是實現透明傳輸。
透明傳輸(Transparent transmission):在傳輸過程中,不管所傳數據是什么樣的比特組合,都能夠在鏈路上正常傳送。對于數據而言,傳輸的鏈路仿佛透明不存在一樣,它只是一個通道,能夠將數據傳過去,不會對數據本身有任何影響和限制。
比如寄信就是透明傳輸,你只需要把信件放到郵箱,至于信怎么到你收信的地址,你不需要了解。
而PPP協議正是利用了字節填充或者比特填充,消除了數據字段的某個字節碰巧和特殊的標志字段比特組合相同的情況,讓上層協議的數據字段可以用任意的比特組合。PPP協議也是一種透明傳輸。
地址字段和控制字段
地址字段(address)和控制字段(control):都是借鑒了HDLC協議的地址和控制字段的格式。但是,在PPP中這2個字段目前還沒有參與使用。
地址字段原本指示哪個站正在處理,但是PPP只有一個目的地,所以地址字段被設置為固定值0xFF(表示所有站)。
而控制字段用于指示幀序列和重傳行為(應用于可靠傳輸),但是鏈路層的可靠性不依靠簡單的PPP協議實現。所以控制字段設置為固定值0x03。
實際傳輸中,經常使用一個稱為地址和控制字段壓縮(ACFC)的選項來省略它們,也就是發送方和接收方會約定好消除這2個字節。
協議字段
協議字段(protocol):協議字段表明PPP攜帶的數據字段的協議類型。PPP協議可以攜帶多種協議,所以需要協議字段確定數據字段使用的協議類型。包括各種網絡層協議,NCP協議和LCP協議。
該字段默認為2個字節,但是可以通過一個叫協議字段壓縮(PFC)的選項,雙方在鏈路建立時協商,將協議字段壓縮為1個字節。
當協議字段值為0x0021時,PPP的信息字段就是IP數據報。
當協議字段值為0xC021時,信息字段就是LCP分組。
當協議字段值為0x8021時,信息字段就是NCP的IPCP協議分組。
當協議字段值為0xC023時,信息字段就是PAP鑒別協議。
當協議字段值為0xC223時,信息字段就是CHAP鑒別協議。
有效數據部分
數據字段是PPP協議的有效載荷信息,它的長度是可變的,最多不超過1500字節。
幀檢驗序列FCS字段
幀檢驗序列(Frame Check Sequence, FCS):FCS字段是用于差錯檢測的,讓接收方可以知曉收到的幀是否出了差錯。它只能檢錯,不能糾錯。
PPP的差錯檢測使用的是循環冗余校驗CRC算法。想了解CRC算法可以閱讀我的這篇博文:循環冗余校驗CRC
PPP幀的FCS一般是16位的生成多項式(叫做CRC-16,為x16x^{16}x16+x12x^{12}x12+x5x^{5}x5+1 = 1 0001 0000 0010 0001)。而通過協商,LCP選項可將FCS擴展為32位,使用32位的生成多項式CRC-32。
所以,PPP幀的FCS字段為2或者4個字節。
PPP協議的工作狀態
鏈路的連接是需要分階段完成的,包括:閑置、建立、鑒別、聯網、打開、終止再到再一次閑置。
在每個階段PPP協議數據字段的協議都不同,理解鏈路連接的各個階段才能完全理解PPP的工作模式。
- 閑置:此時鏈路沒有被使用。發送方和接收方之間并不存在物理層和鏈路層的連接(比如個人用戶剛開始還沒有連接上本地ISP)。
- 建立:如果雙方想進行鏈路的連接,首選需要進入建立階段。此階段LCP協議會起作用(也就是PPP幀會封裝LCP協議,雙方通過交換包含LCP協議的PPP幀來完成建立工作)。發送方會和接收方交換LCP分組,用于協商一些選項的配置(比如幀的有效載荷大小,是否壓縮PPP的協議字段等)。(其實嚴格說,建立階段需要物理層和數據鏈路層兩層同時起作用,發送方一開始是先發送物理層的載波信號,等建立物理層連接后,再協商鏈路層連接需要的選項配置)。
- 鑒別:鑒別階段是可選的。主要目的是鑒別發送方的身份,根據鑒別報文的ID和口令等身份信息,接收方來決定是否要和發送方通信。如果發送方身份被接收方認可,就進入聯網階段,否則直接進入終止階段。常用的鑒別協議是PAP協議和CHAP協議。
- 聯網:聯網階段是對網絡層協議的協商。通過對應的網絡控制協議NCP來完成。因為PPP協議支持多種網絡層協議,雙方必須在進行數據報傳輸前,確定到底交換哪種網絡層協議,對應網絡層協議的相關規定也要達成一致。比如,如果PPP協議要封裝IP數據報,那就需要在雙方配置交換IP數據報需要的模塊。雙方會交換IP控制協議IPCP來完成配置工作。
- 打開:到打開階段,連接的相關配置才算完成,雙方才能正式進行數據分組的交換。直到連接終止前,雙方都可以進行數據的傳輸。在打開階段,雙方也可以交換回聲請求和回聲應答LCP分組來檢查鏈路的連接狀態。
- 終止:如果雙方不需要交換數據分組,則可以利用LCP協議完成終止連接的操作。雙方會交換相關用于終止連接的LCP分組,來關閉鏈路。
PPP協議每個階段如何相互轉換可以參考下圖:
LCP協議
鏈路控制協議LCP(Link Control Protocol):LCP協議是用來建立、測試、監控、終止鏈路的連接。在PPP工作的建立階段和終止階段,必須通過交換LCP分組控制鏈路的建立和終止。在PPP工作的打開階段,不僅可以發送網絡層的報文,也可以發送LCP的回聲請求和回聲應答分組,測試鏈路是否正常連接。
LCP協議的報文格式如下圖所示:
編碼
編碼:編碼字段為1個字節,用于確定LCP分組的類型,不同類型的LCP分組在鏈路連接的不同階段發揮不同的作用。
| 編碼 | 分組類型 | 說明 |
|---|---|---|
| 0x01 | 配置請求 | 包含建議選項及其值的列表 |
| 0x02 | 配置確認 | 接受所有建議的選項 |
| 0x03 | 配置不確認 | 告知某些選項不能被接受 |
| 0x04 | 配置拒絕 | 告知某些選項不可識別 |
| 0x05 | 終止請求 | 請求關閉線路 |
| 0x06 | 終止確認 | 接受關閉請求 |
| 0x07 | 編碼拒絕 | 告知一個未知編碼 |
| 0x08 | 協議拒絕 | 告知一個未知協議 |
| 0x09 | 回聲請求 | 檢測另一端是否活動的一種呼叫報文 |
| 0x0A | 回聲應答 | 對回聲請求報文的響應 |
| 0x0B | 丟棄請求 | 丟棄分組的請求 |
如上表所示,LCP分組類型可以分為3類:
- 在建立階段,雙方對選項配置的協商(前4種)。
- 在終止階段,用于鏈路終止(第5,6種)。
- 在打開階段,用于鏈路的測試和調試。
標識
標識(identification,ID):因為LCP分組經常是成對出現的。比如發送方發送配置請求LCP分組,接收方可能會回復對應的配置確認LCP分組。標識就用于將請求和應答分組匹配在一起。
首先,發送方會提供序列號,每發送一個消息進行遞增(這樣發送方的LCP報文的ID就不一樣了),接收方在生成對應的應答報文時,該報文的ID字段會復制請求報文的ID。這樣請求方收到應答報文后,可以通過看標識字段是否相同來匹配報文。
長度
長度:長度字段給出了LCP分組的字節長度,它不能超過鏈路的最大接受單元(MRU)。
選項
LCP協議常用于鏈路建立連接的階段,它會讓雙方協商選項的配置。選項并不在LCP的首部,而是LCP的數據部分。LCP的數據字段分為三段:選項類型、選項長度和選項值。下面是最常見的一些選項:
| 選項 | 默認值 |
|---|---|
| 最大接受單位 | 1500 |
| 鑒別協議 | 無 |
| 協議字段壓縮 | 關閉 |
| 地址和控制字段壓縮 | 關閉 |
鑒別協議
PPP協議在鑒別階段會封裝鑒別協議(Authentication protocol, AP)。鑒別的作用是讓接受方識別發送方的身份。PPP有兩種鑒別協議:口令鑒別協議和查詢握手鑒別協議。
口令鑒別協議PAP
口令鑒別協議(Password Authentication Protocol, PAP):這是一種非常簡單的鑒別協議。它在PPP的協議字段的值為:0xC023。發送方需要提供鑒別身份(通常是用戶名)和口令(俗稱的密碼),接收方會檢測身份和口令的合法性,決定是否接受連接。
查詢握手鑒別協議CHAP
查詢握手鑒別協議(Challenge Handshake Authentication Protocol, CHAP):CHAP使用一個三步握手的鑒別方式,它不需要傳輸口令。口令一開始發送方和接收方都是已知的。它在PPP的協議字段的值為:0xC223。
1.接收方會給發送方一個包含查詢值的查詢分組。
2.發送方根據該查詢分組結合口令生成一個結果,并把該結果作為響應分組發送給接收方。
3.接收方也用同樣的方式生成一個結果,如果和發送方的結果一致,就允許訪問;否則訪問被拒絕。
這其實是很簡單的密碼學的原理,這比PAP協議安全很多。因為口令始終沒有在鏈路上傳輸。
網絡控制協議NCP
網絡控制協議(Network Control Protocol, NCP):這實際是一個協議組合,有多個NCP協議。因為PPP協議支持多種網絡層協議,比如IP協議,Xerox協議等,每一種網絡層協議在發送數據報之前,都需要對應的網絡控制協議為其配置相關信息。比如IP數據報在鏈路層傳輸前,就需要IPCP協議配置好用來承載IP數據報的鏈路。
由于IP數據報非常重要,所以我著重介紹為其配置網絡信息的IPCP協議。
IPCP協議
互聯網絡協議控制協議(Internet Protocol Control Protocol, IPCP):IPCP協議在PPP的協議字段的值為0x8021。
它的首部和LCP分組類似,也有編碼字段,標識字段,長度字段。它的數據字段也包含可變的IPCP信息。
它的編碼字段有7種,編碼從0x01到0x07,每種編碼對應不同的作用。
鏈路層需要傳輸IP數據報,必須用IPCP協議進行網絡層信息的配置,雙方達成一致之后,才可以進入打開狀態,才能正常傳輸IP數據報。
總結
- 上一篇: 野麦子的功效与作用、禁忌和食用方法
- 下一篇: werewolf (桌游)