← 전체 글

테이블은 트리가 아니다

AS 그래프를 어떻게 그릴지 규칙 세 가지를 하나도 재 보기 전에 적어 두었다. 진짜 풀 테이블이 그 셋을 모두 무너뜨렸다.

Michel Wijnberg

앞선 열두 편은 한 가지 이점에 기대고 있었습니다. 자율 시스템 안에서는 라우터 자신이 정답 이라는 것입니다. 모델이 무엇을 주장하든 장비에 직접 물어볼 수 있습니다. 3편의 AS를 넘나드는 경로조차 제가 로그인할 수 있는 망 안에 머물러 있었습니다. 이번 시리즈는 그것이 더 이상 가능하지 않을 때 무슨 일이 벌어지는지에 관한 이야기입니다. 다루는 대상이 남의 네트워크이기 때문입니다.

BGP 테이블은 인터넷의 그림이 아닙니다. 내가 서 있는 자리에서 본 인터넷의 그림이며, 운영자가 거기서 끌어내는 결론은 거의 전부가 아무도 표시해 주지 않는 방식으로 그 관측 지점에 조건 지어져 있습니다. 진짜 테이블이 실제로 어떻게 생겼는지에 관한 네 편을, AS 뷰를 만드는 사람이라면 반드시 답해야 하는 가장 기초적인 질문에서 시작합니다.

이걸 어떻게 그리지?

저는 아무것도 재 보기 전에 설계 문서에서 그 질문에 답했습니다. 확신을 갖고 적은 규칙 세 가지. 셋 다 틀렸고, 틀린 방식이 규칙 자체보다 흥미롭습니다.


내가 적어 둔 세 가지 규칙

Osprey의 AS 흐름 뷰는 자신의 AS를 가운데 두고 나머지를 거리에 따라 둘러 배치합니다. 설계는 세 가지 성질을 못박아 두었습니다.

#규칙전제한 것
1관측 지평은 고리다어떤 거리 너머에서 그래프는 끝난다
2부채꼴 폭은 질량 비중과 같다AS마다 선행자가 하나이므로 원반이 깔끔하게 나뉜다
3오리진은 잎이다 (암묵적)트래픽은 가장자리에서 생겨 가운데를 통과한다

먼저 용어 하나. 나머지를 읽는 방식이 여기서 갈립니다. “선행자”와 “부모”는 제 렌더링 용어이지 BGP가 광고하는 것이 아닙니다. AS_PATH는 순서 있는 수열이며 계층에 대해서는 아무 말도 하지 않습니다. 제가 선행자라고 부르는 것은, 실제로 받은 경로를 따라 관측 지점에 한 걸음 더 가까운 AS입니다. 이 관계는 보는 쪽이, 보는 쪽의 위치에서 구성한 것이고, 그게 논지의 전부입니다.

하중을 지는 것은 규칙 2입니다. 모든 AS가 정확히 하나의 선행자를 통해 내게 닿는다면 그래프 는 트리이고, 트리는 폭이 부피를 뜻하는 중첩 부채꼴로 그릴 수 있습니다. 여러분이 본 BGP 그래프의 계층적 표현은 전부 이 가정 위에 서 있고, 대개 그 사실을 말하지 않습니다.

그래서 진짜를 재 봤습니다.


풀 테이블이 말하는 것

풀 IPv4 테이블: 베스트 경로 1,071,538개, 경로 어딘가에 등장하는 AS 79,168개, 업스트림 두 개를 가진 관측 지점 하나. (오리진 AS는 더 적어 78,538개입니다. 두 수치는 서로 다른 질문이고 둘 다 이 시리즈에 나옵니다.) 그 옆에 DN42, 완전히 별개이고 한 자릿수 작은 네트워크. 둘 다 실측이고, 둘 다 같은 코드로 돌렸습니다.

가정DN42풀 테이블판정
AS당 선행자 하나1,138 중 258이 복수, 최대 2979,168 중 22,371 (28.3%), 최대 202 선행자거짓
가장자리 질량은 가장 무거운 부모로 들어온다18.3%는 아니다**17.5%**는 아니다거짓
순환 없음2-순환 41–47개2-순환 240개거짓
오리진은 잎트랜싯 192 중 187 (97.4%)이 스스로도 기점11,186 중 10,556 (94.4%)거짓
경로는 짧다5홉 이상이 0.0%38.0%, 최장 15개념적으로 오류

두 열은 같은 종류의 수치가 아니며, 그 점이 중요합니다. 풀 테이블은 제가 다시 돌릴 수 없는 피드의 한 장짜리 스냅숏이지만, DN42는 살아 있는 네트워크라 다시 물어볼 수 있고, DN42 열은 2026-08-23에 측정한 값입니다. 엿새 전 같은 질의는 off-tree 33.7%, 2-순환 138개, 5홉 이상 질량 8.7%라고 답했습니다. 아무것도 망가지지 않았고 코드도 바뀌지 않았습니다. 피어가 들어오고 나갔고, 그래프의 모든 구조적 성질이 그것을 따라 움직였을 뿐입니다.

그중 일부는 훨씬 빠르게 움직입니다. 45초마다 두 시간 동안 표본을 뜨면 2-순환 개수는 41과 47 사이를 오갑니다. 그 칸이 수치가 아니라 범위인 이유입니다. 이 글이 실제로 기대고 있는 세 수치, 곧 오리진 개수와 off-tree 비중과 텅 빈 바깥 고리는, 같은 표본들 내내 전혀 움직이지 않았습니다. 이 시리즈의 논지가 이르게, 그리고 청하지도 않았는데 찾아온 셈입니다.

둘째 줄을 다시 읽어 주십시오. 계층으로 그려지는 모든 것에서 이 줄이 관건입니다. 이 관측 지점에서 보이는 AS의 4분의 1 이상이 선행자를 둘 이상 갖고 있고, 그중 하나는 202개를 갖고 있습니다. 그 노드를 담을 수 있는 부채꼴 경계는 없습니다. 더 나은 기하로 풀 배치 문제가 아니라, 그리려는 형태 자체가 존재하지 않습니다.

규칙 2에 대해 제가 적어 둔 완화책은 “복수 부모 노드는 부채꼴 경계에 놓는다”였습니다. 원반 전체에 흩어진 202개의 부모 앞에서, 그 지시는 아무 의미가 없습니다.


각각의 실패가 그림에서 앗아 가는 것은 다르다

복수 부모는 분할을 깹니다. 트리 배치는 부채꼴을 안쪽으로 따라가면 그 트래픽이 어디서 왔는지 알 수 있다는 함의를 갖습니다. 가장자리 질량의 17.5%가 가장 무거운 부모를 통해 들어오지 않는 그래프에서, 부채꼴이 말하는 것은 상대다수이지 경로가 아닙니다. 그 말 없이 그리면 다수가 사실로 둔갑합니다.

“오리진은 잎”은 뺄셈을 깹니다. 내부 노드 거의 전부가 자기 프리픽스를 기점으로 냅니다. 트랜싯 AS의 부피를 보여 주면서 자식들의 몫을 빼면 자기 기점 공간을 알 수 있게 하는 표현은 그중 94%에서 틀립니다. 자기 기점은 어느 칸에서든 독립된 것으로 그려야 하며, 남는 것으로 암시해서는 안 됩니다.

고리는 애초에 거리가 아니었습니다. 이건 수치가 아니라 개념을 틀렸던 쪽입니다. BGP는 내주는 모든 경로에 대해 AS_PATH 전체를 내줍니다. 어느 거리부터 프로토콜이 잘라내기 시작하는 일은 없습니다. 경로가 짧아지는 일은 있지만 멀어서 짧아지지는 않습니다. 보이지 않는 것은 지평 너머에 있는 게 아니라, 이유가 있어 부재합니다.

  • 애초에 나에게 광고되지 않았거나,
  • 내 정책이 거부했거나,
  • 애그리게이터가 AS_SET으로 지워 버렸거나,
  • 아니면 투명 라우트 서버 뒤에 있어서, 그 서버는 설계상 AS_PATH 홉을 전혀 남기지 않습니다 (RFC 7947).

이 중 어느 것도 반지름을 갖지 않습니다. “여기서부터 바깥은 전부”라고 붙인 고리는 프로토콜이 뒷받침하지 않는 기하학적 주장입니다. Osprey가 대신 그리는 것은 실제로 관측된 인접 관계 위에서의 홉 거리이고, 범례도 최솟값을 암시하지 않고 정확히 그렇게 적혀 있습니다.

DN42 관측 지점에서 본 AS 흐름의 방사형 렌즈. 고리는 홉 거리이고, 범례에는 관측된 인접 관계 위에서의 거리이며 경로별 최솟값이 아니라고 적혀 있다. 위쪽 띠에는 피드의 형태가 놓인다: 오리진 1,132개, off-tree 18.3%, 5홉 이상은 하나도 없음
DN42 관측 지점에서 본 AS 흐름의 방사형 렌즈. 고리는 홉 거리이고, 범례에는 관측된 인접 관계 위에서의 거리이며 경로별 최솟값이 아니라고 적혀 있다. 위쪽 띠에는 피드의 형태가 놓인다: 오리진 1,132개, off-tree 18.3%, 5홉 이상은 하나도 없음

이 글이 다루는 뷰가 바로 저것이고, DN42 피드에서 그려졌습니다. 제가 중요하게 보는 부분은 위쪽 띠입니다. 어떤 트리도 담을 수 없는 18.3%의 질량까지 포함해서, 자기가 그리고 있는 그래프의 형태를 밝혀 둡니다. 그림이 완전한 것이라고 읽는 이가 넘겨짚게 두지 않습니다.


둘 다 “AS 토폴로지”라 불리는 두 그래프

둘을 나란히 놓았을 때 흥미로운 것은 다르다는 사실이 아닙니다. 어디가 다른가입니다.

성질DN42풀 테이블
복수 부모 AS22.7%28.3%
가장 무거운 부모를 벗어난 가장자리 질량18.3%17.5%
스스로도 기점인 트랜싯97.4%94.4%
5홉 이상 경로0.0%38.0%

저 네 줄 가운데 셋은 충분히 비슷해서, 어느 한쪽에 맞춰 조율한 모델도 다른 쪽에서 그럴듯해 보입니다. 넷째 줄은 정도의 차이가 아닙니다. DN42에서는 5홉 이상에 아무것도 없고, 진짜 테이블에서는 질량의 3분의 1을 훌쩍 넘습니다. 작은 네트워크로 검증한 배치는 큰 쪽에서 살짝 어긋나는 정도가 아닙니다. 바깥 고리가 비어 있는 그래프에 대해 검증된 뒤, 바깥 고리야말로 인터넷의 대부분이 사는 곳인 그래프로 출하되는 것입니다.

이것은 제가 펴려고 했던 판본보다 나쁘고, 랩이 IGP에 대해 펴는 것과 같은 논지를 한 단계 위에 적용한 것입니다. 모델을 반박할 수 없는 환경에서는 그 모델을 검증할 수 없습니다. 세 줄이 일치한다는 사실이 바로 넷째 줄을 위험하게 만듭니다. 작은 피드는 자기 성질 가운데 어느 것이 우연히 일반화되는지 알려 주지 않습니다.


이 시리즈가 처음에 놓는 거부

이 시리즈에서 무엇이든 그리기 전에 짚어 둘 만한 귀결이 하나 있습니다.

AS 그래프의 간선은 경로 인접이지 결코 피어링 주장이 아닙니다. 두 AS가 AS_PATH에서 나란히 나타난다. 관측은 그게 전부입니다. 둘 사이에 세션이 있다는 뜻이 아니며, 위의 투명 라우트 서버가 바로 그 이유입니다. RFC 7947에 따라 서버가 홉을 남기지 않으므로, 그 클라이언트 둘은 아무 관계 없이 경로상 인접해집니다.

그래서 카드는 “경로상의 인접이며, 검증된 피어링 세션이 아님”이라고 말하고, 모든 간선에서 그렇게 말합니다.

한 인접에 대한 카드. 엔트리 수와 양쪽 각각의 질량에서 차지하는 비중을 준 뒤, 이것이 수신한 AS_PATH에서 관측된 인접일 뿐 검증된 피어링 세션이 아니라고 빠짐없이 밝힌다
한 인접에 대한 카드. 엔트리 수와 양쪽 각각의 질량에서 차지하는 비중을 준 뒤, 이것이 수신한 AS_PATH에서 관측된 인접일 뿐 검증된 피어링 세션이 아니라고 빠짐없이 밝힌다

더 강한 주장이 가능한 자리는 정확히 하나, 자신의 AS에 닿는 간선이고, 그것도 독립된 세션 기록이 뒷받침할 때뿐입니다. 그것은 그림의 한 고리이며, 주장을 허락하는 것은 위치가 아니라 두 번째 근거입니다. 그보다 바깥은 전부 경로에 대한 추론이고, 다르게 이름 붙이면 남의 네트워크들 사이에 관계를 지어내는 일이 됩니다.


테이블이 실제로 건네준 것

따로 적어 둘 만합니다. 위에서 무너진 규칙은 전부 같은 방식으로 무너졌기 때문입니다.

피드가 준 것은 셋입니다. 프리픽스와 그 베스트 경로, 각 경로의 AS_PATH, 그리고 그것이 어느 세션으로 들어왔는지. 관측은 그게 전부입니다.

이 글의 나머지는 전부 제가 계산했습니다. 선행자, 홉 거리, 간선 질량, 트리를 벗어난 비중, 그 AS가 스스로도 기점인지, 그래프 자체까지. 모두 구성물이며 하나의 위치에서 만들어졌고, 위치가 바뀌면 모든 수치가 바뀝니다.

그리고 세 가지는 어떤 거리에서든 BGP 테이블에 아예 들어 있지 않습니다.

  • 두 AS에 세션이 있는지,
  • 이 위로 트래픽이 얼마나 흐르는지,
  • 그리고 내 업스트림들이 나에게 보내지 않기로 한 경로들. 그것들은 보류되었다는 흔적조차 남기지 않습니다.

제가 적어 둔 세 규칙은 하나같이 둘째 열에 대한 주장을 첫째 열에 대한 주장인 양 차려입은 것이었습니다. “모든 AS에는 부모가 하나 있다”는 관측처럼 들립니다. 그것은 렌더링의 성질이고, 그 차이를 보이게 만든 것이 측정이었습니다.


요점

규칙 셋을 적었고 측정이 셋 다 반박했습니다. 좋은 결과이며, 규칙이 틀릴 수 있을 만큼 구체적이었기에 얻을 수 있었던 결과입니다.

시리즈의 나머지가 다룰 더 넓은 주장은 이것입니다. BGP 테이블은 관점이다. 그 형태도, 중심도, 백본도, 지평도 전부 피드가 어디서 오는지의 산물입니다. 그것을 지리처럼 그리는 도구는 모두, 하나의 관측 지점에 대한 근거만 가진 채 인터넷에 대한 주장을 하고 있는 셈입니다.

정직한 판본은 관측한 것을 그리고, 그것을 낳은 관측 지점을 밝힙니다.

그래서 다음 글이 다룰 질문이 남습니다. 테이블을 계층으로 그리기를 포기한 뒤에도, 목록 맨 위에 무엇을 둘지는 여전히 정해야 하고, 그것은 들리는 것보다 어려운 질문입니다.


다음: 모두가 그것으로 정렬하는 축, 그리고 인터넷에서 가장 큰 네트워크가 존재하지 않는 이유. 가장 큰 AS는 존재하지 않는다.