Фото, сделанное Йонгом во время его первого посещения Гентинга
Фото, сделанное Йонгом во время его первого посещения Гентинга

Цунами

Разное случается за рулеточным столом. Китайцы азартны. Они любят выигрывать и громко кричать. Они кладут монетку на стол с криком «Идзя!». А потом еще одну: «Идзя!». И еще две: «Идзя!». С десяток зевак, обступив стол со всех сторон, во все глаза. И пара напомаженных красоток пытаются придвинуться к кричащему поближе, чтобы продемонстировать свои прелести на тот случай, если тот выиграет. 

Китайцы любят казино, свободное место за столом сложно отыскать. Ставки от 10 ринггит на рулетке и от 50 на покерном столе. Завсегдатаи старательно записывают выпавшие числа. Бабушка восьмидесяти лет перебирает фишки влажными пальцами и ставит на зеро. Мимо. Рулетка французская, но лишена серий. Нет и "соседей". Ставки закрывают через 3-5 секунд после “спина”. Сложно постигнуть как тут можно выиграть! Но вот радостный женский возглас: "А-хахаха!!". Что ж кому-то повезло...

Таков Гентинг - город развлечений, китайско-малазийский курорт, где ни одного европейца. Хотя двое тут есть: клоун-акробат и продавщица воздушных шаров. Других не увидеть среди фешенебельных ресторанов: иная жизнь бурлит за кулисами, попасть за которые значит, как минимум, иметь “хорошие мозги”: разработка кодов, автоматизация процессов, резервирование сервисов, поддержка сетевой инфраструктуры - в общем все, что вырвалось как джин из бутылки, когда распаковали первые ящики с оборудованием. 

Это был период первого бума развития сетевых технологий в мире и Лим сделал ставку на совсем молодую тогда компанию, каким-то необъяснимым чутьем предвидя, что она станет крупным игроком на капиталистическом шаре Земли. 

На гору хлынул поток специалистов. И дело было не только в том, что они были крутыми специалистами с Запада, но и в том, что они были “белыми” специалистами, а значит, как считалось, не азартными. Лиму были нужны мозги, и мозги чистые, не одержимые блэк джеком, пятикарточным покером или “равными шансами”. Кроме того, европейцев здесь любили и хотели видеть за высокий рост и, в особенности, светлые, как пшено, волосы. Местные девушки не стеснялись подходить, трогать локоны и просить сфотографироваться. Благодаря одному такому “подходу” и появился на свет Тоби Йонг: чудный мальчик смешанных кровей от отца-голландца и матери-сингапурки китайского происхождения. 

Мальчика растили с любовью. Его нежные годы прошли в тихом уединении плавучей деревни Pulau Ketam в Малаккском проливе. Отец преподавал введение в Python даровитым выходцам малайских школ, что взял под свое крыло будущий гигант индустрии, в то время как мать занималась воспитанием маленького Тоби, охотясь за черными крабами во время отливов с сыном под руку.

Фото с google maps. Дом указан мной ориентировочно по памяти.
Фото с google maps. Дом указан мной ориентировочно по памяти.

Это милое уединение оборвало цунами 2004 года. 

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

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

Труженик

К моменту моего знакомства с Тоби он на постоянной основе работал в Гентинге: модернизировал и автоматизировал старое 100Mb/s Ethernet поколение и делал еще что-то, имеющее отношение к распознаванию лица, о чем нельзя было говорить открыто. Может быть, это было связано с теми мозговитыми игроками в блэкджек, которые оставляли без штанов казино по всему миру; но то были только мои - обывателя - предположения. Сам Тоби упомянул об этом только раз, но сразу затупился и не смог больше произнести ни слова, убоявшись разгласить коммерческую тайну.

Начальство его любило за полуевропейскую внешность, и уважало за труд. Его поселили в одном из номеров отеля, чтобы он не тратил время на дорогу из Куала-Лумпура и обратно. Первая же его поездка на работу сложилась из череды неприятных обстоятельств. Таксистом оказался индус на урчащем тарантасе. Как только он услышал куда его просят отвезти, он направил такси в сторону своего дома, чтобы подобрать жену, которая никогда не была в Гентинге. Затем он уговорил Тоби заехать в магазин часов его тестя и купить что-нибудь “по выгодной цене”. Даже на подъезде к Гентингу индус не унимался и научивал Тоби оставить под алтарем Chin Swee Caves Temple “какую-то” часть денег (и чем больше, тем лучше)  -  якобы на удачу. К счастью для юного программиста, тарантас заглох, не доехав даже до упомянутого алтаря. Тоби бросил индусу с его женой 100 ринггит, пересел на фуникулер, и наконец вздохнул свободно.

Еще одно фото сделанное Тоби Йонгом в его первую поездку в Гентинг
Еще одно фото сделанное Тоби Йонгом в его первую поездку в Гентинг

Будни для Тоби были однообразны. Поскольку он жил и работал в одном месте, то граница между одним и другим быстро размылась. 

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

Тоби стал появляться в игровом зале. Он находил местечко где-нибудь в дилерской зоне (в игровую зону он не имел права заходить) и наблюдал.

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

Другие были с достатком. Когда они подходили к столу, то “крестьяне” переставали играть. Он хорошо помнил одного мужчину с изумрудным перстнем на мизинце. Он бросил дилеру почти небрежно пачку в 10 тысяч ринггит и игра замерла. Он взял “цвет” и весь расставил его на поле. Ни одна из ставок не сыграла. Он сделал так снова. И снова ни одна из ставок не сыграла. Так продолжалось шесть или семь спинов, пока мужчина не достал из кармана другую пачку и тоже проиграл ее в течение двух-трех вращений шарика. 

Иногда он видел, как девушка, пришедшая в казино в первый раз, ставила на день своего рождения и выигрывала. Да, бывало и такое. 

Он наблюдал за игроками, которые ставили на “равные шансы” и проигрывали свои дома. Он видел как “черное” выпадало 16 раз подряд, в то время как бедолага каждый раз ставил на “красное” и удваивал ставку после очередного проигрыша в надежде вернуть потерянное.

Иногда и сам Тоби позволял себе поиграть вместе с ними, но делал это мысленно: он ставил воображаемые ставки, которые нередко выпадали - частое наблюдение за игрой вкупе с математическими способностями выработало в нем, как это называют, “чувство спина”. Он знал дилеров, он знал как они тасуют карты, как они закручивают шарик - он чувствовал этот пульс карт, рулеток, “шафлов”, как чувствуют подводное течение опытные пловцы в открытой воде. 

Наверное, жизнь Тоби Йонга могла продолжаться так какое-то время, может быть даже продолжительное. Его нельзя было назвать большим авантюристом, пока в игорный зал не вошла Ван Кенг.

“Этот краб будет черным, мама”

Шла последняя неделя перед Рамаданом, Гентинг был захлестнут туристами, жаждущих развлечений перед долгим постом. Ван Кенг просто была одной из них, ничем не примечательной молодой девушкой. 

В тот день Тоби много времени проводил за мониторами, тестируя дописанные им алгоритмы. Он поглядывал то на один, то на другой экраны, когда его взгляд остановился, а губы вопросительно прошептали одно слово. И если бы кто-то находился совсем рядом с ним в тот момент, то он услышал бы это слово: “Мама?”. 

Наши чувства редко поддаются логике, а печали детства оставляют глубокие рубцы на сердце. Нечто необъяснимое происходит с человеком, когда эти рубцы задевают. 

Пол под ногами Тоби размягчился до илистой зыбости и отпечатки босых ног его матери неясными следами вели прочь в игровой зал. 

Он захотел незамедлительно пойти по этим следами, увидеть свою “мать”, оказаться рядом с ней, взять ее за руку, как тогда давно, когда они гонялись за крабами во время отливов. И самое главное, он должен был сказать ей, что сожалеет, очень сожалеет, что не смог спасти ее от цунами будучи семилетним мальчиком, что не смог уберечь свою единственную маму: он хотел сказать ей все это, он хотел сказать ей “прости”.

Поднявшись со стула и уже направившись к двери, Тоби остановился, замер на какое-то время, затем вернулся к своему компьютеру и ввел несколько команд на клавиатуре, хлопнул по кнопке Enter и быстро вышел за дверь в игровой зал.

Он подошел к Ван Кенг как раз в тот момент, когда дилер запускал спин. Черное выпадало на тот момент 6 ряд подряд. Он не знал как заговорить с этой девушкой, поэтому он сказал ей то, в чем разбирался лучше всего:

- Этот краб будет черным, мама, - и переставил ее скромную фишку с красного поля в черное за секунду до закрытия ставок.

Тоби Йонг исчез так же стремительно, как и появился. 

Ван Кенг была поражена вмешательством незнакомого для нее человека, что не заметила как сыграла ее ставка. 

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

К концу дня Тоби Йонг был уволен.

Тоби-злодей

Тоби Йонг нарушил сразу три правила, за которые в респектабельной компании следует незамедлительное увольнение. Первое - это внутренний регламента: выйдя в игровую зону и передвинув фишки Ван Кенг, Тоби сделал себя “игроком”. Компания, как уже упоминалось, не терпела в своих рядах игроков. Второе - это саботаж: вернувшись к компьютеру и “введя несколько команд”, Тоби отключил интерфейс на коммутаторе распределения, что повлекло дергадацию сервиса для посетителей казино и, в целом, для инфраструктуры. При этом это было сделано намеренно - это слово “намеренно” было подчеркнуто в отчете, касательно увольнения Тоби Йонга. В нем также упоминалось, что такое действие, совершенное случайно в силу невнимательности или усталости, могло бы быть прощено, но не намеренное, что является внутреннем саботажем и целенаправленным действием против репутации компании. И, наконец, третье и может самое страшное - это сокрытие. 

Тоби не был большим знатоком основ сетевых технологий. Он был больше программистом. За те несколько секунд, что он стоял неподвижно, прежде чем войти в игровой зал, он воскрешал в памяти лекции по сценариям отказа изыбочных линков в Spanning Tree. Он вспомнил два из них, один из которых ему не подходил, а второй давал 52 секунды, при которых ни одна камера видеонаблюдения не работала бы в целом секторе. 

Тоби надеялся, что небольшой сбой никто не заметит, ведь это всего 52 секунды, а выключенный интерфейс не останется выключенным, потому что OPS сразу же включит его обратно и заметить это можно будет только изучая логи.

Примерная конфигурация OPS на коммутаторах Huawei CloudEngine
Примерная конфигурация OPS на коммутаторах Huawei CloudEngine

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

В тот момент, когда он передвигал фишки Ван Кенг, камера уже успела восстановиться: она засняла этот момент, узнала лицо Тоби, сгенерировала сообщение о нарушении и отправила данные “наверх”. Все произошло ровно так, как спроектировал сам Тоби Йонг и мог бы получить за это премию, если бы сам не стал виновником произошедшего.

Техническая часть

(В этом разделе приводится подробный разбор трех упомянутых сценариев.)

Есть три сценария развития событий, когда линк в STP выходит из строя, говоря про стандарт 802.1d. 

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

Первый из них самый нежный. Он нежный потому, что не затрагивает трафик, пульсирующий по остовному дереву. В этом сценарии, как на картинке сверху, линк между SW2 и SW3 выходит из строя. Порт Gi1/0/3 на SW2 Designated port (DP) и порт Gi1/0/2 на SW3 в blocking state. Поскольку Gi1/0/2 на SW3 уже находится в blocking state и, как следствие, нет трафика между двумя этими коммутаторами, то они оба отправляют данные через SW1. Оба и SW2 и SW3 отправят TCN (Topology change notification) по направлению к root коммутатору SW1, что приведет к обновлению их MAC address таблиц.

Второй сценарий, на который рассчитывал Тоби Йонг. В этом сценарии линк между SW1 и SW2 выходит из строя. Это затрагивает трафик, пульсирующий от SW1 или SW3 по направлению к SW2, потому что порт Gi1/0/2 на SW3 в blocking state.

Событие 1. SW1 обнаруживает отказ линка на его интерфейсе Gi1/0/1 и SW2 обнаруживает отказ линка на его интерфейсе Gi1/0/3.

Событие 2. В обычной ситуации SW1 сгенерировал бы TCN и отправил его через свой root port, но поскольку он является root bridge, он не может этого сделать.

SW2 удалит его лучшее BPDU, полученное от SW1 через порт Gi1/0/1, потому что теперь этот порт в состоянии down. В этой связи SW2 должен отправить TCN по направлению к root коммутатору, чтобы проинформировать его об изменении топологии, однако, его root порт, через который он мог бы это сделать, находится в состоянии down.

Событие 3. SW1 рассылает конфигурационное BPDU с Topology Change flag из всех своих портов. Это BPDU принимает SW3, но SW3 не может переслать его SW2, так как его порт Gi1/0/2 по-прежнему находится blocking state.

SW2 теперь считает себя root bridge и отправляет конфигурационное BPDUs.

Событие 4. SW3 получает конфигурационное BPDU с Topology Change flag от SW1. SW3 уменьшает MAC address age timer до значения forward delay (15 секунд), чтобы удалить старые MAC записи. SW3 получает от SW2 BPDU и отбрасывает его, так как он все еще получает превосходящее BPDU от SW1.

Событие 5. Max age timer на SW3 истекает и теперь порт Gi1/0/2 на SW3 переходит из blocking в listeting state. SW3 теперь может переслать к SW2 следующее конфигурационное BPDU, которое он получил от SW1.

Событие 6. SW2 получает конфигурационное BPDU от SW1 через SW3 и идентифицирует его как превосходящее. SW2 помечает свой интерфейс Gi1/0/3 как root port и переводит его в listeting state.

Итоговое время сходимости для SW2 составит 52 секунд: 20 секунд для Max Age timer на SW3, 2 секунды для конфигурационного BPDU от SW3, 15 секунд - listening state и 15 секунд - learning state.

Третий сценарий, который случился на самом деле. В нем выходит из строя линк между SW1 и SW3. Это сразу затрагивает трафик, пульсирующий от SW1 или SW2 по направлению к SW3, потому что порт Gi1/0/2 на SW3 в blocking state. Эта маленькая картинка ниже иллюстрирует ряд событий, который произойдут, чтобы стабилизировать вышедшую из строя STP топологию в этом сценарии:

Событие 1. SW1 обнаруживает отказ линка на его интерфейсе Gi1/0/3 и SW3 обнаруживает отказ линка на его интерфейсе Gi1/0/1.

Событие 2. В обычной ситуации SW1 сгенерировал бы TCN и отправил его через свой root port, но поскольку он является root bridge, он не может этого сделать.

SW3 удалит его лучшее BPDU, полученное от SW1 через порт Gi1/0/1, потому что теперь этоn порт в состоянии down. В этой связи SW3 должен отправить TCN по направлению к root коммутатору, чтобы проинформировать его об изменении топологии, однако, его root порт, через который он мог бы это сделать, находится в состоянии down.

Событие 3. SW1 рассылает конфигурационное BPDU с Topology Change flag из всех своих портов. Это BPDU будет разослано всем и будет принято всеми коммутаторами L2 домена.

Событие 4. SW2 и SW3 получат конфигурационное BPDU, содержащее Topology Change flag. Эти коммутаторы уменьшат MAC address age timer до значения forward delay (15 секунд), чтобы удалить старые MAC записи. SW2 не знает на этом этапе, что поменялось в топологии.

Событие 5. SW3 должен ждать пока он не “услышит” root bridge снова или истечет Max Age timer, прежде чем он сможет обновить статус порта и начать принимать BPDUs на его Gi1/0/2 интерфейс (который ранее находился в blocking state).

Итоговое время сходимости для SW3 составит 30 секунд: 15 секунд - listening state и 15 секунд - learning state прежде чем Gi1/0/2 на SW3 сможет принять роль PR (Root Port).

Послесловие

Тоби не разобрался с топологией STP, не проверил какие интерфейсы блокируются на коммутаторе, что было, впрочем, не единственной его ошибкой в тот день. Он летел на такси c вершины Гентинга с зажатым в руках конвертом на такой скорости, что закладывало уши: серпантин за серпантином, поворот за поворотом, как если бы это были годы его жизни. Он возвращался в прошлое, которым жил все это время - призраки прошлого были более живыми созданиями, чем реальность. “Призрак матери, призрак матери…” - бубнил он под нос, пока его телефон не зазвонил. Он поднял трубку, стараясь пересилить боль в ушах, и сказал “Алло?”. На другом конце ответил голос Ван Кенг: “Это вы подложили мне записку с номером телефона?”.

Через несколько лет я посетил Тоби Йонга. Он и Ван Кенг жили вместе - между ними что-то завязалось. Говорить об этом здесь неуместо. Могу сказать только то, что Тоби Йонг обещал себе никогда не посещать деревню, в которой он вырос, дабы не травить призраков прошлого. Его отец по-прежнему живет в ней, сейчас ему 65 лет.

Фото Тоби Йонга и Ван Кенг, сделанное мной после описанных здесь событий. Тоби Йонг пожелал не публиковать своего лица.
Фото Тоби Йонга и Ван Кенг, сделанное мной после описанных здесь событий. Тоби Йонг пожелал не публиковать своего лица.