Как я перестал бояться и полюбил TCP/IP
Вы никогда не задумывались о том, что простой кусочек меди может показать вам все 250 фильмов из рейтинга IMDb за 10 минут, при этом не исказив ни одного кадра в этих картинах? Сам по себе Cuprum на это, конечно, не способен, для этого ему нужна щепотка магии, и вот про эту щепотку я вам сегодня расскажу. Если перенестись во времена SkyNet и провести аналогию между машиной и человеком, то сеть для компьютера выполняет ту же роль, что и язык для кожаных ублюдков. Разница только в том, что люди при помощи речи города строят, а SkyNet при помощи сетевых технологий их уничтожает.
С чего же все началось? Все началось в агентстве передовых исследовательских проектов aka ARPA. В разгар холодной войны ребята с западного побережья всерьез и надолго обеспокоились проблемой коммуникации их систем обороны в случае нападения боевых дельфинов и ядерных ударов с территории СССР. Для этого было решено создать сеть, которая будет устойчива к изменению своей топологии и в будущем позволит не забывать, как выглядят котята даже в случае ядерной войны. Так появилась ARPANET, первые испытания которой прошли 29 октября 1969 года в 21:00. Изначально она состояла из двух DDP-516 — первый находился в Калифорнийском университете, а второй — на расстоянии 600 км от него, в Стэнфордском университете. Что примечательно, уже тогда использовался IP, который и по сей день является основным протоколом передачи данных в этих ваших интернетах.
Так же стоит упомянуть NSFNet — эта сеть появилась в 1984, ее главной целью было объединить лучшие университеты США, а также упростить коммуникацию между ними. Впоследствии она станет крупнейшим Internet backbone начала 1990-ых.
Как же так получается, что СССР развалился, а эта сеть — нет? Весь секрет в двух принципах: строгом разделении функций между уровнями сетевых протоколов и оборачиваемости пакетов. Для того чтобы ARPAnet не повторила судьбу СССР, при ее разработке DARPA выделила набор уровней, каждый из которых отвечал за конкретную задачу. В итоге у них получился “слоеный пирог” из таких уровней, который они назвали сетевой моделью.
Дабы у нас с тобой, дорогой читатель, не вышел конфуз, стоит ясно понимать, что такое уровень, межуровневый интерфейс, протокол и стек протоколов. Уровень — это, дословно, уровень абстракции. Это может быть как физический уровень, который работает с данными как с электрическими сигналами, так и сетевой уровень, который решает проблемы межсетевого взаимодействия. Межуровневый интерфейс — это интерфейс взаимодействия между соседними уровнями, используемый для передачи данных между уровнями. Протокол — это набор правил, по которому происходит передача данных от передатчика к приемнику. На каждом уровне используется свой протокол, например TCP для транспортного уровня и HTTP для уровня приложения. Стек протоколов — это набор протоколов, который используется для передачи данных в сети, — иными словами, конкретная реализация сетевой модели.
После того, как с основными понятиями стало болиелимение понятно, осталось разобраться с тем, что такое оборачиваемость пакетов. Тут все просто: когда данные “погружаются” в стеке протоколов, к ним добавляется дополнительная мета-информация: TCP добавляет заголовок с информацией о размере TCP окна, а на физическом уровне — о начале кадра. Таким образом, пакет данных оборачивается дополнительной информацией на каждом уровне. Данный принцип используется не только в сетевых технологиях, но и, например, при передаче данных по любым шинам данных, например PCIe. Примером стека сетевых протоколов может послужить модель философ-переводчик-секретарь; так, 2 философа, владеющие разными языками, общаются между собой абсолютно свободно при помощи переводчика и секретаря.
Теперь, когда мы с вами понимаем принципы построения сетевых моделей, мы можем рассмотреть парочку из них — OSI и DOD aka TCP/IP. Модель OSI включает в себя 7 уровней: прикладной, уровень представления, сеансовый, транспортный, сетевой, канальный и физический уровни. В модели TCP/IP всего 4 уровня: прикладной, транспортный, сетевой и уровень доступа к сети. В TCP/IP отсутствуют сеансовый и уровень представления, к тому же канальный и физический уровни объединены в уровень доступа к сети. Модель OSI — это яркий пример проекта, созданного в очень академическом кругу, тогда как TCP/IP был разработан “в поле”. Многие уровни и концепции модели OSI оказались избыточными и громоздкими, тогда как TCP/IP покрывал все потребности межсетевого взаимодействия, оставаясь при этом довольно компактным. Так как модель OSI — это влажные фантазии ребят из ISO и в данный момент несет больше исторической ценности, чем практической, мы будем подробно рассматривать модель TCP/IP.
Как и все миллионеры из трущоб, мы начнем с низов, и первым делом рассмотрим нижний уровень модели TCP/IP — уровень доступа к сети. Этот уровень используется для физической передачи сигнала в сети. В приличном обществе на этом уровне используются технологии Ethernet. Название дословно переводится как “эфирная сеть”, так как в изначальном варианте Ethernet был очень похож на радиовещание: пакеты, которые попадали в сеть, принимались всеми остальными хостами сети. В качестве физического носителя сигнала используется разность потенциалов в двух медных проводниках. Эти проводники скручены друг с другом, что позволяет практически исключить влияние помех на передаваемый сигнал. Если происходит изменение потенциала из внешней среды, то этот потенциал изменяется одинаково в двух проводниках, соответственно, разница потенциалов остается неизменной. Всего существует 7 категорий кабелей Ethernet, и чем выше эта категория, тем больше витков на единицу длины имеет каждая пара. Оконечное оборудование соединяется при помощи разьема 8P8C (4 витых пары), который часто путают с RJ45, но RJ45 — это тип физического интерфейса, включающий в себя не только 8P8C, но и телефонный 4P4C (2 витых пары). Если вы не звоните, а звоните, то и Ethernet обжимайте 8P8C, а не RJ45. Также существует стандарт порядка проводов при обжимке (подключения кабеля к разьему 8P8C aka RJ45). Если изменить порядок проводов, то торренты скачиваться не перестанут, так как электроны еще не настолько развиты, чтобы обращать внимание на цвет изоляции. Для того чтобы устроить у себя дома локальный апокалипсис и анархию, можете поменять желтый и коричневый провод местами. Cамое главное правило, которое не стоит нарушать при обжимке, — соблюдать одинаковый порядок цветов на обоих концах провода.
Следующий пациент — сетевой уровень, бытовые пользователи сети используют его для вычисления местоположения и угроз, но на самом деле он необходим для определения пути передачи данных. На этом уровне используется Internet Protocol — межсетевой протокол. Сейчас активно используются 2 версии IP: жлобский IPv4 и луноподобный IPv6. Более подробно об их кишочках и отличительных особенностях поговорим позже. Итак, IP используется для адресации хостов в сети и определения маршрута передачи данных. Каждому хосту сети выдается IP-адрес, в IPv4 сетях этот адрес имеет размер 4 байта, а в IPv6 — царские 16 байт. Чтобы бедные человеки не вводили 128 бит при подключении платному серверу Counter-Strike 1.6, используется специальная номенклатура записи сетевых адресов. IPv4 адрес записывается в виде 4 десятичных чисел от 0 до 255, разделенных точкой — например 228.148.8.255. Для записи IPv6 используются 32 шестнадцатеричных числа от 0 до F, разделенных двоеточием — например 2001:DB8:0000:FFFF::1234. При записи IPv6 адресов есть 2 правила, которые помогут вам сохранить ментальное здоровье и не испытать на себе карательную психиатрию:
- Пропуск всех ведущих нулей в шестнадцатеричной записи. 0DB8 равносильно записи DB8.
- Двойное двоеточие (::) может заменить любую единую смежную строку одного или нескольких 16-битных сегментов (хекстетов), состоящих из нулей, но использовать эту магию в адресе можно только один раз.
Примеры записи неоднозначно сжатых адресов:2001:DB8::ABCD:0000:0000:12342001:DB8::ABCD:0000:0000:0000:12342001:DB8:0000:ABCD::12342001:DB8:0000:0000:ABCD::1234
IP-адрес содержит в себе адрес подсети и адрес хоста в этой подсети, а для разделения этой информации используется префикс или маска подсети. Префикс — это число, обозначающее количество бит для адресации подсети; к примеру, 192.168.0.1/16 означает, что первые 16 бит IP-адреса — это адрес подсети, а остальные биты — это адрес хоста в этой подсети. Маска подсети для этого префикса — 255.255.0.0, первые 16 бит в ней равны единицам; та же маска, но в двоичном виде — 11111111.11111111.00000000.00000000.
Теперь настало время поговорить о транспортном уровне, протоколы которого контролируют процесс передачи данных. На этом уровне всеми делишками заправляют TCP и UDP. Отличительная особенность TCP состоит в том, что он использует процесс трехкратного рукопожатия для установки соединения, а также требует подтверждения (acknowledges) после каждого получения пакета, вследствие чего TCP гарантирует доставку и правильную последовательность фрагментов данных. Он используется в качестве транспорта для таких протоколов, как HTTP, telnet и ssh. UDP, в свою очередь, не использует установку соединения и механизм подтверждения доставки, из-за чего скорость передачи по UDP намного выше. Он незаменим при потоковой передаче данных, так как потеря одного кадра не является ощутимой для пользователя. UDP используется для отправки broadcast сообщений, получателями которых являются все хосты в сети. Когда хост получает такое сообщение, он ретранслирует его на все свои интерфейсы. Eсли несколько хостов объединить в топологическое кольцо, то broadcast пакет будет передаваться по нему, бесконечно увеличивая нагрузку на сеть; такой вид атаки называется broadcast storm. Для увеличения скорости передачи по протоколу TCP используется весьма кошерная технология — TCP-окно. В каждом заголовке TCP-пакета содержится параметр window size, регулирующий количество пакетов, которое можно отправить без подтверждения. К примеру, если размер окна равен 10, то хост может отправить 10 пакетов без получения подтверждения; далее он ожидает подтверждения, и, как только его получит, он сможет передать в сеть следующий пакет. При слишком большом значении этого окна возрастает нагрузка на всю сеть, поэтому выбирать его нужно с умом (но лучше не выбирать).
Вот мы и добрались до самого кошерного уровня — уровня приложений. Он предназначен для обмена информацией непосредственно между приложениями. Данные на этом уровне могут представлять собой абсолютно любую информацию: как гипертекст, так и мультимедийные данные. Всеми любимый протокол HTTP используется для передачи гипертекста, в качестве транспорта он использует TCP. Каждый HTTP пакет имеет заголовок (тащемто там 4 вида заголовков), в котором хранятся полезные для жизни интернета байты. HTTP — это основной протокол работы этих ваших браузеров. Для разнообразия протокольной фауны поговорим о протоколе RTSP, который эксплуатируется для передачи потока мультимедийных данных. Заголовков в нем намного меньше и в качестве транспортного протокола он использует UDP, но архитектурно он является аналогом HTTP. Так же как и приложений, протоколов на этом уровне существет масса, тысячи их.
Вот собственно и все, дорогой читатель, можешь считать, что мы пронеслись на советском стратегическом бомбардировщике над этой мирной капиталистической страной компьютерных сетей. Если что-то осталось недостаточно ясным, не расстраивайся, обращайся к нашему общему другу.