Для многих задач задержки между клиентом сервером критически важны нап

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
Для многих задач задержки между клиентом и сервером критически важны, например в онлайн играх, видео/голосовых конференциях, IP телефонии, VPN и т.д. Если сервер будет слишком удален от клиента на уровне IP-сети, то задержки (в народе "пинг", "лаг") будут мешать работе.
Географическая близость сервера не всегда равна близости на уровне IP маршрутизации. Так например сервер в другой стране может быть "ближе" к вам, чем сервер в вашем городе. Все из-за особенностей маршрутизации и построения сетей.
Как выбрать сервер максимально близкий ко всем потенциальным клиентам? Что такое связность IP-сетей? Как направить клиента на ближайший сервер? Разберемся в статье.
<cut />
<h2>Измеряем задержки</h2>
Для начала научимся измерять задержки. Эта задача не так проста как может показаться, потому что для разных протоколов и размеров пакета задержки могут отличаться. Также можно не заметить кратковременные явления, например провалы продолжительностью в несколько миллисекунд.
<h2>ICMP — обычный ping</h2>
Будем использовать юниксовую утилиту ping, она позволяет вручную установить интервалы между посылками пакетов, чего не умеет версия ping для windows. Это важно, потому что если паузы между пакетами долгие, можно просто не увидеть что происходит между ними.
<b>Размер пакета</b> (опция -s) — по умолчанию утилиты ping посылает пакеты размером 64 байта. С такими маленькими пакетами могут быть не заметны явления проявляющиеся с большими пакетами, поэтому мы будет устанавливать размер пакета 1300 байт.
<b>Интервал между пакетами</b> (опция -i) — время между посылками данных. По умолчанию пакеты посылаются раз в секунду, это очень долго, реальные программы шлют сотни и тысячи пакетов в секунду, поэтому установим интервал 0.1 секунду. Меньше просто не разрешает программа.
В итоге команда выглядит так:
<source>
ping -s 1300 -i 0.1 yandex.ru
</source>
Такая конструкция позволяет увидеть более реалистичную картину задержек.
<h2>Пинг по UDP и TCP</h2>
В некоторых случаях, TCP-подключения обрабатываются не так как ICMP пакеты и из-за этого замеры могут отличаться в зависимости от протокола. Также часто бывает, что хост просто не отвечает на ICMP и обычный пинг не работает. Так, например, всю жизнь делает хост <b>microsoft.com</b>.
Утилита <a href="https://nmap.org/nping/">nping</a> от разработчиков знаменитого сканера nmap умеет генерировать любые пакеты. Ее можно использовать в том числе для измерения задержек.
Так как UDP и TCP работают на определенных, нам нужно "пинговать" конкретный порт. Попробуем пропинговать TCP 80, то есть порт веб-сервера:
<source>
$ sudo nping --tcp -p 80 --delay 0.1 -c 0 microsoft.com
Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2020-04-30 13:07 MSK
SENT (0.0078s) TCP 10.0.0.1:63236 > 13.77.161.179:80 S ttl=64 id=49156 iplen=40 seq=3401731188 win=1480
SENT (0.1099s) TCP 10.0.0.1:63236 > 13.77.161.179:80 S ttl=64 id=49156 iplen=40 seq=3401731188 win=1480
RCVD (0.2068s) TCP 13.77.161.179:80 > 10.0.0.1:63236 SA ttl=43 id=0 iplen=44 seq=1480267007 win=64240 <mss 1440>
SENT (0.2107s) TCP 10.0.0.1:63236 > 13.77.161.179:80 S ttl=64 id=49156 iplen=40 seq=3401731188 win=1480
RCVD (0.3046s) TCP 13.77.161.179:80 > 10.0.0.1:63236 SA ttl=43 id=0 iplen=44 seq=1480267007 win=64240 <mss 1440>
SENT (0.3122s) TCP 10.0.0.1:63236 > 13.77.161.179:80 S ttl=64 id=49156 iplen=40 seq=3401731188 win=1480
RCVD (0.4247s) TCP 13.77.161.179:80 > 10.0.0.1:63236 SA ttl=42 id=0 iplen=44 seq=2876862274 win=64240 <mss 1398>
Max rtt: 112.572ms | Min rtt: 93.866ms | Avg rtt: 101.093ms
Raw packets sent: 4 (160B) | Rcvd: 3 (132B) | Lost: 1 (25.00%)
Nping done: 1 IP address pinged in 0.43 seconds
</source>
По умолчанию nping посылает 4 пакета и останавливается. Опция <b>-c 0</b> включает бесконечную посылку пакетов, чтобы остановить программу, нужно нажать Ctrl+C. В конце будет показана статистика. Видимо что среднее значение rtt (round-trip time) равно 101мс.
<h2>MTR — traceroute на стеройдах</h2>
Программа <a href="https://www.bitwizard.nl/mtr/">MTR</a>(англ. My Traceroute) — продвинутая утилита для тарссировки маршрутов до удаленного хоста. В отличии от обычной системной утилиты traceroute (в windows это утилита tracert), умеет показывать задержки до каждого хоста в цепочке следования пакета. Также умеет трассировать маршруты не только по ICMP, но и по UDP и TCP.
<source lang="bash">$ sudo mtr microsoft.com</source>
<a href="https://habrastorage.org/webt/ym/dy/id/ymdyidxtjy3uqco5royohylfk6i.png"><img src="https://habrastorage.org/webt/ym/dy/id/ymdyidxtjy3uqco5royohylfk6i.png" /></a>
<font><sup>(Кликабельно) Интерфейс программы MTR. Запущенна трассировка маршрута до microsoft.com </sup></font>
MTR сразу показывает пинг до каждого хоста в цепочке, при том данные постоянно обновляются, пока программа запущена и можно видеть кратковременные изменения.
На скриншоте видно, что на узле №6 есть потери пакетов, но на самом деле это не совсем так, потому как некоторые маршрутизаторы могут просто отбрасывать пакеты с истекшим TTL и не возвращать ответ с ошибкой, поэтому данные о потерях пакетов тут можно игнорировать.
<h2>WiFi против кабеля</h2>
<img src="https://habrastorage.org/webt/rg/ut/ul/rgutulxuxjraddrqzzan1xvpkws.png" />
Эта тема не совсем относится к статье, но на мой взгляд очень важна в контексте задержек. Я очень люблю WiFi, но если у меня есть хоть малейшая возможность подключиться кабелем к интернету, я ею воспользуюсь. Также я всегда отговариваю людей использовать WiFi камеры.
Если вы играете в серьезные онлайн-шутеры, вещаете потоковое видео, торгуете на бирже: пожалуйста, используйте интернет по кабелю.
Вот наглядный тест для сравнения WiFi и кабельного подключения. Это ping до WiFi роутера, то есть еще даже не интернет.
<a href="https://habrastorage.org/webt/v5/nv/va/v5nvva7e1hwfakt4lucnahq9rfi.png"><img src="https://habrastorage.org/webt/v5/nv/va/v5nvva7e1hwfakt4lucnahq9rfi.png" alt="image"/></a>
<font><sup>(Кликабельно) Сравнение ping до WiFi роутера по кабелю и по WiFi</sup></font>
Видно, что по WiFi задержки больше на 1мс и иногда бывают пакеты с задержками в десять раз больше! И это только короткий отрезок времени. При этом тот же самый роутер выдает стабильные задержки <1мс.
В примере выше используется WiFi 802.11n на 2.4GHz, к точке доступа по WiFi подключен только ноутбук и телефон. Если бы на точке доступа было больше клиентов, результаты были бы сильно хуже. Именно поэтому я так против перевода всех офисных компьютеров на WiFi если есть возможность дотянуться до них кабелем.
<h2>IP связность</h2>
Итак мы научились измерять задержки до сервера, попробуем найти ближайший сервер к нам. Для этого можем посмотреть как устроена маршрутизация у нашего провайдера. Для этого удобно использовать сервис https://bgp.he.net/
<img src="https://habrastorage.org/webt/8n/yi/yp/8nyiyp-unvpxvw7wlex_1tuxbs8.png" />
При заходе на сайт видим, что наш IP-адрес принадлежит автономной системе <a href="https://bgp.he.net/AS42610">AS42610</a>.
Посмотрев на граф связности автономным систем, можем увидеть через каких вышестоящих провайдеров наш провайдер связан с остальным миром. Каждая из точек кликабельна, можно зайти и почитать что это за провайдер.
<img src="https://habrastorage.org/webt/ch/kx/zx/chkxzx30am1a2hm5eu9ktmnq9nu.png" />
<font><sup>Граф связности автономных систем провайдера</sup></font>
Используя этот инструмент можно изучить как устроены каналы любого провайдера, в том числе и хостинга. Посмотреть к каким провайдерам он подключен напрямую. Для этого нужно вбить в поиск bgp.he.net IP-адрес сервера и посмотреть на граф его автономной системы. Также можно понять как один датацентр или хостинг-провайдер связан с другим.
Большинство точек обмена обмена трафиком предоставляет специальный инструмент называемый looking glass, позволяющий выполнить ping и traceroute со стороны конкретного роутера на точке обмена.
Вот например, looking glass от МГТС http://lg.mtu.ru/cgi-bin/lgform_img.cgi
Так, выбирая сервер, мы можем заранее посмотреть как он будет выглядеть с разных точек обмена трафиком. И если наши потенциальные клиенты находятся в определенной географической зоне, мы можем найти оптимальную локацию для сервера.
<h2>Anycast</h2>
<font color=red>Андрей про anycast</font>
<h2>Выбираем ближайший сервер</h2>
Мы решили упростить процедуру поиска оптимального сервера для наших клиентов и сделали страницу с автоматическим тестом ближайших локаций: <a href="https://ruvds.com/ru-rub/data/rus">датацентры RU-VDS</a>.
При заходе на страницу скрипт измеряет задержки от вашего браузера до каждого сервера и отображает их на интерактивной карте. При клике на датацентр показывается информация с результатами тестов.
<img src="https://habrastorage.org/webt/o2/fm/p5/o2fmp5f93v5cz4-4llyammapenc.png" />