Поднимите руки те, у кого есть номер телефона... Вау, лес рук! Но знаете ли вы, что скрывается за этим набором цифр?

Привет! Меня зовут Михаил и я уже больше 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 все равно пригодился, о чем расскажу ниже.

Авторство: Maximilian Dörrbecker. Собственная работа на основе: World Map Blank.svg, CC BY-SA 2.0
Авторство: Maximilian Dörrbecker. Собственная работа на основе: World Map Blank.svg, CC BY-SA 2.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):

  • 0 — звонок внутри страны

  • 00  для выхода на межгород

Таких кодов куда больше, так как какого-то стандарта или спецификации нет, только справочная информация. Более того, каждый оператор связи в стране и каждый администратор самой мелкой АТС компании может придумать свои коды и никто ему не помешает.

fdfb8319-1b84-492e-890a-8c601ff7755b

Ок, с зоной и страной определились. Направление звонка пользователь нам тоже рассказал (введя код направления или не введя, если хочет позвонить на соседнюю улицу). Но это только часть, что скрывается в самом номере?

Дальше прям совсем локальная специфика и если вам она важна, то придется разбираться с каждой страной и вникать в правила набора. Как и с кодами выхода, эта та же справочная информация, но уже с нормализацией внутри страны в разрезе оператора связи.

Справочники можно собрать из различных источников, благо меняются они редко. Есть например библиотека от google libphonenumber (демо на JS), есть данные в Wiki,  есть официальные выгрузки планов нумерации, такие как Мин. связи РФ

Локальная история

Заглянем в план нумерации России:

  • код страны +7

  • внутренний код вызова 8

  • выход на международное направление 810

  • максимальная длина номера 10 (считается без кода страны)

На текущий момент есть 2 вида нумерации в ТфОП РФ:

  • Географически привязанные номера (ABC)

5b36a11c-f62c-4eb7-a86a-005e236ae986
  • Без привязки к географии (DEF)

2856dbcb-b83a-4e60-bc95-ccd613d9e9d6

По географии вслед за кодом страны идет код региона (3 цифры), а после него от 0 до 2 цифр код для городов. Хотя само "Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации" определяет только код региона и диапазоны номеров которые туда входят с привязкой к географии. На сайте Министерства связи есть открытые данные, которые они периодически обновляют и для организации актуальных справочников можно делать выгрузку к себе.

Получается, что любой российский номер можно разобрать забрав с конца 7 цифр и затем еще 3 кода региона. Этих данных достаточно, чтобы узнать оператора и географическое расположение, проверив вхождение в диапозон плана нумерации.

Зачем же тогда код города? Опять таки для нормализации. Получив на вход 123-45, можем оперировать только тем, где находится АТС и дополнить номер кодом города, региона и страны, таким образом получить полный номер для звонка.

А еще для красивого форматирования на сайте, расставляя скобочки и пробелы где нужно.

Для выхода на международное направление

7e0fccbc-b137-437b-940e-d82f53b75f56

С развитием сотовой связи зоновая принадлежность сошла на нет, стало не важно где находится номер и даже страна - это условность. А когда пришли к тому, что номер - это собственность не только телефонной компании, а вся жизнь человека, то разрешили менять оператора не меняя номер телефона, хотя технически привязка к оператору остается. Поэтому в DEF вместо кода региона указывается код определяющий оператора, так что по тому же справочнику Мин. связи можно сделать выгрузку и понять кому принадлежит номер. Сотовые операторы зачастую также не просят от пользователя кода направления, определяя его необходимость по коду страны.

Как же оператор понимает куда звонить, если я уехал на море, включив роуминг оставаясь на номере своей страны? Тут уже и начинается вся та маршрутизация и коммутация, про которую говорили в самом начале.

Закрепим на примере

1c0c4e6f-fd41-45d1-8753-87deb0d96139

Василий из России нашел номер телефона любимой компании в интернете, скопировал как есть и решил позвонить "+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

1d9ee90d-c90d-40aa-9afc-417cb1edf017

Итак, звоним...

- Алло.
- Привет! Как дела?

Комментарии (15)


  1. acordell
    03.08.2023 07:10
    +1

    Спасибо, полезно! А есть все-таки хоть какая-то разница как хранить телефоны в контактах с +7 начинающийся или просто с 8?


    1. ksupipr Автор
      03.08.2023 07:10

      Лучше хранить по стандарту с 7ки. А дальше уже форматировать пользователю как удобно, заменяя внутренним кодом для России выводя с 8ки.

      Мы делаем именно так. Форматирование реализовали через шаблоны и эти шаблоны можно отдать на выбор пользователя, мол как хочешь видеть или у прикладников в продукте/разделе как по макету.

      Про вывод номера это прям объемная история, если интересно, могу расписать точки зрения и существующие стандарты вывода.


    1. AWRDev
      03.08.2023 07:10
      +2

      Я так понимаю, 8 - это пережиток советских времен и ранней России, когда через "восьмёрку" выходили на межгород.

      За пределами РФ мне кажется, если позвонить через номер, начинающийся с 8, операторы не поймут куда звонить и либо скажут, что номер неправильный, либо позвонят по +8 дядюшке Ляо ну или найдут локальный номер, если получится


      1. ksupipr Автор
        03.08.2023 07:10

        Она и сейчас обязательна на стационарных телефонах, но да, это пошло из советского плана нумерации и до сих пор тянется в странах СНГ.


        1. Vapaamies
          03.08.2023 07:10
          +1

          Не тянется. Многие страны СНГ как раз перешли на 0/00. Вполне возможно, что только Россия, Казахстан и Белоруссия остались на советской системе.


    1. Tarakanator
      03.08.2023 07:10
      +3

      лучше с +7
      1)если вы будете в другой стране, то звонки вам будут точно приходить с +7, а не 8 номеров.
      2)не всё ПО корректно работает с 8. К примеру у меня на смартчасах не определялись звонящие, если они записаны были с 8.
      3)если вы за границей, то через 8 уже не позвонить, приходится руками править сохранённые номера.


    1. alexxz
      03.08.2023 07:10
      +1

      Лучше +7. Внутри страны разницы нет, а вот при звонке с сим-карты другой страны, приходится все равно делать +7


    1. Alex_Tver
      03.08.2023 07:10
      +3

      Некоторые СМС шлюзы не отправляют сообщения на номера без кода региона. СМС уйдет, деньги с вас возьмут, доставлена она никогда не будет.


  1. Altaev
    03.08.2023 07:10

    Если не ошибаюсь, Мск с 095 на 495 мигрировали для большего соответствия международным, хм, рекомендациям?


  1. DikSoft
    03.08.2023 07:10

    А тут как быть при автоматическом парсинге?

    +7-999-123-45-67:
    +7 = ex.USSR , "big region"
    999 = Megafon ?
    или
    9 = страна, 99 - один из кодов страны ?

    +7-777-123-45-67
    +7 = ex.USSR , "big region"
    777 = Bee-Line KZ ?
    или
    7 = страна, 77 - один из кодов страны ?


    1. ksupipr Автор
      03.08.2023 07:10

      Для ex.USSR делали справочник с расширенными кодами

      Условно туда попал Казахстан в виде кода 76 и 77, как-то так

      "77": { code: "7", alpha_2: "KZ"... }

      Тогда можем искать от больших последовательностей символов кода, например 777 - нету, 77 есть, берем словарь, достаем "code"

      С Североамериканским планом нумерации та же история, там все с 1, хотя полно стран. Так что берем код 1 и складываем с зоновым кодом, получаем точное попадание по большим последовательностям и по ним достаем инфу из словаря

      Ну а когда нашли страну, то по alpha_2 находим справочник с данными по конкретному плану нумерации.


    1. Didimus
      03.08.2023 07:10

      Определять оператора по префиксу не получится, уже ведь доступен перенос номера


      1. ksupipr Автор
        03.08.2023 07:10

        В выгрузке россвязи где-то раз в месяц можно пытаться, а так да, максимум определение того, что это мобильный.


  1. xaosxaos2
    03.08.2023 07:10

    Нда порой понапишут, да вы сейчас можете в телефоне (не стационаре) набрать не 810, а просто +1.... если надо позвонить в америку. 810 это осталось с эпохи СССР на АТС. У меня даже по России все номера через E/164 +7... записаны. Потому-что если записать просто 9.... можно неожиданно в грузию позвонить


    1. ksupipr Автор
      03.08.2023 07:10

      Все можно, но на АТС все равно нужно понять, разобрать и дополнить при необходимости.