GPRS 隧道協議（英語：GPRS Tunnelling Protocol，簡稱：GTP）是一組基於 IP 的通信協議，用於在 GSM、UMTS 和 LTE 網絡中承載 GPRS（通用分組無線業務，英語：General Packet Radio Service）。

GTP 協議目前有 3 個版本：version 2 使用於 LTE 核心網；version 1 使用於 GSM 和 UMTS 網絡，也應用於 LTE 網絡中以傳輸用戶面數據；version 0 是早期版本，被 1999 年標準化的 version 1 替代。



GTP 協議的用途

GSM 和 UMTS 網絡

GPRS 核心網

GTP 是 GPRS 核心網中使用的主要協議。它使得 GSM 或 UMTS 網絡的終端能夠在網絡中移動位置，同時能持續的通過同一個 GGSN 連接到網際網路。為了實現這一功能，GTP 協議總是將用戶面數據從用戶位置所屬的 SGSN 傳輸到它開戶信息所對應的 GGSN。

GPRS 核心網使用三種 GTP 協議。


* GTP-U 用於為每個 PDP 上下文提供一個或多個隧道，用以傳輸用戶數據

* GTP-C 用於控制目的，包括：
  
* PDP 上下文的建立和刪除
  
* GSN 可及性驗證
  
* 位置更新。例如，當簽約用戶從一個 SGSN 移動到另一個 SGSN

* GTP' 用於從各個 GSN 傳送計費數據到計費網關功能（CGF，英語：Charging Gateway Function）。

GGSN 和 SGSN（合稱為「GSN」）在 UDP 埠 2123 上監聽 GTP-C 消息，在埠 2152 上監聽 GTP-U 消息。GTP 協議通信可以通過 GPRS 漫遊交換（英語：GPRS Roaming Exchange）發生在不同運營商之間。

_計費網關功能_（CGF，英文：Charging Gateway Function）在 TCP/UDP 埠 3386 上監聽發送自 GSN 的 GTP' 消息。核心網發送計費信息到 CGF，計費信息至少包含 PDP 上下文激活次數以及終端用戶傳送的數據量。與 GTP-C 和 GTP-U 不同，GTP' 協議承載的報文通常只在單個運營商網絡內部使用，因此並不那麼標準化。運營商可以做特殊的配置，使用特別的編碼，甚至使用完全不同的系統來完成計費。

UMTS 的核心網和接入網之間（Iu-PS 接口）

GPRS 核心網和 UMTS 接入網之間的 Iu-PS 接口上，用戶面也使用 GTP-U 協議。然而在控制面上並不使用 GTP-C，而是用 RANAP 協議。GTP-U 的隧道在 Iu-PS 接口上也是以 RANAP 協議管理的。

LTE 網絡

LTE 網絡中的 GTP 協議功能與 GSM/UMTS 網絡中基本相同。在控制面上 LTE 網絡使用 GTPv2-C，用戶面上使用 GTP-U，計費相關功能使用 GTP'。

在 S1 接口（eNodeB 和 SGW 之間）上，用戶面使用 GTP-U 協議。在接入網 X2 接口（兩個 eNodeB 之間）上，用戶面也使用 GTP-U 協議，控制面使用 X2AP。



協議特性

所有的 GTP 變種都有一些共有的特性。消息的結構都是相同的，GTP 消息頭在 UDP/TCP 頭之後。

消息頭

GTP 版本 1

GTPv1 消息頭包含如下的欄位：

版本（Version）
: 長度為 3 位，對於 GTPv1 來說，這個值始終是「1」。

協議類型（PT，全稱：Protocol Type）
: 長度為 1 位，取值為 1 表示 GTP，0 表示 GTP'。

保留（Reserved）
: 長度為 1 位，保留欄位（必須為 0）。

擴展消息頭標誌位（E，全稱：Extension header flag）
: 長度為 1 位，標記是否存在一個可選的擴展消息頭欄位。

序列號標誌位（S，全稱：Sequence number flag）
: 長度為 1 位，標記是否存在一個可選的序列號欄位。

N-PDU 號標誌位（PN，全稱：N-PDU number flag）
: 長度為 1 位，標記是否存在一個可選的 N-PDU 號欄位。

消息類型（Message Type）
: 長度為 8 位，指示 GTP 消息的類型。關於消息類型的定義，請參考 3GPP TS 29.060 第 7.1 節。

總長度（Total Length）
: 長度為 16 位，指示消息體長度，單位為字節，不包括 GTP 頭前 8 位元組的必選欄位。

隧道端點標識（TEID，全稱：Tunnel endpoint identifier）
: 長度為 32 位（4 個八位元組），用於區分 GTP 隧道中的不同連接。

序列號（Sequence number）
: 可選欄位，長度為 16 位。當 E、S 或 PN 位中的任意一個取值為 1 時，這個欄位存在。僅當 S 位為 1 時，這個欄位必須被解析。

N-PDU 號（N-PDU number）
: 可選欄位，長度為 8 位。當 E、S 或 PN 位中的任意一個取值為 1 時，這個欄位存在。僅當 PN 位為 1 時，這個欄位必須被解析。

下一擴展消息頭類型（Next extension header type）
: 可選欄位，長度為 8 位。當 E、S 或 PN 位中的任意一個取值為 1 時，這個欄位存在。僅當 E 位為 1 時，這個欄位必須被解析。

下一擴展消息頭如下：

長度（Length）
: 長度為 8 位。這個欄位指出本擴展消息頭的長度，包括長度（這個欄位本身）、內容和下一擴展消息頭欄位，以 4 個八位元組為單位，因此擴展消息頭的長度必須是 4 的倍數。

內容（Contents）
: 擴展消息頭內容。

下一擴展消息頭（Next extension header）
: 長度為 8 位。它指出下一擴展消息頭的類型，取值為 0 表示不存在下一個擴展消息頭。通過該欄位可以實現多個擴展消息頭的串聯。

GTP 版本 2

它也被稱為「進化版 GTP」（evolved-GTP）或「eGTP」。GTPv2-C 消息頭包含如下的欄位：

注意：不存在 GTPv2-U 協議。在 LTE 中的 GTP-U 仍使用 GTPv1-U。

版本號：長度為 3 位，對於 GTPv2 來說，這個值始終是「2」。
捎帶消息標誌位（Piggybacking flag）
: 如果被置為 1，則在這條消息後面會有另外一條帶有完整消息頭的 GTP 消息。協議里具體規定了每種消息可以攜帶的消息類型。

TEID 標誌位（TEID flag）
: 如果被置為 1，則 TEID 欄位存在。只有 Echo Request 和 Echo Response 消息不攜帶 TEID 欄位。

總長度（Total length）
: 包括消息頭和消息體的消息總長度（除去必選欄位所在的前 4 個八位元組）。

連接機制

除了共同的消息結構之外，GTP 協議還有一個共同的機制來驗證兩個節點之間的連接。這種機制依靠以下兩種消息實現：


* Echo Request

* Echo Response

每隔 60 秒，一個網元可以向每個有活躍連接的對端發送一個 Echo Request，來確認連接有效。如果對端不回復 Echo Response，則它可以被視為宕機，而該活躍連接將被刪除。

各種 GTP 協議除了上述 2 個消息之外，沒有共通的消息類型。也就是說，GTP-C，GTP-U 和 GTP' 基本上是 3 種獨立的協議。

GTP-C - GTP 控制面

GTP-C 協議是 GTP 標準的「控制」部分。當一個簽約用戶請求一個 PDP 上下文，SGSN 將發送一個「_創建 PDP 上下文請求_」（Create PDP Context Request）的消息給 GGSN，給出該簽約用戶的請求的明細。該 GGSN 將發送一個「_創建 PDP 上下文響應_」（Create PDP Context Response）消息，這個消息會要麼給出被激活的 PDP 上下文內容，要麼指出一個失敗，及該失敗的原因。版本 1 和版本 2 的 GTP-C 消息使用 UDP 埠 2123。

在 LTE 核心網中，GTPv2-C 協議負責在 S1、S5/S8 等接口上創建、維持和刪除隧道。它被用於控制面路徑管理（control plane path management）、隧道管理（tunnel management）和移動性管理（mobility management）。它也控制轉發位置變更消息、SRNS 上下文、並在 LTE 的網間切換中創建轉發隧道。

GTP-U - GTP 用戶數據隧道

GTP-U 是一個比較簡單的基於 IP 的隧道協議，它允許在各個端點集之間建立多個隧道。UMTS 網絡中，每個簽約用戶擁有至少一個隧道。每一個激活的 PDP 上下文擁有至少一個隧道，當隧道多於 1 個時，多出來的隧道為特定的服務提供特定的端到端 QoS。

每個隧道由一個 GTP-U 消息中的 TEID（隧道端點標識符，{{lang-en|Tunnel Endpoint Identifier}）標識。TEID 應當是一個動態分配的隨機數。如果這個隨機數能達到密碼級水平，則可以抵禦一定程度的攻擊。即使這樣，3GPP 標準仍然要求所有的 GTP 流量，包括用戶數據，都應當在安全私有網絡中被發送，不能直接連接到網際網路。GTP-U 使用 UDP 埠 2152。

在 LTE 核心網中，使用 GTPv1-U 協議在 GTP 隧道上跨 S1、S5/S8 等接口上交換用戶數據。UE 所收發的 IP 包被打包在 GTPv1-U 的包中，並在 P-GW 和 eNodeB 之間的各段隧道中傳輸。LTE 網絡的 X2 接口，即 eNodeB 之間的接口上，用戶面協議使用的也是 GTPv1-U。

GTP' - 計費傳輸

GTP' 協議被用於向 CGF（計費網關功能，英語：Charging Gateway Function）傳輸計費數據。GTP' 使用 TCP/UDP 埠 3386。

協議棧

GTP 協議需要被承載在 UDP 協議上。早期版本 GTPv0 也允許 TCP 傳輸。

GTPv0 是最早的 GTP 協議，控制面和用戶面使用相同的埠。

GTPv1 於 1999 年在 3GPP TS 29060 版本 3.3.0 中被標準化。它實際上是兩個協議，一個用於控制面（被稱為「GTP-C」），而另一個則用於用戶數據隧道（被稱為「GTP-U」）。

GTP-U 在 UMTS 網絡中也被用於從 RNC 往 SGSN（即 Iu-PS 接口上）傳送用戶數據。然而，此時控制面使用的是 RANAP 協議而不是 GTP-C。



GTP 的歷史版本

GTP 的原始版本（版本 0）與 3G/LTE 核心網中使用中的版本 1 和版本 2 有顯著的不同：


* 隧道標識符（TEID）是非隨機的；

* 除了 IP 協議，也支持傳輸 X.25 協議的數據；

* 所有的功能都使用固定的 3386 埠（不像在 GTPv1 中僅僅用於計費）；

* 除了 UDP 以外，也可以使用 TCP 協議作為傳輸層；

* 與簽約用戶相關的欄位，例如 QoS，相對較少。

版本 0 中的非隨機 TEID 在有安全性問題：當一個攻擊者對任一漫遊合作夥伴網絡有訪問權限時，或可以找到其它一些方式來遠程地向 GPRS 骨幹網發送消息包的時候，就可以干擾網絡運行。版本 0 現在幾乎已完全被版本 1 所替代。即使這樣，新版本的標準仍聲明，GSN 必須支持更舊的版本。但幸運的是，可以用簡單的 IP 訪問列表來禁止 v0 使用的 3386 埠，從而封鎖版本 0。



GTP 標準化

GTP 原本是在 ETSI（European Telecommunications Standards Institute）的 GSM 標準 09.60 中被標準化的。隨著 UMTS 標準的創建，它被移動到 3GPP。到 2005 年，3GPP 將其做為 3GPP 標準 29.060 來維護。GTP' 使用相同的消息格式，但是它的使用獨立的標準 32.295，並且定義了它所傳輸的計費數據的標準化格式。

TS 29.060 的後續版本取消了對 GTPv1 和 v0 互聯的支持，因此如果網絡中有 GSN 只支持 v0 的話，使用 v1 協議的其他網元也不會降到 v0 去配合。

GTPv2（用於 EPC，即 LTE 核心網）在 2008 年進入起草階段，並在同年 12 月發布。使用 GTPv1 的「版本不支持」機制，GTPv2 支持到 GTPv1 的降級運行，但不提供到 GTPv0 的降級運行。



參見


* 代理移動 IPv6（Proxy Mobile IPv6）

* 移動 IP（Mobile IP）



參考資料



外部連結


* 3GPP 官方網站（頁面存檔備份，存於網際網路檔案館）

* GPRS 隧道協議版本 2（GTPv2）或進化版 GTP（eGTP）的免費和開源的實現 （頁面存檔備份，存於網際網路檔案館）

* GTP 問答 （頁面存檔備份，存於網際網路檔案館）