- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF129:DrBrown3
Материал из Linuxformat.
Содержание |
Джонни-датаграмма
- Взгляд на Сеть глазами скромного запроса HTTP GET.
Познакомьтесь с Джонни. Он – датаграмма, и вот его история. Он уродился обычным пакетом HTTPзапроса, одним из тех, что в бессчетном количестве каждый день бесстрашно бороздят Интернет. Но он мог бы быть и STMPзапросом, и эхозапросом ICMP, и да же презренным сегментом TCP SYN. История отличалась бы ненамного.
Джонни возник в 13:34:07 в понедельник 14 декабря, когда Майк (реальный человек) щелкнул по ссылке в браузере, чтобы зайти на сайт Linux Format. Для получения webстраницы браузер Майка создал Джоннидатаграмму. При рождении он был длиной 522 байта. Начинался он с текста GET/HTTP/1.1, а заканчивался пустой строкой – так уж устроены HTTPзаголовки. Правду сказать, он весь состоял из заголовка при пустом теле, что, по мнению Джонни, было странновато, но браузер убедил его, что для HTTPзапроса GET это нормально. Создав пакет, браузер направил его в стек протокола TCP/IP на компьютере Майка с четкими инструкциями передать его на порт 80 компьютера с IPадресом 88.212.205.226.
Слой TCP на компьютере Майка взял Джоннидатаграмму и добавил к нему заголовок. С этим заголовком, с его важными полями, включая window size (размер окна) и sequence number (номер последовательности), и таинственными флагами с краткими именами SYN, PSH и FIN, Джонни приосанился. Но он чувствовал, что важнейшие поля в его TCPзаголовке – номера портов источника и получателя. Слой TCP казался озабоченным судьбой Джонни: он записал в своем блокноте, когда тот покинул компьютер. Джонни думал, как здорово быть частью протокола, основанного на соединениях, и жалел датаграммы протокола UDP без установки соединения, с их тщедушными заголовками, не стоящими внимания. Теперь Джонни стал длиной 554 байта. Он был уверен, что достаточно короток, чтобы по дороге его не разреза ли на части, и благодарил за это судьбу. При мысли о фрагментации, передаче и сборке на другом конце у него слезы на глаза наворачивались.
Время вышло
Ес ли бы Джонни мыслил четче, он понял бы, что при блокировке брандмауэром порта 80 на той стороне канала его бы вообще не отправили, потому что TCPсоединение не установилось бы. Но когда ты всего лишь маленькая датаграмма перед лицом забвения, четко мыслить тяжело.
Джонни передали на слой IP, который тут же добавил другой заголовок с IPадресами источника и получателя и какимто полем под названием time to live (время жизни), которое немного его встревожило. Джонни было всего несколько десятков микросекунд, а уже казалось, что дни его сочтены! Теперь он был длиной 574 байта.
Джонни гордился своими новыми яркими заголовками: ведь теперь достаточно было взглянуть на них, чтобы понять, куда он направляется. Он был благодарен за это – честно говоря, он не представлял, как самому это узнать, и ему на каждом шагу приходилось бы спрашивать, куда идти.
Слой IP передал Джонни дальше по стеку протоколов, где его обернули в кадр Ethernet, готовый для передачи по локальной сети на шлюз по умолчанию. В этом кадре были Ethernetадреса источника и получателя, каждый по 6 байт, так что теперь Джонни достиг 588 байт и заметно отяжелел. Сам процесс передачи был довольно странным: в каждый момент времени передавался только один бит, и Джонни не мог засечь свое пребывание «в проводах»: все больше и больше его оказывалось на получателе и все меньше и меньше на источнике.
Потом Джонни угодил в ADSLмаршрутизатор Майка. Его Ethernetкадр был разобран, и, к ужасу Джонни, маршрутизатор затеял менять адрес источника в его IPзаголовке и порт источника в TCPзаголовке. Маршрутизатор отверг его протесты: «Прости, приятель, – скорбно сказал он, – но ты пришел с частного IPадреса, и выпускать тебя в Интернет в таком виде против правил. Боюсь, что ты немаршрутизируемый». Потом Джонни снова обернули для передачи по ADSLсоединению на первый из нескольких маршрутизаторов интернетпровайдера Майка.
Все это шлюзование – разборка внешнего кадра, принятие решения о маршрутизации и обертка в кадр – повторялось снова и снова, и Джонни уже начал терять ему счет. Он заметил, что его время жизни, начавшееся с 64, постепенно уменьшается. Джонни подивился, что же будет, когда оно достигнет нуля. Из киберпространства появится ужасный цифровой чистильщик и утащит его в /dev/null? Это больно?
Блуждая по главным шлюзам Интернета, он заинтересовался, что такое «ориентированность TCPпротокола на соединения». Ни один из шлюзов, которых расспрашивал Джонни, ничего не знал о соединении, частью которого он был. «Не все тебе равно, – говорили они, – мы лишь направляем тебя, а потом навек о тебе забываем». Вообщето, пока он не достиг TCPслоя сервера Linux Format, «соединения» как такового не было. По крайней мере, кажется, его ждали. И правда, ему были так рады, что даже сразу отправили компьютеру Майка подтверждение, что Джонни успешно прибыл. TCPслой на конце Майка облегченно вздохнул и вычеркнул Джонни из списка. «Еще один добрался, босс», сказал он ядру.
Игра в ожидания
До прибытия в сетевой интерфейс получателя (webсервер Linux Format) Джонни пересек 15 маршрутизаторов, и его возраст был уже 74 мс – неплохо для датаграммы, думал он. Отсюда он вывел, что потратил менее миллисекунды на «движение», а остальные 73 просидел в очередях и буферах шлюзов – опыт, в миниатюре иллюстрирующий современный перелет на самолете. Но Джонни еще не достиг тихой гавани, и на входе в цепочку сетевого фильтра INPUT на webсервере Linux Format его посетило дурное предчувствие. Соответствует ли он правилу ACCEPT? Он был почти уверен, что политика по умолчанию будет DENY, потому что в очереди на отправку на компьютере Майка он наслушался грустных историй от обессиленных ICMPпакетов «порт недоступен», вернувшихся с поля битвы, про храбрых датаграмм, с трудом пробившихся сквозь бесчисленные шлюзы лишь затем, чтобы бесследно исчезнуть во входной очереди получателя. Проходя по цепочке INPUT, правило за правилом, без единого совпа дения, он уже начал отчаиваться. Тут правило с совпа дением сжа лилось над ним, и его пропустили по стеку дальше к получателю.
Слой IP ласково удалил IPзаголовок Джонни и передал его на слой TCP, а тот, удалив TCPзаголовок, обнажил исходный заголовок HTTPзапроса и направил Джонни к последнему получателю – порту 80. В этот момент Джонни наконец вспомнил, зачем пришел. Теперь он мог передать свой GETзапрос очень восприимчивому webсерверу Apache! «Хорошо, Джонни, – дружелюбно сказал сервер Apache, – я его беру...»
История Джонни близится к концу, но она отнюдь не единична. Он был не первой датаграммой, появившейся на свет, когда Майк щелкнул по ссылке Linux Format. Еще до того, как Джонни мог начать свое путешествие, для установки соединения уже были переданы запросы и ответы DNS, ARP и три TCPпакета. По сути, Джонни был одним из 52 пакетов HTTPзапроса GET, созданных просто для того, чтобы скачать домашнюю страницу Linux Format на компьютер Майка. Во время загрузки утилита перехвата пакетов Wireshark обнаружила в общей сложности более 1000 пакетов.
Вот такая жизнь Джоннидатаграммы. В следующий раз, щелкая по ссылке, подумайте о Джонни и его друзьях, путешествующих ради вас по киберпространству.
Зачем нужны слои?
С точки зрения администраторов Linux, в стеке протоколов существует четыре слоя.
Верхний – слой приложения; с ним взаимодействуют приложения клиента и сервера. Здесь на ходятся протоколы, исполняющие полезную работу: загрузку webстраниц, отправку электронной почты, поиск IPадресов, синхронизацию часов, удаленный вход в систему и т. д.
Под ним на ходятся транспортный слой и протоколы TCP и UDP. Они реализуют концепцию номеров портов, чтобы пакеты доставлялись в заданную транспортную конечную точку на компьютере – ту, которую слушает сервер получателя. В случае UDP (User Datagram Protocol – Протокол пользовательских датаграмм) это и все, что делает слой. UDP предоставляет сервис доставки по принципу «делаем как можем», и у него нет встроенного механизма проверки, доставлены пакеты или нет, или отправки пакетов заново при их утрате.
Протокол TCP (Transmission Control Protocol – Протокол управления передачей) гораздо сложнее. В дополнение к номерам портов, задающих конечную точку, в TCP используется схема подтверждения приема (квитирование) и повторная передача. Она гарантирует доставку, даже если нижележащий сетевой слой теряет пакеты. В TCP так же есть необычные механизмы регулирования потока данных по сети. TCP – «протокол, ориентированный на соединение», и использует для его установки три пакета, прежде чем начнет передавать какиелибо данные. Однако, как показал опыт Джонни, только две конечные точки чтото об этом знают. Обеспечение TCPсоединения не использует никаких ресурсов на промежуточных шлюзах.
Копаем глубже
Под транспортным слоем лежит сетевой слой и протокол IP. За дача у IP только одна: маршрутизировать пакеты через Интернет так, чтобы они достигли нужного компьютера. Он не работает с номерами портов и не имеет механизма для подтверждения передачи или ее повтора.
Под транспортным слоем скрываются десятки незаметных протоколов. Они заботятся о физической передаче потока битов с одного компьютера на другой. Здесь расположены семейства протоколов 802.3 (Ethernet) и 802.11 (WiFi). На этом уровне довольно сложная логика, но, к счастью, большинство системных администраторов общается с ним очень мало, разве что когда привязывают к проводам Ethernet веревки, чтобы протащить их через кабельканалы в офисе!