Google Global Cache - Метод кодирования доменов кэширующих серверов Google Video - Youtube
Google Global Cache (GGC) — это распределённая система кэширующих серверов Google, размещаемая непосредственно в сетях интернет-провайдеров (ISP). GGC является ключевым компонентом CDN Google, обеспечивающим доставку видео с YouTube и другого контента с минимальной задержкой. Серверы GGC имеют особую систему доменных имён, основанную на криптографическом шифре подстановки.
В данной статье рассматриваются три связанные системы доменных имён, используемых Google: SN-домены (8-символьное кодирование), GGC-домены (с именем провайдера) и домены 1e100.net.
Обзор инфраструктуры Google CDN
Google использует распределённую сеть доставки контента (CDN), состоящую из нескольких уровней:
- Собственные дата-центры Google — 13+ крупных центров обработки данных по всему миру (США, Европа, Азия, Южная Америка)
- Точки присутствия (PoP) Google — серверы на границе сети, размещённые в ключевых точках обмена трафиком
- Google Global Cache (GGC) — кэширующие серверы, устанавливаемые у интернет-провайдеров-партнёров
Каждый физический или виртуальный сервер имеет уникальный домен в одной из трёх систем именования: SN, GGC или 1e100.net.
SN-домены (Server Number domains)
SN-домены — это 8-символьные закодированные имена, используемые для кэширующих серверов YouTube. Формат:
r1---sn-[123][45][6][78].googlevideo.com
Где:
- [123] — трёхсимвольный код города, полученный из IATA-кода аэропорта
- [45] — первая часть номера группы серверов (Point of Presence)
- [6] — идентификатор протокола: n/u для IPv6, m для IPv4
- [78] — вторая часть номера группы серверов
Также встречается форма:
r?.sn-xxxxxxxx.googlevideo.com r?---sn-xxxxxxxx.googlevideo.com r?.xxx??s??.googlevideo.com r?---xxx??s??.googlevideo.com
Каждый SN-домен имеет 20 экземпляров с префиксами от r1 до r20. Соответствующие IPv6-адреса имеют 8-й сегмент в диапазоне 0x6–0x19.
Кодирование города (IATA → SN)
Город кодируется через шифр подстановки (Substitution Cipher). Таблица получена поворотом алфавитно-цифровой матрицы на 90° против часовой стрелки.
Базовый алфавит: 1023456789abcdefghijklmnopqrstuvwxyz
Таблица подстановки для IATA-кодов:
| 6 d k r y | | --------- | | 5 c j q x | | 4 b i p w | | 3 a h o v | | 2 9 g n u | | 0 8 f m t | | --------- | | 7 e l s | z
Правила:
- 25 символов в рамке представляют буквы a–y (слева направо, сверху вниз): 5 → a, t → y
- Символ в левом нижнем углу — 0 (не 1)
- Символ 1 соответствует букве z
Пример: код a5m декодируется в lax — Лос-Анджелес (LAX).
Кодирование номера группы серверов
Номер группы (Point of Presence) — это двузначное число от 00 до 39, кодируемое двухсимвольной комбинацией:
| 1 2 3 4 5 6 7 | 8 9 a b c d e | f g h i j k l | m n o p q r s | t u v w x y z | 0 1 2 3 4 5 6 | 7 8 9 a b c d | e f g h i j k | l m n o p q r | s t u v w x y | z
Первый столбец (символы 7, e, l, s, z, 6, d, k, r, y) представляет цифры 0–9.
Примеры: ek → 17, 7r → 08, 7e → 01, el → 12, s7 → 30.
Идентификатор протокола
- n — IPv6, биты 49–64: 0 – 3ff
- u — IPv6, биты 49–64: 400 – 7ff
- m — IPv4, без IPv6
Примеры SN-доменов
a5mekn7r— LAX, группа 17, IPv6, группа 08. IPv6: 2607:f8b0:4007:a::/64, IPv4: 74.125.103.0/24a5m7zu7r— LAX, группа 17, IPv6 (u), группа 08. IPv6: 2607:f8b0:4007:407::/64, IPv4: 74.125.215.0/24a5mekm76— LAX, группа 17, IPv4 (m), группа 06. Только IPv4: 208.117.242.0/24nwj7kned— SJC (Сан-Хосе), группа 27, IPv6, группа 03q4f7dnee— DFW (Даллас), группа 07, IPv6, группа 044g57knls— FRA (Франкфурт), группа 00, IPv6, группа 01ni57dn7e— PEK (Пекин), группа 01, IPv6, группа 00oguesnsy— SIN (Сингапур), группа 06, IPv6, группа 16
GGC-домены
GGC-серверы устанавливаются непосредственно у интернет-провайдеров. Их домены содержат закодированное имя провайдера.
Паттерн GGC
r?---sn-[isp name]-[loc][x].googlevideo.com
- [isp name] — закодированное имя провайдера (ISP name), длина варьируется; правила кодирования те же, что и для SN-доменов
- [loc] — IATA-код города (3 буквы), закодированный по тем же правилам
- [x] — номер группы серверов (1–2 символа)
Примеры GGC-доменов
gxo5uxg-jqbe — renater-cdg1 (Renater, Париж) gvopm-vu2e — ronix-otp1 (Ronix, Отопени) oju0-u2xl — nctu-tpe2 (NCTU, Тайбэй) uphxqvujvh-30al — timedotcom-kul2 (Time dotCom, Куала-Лумпур) 8xgn5uxa-quhe — versatel-dtm1 (Versatel, Дортмунд) 585pav-ch5e — availo-bma1 (Availo, Бромма) a8au-xfge — lvlt-ewr1 (LVLT, Ньюарк) a8au-a5me — lvlt-lax1 (LVLT, Лос-Анджелес) 9nj-4g5e — qsc-fra1 (QSC, Франкфурт) oxc0a5-ixae — nebula-hel1 (Nebula, Хельсинки) cnoa-qxae — bsnl-del1 (BSNL, Дели) ipoxu-u2xs — hinet-tpe3 (HiNet, Тайбэй) xmjxajvh-jb3e — excelcom-cgk1 (Excelcom, Джакарта) pqx5jxaa0a5g-2o9l — ideacellular-pnq2 (Idea Cellular, Пуна) f5p5-hxae — waia-mel1 (WAIA, Мельбурн) ibj-i3bs — hgc-hkg3 (HGC, Гонконг) cp1oxu-jb3e — biznet-cgk1 (Biznet, Джакарта) ug5onuxaxjvh-v8ce — transtelecom-ovb1 (Транстелеком, Новосибирск)
Домены 1e100.net
1e100.net — это каноническое доменное имя Google для своих серверов, введённое в октябре 2009 года. Название происходит от числа "googol" (1 × 10¹⁰⁰).
Формат 1 (IPv6)
[a-z]{3}[0-9]{2}s[0-9]{2}-in-x[0-9a-f]{2}.1e100.net
Пример: dfw06s16-in-x1f.1e100.net
- dfw — IATA-код аэропорта Даллас-Форт-Уэрт
- 06s16 — номер группы
- x — hex-обозначение
- 1f — номер сервера в группе (0x00–0x1f, 32 сервера)
- IPv6 4-й сегмент: 800–80f (16 групп), 8-й сегмент: 1000–101f
Формат 2 (IPv4)
[a-z]{3}[0-9]{2}s[0-9]{2}-in-f[0-9]{1-2}.1e100.net
Пример: dfw06s16-in-f31.1e100.net
- f — десятичное обозначение
- номер сервера: 0–31 (32 сервера)
Формат 3 (сокращённый, Тайвань)
[a-z]{2}-in-x[0-9a-f]{2}.1e100.net
Пример: tf-in-x7b.1e100.net
- t — Taipei (Тайбэй)
- x — hex-обозначение
- 7b — номер сервера (0x00–0xff, до 256 серверов)
- IPv6 4-й сегмент: c00–c0f (16 групп)
Известные IP-пулы 1e100.net
2001:4860::/32 — США 2404:6800::/32 — Австралия (Азия) 2607:f8b0::/32 — США 2a00:1450::/29 — Ирландия (Европа)
Связь между системами
Один и тот же сервер может быть представлен во всех трёх системах именования:
# 1e100.net формат lax17s08 # SN-домен (8-символьный) a5mekn7r # Компоненты: lax → a5m (IATA → SN) 17 → ek (группа, первая часть) s → n (разделитель/протокол) 08 → 7r (группа, вторая часть)
Известные соответствия городов (IATA → SN-префикс):
lax (Лос-Анджелес) → a5m sjc (Сан-Хосе) → nwj dfw (Даллас) → q4f atl (Атланта) → ab5 / p5q mia (Майами) → hp5 / nx5 lga (Нью-Йорк) → vgq ord (Чикаго) → tt1 sea (Сиэтл) → 9gv den (Денвер) → 5ua yyz (Торонто) → qxo fra (Франкфурт) → 4g5 lhr (Лондон) → 1gi par (Париж) → 25g ber (Берлин) → cxg ams (Амстердам) → h0j bru (Брюссель) → f5f sin (Сингапур) → ogu kul (Куала-Лумпур) → qxa nrt (Токио) → i3b hkg (Гонконг) → h55 maa (Ченнаи) → 30a del (Дели) → npo pek (Пекин) → ni5 cgk (Джакарта) → cp1 / poq gru (Сан-Паулу) → x1x eze (Буэнос-Айрес) → bgo mrs (Марсель) → ...
Исходный код конвертера
Полный код утилиты для преобразования между системами доступен в репозитории: [1](https://github.com/lennylxx/ipv6-hosts/blob/master/tools/conv.py)
#!/usr/bin/env python3
import sys
table = '1023456789abcdefghijklmnopqrstuvwxyz'
def iata2sn(iata):
sn = ''
for v in iata:
if v in table:
i = ((ord(v) - ord('a')) * 7 + 5) % 36
sn += table[i]
else:
sn += v
return sn
def sn2iata(sn):
iata = ''
for v in sn:
if v in table:
i = table.index(v)
i = (5 - i % 7) * 5 + i // 7 + 10
iata += table[i]
else:
iata += v
return iata
def num2code(num):
code = ''
for v in num:
if v in table:
i = ((ord(v) - ord('0') + 1) * 7) % 36
code += table[i]
else:
code += v
return code
def code2num(code):
num = ''
for v in code:
if v in table:
i = table.index(v)
i = i // 7 + i % 7 - 1
num += str(i)
else:
num += v
return num
def main():
if len(sys.argv) != 3:
print('usage:\\tconv -i iata\\n\\tconv -s sn\\n\\tconv -p isp\\n\\tconv -g ggc')
sys.exit(1)
input = sys.argv[2]
ret = ''
if sys.argv[1] == '-i':
ret += iata2sn(input[0:3])
ret += num2code(input[3:5])
if len(input) > 3:
ret += 'n'
ret += num2code(input[6:8])
elif sys.argv[1] == '-s':
ret += sn2iata(input[0:3])
ret += code2num(input[3:5])
if len(input) > 3:
ret += 's'
ret += code2num(input[6:8])
elif sys.argv[1] == '-p':
lst = input.split('-')
ret += iata2sn(lst[0])
if len(lst) == 2:
ret += '-'
ret += iata2sn(lst[1][0:3])
ret += num2code(lst[1][3:])
elif sys.argv[1] == '-g':
lst = input.split('-')
ret += sn2iata(lst[0])
if len(lst) == 2:
ret += '-'
ret += sn2iata(lst[1][0:3])
ret += code2num(lst[1][3:])
else:
print('Unknown option.')
sys.exit(1)
print(ret)
sys.exit(0)
if __name__ == '__main__':
main()
Примеры использования
# IATA → SN: lax17s08 → a5mekn7r python3 conv.py -i lax17s08 # SN → IATA: a5mekn7r → lax17s08 python3 conv.py -s a5mekn7r # ISP → SN: lax-sfo38 → a5m-6zn41 python3conv.py -p lax-sfo38 # GGC → IATA: a5m-6zn41 → lax-sfo38 python3 conv.py -g a5m-6zn41
Математическая основа шифра
Кодирование основано на линейном конгруэнтном преобразовании 36-ричного алфавита:
- Для IATA: i = ( (ord(v) - ord('a')) × 7 + 5 ) mod 36
- Для чисел: i = ( (ord(v) - ord('0') + 1) × 7 ) mod 36
Обратное преобразование восстанавливает исходное значение через обращение формулы по модулю 36. Такая схема обеспечивает взаимно-однозначное отображение 26 букв (a–z) и 10 цифр (0–9) на 36-символьный алфавит 1023456789abcdefghijklmnopqrstuvwxyz.
Практическое применение
Знание системы кодирования позволяет:
- Определять географическое расположение сервера по его доменному имени
- Сопоставлять IPv4/IPv6-адреса с конкретными серверами и их местоположением
- Группировать серверы по точкам присутствия (PoP)
- Идентифицировать ISP, на сетях которых установлены GGC-серверы
- Понимать архитектуру глобальной инфраструктуры Google CDN
Ссылки
- Репозиторий ipv6-hosts (исходный код, списки доменов, hosts-файлы)
- Оригинальная страница SN-domains
- Страница GGC на GitHub Wiki
- Страница 1e100.net на GitHub Wiki
- Страница YouTube на GitHub Wiki
- Исходный код конвертера conv.py
- Таблица SN-доменов (Google Sheets)
- Геоинформация о серверах 1e100.net
- Коды аэропортов IATA (Wikipedia)
- Шифр подстановки (Wikipedia)
- Google FAQ о домене 1e100.net
- Запрос GGC-серверов, назначенных вашему IP
