Чего хотят пользователи, нажимая цифры на телефоне?
Поднимите руки те, у кого есть номер телефона… Вау, лес рук! Но знаете ли вы, что скрывается за этим набором цифр?
Привет! Меня зовут Михаил и я уже больше 7 лет пытаюсь разобраться как же работает телефония.
Про особенности коммутации уже писали тут. В своей статье хочется разобраться, что стоит за набором цифр телефонного номера.
Перед нами возникла задача разобраться не только в Российских номерах, но и в остальных в мире. Понять их составляющие, чтобы правильно настраивать маршрутизацию вызовов и нормализовать номера перед набором.
Нам нужен план!
Телефонный план нумерации — система телефонных номеров, позволяющая пользователям телефонной сети совершать и принимать звонки, а также определять направление вызова и идентифицировать звонящего. План нумерации позволяет предоставить единый подход к набору телефонных номеров, доступный и понятный каждому участнику, а также позволяет правильно настраивать маршрутизацию вызовов специалистам, обслуживающим соответствующую телефонную сеть и коммутирующее оборудование.
По назначению, планы делятся на
внутренний — внутри организации
внешний — телефонные сети общего пользования (ТфОП оно же PSTN)
Если нас читают программисты, то это похоже на области видимости.
Локальные (внутренний план) — возможности использования одинаковых номеров внутри закрытой системы, в одной АТС компании. И глобальные (внешний план) — для адресации всех людей в мире.
К внутреннему плану вопросов нет, тут как придумали и настроили, так и будет. Зачастую, это номера от 1 до 4х цифр и правила определения простые. Условно, если номер <= 4 то звоним внутри, если > 4 то наружу. Хотя по мере увеличения компании возникнет потребность в более сложных правилах. Например, есть заводы с количеством работников равным населению города.
С внешним планом все сложнее.
Разделяй и властвуй
Исторически все развивалось по принципу YAGNI и это в целом правильно, так как зачем выдумывать что-то, если проблемы нет. Однако, с ростом пользователей телефонов встала потребность в какой-то стандартизации. Первыми об этом задумались провайдеры телефонной связи. Сначала, реализовали задуманное внутри себя (когда начали активно расширяться внутри стран), затем регионов, затем объединяясь в международные корпорации и консорциумы.
В итоге родилось куча разных вариантов нумерации, в каждой из стран мира.
На самом деле, все не так уж страшно, так как есть, например, Североамериканский план нумерации NANP (North American Numbering Plan), который включает в себя порядка 29 стран и островов.
Как в этом разобраться и работать слаженно? Объединиться экспертам и что-то придумать!
Так был создан сначала «Международный консультационный комитет по телефонии и телеграфии», а с активным развитием интернета (где тоже нужно как-то навести порядок в адресации сайтов и e-mail) комитет развился в «Сектор стандартизации электросвязи Международного союза электросвязи» или ITU (International Telecommunication Union)
Эти ребята собрали все до чего дотянулись. Долго смотрели, на то, что операторы уже наворотили и мудро пошли по принципу «работает — не трожь». Просто разделили все на зоны через коды.
Назвали их IDD (International Direct Dialing) или ISD (International Subscriber Dialing), в общем некий идентификатор, по которому можно понять с чем будем иметь дело.
Вы их отлично знаете в виде конструкции со знаком »+», например +7
Всего зон 10 (да-да, этого хватает 8 миллиардам людей)
Зоновое разделение
Зона 1 — Северная Америка. Вобрал в себя крупнейший Североамериканский план нумерации
Зона 2 — Африка
Зона 3 и 4 — Поделили страны Восточной и Западной Европы
Зона 5 — Южная Америка
Зона 6 — Австралия
Зона 7 — СССР. На тот момент крупное объединение территорий
Зона 8 и 9 — Азиатская часть Евразии. Зона 8 еще используется для спец резерва + для, например, номеров без тарификации известные многим как 8 800.
Зона 0 — предлагалось ее использовать для организации шлюза из сети передачи данных. Но ребята мудрые, так что решили ее оставить без использования, а 0 все равно пригодился, о чем расскажу ниже.
Итак, уже хорошо, разобрались с 1 цифрой.
1я цифра в номере — это Зона! Но вот только пользователи вводят номера далеко не по стандарту и совсем не в курсе всяких там комитетов.
Форматы номеров
Общепринятый (народный) — это внутренний формат страны то, как привыкли люди, а люди склонны максимально упрощать. Если мне нужно позвонить бабуле, то зачем мне все эти зоны и прочая ерунда? Я позвоню 12345
В рамках страны/региона, как уже говорилось, каждый сам за себя, типа тех же NANP, DIN 5008 (Deutsches Institut für Normung) или стран бывшего СССР в виде набора через 8ку
Международные. Вот тут уж если сунулся за пределы, будь любезен соблюдать E.123 и E.164 от все тех же ITU
В общем, это похоже на микросервисную архитектуру — внутри делай что хочешь, а снаружи соблюдай контракт.
Ну-ка давай уже к 1й цифре! У нас же есть соглашение в виде E.164.
Отлично! 1я — это зона кода страны, а весь номер состоит из
географически
глобальных служб
международный номер
и пр. Подробнее можно почитать в стандарте на Wiki Сами спеки можно скачать на сайте комитета
Итак, что мы можем понять про номер телефона:
длина максимум 15 цифр
код страны от 1 до 3х цифр (обязательная зона и дальше принадлежность страны)
Уже неплохо, зная зону и страну можно расписать специфические справочники нумерации внутри нее с такими данными как:
Максимальная длина телефонного номера, без кода страны (NSN — National Significant Number). Можем использовать для быстрой валидации номера страны (если больше, то что-то не то)
Внутренний код страны (National code). Используется для междугородней связи
Код для выхода на международное направление (International direct code)Специфику по странам можно найти тут
Изнутри наружу
Что еще за новые коды? Нужны они для того, чтобы дать понять оператору чего вы хотите. При наборе внутреннего кода позвонить по стране, при вроде кода выхода на международное направление — за ее пределы.
В международной практике для таких кодов часто используют систему Лидирующих нулей (Leading zero):
Таких кодов куда больше, так как какого-то стандарта или спецификации нет, только справочная информация. Более того, каждый оператор связи в стране и каждый администратор самой мелкой АТС компании может придумать свои коды и никто ему не помешает.
Ок, с зоной и страной определились. Направление звонка пользователь нам тоже рассказал (введя код направления или не введя, если хочет позвонить на соседнюю улицу). Но это только часть, что скрывается в самом номере?
Дальше прям совсем локальная специфика и если вам она важна, то придется разбираться с каждой страной и вникать в правила набора. Как и с кодами выхода, эта та же справочная информация, но уже с нормализацией внутри страны в разрезе оператора связи.
Справочники можно собрать из различных источников, благо меняются они редко. Есть например библиотека от google libphonenumber (демо на JS), есть данные в Wiki, есть официальные выгрузки планов нумерации, такие как Мин. связи РФ
Локальная история
Заглянем в план нумерации России:
— код страны +7
— внутренний код вызова 8
— выход на международное направление 810
— максимальная длина номера 10 (считается без кода страны)
На текущий момент есть 2 вида нумерации в ТфОП РФ:
По географии вслед за кодом страны идет код региона (3 цифры), а после него от 0 до 2 цифр код для городов. Хотя само «Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации» определяет только код региона и диапазоны номеров которые туда входят с привязкой к географии. На сайте Министерства связи есть открытые данные, которые они периодически обновляют и для организации актуальных справочников можно делать выгрузку к себе.
Получается, что любой российский номер можно разобрать забрав с конца 7 цифр и затем еще 3 кода региона. Этих данных достаточно, чтобы узнать оператора и географическое расположение, проверив вхождение в диапозон плана нумерации.
Зачем же тогда код города? Опять таки для нормализации. Получив на вход 123–45, можем оперировать только тем, где находится АТС и дополнить номер кодом города, региона и страны, таким образом получить полный номер для звонка.
А еще для красивого форматирования на сайте, расставляя скобочки и пробелы где нужно.
Для выхода на международное направление
С развитием сотовой связи зоновая принадлежность сошла на нет, стало не важно где находится номер и даже страна — это условность. А когда пришли к тому, что номер — это собственность не только телефонной компании, а вся жизнь человека, то разрешили менять оператора не меняя номер телефона, хотя технически привязка к оператору остается. Поэтому в DEF вместо кода региона указывается код определяющий оператора, так что по тому же справочнику Мин. связи можно сделать выгрузку и понять кому принадлежит номер. Сотовые операторы зачастую также не просят от пользователя кода направления, определяя его необходимость по коду страны.
Как же оператор понимает куда звонить, если я уехал на море, включив роуминг оставаясь на номере своей страны? Тут уже и начинается вся та маршрутизация и коммутация, про которую говорили в самом начале.
Закрепим на примере
Василий из России нашел номер телефона любимой компании в интернете, скопировал как есть и решил позвонить »+48 (22)519–69 00»
Для начала уберем все лишнее, получим 48225196900
Пробуем разобрать. Мы знаем что 1я цифра это зона, а вместе максимум 3 будет код страны. Расчехляем справочник стран, ищем 482, не находим, видимо нет такой страны, но код страны может быть и из 2х цифр, ок, убираем лишнюю и ищем 48. Оу, так это же Польша! Супер.
Отсекаем код, оставляя только номер, находим план нумерации Польши. Длина номера составляет максимум 9 цифр. Длина (225196900) == 9, прекрасно, можем идти дальше.
Вася в России, номер в Польше, нужно выходить наружу. Для этого берем план нумерации России, получаем оттуда код выхода на международное направление — 810.
Можем и дальше разобрать номер, получив зоновые коды Польши и понять, что 22 — это Варшава и внутренний номер который нужен Васе 519–69–00.
Набери Вася 519–69–00, то нам пришлось бы дополнить это региональным кодом и кодом страны АТС с которой он звонит и получился бы что-то вроде +7 347 519–69–00.
Но Вася сделал все правильно и в итоге получилось:
Выход на МП 810 + Код страны 48 + Код города 22 + Номер телефона 5196900 = 81048225196900
Итак, звоним…
— Алло.
— Привет! Как дела?