GPRS隧道协议

**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 問答 （頁面存檔備份，存於網際網路檔案館）