Kodomo

Пользователь

Компьютерные сети

Предупреждение. Я рассказываю только некоторый небольшой срез существующих технологий – тот, с которым, как мне кажется, больше всего приходится общаться мне. (На нынешнем уровне бесчинства технологии я не уверен даже в том, чем я на самом деле пользуюсь, а чем нет). И я рассказываю только самую суть, но даже далеко не все полезные свойства про каждый из протоколов и программ, о которых поведу речь. Частично ради краткости, частично ради того, чтобы не вешать вам лапшу на уши.

Протокол и вложенность протоколов

FIXME

Стеки протоколов TCP/IP и ISO/OSI

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

Вместо того, чтобы навязывать всем один комплект протоколов (и, соответственно, заставлять всех покупать кучу дорогого оборудования), создатели интернета договорились добавить ещё несколько протоколов, которые бы отвечали за задачи передачи данных между разнородными сетями – таким образом, единственное новое оборудование, которое потребовалось, было маршрутизаторами, которые соединяли несколько разнородных сетей (и, разумеется, новые каналы связи). (Вдобавок, для того, чтобы пользоваться интернетом, участникам нужно было добавить в их системы поддержку новых протоколов, но так как с точки зрения существующих сетей они были лишь данными, котороые эти сети несли, то править нужно было только операционные системы, что снова не столь большая проблема).

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

Таким образом сложилась четырёхуровневая модель устройства интернета:

  1. Протоколы канального уровня (link layer) – те самые древние сети, которые объединялись в Интернет – для каждого из них было характерным иметь одну среду передачи данных и как-то решали задачу доставки данных от одного компьютера к другому (иногда очень хорошо, с гарантией доставки, с гарантией правильной последовательности байт и т.п.; иногда очень плохо – с некоторой вероятность некоторые пакеты данных могут быть доставлены)

  2. Протокол сетевого уровня (network layer) – был представлен единственным протоколом IP – он отвечает за то, чтобы доставить пакет от одного компьютера к другому, возможно перебрасывая его по очереди из одной сети в другую

  3. Протоколы транспортного уровня (transport layer) – был представлен протоколами TCP (в первую очередь) и UDP – они решают (или декларативно не решают) задачу гарантии качества доставки: чтобы когда мы отправили какую-нибудь длинную последовательность байт с одной стороны, мы получили бы ту же самую последовательность байт с другой стороны

  4. Протоколы прикладного уровня (application layer) – таким именем называли всё, что использует TCP или UDP

Параллельно для стандартизации в ISO (international standards organization) разрабатывалась теоретическая идеальная модель того, как должен был бы быть интернет, если бы его сделали правильно. К сожалению, пока что интернет не пришёл к такой же модели (поэтому всякий сетевой программист вынужден каждый раз изобретать примерно одинаковые велосипеды, чтобы сделать её из имеющегося устройства интернета; впрочем, некоторые из сложившихся подходов вполне могут в ближайшем будущем стать стандартами). Эта модель выглядит так:

  1. Физический уровень (physical layer) – спецификация того, как должна быть устроена среда передачи данных (например, провод) и как в ней представляется бит

  2. Канальный уровень (data link layer) – когда к одной среде подсоединяется несколько компьютеров, как нам с нашего компьютера доставить данные до заданного, и ещё, как связать несколько кусочков среды через коммутатор

  3. Сетевой уровень (network layer) – отвечает за маршрутизацию между компьютерами, которые подключены к разным локальным сетям (которые связаны между собой), т.е. решает задачу маршрутизации, используя для собственно передачи данных на каждом участке пути соответствующий протокол канального уровня

  4. Транспортный уровень (transport layer) – отвечает за организацию потока байт между двумя компьютерами в интернете (т.е. организует надёжную передачу данных на ненадёжной среде, которой служит протокол сетевого уровня)

  5. Сеансовый уровень (session layer) – отвечает за понятие "сеанса" – т.е. за отслеживание одного диалога одного пользователя с одной стороны и одного экземпляра сервиса с другой – например, он может решать задачи авторизации, управления правами доступа, восстановления состояния случайно прерванного сеанса

  6. Уровень представления (presentaion layer) – отвечает за то, каким образом передаваемые данные представляются в виде последовательностей байт1.

  7. Прикладной уровень (application layer) – отвечает за решение задачи нашего конкретного приложения, какой бы она ни была.

Несмотря на то, что модель ISO/OSI далека от действительности, мне будет удобнее рассказывать о том, как устроен интернет с её точки зрения.

Физический уровень

Физический уровень сейчас представлен в первую очередь тремя носителями: металл (чаще всего – витая пара), оптоволокно и воздух. Иногда в качестве носителя физического уровня используется телефонная линия (модемы и *DSL).

Витая пара (twisted pair).

Основная идея очень простая: четыре пары пары скрученных друг с другом проводов. Даже у такой простой идеи есть много свойств, которые стандартизуют и описывают: как избегать индукции шума с соседних проводов, как избегать образования ощутимого эха сигнала (насколько провода можно сгибать, как соединять несколько проводов), как должен быть устроен разъём для проводов (какой провод соответствует какому пину и какой пин с одной стороны соответствует какому пину с другой), на каких частотах сигнала в проводе не образуется недопустимого уровня помех (чем выше частота, тем выше индуктивное сопротивление – т.е. больше сигнала уходит наружу в виде радиоволны, чем остаётся в проводе в виде тока), как избежать помех от внешних источников, для чего рассчитан провод (для работы внутри этажа, где на него могут случайно поставить стул, где его могут затянуть несколькими узлами – или для работы между этажей, где главное, чтобы провод не растянулся и не порвался под собственным весом). Наконец, частично в спецификации витой пары (а частично в описании протокола, который её испльзует – ethernet) говорится о том, как в ней будет кодироваться сигнал. В ethernet (10BASE-T, 100BASE-T, 1000BASE-T – слово BASE обозначает baseband modulation) сигнал на витой паре как правило кодируется Манчестерским кодом, т.е. 0 и 1 обозначаются не наличием/отсутствием сигнала в линии, а перепадом сигнала в заданной временной рамке.

Оптоволокно (fiberoptics).

Основная идея тоже довольно простая: если мы делаем среду с довольно высоким коэффициентом преломления и достаточно хорошей пропускной способностью для света, то по такой среде мы можем легко передавать сигнал. Со светом нет проблем с наведением сигнала на соседние жилы. Оптоволокно невозможно незаметно подслушать. Включать-выключать свет мы можем почти с любой мыслимой частотой – при этом не возникает индуктивных эффектов. Чем тоньше жила, тем на большее расстояние мы можем передавать сигнал с заданной частотой – т.к. тем под меньшим диапазоном углов лучи будут отражаться. Но тем уже пучок и тем быстрее он затухает. Лучше использовать когеррентный свет (т.к. у него скорость прохождения будет одинаковая и пучок не расширяется). Обычно в отправителе используют светодиоды, а в получателе фотодиоды. С другой стороны, есть много сложностей: жила очень хрупкая, её нельзя изгибать по радиусу меньше порядка полуметра (иначе нарушается полное внутреннее отражение и сигнал теряется вовсе) – поэтому жилы собирают восьмёрками и запихивают в толстый резиновый чехол, очень похожий на силовые кабели; сегменты оптоволокна очень тяжело соединить вместе так, чтобы на соединении не терялся сигнал (обычно для этого волокна сплавляют вместе; при этом их нужно выравнивать с очень большой точностью – порядка мкм); один метр оптоволокна стоит существенно дороже одного метра витой пары. Поэтому оптоволокно используют на участках, где нужно передавать очень большие объёмы данных: на магистралях, между городами, между странами.

Радиоволны (часто используется сокращение RF -- radio frequences).

Основные идеи всем более-менее понятны из названия. С радиоволнами есть много проблем:

Канальный уровень

Ethernet.

Ethernet – это общее имя нескольким протоколам, которые чаще всего используются для локальных сетей. Сейчас чаще всего в качестве физического уровня для ethernet используется витая пара, при этом каждый компьютер соединяется отдельным проводом с концентратором.

Изначально в качестве среды для ethernet использовался коаксиальный кабель, который позволяет к одному проводу подключать несколько компьютеров. Поэтому ethernet рассматривает среду, в которой он организован, как широковещательную. Само слово ethernet – ether net – обозначает "эфирная сеть". Основная идея ethernet такая: когда один из компьютеров хочет что-нибудь сообщить другому, он кричит своё сообщение в эфир, это сообщение слышат все компьютеры в сети, но смотрят, кому сообщение адресовано, и игнорируют чужие сообщения.

Основная проблема в ethernet в том, что несколько компьютеров могут одновременно начать говорить: в этом случае скорее всего по кусочку от каждого сообщения все получат, и ещё все получат много мусора, но все получат в разных пропорциях кусочки сообщений (до разных мест успеют дойти разные куски), и никто не получит сообщения целиком. Это событие называется коллизией. Чтобы коллизии не повторялись, оба отправителя обязаны подождать случайное время (диапазон, из которого выбирается случайное время ожидания, увеличивается экспоненциально в зависимости от номера попытки) и, если линия свободна, попытаться послать сообщение снова.

Из-за этого алгоритма реальная пропускная способность сети очень сильно падает в зависимости от количества активно передающих данные компьютеров в ней. Когда почти весь трафик в сети занят передачей одного длинного файла от одного компьютера к другому, скорость передачи может быть близка к теоретической (всё же она будет ниже из-за кучи вспомогательной информации, которая будет передаваться), но если одновременно два компьютера пытаются передавать длинные файлы, то скорость передачи данных у каждого будет не половиной теоретической, а в разы ниже.

С коллизиями есть одна важная деталь. Предположим, мы хотим передать фрейм длиной 100 бит (такой короткий-короткий фрейм). И предположим, мы используем сеть со скоростью передачи 1 Гбит/с, тогда длительность нашего фрейма окажется 100 / 109 с = 10-7 секунд. Сигнал в проводе идёт примерно со скоростью света: 300000 км/с = 3*108 м/с. Таким образом получается, что наше сообщение имеет длину 10-7 * 3*108 м = 3*10 метров, т.е. 30 метров. Получается, что если в нашей сети стоит три компьютера, между соседними двумя рассторяние 30 метров, при этом первый и последний отправляют сообщение одновременно, то первый и последний компьютеры получат сообщения друг друга чисто и без помех, а компьютер посередине услышит только шум. Поэтому в каждом стандарте Ethernet фиксируют скорость передачи данных, минимальную длину сообщения и максимальнюу длину провода таким образом, чтобы сообщение всегда было длиннее провода – в таком случае мы будем уверены, что либо коллизию услышит и отправитель тоже (рано или поздно), либо коллизия не случится ни у кого.

Каждый компьютер в ethernet идентифицируется уникальным MAC-адресом (media access control address). MAC-адрес – это 48-битное (т.е. 6 байтное) число. У каждого компьютера в пределах локальной сети должен быть уникальный MAC-адрес (иначе два компьютера будут выглядеть как один). Чтобы пользователи не должны были сами настраивать таким образом адреса, производители оборудования и стандартизующая организация IEEE договорились производить сетевые карты таким образом, чтобы у каждой сетевой карты в мире был уникальный MAC-адрес. Для этого MAC-адрес поделили пополам и сказали, что верхние 24 бита – идентификатор производителя, а нижние 24 бита – это серийный номер сетевой карты у производителя. Разумеется, так как некоторые производители произвели или намерены произвести больше 224 = 16млн сетевых карт, то некоторым производителям выдают больше одного идентификатора.

Наконец, к задачам ethernet относится и задача определения, какую полезную нагрузку несёт фрейм. ethernet-фрейм устроен самым простым образом, чтобы решать все эти задачи; он состоит из:

Более точное описание стандарта легко находится, например на сайте Cisco.

Разных вариаций ethernet бывает много, наиболее заметные из них: 10BASE-T, 100BASE-T, 1000BASE-T и 10000BASE-T – это описания протокола ethernet поверх витой пары (буква T) с кодированием сигнала напряжением на проводе (слово BASE – сокращение от baseband, т.е., отсутствие модуляции) с разной максимальной частотой передачи данных – 10Mbit, 100Mbit, 1Gbit, 10Gbit соответственно. В них кроме обычных фреймов, есть ещё специальные фреймы autonegotiation (автоматического проведения переговоров) для выбора, какой из этих протоколов использовать.

Ещё одна разновидность ethernet, которую можно встретить, например, в институте Белозерского – это VLAN. Идея состоит в том, что на некоторых участках сети данные из нескольких разных локальных сетей идут по одному и тому же физическому носителю. Чтобы их различать, в сердину фрейма добавляется идентификатор локальной сети. (Такой фрейм перестаёт быть ethenet-фреймом и если его случайно услышит сетевая карточка компьютера, она его выбросит как шум). По разным концам vlan стоят маршрутизаторы, которые знают, на каких портах у них какая локальная сетка и првевращают фреймы обратно в обычные ethernet-фреймы.

Изначально ethernet проектировался для использования с коаксиальным кабелем, который рассчитан на то, что к одной среде подсоединяется несколько компьютеров. Сейчас ethernet используют с витой парой, а витая пара рассчитана на соединение point-to-point – т.е. только пары устройств. Для того, чтобы вернуть ethernet поверх витой пары широковещательные свойства стали применять концентраторы (hub) – это устройство, в которое втыкается несколько витых пар, которое каждый полученный фрейм с каждого порта ретранслируют на каждый воткнутый в него провод.

Это очень примитивные устройства, поэтому они очень дешёвые, но, как я писал в самом начале, за счёт широковещательности у ethernet сильно падает производительность. Поэтому концентраторы стали делать умнее: они стали разбирать, с какими обратными адресами приходят к ним фреймы и по этому признаку запоминать, на каких проводах к ним подсоединены какие компьютеры, и ретранслировать фреймы только туда, где они знают, что есть адресат – либо, если они не знают, где адресат, всё-таки ретранслировать фрейм всем. Такие более умные концентраторы стали называть коммутаторами (switch).

И концентраторы, и коммутаторы могут объединять не только несколько компьютеров в одну локальную сеть, но и несколько локальных сетей, снова в одну локальную сеть, всё по тому же принципу.

Некоторые люди стали даже считать, что коммутатор добавляет к ethernet защиту от подслушивания. (Ведь раньше каждый мог настроить свою сетевую карточку таким образом, чтобы она принимала и чужие фреймы тоже, а с коммутатором он будет получать только свои и широковещательные фреймы). На самом деле, это не так, и коммутатор тоже довольно легко обмануть: для каждого порта на нём хранится ограниченное количество MAC-адресов, и если с этого порта начинают приходить фреймы с большего количества MAC-адресов, то коммутатор начинает считать, что по этому проводу он подсоединён к большой ethernet-подсетке, и начинает ретранслировать туда всё, для чего он не знает адресата. Этот приём применяется для подслушивания в ethernet. (От этого приёма тоже есть защита: на некоторых коммутаторах выделяют один или два гнезда "uplink", и для всех остальных гнёзд считают, что на них может обитать не более одного компьютера).

graph bilink {
    rankdir=LR;
    node [shape=record];

    subgraph subnet1 {
        rank=source;
        n1A [label="computer A"];
        n1B [label="computer B"];
        n1C [label="computer C"];
    }
    subgraph cluster_switch1 {
        label="Switch 1";
        s1p1 [label="1"];
        s1p2 [label="2"];
        s1p3 [label="3"];
        s1p4 [label="4"];
        s1p5 [label="5"];
    }
    subgraph cluster_switch2 {
        label="Switch 2";
        s2p1 [label="1"];
        s2p2 [label="2"];
        s2p3 [label="3"];
        s2p4 [label="4"];
        s2p5 [label="5"];
    }
    subgraph subnet2 {
        rank=sink;
        n2X [label="computer X"];
        n2Y [label="computer Y"];
        n2Z [label="computer Z"];
    }

    n1A -- s1p1;
    n1B -- s1p2;
    n1C -- s1p3;
    n2X -- s2p1;
    n2Y -- s2p2;
    n2Z -- s2p3;
    s1p4 -- s2p4;
    s1p5 -- s2p5;
}

Ещё одна забавная ситуация может случиться, если две локальных сети соединить друг с другом двумя каналами между двумя свитчами. (См. схему). FIXME: в этом случае легко проследить, что любой пакет, посланный из одной сети в другую, будет до бесконечности ретранслироваться каждым из свитчей, тем самым полностью забивая сеть и делая её неработоспособной.

Для защиты от этой проблемы придумали протокол STP (spanning tree protocol) – достаточно умный коммутатор может прежде, чем заниматься своими прямыми обязанностями, опросить, какие свитчи доступны через каждое из гнёзд, построить граф связей в локальной сети, выбрать из него какое-нибудь покрывающее дерево и, соответственно, в ситуации дублирующих маршрутов выбирать всегда только один из двух. К сожалению, сейчас stp поддерживают не все, а только достаточно умные свитчи.

Как я уже говорил в начале разговора об ethernet, протокол подразумевает широковещательную среду, и сетевую карту можно настроить таким образом, чтобы она принимала все фреймы в сети, в том числе, и адресованные другим компьютерам. Этот режим сетевой карты называется promisous mode. В нём умеет работать довольно много разных программ, в основном, это либо снифферы (sniffer – от слова sniff – принюхиваться; сниффер – это программа, которая послушивает, что происходит в сети и выдаёт это в каком-нибудь виде пользователю), либо программы для сбора статистики. Наиболее показательная/интересная программа на эту тему – tcpdump.

FIXME: (упражнение на tcpdump)

WiFi

Ещё одно очень родственное семейство протоколов в народе именуется словом WiFi. Это протоколы для беспроводной связи.

Они очень похожи на ethernet (вплоть до того, что они используют такие же MAC адреса, которые раздаются из общего адресного пространства), к которому сверху прикручено много новых трудностей.

Основные трудности, с которыми вынуждены бороться в WiFi:

В wifi возникают новые понятия:

Wifi. FIXME:

Сандарт IEEE 802.11 довольно читаемый.

FIXME: Wimax & GSM/GPRS/Edge: соревнование за вход в систему, далее назначаются частоты и тайм-слоты, т.о. не бывает конфликтов (если все участники добросовестные)

FIXME: Wimax & GSM/GPRS/Edge – многоуровневые протоколы сами по себе, в каждом из их есть понятие точки доступа и точки выхода в интернет: несколько протоколов и зачастую странноватые схемы подключения отвечают за то, чтобы передавать данные между клиентом и точкой выхода в интернет. С точки зрения протокола IP вся эта инфраструктура служит канальным уровнем. Эти сложности нужны для того, чтобы вне зависимости от того, к какой точке вы присоединены, у вас был один и тот же IP-адрес, и, тем самым, переход от одной точки доступа к другой совершенно незаметен с пользовательской точки зрения. Wifi этим свойством не обладает.

graph routing {
 "access point 1" -- "gateway";
 "access point 2" -- "gateway";
 "access point 3" -- "gateway";
 "access point 4" -- "gateway";
 "client" -- "access point 2" [style=dotted];
}

Сетевой уровень

IP. FIXME:

IPv6:

Транспортный уровень

TCP. FIXME:

UDP. FIXME:

ICMP. FIXME:

Прикладные протоколы

FIXME:

DNS

FIXME:

SSH

FIXME:

DHCP/BOOTP

FIXME:

HTTP

FIXME:

NAT

FIXME:

Firewall

FIXME:

Настройка сети в Linux

FIXME:

Работа с сетью в Linux в командной строке

FIXME:

  1. На удивление, программисты очень любят много и повторно решать одну и ту же тупую и тривиальную задачу -- задачу сериализации -- как наши объекты/структуры/данные представить в виде потока байт из которого потом можно получить наши объекты обратно -- хотя эта задача была ещё в 80-м году прекрасно решена в SmallTalk или того раньше, в 57-м в Lisp. В интернете люди зачастую вместо того, чтобы использовать какой-нибудь существующий способ сериализации и сосредоточиться на решаемой задаче, изобретают новые протоколы и тратят время на возню с ними. (1)

  2. На лекции я говорил, что в конце фрейма идёт маркер конца. Оказывается, это неправда. (2)

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

  4. На самом деле, это очень грубое приближение; например, в режиме работы ad-hoc точек доступа нет. (4)