일반 라우팅 캡슐화

일반 라우팅 캡슐화(Generic routing encapsulation, GRE)는 시스코 시스템즈가 개발한 터널링 프로토콜로, 인터넷 프로토콜 네트워크를 통해 가상 점대점 링크 또는 점대다점 링크 내에서 다양한 네트워크 계층 프로토콜을 캡슐화할 수 있다.

사용 예시
 PPTP와 함께 VPN을 생성하는 데 사용된다.
 연결된 네트워크 간에 라우팅 정보를 전달할 수 있도록 IPsec VPN과 함께 사용된다.
 이동성 관리 프로토콜에서 사용된다.
 A8/A10 인터페이스에서 IP 데이터를 Packet Control Function (PCF)으로/부터 캡슐화하는 데 사용된다.
 리눅스 및 BSD는 시스코 장비와 상호 운용되는 GRE 터널을 통해 임시 IP를 설정할 수 있다.
 분산 서비스 거부 (DDoS) 보호 어플라이언스에서 보호되지 않는 엔드포인트로 연결한다.

프로토콜 스택 예시
OSI 모형 계층프로토콜 예시7. 응용HTTP4. 전송TCP3. 네트워크 (GRE-캡슐화됨)IPv4캡슐화GRE3. 네트워크IPv62. 데이터 링크이더넷1. 물리이더넷 물리 계층

OSI의 프로토콜 계층화 원리에 기반하여, GRE가 아닌 프로토콜 캡슐화는 계층화 순서를 깨뜨린다. 이는 두 개의 다른 프로토콜 스택 사이에 분리자로 간주될 수 있으며, 하나는 다른 하나를 위한 캐리어 역할을 한다.

전달 프로토콜
IP 내에 직접 캡슐화된 GRE 패킷은 IPv4 헤더의 프로토콜 필드에서 IP 프로토콜 유형 47 또는 IPv6 헤더의 다음 헤더 필드를 사용한다.

성능상의 이유로 GRE는 UDP 패킷으로도 캡슐화될 수 있다. ECMP를 사용하면 더 나은 처리량을 달성할 수 있다.

패킷 헤더
확장 GRE 패킷 헤더 (RFC 2890)
확장된 GRE 패킷 헤더의 버전은 아래와 같이 표시된다.
{| class="wikitable" style="text-align: center"
|+확장 GRE 헤더 형식
|-
!style="border-bottom:none; border-right:none;"|오프셋
!style="border-left:none;"|옥텟
!colspan="8"|0
!colspan="8"|1
!colspan="8"|2
!colspan="8"|3
|-
!style="border-top: none"|옥텟
!비트
!style="width:2.75%;"|0
!style="width:2.75%;"|1
!style="width:2.75%;"|2
!style="width:2.75%;"|3
!style="width:2.75%;"|4
!style="width:2.75%;"|5
!style="width:2.75%;"|6
!style="width:2.75%;"|7
!style="width:2.75%;"|8
!style="width:2.75%;"|9
!style="width:2.75%;"|10
!style="width:2.75%;"|11
!style="width:2.75%;"|12
!style="width:2.75%;"|13
!style="width:2.75%;"|14
!style="width:2.75%;"|15
!style="width:2.75%;"|16
!style="width:2.75%;"|17
!style="width:2.75%;"|18
!style="width:2.75%;"|19
!style="width:2.75%;"|20
!style="width:2.75%;"|21
!style="width:2.75%;"|22
!style="width:2.75%;"|23
!style="width:2.75%;"|24
!style="width:2.75%;"|25
!style="width:2.75%;"|26
!style="width:2.75%;"|27
!style="width:2.75%;"|28
!style="width:2.75%;"|29
!style="width:2.75%;"|30
!style="width:2.75%;"|31
|-
!0
!0
|C
|
|K
|S
|colspan="9"|Reserved 0
|colspan="3"|버전
|colspan="16"|프로토콜 유형
|-
!4
!32
|colspan="16"|체크섬 (선택 사항)
|colspan="16"|Reserved 1 (선택 사항)
|-
!8
!64
|colspan="32"|키 (선택 사항)
|-
!12
!96
|colspan="32"|시퀀스 번호 (선택 사항)
|}

 C (1 비트) 체크섬 비트. 체크섬이 있으면 1로 설정된다.
 K (1 비트) 키 비트. 키가 있으면 1로 설정된다.
 S (1 비트) 시퀀스 번호 비트. 시퀀스 번호가 있으면 1로 설정된다.
 Reserved 0 (9 비트) 예약된 비트. 0으로 설정된다.
 버전 (3 비트) GRE 버전 번호. 0으로 설정된다.
 프로토콜 유형 (16 비트) 캡슐화된 페이로드의 이더 프로토콜 유형을 나타낸다. ((IPv4의 경우 16진수 0800이 된다.)
 체크섬 (16 비트) C 비트가 설정된 경우 존재하며, GRE 헤더 및 페이로드에 대한 체크섬을 포함한다.
 Reserved 1 (16 비트) C 비트가 설정된 경우 존재하며, 0으로 설정된다.
 키 (32 비트) K 비트가 설정된 경우 존재하며, 애플리케이션별 키 값을 포함한다.
 시퀀스 번호 (32 비트) S 비트가 설정된 경우 존재하며, GRE 패킷의 시퀀스 번호를 포함한다.

표준 GRE 패킷 헤더 (RFC 2784)
표준 GRE 패킷 헤더 구조는 아래 다이어그램에 표시된다.

{| class="wikitable" style="text-align: center"
|+표준 GRE 헤더 형식
|-
!style="border-bottom:none; border-right:none;"|오프셋
!style="border-left:none;"|옥텟
!colspan="8"|0
!colspan="8"|1
!colspan="8"|2
!colspan="8"|3
|-
!style="border-top: none"|옥텟
!비트
!style="width:2.75%;"|0
!style="width:2.75%;"|1
!style="width:2.75%;"|2
!style="width:2.75%;"|3
!style="width:2.75%;"|4
!style="width:2.75%;"|5
!style="width:2.75%;"|6
!style="width:2.75%;"|7
!style="width:2.75%;"|8
!style="width:2.75%;"|9
!style="width:2.75%;"|10
!style="width:2.75%;"|11
!style="width:2.75%;"|12
!style="width:2.75%;"|13
!style="width:2.75%;"|14
!style="width:2.75%;"|15
!style="width:2.75%;"|16
!style="width:2.75%;"|17
!style="width:2.75%;"|18
!style="width:2.75%;"|19
!style="width:2.75%;"|20
!style="width:2.75%;"|21
!style="width:2.75%;"|22
!style="width:2.75%;"|23
!style="width:2.75%;"|24
!style="width:2.75%;"|25
!style="width:2.75%;"|26
!style="width:2.75%;"|27
!style="width:2.75%;"|28
!style="width:2.75%;"|29
!style="width:2.75%;"|30
!style="width:2.75%;"|31
|-
!0
!0
|C
|colspan="12"|Reserved 0
|colspan="3"|버전
|colspan="16"|프로토콜 유형
|-
!4
!32
|colspan="16"|체크섬 (선택 사항)
|colspan="16"|Reserved 1 (선택 사항)
|}
 C (1 비트) 체크섬 비트. 체크섬이 있으면 1로 설정된다.
 Reserved 0 (12 비트) 예약된 비트. 0으로 설정된다.
 버전 (3 비트) GRE 버전 번호. 0으로 설정된다.
 프로토콜 유형 (16 비트) 캡슐화된 페이로드의 이더 프로토콜 유형을 나타낸다. ((IPv4의 경우 십육진법 0x0800; IPv6의 경우 0x86DD이다.)
 체크섬 (16 비트) C 비트가 설정된 경우 존재하며, GRE 헤더 및 페이로드에 대한 체크섬을 포함한다.
 Reserved 1 (16 비트) C 비트가 설정된 경우 존재하며, 내용은 0으로 설정된다.

원본 GRE 패킷 헤더 (RFC 1701)
새로운 구조는 원본 구조를 대체했다.

{| class="wikitable" style="text-align: center"
|+원본 GRE 헤더 형식
|-
!style="border-bottom:none; border-right:none;"|오프셋
!style="border-left:none;"|옥텟
!colspan="8"|0
!colspan="8"|1
!colspan="8"|2
!colspan="8"|3
|-
!style="border-top: none"|옥텟
!비트
!style="width:2.75%;"|0
!style="width:2.75%;"|1
!style="width:2.75%;"|2
!style="width:2.75%;"|3
!style="width:2.75%;"|4
!style="width:2.75%;"|5
!style="width:2.75%;"|6
!style="width:2.75%;"|7
!style="width:2.75%;"|8
!style="width:2.75%;"|9
!style="width:2.75%;"|10
!style="width:2.75%;"|11
!style="width:2.75%;"|12
!style="width:2.75%;"|13
!style="width:2.75%;"|14
!style="width:2.75%;"|15
!style="width:2.75%;"|16
!style="width:2.75%;"|17
!style="width:2.75%;"|18
!style="width:2.75%;"|19
!style="width:2.75%;"|20
!style="width:2.75%;"|21
!style="width:2.75%;"|22
!style="width:2.75%;"|23
!style="width:2.75%;"|24
!style="width:2.75%;"|25
!style="width:2.75%;"|26
!style="width:2.75%;"|27
!style="width:2.75%;"|28
!style="width:2.75%;"|29
!style="width:2.75%;"|30
!style="width:2.75%;"|31
|-
!0
!0
|C
|R
|K
|S
|s
|colspan="3"|Recur
|colspan="5"|플래그
|colspan="3"|버전
|colspan="16"|프로토콜 유형
|-
!4
!32
|colspan="16"|체크섬 (선택 사항)
|colspan="16"|오프셋 (선택 사항)
|-
!8
!64
|colspan="32"|키 (선택 사항)
|-
!12
!96
|colspan="32"|시퀀스 번호 (선택 사항)
|-
!16
!128
|colspan="32"|라우팅 (선택 사항, 가변 길이)
|}
원래 GRE RFC는 현재 표준에서 더 이상 사용되지 않는 패킷 헤더의 추가 필드를 정의했다.
 C (1 비트) 체크섬 비트. 체크섬이 있으면 1로 설정된다.
 R (1 비트) 라우팅 비트. 라우팅 및 오프셋 정보가 있으면 1로 설정된다.
 K (1 비트) 키 비트. 키가 있으면 1로 설정된다.
 S (1 비트) 시퀀스 번호 비트. 시퀀스 번호가 있으면 1로 설정된다.
 s (1 비트) 엄격한 소스 라우트 비트.
 Recur (3 비트) 재귀 제어 비트.
 플래그 (5 비트) 향후 사용을 위해 예약되었으며, 0으로 설정된다.
 버전 (3 비트) 0으로 설정된다.
 프로토콜 유형 (16 비트) 캡슐화된 페이로드의 이더 프로토콜 유형을 나타낸다.
 체크섬 (16 비트) C 비트가 설정된 경우 존재하며, GRE 헤더 및 페이로드에 대한 체크섬을 포함한다.
 오프셋 (16 비트) R 비트 또는 C 비트가 설정된 경우 존재하며, R 비트가 설정된 경우에만 유효한 정보를 포함한다. 라우팅 필드 내에서 활성 소스 라우트 항목에 대한 오프셋을 나타내는 오프셋 필드이다.
 키 (32 비트) K 비트가 설정된 경우 존재하며, 애플리케이션별 키 값을 포함한다.
 시퀀스 번호 (32 비트) S 비트가 설정된 경우 존재하며, GRE 패킷의 시퀀스 번호를 포함한다.
 라우팅 (가변) R 비트가 설정된 경우 존재하며, 소스 라우트 항목 목록을 포함하므로 가변 길이다.

PPTP GRE 패킷 헤더

점대점 터널링 프로토콜 (PPTP) 는 아래에 표시된 변형 GRE 패킷 헤더 구조를 사용한다. PPTP는 PPTP GRE 패킷이 전송되는 GRE 터널을 생성한다.

{| class="wikitable" style="text-align: center"
|+PPTP GRE 헤더 형식
|-
!style="border-bottom:none; border-right:none;"|오프셋
!style="border-left:none;"|옥텟
!colspan="8"|0
!colspan="8"|1
!colspan="8"|2
!colspan="8"|3
|-
!style="border-top: none"|옥텟
!비트
!style="width:2.75%;"|0
!style="width:2.75%;"|1
!style="width:2.75%;"|2
!style="width:2.75%;"|3
!style="width:2.75%;"|4
!style="width:2.75%;"|5
!style="width:2.75%;"|6
!style="width:2.75%;"|7
!style="width:2.75%;"|8
!style="width:2.75%;"|9
!style="width:2.75%;"|10
!style="width:2.75%;"|11
!style="width:2.75%;"|12
!style="width:2.75%;"|13
!style="width:2.75%;"|14
!style="width:2.75%;"|15
!style="width:2.75%;"|16
!style="width:2.75%;"|17
!style="width:2.75%;"|18
!style="width:2.75%;"|19
!style="width:2.75%;"|20
!style="width:2.75%;"|21
!style="width:2.75%;"|22
!style="width:2.75%;"|23
!style="width:2.75%;"|24
!style="width:2.75%;"|25
!style="width:2.75%;"|26
!style="width:2.75%;"|27
!style="width:2.75%;"|28
!style="width:2.75%;"|29
!style="width:2.75%;"|30
!style="width:2.75%;"|31
|-
!0
!0
|C
|R
|K
|S
|s
|colspan="3"|Recur
|colspan="1"|A
|colspan="4"|플래그
|colspan="3"|버전
|colspan="16"|프로토콜 유형
|-
!4
!32
|colspan="16"|키 페이로드 길이
|colspan="16"|키 통화 ID
|-
!8
!64
|colspan="32"|시퀀스 번호 (선택 사항)
|-
!12
!96
|colspan="32"|확인 번호 (선택 사항)
|-
|}
 C (1 비트) 체크섬 비트. PPTP GRE 패킷의 경우, 0으로 설정된다.
 R (1 비트) 라우팅 비트. PPTP GRE 패킷의 경우, 0으로 설정된다.
 K (1 비트) 키 비트. PPTP GRE 패킷의 경우, 1로 설정된다. (모든 PPTP GRE 패킷은 키를 전달한다.)
 S (1 비트) 시퀀스 번호 비트. 시퀀스 번호가 제공되면 1로 설정되며, PPTP GRE 데이터 패킷을 나타낸다.
 s (1 비트) 엄격한 소스 라우트 비트. PPTP GRE 패킷의 경우, 0으로 설정된다.
 Recur (3 비트) 재귀 제어 비트. PPTP GRE 패킷의 경우, 0으로 설정된다.
 A (1 비트) 확인 번호 존재 여부. 확인 번호가 제공되면 1로 설정되며, PPTP GRE 확인 패킷을 나타낸다.
 플래그 (4 비트) 플래그 비트. PPTP GRE 패킷의 경우, 0으로 설정된다.
 버전 (3 비트) GRE 버전 번호. PPTP GRE 패킷의 경우, 1로 설정된다.
 프로토콜 유형 (16 비트) PPTP GRE 패킷의 경우, 16진수 880B로 설정된다.
 키 페이로드 길이 (16 비트) GRE 헤더를 포함하지 않는 페이로드의 크기를 포함한다.
 키 통화 ID (16 비트) 패킷이 속한 세션에 대한 피어의 통화 ID를 포함한다.
 시퀀스 번호 (32 비트) S 비트가 설정된 경우 존재하며, GRE 페이로드 시퀀스 번호를 포함한다.
 확인 번호 (32 비트) A 비트가 설정된 경우 존재하며, 발신자가 수신한 가장 높은 GRE 페이로드 패킷의 시퀀스 번호를 포함한다.

표준
 : Generic Routing Encapsulation (GRE) (정보용)
 : Generic Routing Encapsulation over IPv4 networks (정보용)
 : Point to Point Tunneling Protocol (정보용)
 : Generic Routing Encapsulation (GRE) (제안된 표준, RFC 2890에 의해 업데이트됨)
 : Key and Sequence Number Extensions to GRE (제안된 표준)
 : GRE-in-UDP Encapsulation (제안된 표준)

 같이 보기 
 일반 라우팅 캡슐화를 사용한 네트워크 가상화 - GRE를 통해 L2 패킷을 전달한다.
 GPRS 터널링 프로토콜 - GTP-U는 GRE와 유사하며 셀룰러 네트워크에서 사용된다.

 각주 

 외부 링크 

 Generic Routing Encapsulation, 시스코의 서브프로토콜 홈페이지
 Generic Routing Encapsulation , 시스코 DocWiki (이전 "Internetworking Technology Handbook")의 항목

분류:시스코 시스템즈
분류:터널링 프로토콜