1. 개요

BGP(Border Gateway Protocol)는 AS(독립된 망) 끼리 “이 대역은 나를 거쳐 갈 수 있다” 를 알려 주는 라우팅 프로토콜이다. 통신사·클라우드·큰 서비스의 라우터가 이웃 라우터에게 자기 대역을 광고하고, 받은 광고를 다시 다른 이웃에게 전하면서 인터넷 전체의 경로 표가 채워진다.

BGP 는 경로 표를 미리 채워 두는 대화일 뿐, 사용자 패킷 안에 들어 있지 않다. 패킷은 채워진 표만 보고 지나간다.

구글 AS15169경유망 AS64500KT AS476612341구글이 광고한다"142.250.1.0/24 은 나에게 오라"AS_PATH: 151692경유망이 자기 번호를 붙여 전달AS_PATH: 64500 151693KT 라우터에 한 줄이 생긴다142.250.1.0/24 → 경유망 쪽 케이블4실제 패킷은 반대 방향으로광고가 온 길을 거꾸로 따라간다경유망 AS64500 은 문서용 예시 번호다. 실제 KT 와 구글은 IX 에서 직접 이어져 있기도 하다광고는 주인에서 바깥으로 퍼지고, 패킷은 그 길을 거꾸로 따라 주인에게 간다

2. AS

BGP 가 이야기하는 단위는 라우터가 아니라 AS 다. AS 는 한 회사가 하나의 정책으로 운영하는 망, 쉽게 말해 “인터넷 위의 회사 하나” 다. KT 는 AS4766, 구글은 AS15169 이고, 집은 AS 가 아니라 통신사 AS 의 일부다.

3. 전송 방식

BGP 는 TCP 위에서 돈다. 이웃 라우터의 TCP 179 번 포트로 연결을 맺고, 그 연결 안에서 BGP 메시지를 주고받는다. 웹 브라우저가 서버의 443 번에 TCP 로 붙는 것과 같은 구조다.

노드 사이 선 위의 BGP 패킷 한 개Ethernet14BIP20BTCP20BBGP 메시지헤더 19B + 본문11Ethernet — 받는 MAC = 바로 옆 이웃 라우터22IP — 출발 = 내 경계 라우터 · 목적 = 이웃 라우터33TCP — 목적지 포트 17944BGP — OPEN · UPDATE · KEEPALIVE · NOTIFICATIONUDP 가 아니라 TCP — 재전송·순서·도착 확인을 TCP 에 맡기고, BGP 는 경로 이야기만 한다eBGP 는 IP 의 TTL 을 1 로 보낸다 — 케이블로 바로 이어진 이웃에게만 닿고 그 너머로는 못 간다포트 179 는 받는 쪽 포트 — 먼저 연결을 건 쪽은 임의 포트에서 상대의 179 로 붙는다BGP 는 TCP 179 번 위에서 도는 대화다 — 보통 웹 요청과 같은 방식으로 실려 간다

TCP 를 쓰기 때문에 BGP 자체에는 재전송이나 순서 맞추기가 없다. 메시지가 사라지거나 뒤섞이는 문제는 TCP 가 처리하고, BGP 는 “어느 대역이 어디로 가는지” 만 이야기한다.

3.1. 메시지 순서

BGP 는 일방적으로 던지고 끝나는 방식도, 메시지마다 답장을 받는 방식도 아니다. 연결과 인사는 서로 주고받고, 경로(UPDATE)는 보내기만 한다.

KT 라우터경유망 라우터TCPSYNTCP 3-way handshake (포트 179)SYN-ACKACKOPENAS 번호 · Hold Time 90초 · 라우터 IDOPEN양쪽이 하나씩 보낸다KEEPALIVE"네 OPEN 받아들인다" — 세션 성립UPDATE × 많이처음 한 번은 가진 경로 전부TCP ACKBGP 답장은 없다 — 도착 확인은 TCP 가KEEPALIVE할 말이 없어도 30초마다KEEPALIVEUPDATE그다음부터는 바뀐 것만 (광고·철회)TCP ACK90초 동안 아무것도 안 오면 → 세션을 끊고 그 이웃에게 받은 경로를 전부 지운다연결은 TCP 3-way, 인사는 OPEN 교환, 경로는 UPDATE 를 보내기만 한다 — 답장은 TCP ACK 뿐
  • 연결 — TCP 3-way handshake. 양쪽 다 연결을 걸 수 있고, 동시에 걸면 라우터 ID 가 큰 쪽의 연결만 남긴다
  • 인사 — 양쪽이 OPEN 을 하나씩 보낸다. AS 번호가 설정과 다르면 받아들이지 않는다
  • 수락 — 상대의 OPEN 이 괜찮으면 KEEPALIVE 로 답한다. 이때부터 세션이 성립한다
  • 경로 — UPDATE 는 BGP 답장이 없다. 도착은 TCP ACK 이 보장하고, 받은 경로를 쓸지 말지는 받는 쪽이 조용히 정한다
  • 생존 — 할 말이 없어도 KEEPALIVE 를 주기적으로 보낸다(Hold Time 의 1/3, 보통 30초)
  • 오류 — 형식이 틀리거나 Hold Time 이 지나면 NOTIFICATION 을 보내고 연결을 끊는다

4. UPDATE 메시지

경로를 실어 나르는 메시지는 UPDATE 다. UPDATE 한 통은 “이 대역들은 이제 못 간다” 와 “이 설명서대로 이 대역들은 간다” 두 부분으로 이뤄진다.

BGP 헤더 — 모든 메시지 공통 (19B)Marker 16Bff ff … ff (전부 1)Length 2B메시지 길이Type 1B2 = UPDATE1 OPEN — 인사, AS 번호2 UPDATE — 경로 광고·철회3 NOTIFICATION — 오류, 끊기4 KEEPALIVE — 살아 있음UPDATE 본문철회 길이2B철회할 대역가변속성 길이2B경로 속성가변NLRI새로 갈 수 있는 대역더는 못 가는 대역새 경로의 설명서"이 대역은 나에게 오라"ORIGIN어디서 처음 나왔나IGPAS_PATH지나온 AS 목록64500 15169✱NEXT_HOP다음에 넘길 라우터203.0.113.1✱LOCAL_PREFAS 안에서만 쓰는 우선순위iBGP 전용속성 하나 = 플래그 1B · 종류 1B · 길이 1~2B · 값✱ 다른 AS 로 넘길 때마다 바뀐다NLRI 한 줄의 실제 바이트188E FA 01앞 1바이트 = 접두 길이 24 (0x18)뒤에는 필요한 바이트만 — 142.250.1 → 142.250.1.0/24UPDATE 한 통 = "이 대역들은 못 간다" + "이 설명서대로 이 대역들은 간다"

경로 속성 중 AS_PATH 와 NEXT_HOP 은 다른 AS 로 넘길 때마다 바뀐다. 광고를 받은 AS 는 자기 AS 번호를 AS_PATH 맨 앞에 붙이고, NEXT_HOP 을 자기 경계 라우터 주소로 바꿔 다음 이웃에게 전한다. 그래서 AS_PATH 는 광고가 지나온 AS 의 목록이 되고, NEXT_HOP 은 언제나 “바로 옆 이웃의 어느 라우터로 보내면 되는지” 를 가리킨다.

광고와 철회는 같은 UPDATE 메시지에서 채우는 칸만 다르다.

광고 UPDATE철회할 대역비어 있음경로 속성ORIGIN IGPAS_PATH 64500 15169NEXT_HOP 203.0.113.1NLRI142.250.1.0/24철회 UPDATE철회할 대역142.250.1.0/24경로 속성비어 있음NLRI비어 있음한 통에 둘 다 담을 수도 있다 — "A 는 철회, B 는 새로 광고"광고는 아래 두 칸을, 철회는 맨 위 칸만 채운다

5. 경로 선택

같은 대역에 대한 광고가 여러 이웃에게서 오면 하나를 골라 경로 표에 적는다.

KT AS4766짧은 위쪽을 고른다구글 AS15169142.250.1.0/24 광고AS64500AS64501AS64502받은 AS_PATH: 64500 15169 (2개) ✓받은 AS_PATH: 64501 64502 15169 (3개)고리 막기 — 자기 AS 번호가 이미 AS_PATH 에 있으면 그 광고는 받지 않는다고르는 순서 — 내 정책(LOCAL_PREF)이 먼저, AS_PATH 길이는 그다음이다AS_PATH 는 광고가 지나온 AS 의 목록 — 길 고르기와 고리 막기에 같이 쓰인다

AS_PATH 가 짧다고 꼭 빠른 길은 아니다. AS 하나가 대륙을 가로지를 수도 있다. 그래서 실무에서는 정책(LOCAL_PREF)으로 비용이 싼 이웃을 먼저 고르게 하고, AS_PATH 길이는 그다음 기준으로 쓴다.

6. 이웃 관계

BGP 는 자동으로 이웃을 찾지 않는다. 운영자가 상대 라우터의 IP 와 AS 번호를 직접 설정하면, 둘이 TCP 179 번으로 연결을 맺고 대화를 시작한다. 이 연결을 BGP 세션이라고 부른다.

eBGP
서로 다른 AS 사이의 BGP. 통신사와 구글처럼 회사 경계에서 쓴다. 보통 케이블로 바로 이어진 이웃끼리 맺는다
iBGP
같은 AS 안의 라우터끼리 바깥에서 받은 경로를 나눠 갖는 BGP. 받은 경로를 다른 iBGP 이웃에게 다시 넘기지 않는다

회사 사이의 이웃 관계는 돈이 오가는 방식에 따라 둘로 나뉜다.

트랜짓 (transit)
돈을 내고 "인터넷 전체로 가는 길" 을 사는 관계. 작은 망이 큰 망에 붙을 때
피어링 (peering)
서로의 고객 대역만 주고받는 관계. 대개 무료. IX 건물에 라우터를 모아 케이블로 잇는다

IX(Internet Exchange)는 여러 회사가 라우터를 한 건물에 모아 두고 케이블로 서로 잇는 곳이다. 이웃이 “이어져 있다” 는 건 실제로 라우터 포트끼리 광케이블이 꽂혀 있다는 뜻이다.

7. 경로 표와의 관계

BGP 가 하는 일은 결국 라우팅 테이블 채우기다. 이웃들에게 받은 광고 중 대역마다 하나를 골라 라우터의 경로 표에 한 줄씩 넣고, 광고가 바뀌면 그 줄을 고친다. 패킷이 오면 라우터는 그 표에서 목적지와 가장 길게 맞는 줄(Subnet 의 접두 길이 기준)을 찾아 보낸다. 그 순간 BGP 는 아무것도 하지 않는다.

표에는 주소 하나하나가 아니라 대역이 들어간다. 그래서 IPv4 주소 43억 개가 약 100만 줄로 접힌다.

IPv4 주소 전체 — 약 43억 개0.0.0.0 … 255.255.255.255덩어리 하나 = 대역 하나 = 라우팅 테이블 한 줄142.250.1.0/24주소 256개한 줄로KT 경계 라우터의 라우팅 테이블1.1.1.0/24→ 1번 케이블8.8.8.0/24→ 2번 케이블142.250.1.0/24→ 3번 케이블211.34.0.0/16→ KT 안쪽…→ 약 100만 줄43억 ÷ 100만 ≈ 한 줄이 평균 4천 개 넘는 주소를 맡는다 — /16 한 줄이면 65,536개테이블은 주소가 아니라 대역을 적는다 — 집 주소가 아니라 우편번호로 분류하는 것과 같다

100만 줄 전체를 가진 라우터는 소수다. 대부분의 기기는 “모르면 위로” 라는 기본 경로 한 줄로 지낸다. 노트북과 공유기는 이 한 줄을 DHCP 로 받고, 전체 지도는 바깥으로 가는 길이 여럿이라 골라야 하는 경계 라우터만 BGP 로 채운다. DHCP 와 BGP 는 같은 표를 채우는 서로 다른 도구인 셈이다.

12344경계 라우터 (통신사·클라우드)약 100만 줄 — 인터넷 전체 지도BGP 로 채운다 · 기기 수는 가장 적다3통신사 안쪽 라우터회사 안의 길 + "모르면 경계로"2공유기표 몇 줄 — "모르면 통신사"1노트북 · 폰표 1~몇 줄 — "모르면 공유기"기기 수는 가장 많다아래로 갈수록 기기는 많고 표는 작다 — 전체 지도는 맨 위 소수만 갖는다

100만 줄이어도 한 줄이 수십 바이트라 전체는 수십 MB 수준이다. 대형 라우터는 이 표를 TCAM 같은 전용 칩에 올려 패킷마다 나노초 단위로 찾는다. 다만 칩 크기에는 한계가 있다. 2014년 8월 12일 표가 51만 2천 줄을 넘자, 칩 용량이 딱 그만큼이던 오래된 라우터들이 새 줄을 넣지 못해 곳곳에서 장애가 났다(“512k day”). 표는 지금도 해마다 커지고 있다.

8. 잘못된 광고

BGP 는 기본적으로 이웃의 광고를 믿는다. 그래서 광고가 틀리면 인터넷 전체가 그 틀린 길을 따른다.

더 좁은 대역을 가로채기 (2008)
파키스탄 텔레콤이 유튜브 대역의 일부(/24)를 광고했다. 유튜브가 알리던 /22 보다 길게 맞아서 전 세계 유튜브 트래픽이 파키스탄으로 몰렸다
자기 대역을 거둬들이기 (2021)
페이스북이 설정 작업 중 자기 DNS 서버 대역의 광고를 거둬들였다(withdraw). 길이 사라져 페이스북·인스타그램이 몇 시간 동안 접속되지 않았다

이를 막으려고 RPKI 가 쓰인다. 대역의 주인이 “이 대역은 이 AS 만 광고할 수 있다” 는 서명을 등록해 두면, 라우터가 서명과 맞지 않는 광고를 버린다.

9. 쿠버네티스의 BGP

Calico 는 기본적으로 BGP 로 노드 사이를 잇는다. 각 노드가 하나의 BGP 화자처럼 행동하며 자기 Pod 대역을 광고하고, 랙 스위치나 다른 노드가 이를 받아 경로 표에 적는다. 패킷을 감쌀 필요가 없어 VXLAN 보다 단순하지만, 망 장비가 BGP 를 받아 줘야 한다.

12341노드 1 — 10.244.1.0/24자기 Pod 대역을 광고2노드 2 — 10.244.2.0/243노드 3 — 10.244.3.0/244랙 스위치(ToR)가 받아 적는다Pod 주소로 바로 라우팅된다터널(VXLAN) 없이 — Calico 의 기본 방식노드가 AS 처럼 행동한다 — 깃발은 "이 Pod 대역은 나에게 보내라"

MetalLB 의 BGP 모드도 같은 원리다. type: LoadBalancer 서비스의 외부 IP 를 노드가 라우터에게 광고해, 바깥 패킷이 그 노드로 들어오게 한다.

10. 확인 명령

노트북은 BGP 를 쓰지 않지만, 공개된 BGP 정보는 조회할 수 있다.

whois -h whois.cymru.com " -v 142.250.1.1"     # 이 IP 를 광고하는 AS 와 대역
# AS      | IP               | BGP Prefix          | CC | Registry | Allocated  | AS Name
# 15169   | 142.250.1.1      | 142.250.1.0/24      | US | arin     | 2012-05-24 | GOOGLE - Google LLC, US

whois -h whois.cymru.com " -v AS4766"          # AS 번호의 주인
traceroute -a 142.250.1.1                       # macOS: 각 홉의 AS 번호도 함께 표시
# BGP 를 쓰는 라우터·노드에서 실제 메시지 보기
tcpdump -i eth0 -n -v tcp port 179           # OPEN, KEEPALIVE, UPDATE 가 BGP 로 해석되어 보인다
# Calico 를 쓰는 클러스터에서
calicoctl node status                           # 노드의 BGP 이웃과 세션 상태 (Established)
ip route | grep bird                            # BGP 로 받은 다른 노드의 Pod 대역 (proto bird)

웹에서는 bgp.tools 나 bgp.he.net 에서 AS 번호나 IP 로 광고 현황을 볼 수 있다.

11. 관련 문서

  • AS — BGP 로 이야기하는 주체. 인터넷 위의 회사 하나
  • Subnet — BGP 가 광고하는 단위. 가장 길게 맞는 줄이 이긴다
  • DHCP — 집이 BGP 대신 기본 경로 한 줄을 받는 방법
  • VXLAN — 노드 사이를 감싸서 잇는 방법. BGP 는 감싸지 않고 알린다
  • CNI — Calico 같은 구현체가 BGP 를 쓴다
  • Network & K8s.01-2 Across the Network — 통신사 라우터의 경로 표가 채워지는 과정

12. 출처

BGP-4 는 RFC 4271 이 정의한다. 하는 일과 TCP 179 번이 여기 있다.

“The primary function of a BGP speaking system is to exchange network reachability information with other BGP systems.”

“BGP uses TCP [RFC793] as its transport protocol. … BGP listens on TCP port 179.”

처음에 전부, 그 뒤로는 바뀐 것만 보낸다는 것(3.1)도 같은 절에 있다.

“Incremental updates are sent as the routing tables change. BGP does not require a periodic refresh of the routing table.”