Как работает международный роуминг
В этой статье я расскажу о том, как работает услуга международный роуминг и как проходит звонок и SMS при нахождении в роуминге. Расшифровки аббревиатур можно прочитать в этой статье.
Об услуге
Роуминг – услуга, позволяющая абонентам совершать вызовы, пользоваться услугой передачи данных, пользоваться другими услугами, предоставляемыми оператором, находясь в сетях других операторов, в том числе и зарубежных, с которыми оператор абонента имеет роуминг-соглашение. При этом номер телефона абонента остаётся неизменным.
Национальный роуминг – это возможность пользоваться услугами «чужой» сети в пределах одной страны.
Международный роуминг – это возможность пользоваться услугами мобильной сети зарубежного оператора, с которыми имеется соглашение. В статье будет описываться именно этот тип роуминга.
Авторизация

Первое действие, которое происходит при попытки зарегистрироваться в сети зарубежного партнера, – это проверка абонента на «валидность». Этим занимается VLR/MSC, в зоне действия которого находится MS. После того как гостевой VLR/MSC получит команду «Location Update» от MS, зная IMSI абонента, по MAP отправляет сообщение «Send Authentication Info» на HLR; он же в свою очередь проверяет, что MS и полученный IMSI действительны. Если проверка прошла успешно и абонент является «валидным», HLR отправляет IMSI в AUC. AUС генерирует триплет (SRES, RAND, Kc) и отправляет его в HLR, затем HLR отправляет эти данные на VLR/MSC, который обслуживает MS. После того как VLR/MSC получил эти данные, VLR/MSC посылает RAND на MS. Получив запрос RAND, MS подставляет полученный RAND и Ki(записан на SIM карте) и вычисляет SRES, который отправляет в VLR/MSC. Если SRES, полученный от MS, совпадает со SRES, полученным от AUC, тогда MS считается авторизованный.
Update Location

После того как VLC/MSC авторизовал MS, он отправляет на домашний HLR сообщение «Update Location». Это сообщение отправляется для того, чтобы HRL знал, в зоне действия какого VLR/MSC находится абонент. Сообщение «Update Location» содержит в себе IMSI абонента и GT VLR/MSC. HLR, получив данные, проверит, подключена ли услуга роуминг. Если у абонента нет запрета, то HLR удалит профиль абонента с того VLR/MSC, где был абонент зарегистрирован до этой процедуры, отправив сообщение «Cancel Location». Также HLR с помощью сообщения «Insert Subscriber Data» пересылает профиль абонента на запросивший эту информацию VLC/MSC. После того как VLR/MSC получит эту информацию, «Update location» будет закончено, и HLR сохранит у себя в профиле абонента адрес VLR/MSC, запросившего Update location. На данном этапе «Update Location» закончен. При поступлении вызова или SMS HLR знает, какому VLR/MSC отправить его.
После этих процедур абонент считается зарегистрированным в сети, т.е. он может совершать и принимать вызовы, SMS, пользоваться другими доступными услугами. Рассмотрим подробней процедуры входящего и исходящего вызова.
Входящий вызов

От абонента А поступает вызов на абонента Б, который находится в роуминге. Абонент А набирает номер абонента А (MSISDN). Если это вызов с городской сети, то сообщение IAM подсистемы ISUP поступит на GMSC, далее GMSC определяет адрес HLR исходя из полученного MSISDN и отправляет сообщение «sendRoutingInfo» по протоколу MAP на HLR. HLR, получив MSISND, определяет IMSI абонента Б, а также, в каком VLR/MSC находится абонент. Далее HLR отправляет на VLR/MSC сообщение «ProvideRoamingNumber» по протоколу MAP в котором содержится IMSI абонента Б. Сообщение «ProvideRoamingNumber» служит для запроса временного номера MSRN из пула номеров, зарегистрированных на VLR/MSC. MSRN имеет формат (GT) той страны, в которой находится VLR/MSC, обслуживающий абонента. MSRN выдаётся на время установления вызова, затем снова попадает в пул номеров MSRN.
После того как MSRN был выделен, он отправляется на HLR; HLR в свою очередь отправляет этот MSRN на GMSC. GMSC маршрутизирует этот вызов по MSRN до VLR/MSC, обслуживающий абонента Б, отправляя сообщение IAM подсистемы ISUP на выделенный MSRN.
В статье процедура пейджинга и установления вызова по ISUP рассматриваться не будет.
Исходящий вызов
Абонент А, находясь в роуминге, звонит Абоненту Б. При исходящем вызове первым делом происходят процедуры Авторизация и Update Location, описанные выше. Первым делом VLR/MSC, в котором зарегистрирован абонент А, отправляет сообщение «sendRoutingInfo» (в котором содержится MSISDN вызывающего абонента Б) на GMSC. GMSC, в свою очередь, по ISUP отправляет IAM на номер MSISDN. Если MSISND принадлежит проводной сети, то вызов идет на обслуживающий данный абонентский номер АТС. Если же MSISDN принадлежит сотовому оператору, то сообщение IAM идет на GMSC абонента Б. Далее GMSC отправляет запрос «sendRoutingInfo» в HLR для того, чтобы узнать адрес VLR/MSC, обслуживающий абонента Б, и его IMSI. После того как HLR предоставил эту информацию, GMSC отправляет IAM на этот VLR/MSC.
Исходящее SMS
Абонент А, находясь в роуминге, отправляет SMS на абонента Б. После того как VLR/MSC получил сообщение от абонента, передает его через SCCP провайдера на SMSC домашней сети через GMSC. SMSC отправляет сообщение «sendRoutingInfoForSM» на HLR абонента Б, после чего HLR отвечает адресом VLR/MSC (в зоне действия которого находится абонент Б) и IMSI смс-центру. Далее SMSC отправляет сообщение «forwardSM» на VLR/MSC абонента Б.
Входящее SMS
Абонент А отправляет SMS абоненту Б, который находится в роуминге. Принцип аналогичен тому, что описан при исходящем сообщении. От SMSC абонента А через SCCP провайдера поступает сообщение «sendRoutingInfoForSM» на GMSC, а затем на VLR/MSC, в зоне которого находится абонент Б. После этого VLR/MSC отвечает IMSI и своим адресом. После этой процедуры от SMSC абонента А поступает сообщение «forwardSM». VLR/MSC, получив это сообщение, делает попытку доставки сообщения абонента. Если сообщение доставлено, VLR/MSC отвечает «forwardSM END».
Home Routing
При «хоумрутинге» HLR выдает фиктивный IMSI и адрес VLR/MSC. SMS поступает на виртуальный MSC, а затем уже виртуальный MSC передает SMS на реальный MSC.
Монетизация A2P SMS трафика
Недобросовестные агрегаторы используют различные серые маршруты и SIM-боксы для снижения себестоимости доставки коммерческих SMS-сообщений. Такие действия могут приносить мобильным операторам значительные убытки.
Выявляйте серые маршруты
Платформа позволяет оператору определить, в каких случаях SMS-агрегатор пытается избежать оплаты за терминацию A2P сообщений и направляет их по «серым» маршрутам, например:
в межоператорском обмене сообщениями через операторов-партнеров с использованием P2P;
в международном трафике, замаскированном под местный при помощи локальных агрегаторов.
Находите SIM- боксы
С помощью SIM карт с дешевыми сообщениями SMS-агрегаторы выдают A2P-трафик за P2P от обычных абонентов. Решение автоматически блокирует сообщения с SIM-боксов и предоставляет исторические данные для борьбы с фродом.
Противодействие мошенничеству
- Для рассылки SMS через сторонние сети операторы вынуждены предоставлять идентификаторы абонентов и их местонахождение. Это небезопасно, так как открывает возможности для SS7-атак, таких как отслеживание местоположения абонента, перехват SMS и голосовых звонков.
Функция SMS Home routing позволяет операторам доставлять сообщения из сторонних сетей и не раскрывать при этом идентификаторы собственных абонентов.
Правила и условия рассылки
Домашняя маршрутизация SMS — это изменение, внесенное в исходную спецификацию GSM. Домашняя маршрутизация позволяет мобильным сетям предлагать полный спектр передовых услуг как для входящих, так и для исходящих SMS-сообщений. Это изменение предоставляет функциональные возможности пользователям мобильных телефонов и дает операторам мобильной связи возможность получать дополнительный доход. Он использует Регистр домашнего местоположения (HLR) для изменения потока входящих сообщений вне сети (сообщений, которые исходят не из домашней сети), направляя их на маршрутизатор SMS, а не прямо на целевые телефоны. Там перед доставкой сообщений могут быть применены расширенные сервисы, такие как переадресация, копирование, архивирование и защита от нежелательной почты.
Роутинг на основе атрибутов в приложении ASP.NET Core MVC

Прежде чем разбираться с маршрутизацией атрибутов в приложении ASP.NET Core MVC, давайте сначала внесем некоторые изменения в наше приложение. Сначала измените метод Configure() файла Startup.cs , как показано ниже. Мы используем метод UseMvc() без передачи шаблона маршрута по умолчанию в качестве параметра.
public class Startup < public void ConfigureServices(IServiceCollection services) < services.AddMvc(); >public void Configure(IApplicationBuilder app, IHostingEnvironment env) < app.UseMvc(); >>
С учетом вышеуказанных изменений в методе Configure теперь у нашего приложения нет настроенных маршрутов для обработки запроса и ответа.
Теперь отредактируем HomeController , как показано ниже.
public class HomeController : Controller < public string Index() < return "Index() Action Method of HomeController"; >>
Теперь, когда вы перейдете по любому из приведенных ниже URL-адресов, вы получите 404 ошибки. Это связано с тем, что в настоящее время в нашем приложении нет настроенного маршрута для обработки запроса.
http://localhost:5000 http://localhost:5000/home http://localhost:5000/home/index
Давайте посмотрим, как использовать роутинг на основе атрибутов для сопоставления входящих URL-адресов с методом действия Index контроллера HomeController .
Маршрутизация атрибутов в ASP.NET Core MVC:
С помощью ASP.NET Core Attribute Routing вы можете использовать атрибут Route для определения маршрутов для вашего приложения. Вы можете использовать атрибут Route либо на уровне контроллера, либо на уровне методов действия контроллера. Когда вы применяете атрибут Route на уровне контроллера, он применим ко всем методам действий этого контроллера.
Давайте отредактируем HomeController , как показано ниже. Здесь мы применили атрибут Route к методу Action.
using Microsoft.AspNetCore.Mvc; namespace FirstCoreMVCApplication.Controllers < public class HomeController : Controller < [Route("")] [Route("Home")] [Route("Home/Index")] public string Index() < return "Index() Action Method of HomeController"; >> >
Если вы заметили, здесь мы применили атрибут Route() три раза к методу действия Index() контроллера HomeController . Необходимо помнить, что для каждого экземпляра атрибута Route мы указывали свой шаблон маршрута. С указанными выше тремя атрибутами Route теперь мы можем получить доступ к методу действия Index() контроллера HomeController , используя URL-адреса, указанные ниже.
http://localhost:5000 http://localhost:5000/home http://localhost:5000/home/index
Теперь запустите приложение и перейдите по вышеуказанным URL-адресам, и вы увидите ожидаемый результат.
Маршрутизация атрибутов с параметрами в приложении ASP.NET Core MVC:
С помощью маршрутизации на основе соглашений (Conventional-Based routing) мы можем указать параметры маршрута как часть шаблона маршрута. Мы также можем сделать то же самое с маршрутизации на основе атрибутов (Attribute-Based routing). Это означает, что мы также можем определить атрибут маршрута с параметрами. Чтобы проверить это, измените HomeController , как показано ниже.
using Microsoft.AspNetCore.Mvc; namespace FirstCoreMVCApplication.Controllers < public class HomeController : Controller < [Route("")] [Route("Home")] [Route("Home/Index")] public string Index() < return "Index() Action Method of HomeController"; >[Route("Home/Details/")] public string Details(int id) < return "Details() Action Method of HomeController, ID Value = " + id; >> >
Как видно из приведенного выше кода, метод действия Details() имеет параметр id . Обратите внимание, что в шаблоне маршрута мы также указали параметр i . Таким образом, URL /Home/Details/10 выполнит метод действия Details(int id) и передаст значение 10 в параметр id метода действия Details . Это делается с помощью процесса связывания моделей. Теперь запустите приложение и перейдите по указанному ниже URL-адресу, и вы увидите ожидаемый результат.
Маршрутизация атрибутов с необязательными параметрами в приложении ASP.NET Core MVC:
Как и в случае с маршрутизации на основе соглашений, мы также можем сделать параметр необязательным в маршрутизации на основе атрибутов. Чтобы сделать параметр Route необязательным, просто добавьте знак вопроса ? В конце параметра.
using Microsoft.AspNetCore.Mvc; namespace FirstCoreMVCApplication.Controllers < public class HomeController : Controller < [Route("")] [Route("Home")] [Route("Home/Index")] public string Index() < return "Index() Action Method of HomeController"; >[Route("Home/Details/")] public string Details(int id) < return "Details() Action Method of HomeController, ID Value = " + id; >> > Теперь запустите приложение и перейдите по указанному ниже URL, и вы увидите ожидаемый результат, вместо ошибки 404.
Именование контроллеров и методов действий в маршрутизации атрибутов:
При использовании маршрутизации на основе атрибутов в приложении ASP.NET Core MVC имена контроллеров и методов действий не играют большой роли. Чтобы понять это, измените HomeController , как показано ниже.
using Microsoft.AspNetCore.Mvc;s namespace FirstCoreMVCApplication.Controllers < public class HomeController : Controller < [Route("")] [Route("MyHome")] [Route("MyHome/Index")] public string StartPage() < return "StartPage() Action Method of HomeController"; >> >
Как видите, мы трижды указали атрибут Route у метода действия StartPage() контроллера HomeController . Таким образом, метод действия StartPage() будет выполняться для следующих 3-х URL-адресов.
/ /MyHome /MyHome/Index
Роутинг на основе атрибутов на уровне контроллера:
В приложении ASP.NET Core MVC также возможно применить атрибут Route() к классу Controller , а также к отдельным методам действий. Если вы хотите сделать атрибут маршрутизации менее повторяющимся, то вам нужно использовать атрибуты маршрута на уровне контроллера, а также на уровне отдельных методов действий. Чтобы в этом убедиться отредактируем класс HomeController , как показано ниже.
using Microsoft.AspNetCore.Mvc; namespace FirstCoreMVCApplication.Controllers < public class HomeController : Controller < [Route("")] [Route("Home")] [Route("Home/Index")] public string Index() < return "Index() Action Method of HomeController"; >[Route("Home/Details/")] public string Details(int id) < return "Details() Action Method of HomeController, ID Value = " + id; >> >
С помощью приведенного выше кода мы можем получить доступ к методу действия Index() , используя следующие 3 URL-адреса.
/ /Home /Home/Index
В той же строке мы также можем получить доступ к методу действия Details(int? Id) , используя следующие 2 URL.
/Home/Details /Home/Details/2
Если вы заметили, мы используем слово Home несколько раз (в нашем примере четыре раза). Чтобы не дублировать эти маршруты, нам нужно применить атрибут Route() со словом Home на уровне класса HomeController , как показано ниже.
using Microsoft.AspNetCore.Mvc; namespace FirstCoreMVCApplication.Controllers < [Route("Home")] public class HomeController : Controller < [Route("")] [Route("Index")] public string Index() < return "Index() Action Method of HomeController"; >[Route("Details/")] public string Details(int id) < return "Details() Action Method of HomeController, ID Value = " + id; >> >
Примечание. Шаблон маршрута, применяемый на уровне контроллера, добавляется к шаблону маршрута, применяемому к уровню метода действия.
Теперь, при переходе по следующим четырем URL-адресам, вы получите ожидаемый результат.
/Home /Home/Index /Home/Details /Home/Details/2
Однако при переходе к корневому URL-адресу http://localhost:5000 приложения вы получите ошибку 404. Чтобы решить эту проблему, необходимо включить шаблон маршрута, который начинается с / , в метод действия Index() , как показано ниже.
[Route("")] [Route("/")] [Route("Index")] public string Index()
После внесения вышеуказанных изменений запустите приложение и перейдите по корневому URL-адресу, чтобы увидеть ожидаемый результат.
Как игнорировать шаблон маршрута, размещенный на уровне контроллера?
Чтобы игнорировать шаблон маршрута, размещенный на уровне контроллера, необходимо использовать / или ~/ на уровне метода действия.
Если шаблон маршрута метода действия начинается с / или ~/ тогда шаблон маршрута контроллера не будет объединен с шаблоном маршрута метода действия.
Чтобы проверить это, изменим класс HomeController , как показано ниже. В следующем коде метод действия About начинается с ~/ поэтому этот метод действия не будет сочетаться с шаблоном маршрута контроллера.
[Route("Home")] public class HomeController : Controller < [Route("~/About")] public string About() < return "About() Action Method of HomeController"; >>
Теперь запустите приложение и перейдите по ссылке /About , и вы увидите ожидаемый результат.