TCP/IP в деталях


Теперь, когда у вас имеется некоторое представление о том, как работает сеть, я предлагаю подробнее рассмотреть реальный сетевой протокол. Доминирующим протоколом в Интернете является TCP/IP, или Transmission Control Protocol over Internet Protocol (протокол управления передачей данных, реализованный поверх межсетевого протокола). TCP — это транспортный протокол, тогда как IP — это сетевой протокол, но они настолько переплелись между собой, что обычно рассматриваются как единое целое. Мы начнем рассмотрение темы с протокола IP, а затем перейдем к TCP и UDP.

IP-адреса и сетевые маски

IP-адрес — это уникальное 32-битовое число, присвоенное конкретному узлу сети. Некоторые адреса остаются более или менее постоянными, как, например, адреса серверов в Интернете. Другие изменяются в зависимости от потребностей сети, как, например, IP-адреса, которые выдаются клиентам, подключающимся к Интернету по коммутируемым линиям связи. Отдельные машины в общедоступных сетях получают IP-адреса из непрерывного диапазона адресов.

Обычно IP-адреса рассматриваются не как 32-битовое число, а делятся на четыре группы по 8 бит в каждой, и записываются в виде десятичных чисел, разделенных точками. Хотя запись 192.168.1.1 — это то же самое, что и 11000000. 10101000.00000001.00000001, или число 11000000101010000000000100000001, тем не менее запись в виде четырех чисел воспринимать проще.

При подключении компании к Интернету провайдер выделяет ей блок IP-адресов. Как правило, этот блок невелик, скажем, 16 или 32 IP-адреса. Если речь идет о небольшой группе идентичных серверов, компания получит лишь несколько IP-адресов.

Сетевая маска определяет размер блока IP-адресов в локальной сети. Размер блока IP-адресов определяется сетевой маской, или, иначе говоря, сетевая маска определяет количество IP-адресов, имеющихся в вашем распоряжении. Если вы имеете давнее знакомство с сетями, вам наверняка приходилось встречаться с сетевой маской 255.255.255.0 и вы знаете, что она описывает блок из 256 IP-адресов. Кроме того, возможно, вы даже знаете, что неверная сетевая маска будет препятствовать нормальной работе системы в сети. Сейчас такие простые сетевые маски встречаются все реже и реже. Чтобы понять, в чем тут дело, необходимо погрузиться в историю IP-адресов. Много лет назад IP-адреса выделялись блоками трех размеров, соответствующих классу A, классу B и классу C. Со временем эта терминология устарела, но мы возьмем ее за основу.

Класс А был очень простым: первое из четырех чисел IP-адресов было фиксированным. Агентство по выпуску IP-адресов в обращение (в прошлом — InterNIC) могло выделить блок адресов класса А, скажем, 10.0.0.0. Оставшиеся три числа владелец мог назначать по своему усмотрению, при условии, что IP-адреса будут начинаться с 10. Например, адреса с 10.1.0.0 по 10.1.1.255 можно было выделить для информационного центра, адреса с 10.1.2.0 по 10.1.7.255 — для офиса в Детройте и т. д. Блоки адресов класса А получали только очень большие компании, такие как Ford и Xerox, а также влиятельные академические организации, связанные с компьютерными технологиями, такие как Массачусетский технологический институт (MIT). Просмотрев список первоначальных владельцев класса А, можно увидеть, что в основном это учебные заведения, имевшие большое влияние в 80-х годах прошлого века.

В блоках класса В фиксированными были первые два из четырех чисел, составляющих IP-адрес. Блок адресов класса В мог выглядеть, например, как 172.16.0.0. Каждый IP-адрес, использовавшийся во внутренней сети, начинался с 172.16, а по своему усмотрению можно было назначать последние два числа. Многие компании среднего размера получили блок адресов класса В.

Подобным образом в блоке класса С фиксированы первые три числа адреса. Обычно такие блоки получали маленькие компании. Провайдер услуг Интернета выделял номер, подобный 198.22.63.0, и предоставлял владельцу блока возможность назначать последнее число каждого адреса.

Такая схема приводила к растрачиванию IP-адресов. Многим мелким фирмам не нужны были 256 IP-адресов, а многие компании среднего размера занимали больше 256, но меньше 65 000 адресов в блоке класса В. И почти никому не требовались все 16 миллионов адресов из блока класса А. Однако было принято такое решение, и до бума Интернета такое положение всех устраивало. Тогда, в 80-х годах, дети хотели просто поиграть с компьютером, теперь же они мечтают о своем собственном сайте электронной коммерции. Это привело к увеличению потребности в IP-адресах.

Сегодня IP-адреса выделяются вместе с префиксной длиной (prefix length), значение которой отделяется от IP-адреса символом слэша (slash). Блок IP-адресов может выглядеть так: 192.168.1.128/25. Подобная запись может быть не очень понятной, но делает возможным более тонкое деление классов адресов. Известно, что каждое из четырех чисел в IP-адресе состоит из 8 бит. При использовании классов «фиксированным» считается определенное количество бит — их нельзя изменить в локальной сети. Адрес класса А имеет 8 фиксированных бит, класса В — 16 бит и класса С — 24 бита.

В приведенных примерах IP-адреса того или иного класса не были представлены в двоичной форме, и я не буду заставлять вас выполнять это преобразование. Однако под IP-адресом следует понимать строку из двоичных чисел. В адресах локальной сети можно изменить биты в правой части каждого адреса, но не биты в левой части. Единственный вопрос, который осталось выяснить: «Где проходит граница, которая отделяет правую и левую части?» Нет никаких причин, по которым длина каждой части адреса должна быть кратной 8. Префиксная длина — это просто некоторое количество фиксированных битов. Запись /25 означает, что фиксированными являются 25 бит, то есть на один бит больше, чем в адресе класса С. В этом случае в адресе можно изменять последние 7 бит. В следующей записи фиксированные биты представлены единицами, а изменяемые — нулями:

11111111.11111111.11111111.10000000

11111111 — это число 255, а 10000000 — 128. Таким образом, данная сетевая маска приобретает вид 255.255.255.128. Все очень просто, если мыслить двоичными категориями. С двоичными числами вовсе не обязательно работать каждый день, но тем, кто не понимает базовые концепции двоичной математики, преобразование чисел из двоичной формы в десятичную кажется совершенно непонятным. В ходе практической деятельности можно научиться видеть десятичные числа в логичной двоичной записи.

Что это означает на практике? Прежде всего, блоки IP-адресов выделяются в количестве, кратном 2. Если изменяемыми являются 4 бита, то возможны 16 адресов 2x2x2x2 = 16), а если 8 бит, то (28) 256 IP-адресов. Если кто-либо говорит, что доступно 19 IP-адресов, то либо речь идет о разделяемой сети Ethernet, либо высказанное утверждение ошибочно.

Нередко можно увидеть IP-адрес хоста вместе с его сетевой маской, например 192.168.3.4/26. Такая форма записи содержит всю информацию, необходимую для подключения компьютера к локальной сети. (Поиск шлюза по умолчанию — это уже другая проблема, но, как правило, адрес шлюза находится либо в самом верху, либо в самом низу диапазона адресов.)

Вычисление сетевых масок в десятичном виде

Преобразование из десятичной формы в двоичную и обратно не всегда доставляет удовольствие. Это не только неудобно, это еще увеличивает вероятность допустить ошибку. Следующая хитрость позволит вам вычислять сетевые маски, оставаясь в рамках десятичной системы счисления.

Прежде всего нужно выяснить, сколько реальных IP-адресов есть в наличии. Это число будет кратно 2. Почти всегда количество адресов меньше 256. Из числа 256 нужно вычесть количество адресов, имеющихся в наличии, и получим последнее число сетевой маски. При этом все еще необходимо уметь определять размеры сети. Если предположить, что IP-адрес имеет вид 192.168.1.100/26, вы должны понимать, что запись /26 — это 26 фиксированных битов, или 64 IP-адреса. Взгляните на последнее число в IP-адресе — 100. Конечно, оно находится не в интервале между 0 и 63, а в интервале между 64 и 127. Другие хосты этого блока имеют IP-адреса от 192.168.1.64 до 192.168.1.127, а сетевая маска имеет вид 255.255.255.192 (256 — 64 = 192).

В этом месте я должен заметить, что сетевые маски часто записываются в шестнадцатеричном виде. У вас может возникнуть желание бросить все, как безнадежное дело, но упростить жизнь вам поможет табл. 6.2, в которой приводятся сетевые маски и количество доступных IP-адресов для сетей /24 и меньше.

Таблица 6.2. Сетевые маски и IP-адреса

Префикс Двоичная маска Десятичная маска Шестнадцате-ричная маска Доступные IP-адреса
/24 00000000 255.255.255.0 0xffffff00 256
/25 10000000 255.255.255.128 0xffffff80 128
/26 11000000 255.255.255.192 0xffffffc0 64
/27 11100000 255.255.255.224 0xffffffe0 32
/28 11110000 255.255.255.240 0xfffffff0 16
/29 11111000 255.255.255.248 0xfffffff8 8
/30 11111100 255.255.255.252 0xfffffffc 4
/31 11111110 255.255.255.254 0xfffffffe 2
/32 11111111 255.255.255.255 0xffffffff 1

Неиспользуемые IP-адреса

Теперь вы понимаете, что объединяет сетевые маски и IP-адреса и что, например, запись /28 подразумевает 16 IP-адресов. К сожалению, не все адреса в блоке можно использовать. Первый IP-адрес блока — это номер сети (network number). Он предназначен для внутреннего управления сетевыми ресурсами.

В любой группе IP-адресов последний номер является широковещательным адресом (broadcast address). Согласно спецификации IP, каждая машина в сети должна откликаться на запрос, посылаемый по этому адресу. Такая возможность позволяет проверять доступность адресатов и выяснять, какие IP-адреса используются в сети. Например, в типичной сети /24 широковещательный адрес будет иметь вид: x.y.z.255. В конце 90-х годов отправка пакетов по широковещательному адресу применялась при организации атак на сети. Сейчас эта возможность отключена в большинстве операционных систем и сетевых устройств.* В системах BSD поддержку широковещательной адресации можно включить с помощью установки параметра net.inet.icmp.bmcastecho в 1.

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

Присвоение IP-адресов

Можно было бы подумать, что каждый компьютер в сети имеет IP-адрес, но это не всегда верно. IP-адреса присваиваются каждому сетевому интерфейсу. Большинство компьютеров имеют единственный сетевой интерфейс, поэтому для них эта разница несущественна. Однако, если в компьютере имеется несколько сетевых карт, то каждой из них присваивается свой IP-адрес. С другой стороны, можно присвоить несколько IP-адресов одному сетевому интерфейсу, используя псевдонимы. Напротив, в некоторых конфигурациях можно связать несколько сетевых карт с единственным сетевым интерфейсом, дав компьютеру единственный виртуальный интерфейс, несмотря на имеющееся количество сетевых карт. Хотя эти различия являются незначительными, о них следует помнить при выяснении возникающих проблем.

ICMP

Протокол управляющих сообщений Интернета (Internet Control Message Protocol, ICMP) — это стандартный способ передачи информации о маршрутах и сообщений о доступности сети. Такие инструменты, как ping(8) и traceroute(8) используют ICMP для сбора необходимых сведений. Протокол ICMP необходим для обеспечения надлежащей производительности сети, но некоторые виды ICMP-сообщений могут использоваться злоумышленниками для получения дополнительных сведений о сети. Если вам необходимо блокировать трафик ICMP по причинам, связанным с обеспечением безопасности, вы должны делать это выборочно.

UDP

Протокол пользовательских дейтаграмм (User Datagram Protocol, UDP) — это основной транспортный протокол передачи данных, работающий поверх протокола IP. В нем не предусмотрена возможность обработки ошибок, он обладает минимальными возможностями проверки целостности и не имеет никакой защиты от потери данных. Несмотря на эти недостатки, UDP является неплохим выбором для передачи некоторых видов данных, и многие службы Интернета используют его.

Когда хост передает данные по UDP, он не знает, доставлены ли они до места назначения. Когда хост получает данные по UDP, он просто прослушивает сеть и принимает все, что из нее приходит. Программа, принимающая данные по UDP, не может проверить, откуда пришли эти данные. Хотя пакеты UDP включают в себя адрес отправителя, его легко подделать. По этой причине UDP называют протоколом без установления соединения (connectionless) или протоколом без установления состояния (stateless).

Почему тогда используется UDP, если он обладает такими недостатками? Приложения, использующие UDP, часто сами реализуют методы обработки ошибок, которые могут не совпадать с методами, предоставляемыми по умолчанию такими протоколами, как TCP. Например, простые клиентские запросы к DNS должны иметь тайм-аут не более нескольких секунд, в противном случае это будет вызывать раздражение у пользователя. Тайм-аут для соединений TCP составляет две минуты. Поскольку реакция на неудачные запросы к DNS должна следовать как можно быстрее, то запросы к DNS отправляются по протоколу UDP. В случаях, когда сервер DNS должен отправлять большие объемы данных (например, передача информации о зонах), он переходит на использование протокола TCP. Для передачи потоковых данных, как в случае с видеоконференциями, также используется протокол UDP. Если бы потеря нескольких пикселей при передаче картинки видеоконференции в реальном времени вызывала повторную передачу данных, это приводило бы лишь к перегрузке сети. Нельзя вернуться назад во времени и восполнить недостающие участки картинки! Аналогичными причинами объясняется применение протокола UDP практически всеми использующими его сетевыми приложениями.

UDP — это также протокол обмена дейтаграммами, в том смысле, что каждый передаваемый блок данных является самодостаточным и законченным и воспринимается как отдельный блок. При этом сами приложения, использующие UDP, чаще всего не считают одиночные пакеты UDP завершенным запросом, каковыми они воспринимаются сетью. Протокол TCP полностью отличается от UDP.

TCP

Протокол управления передачей данных (Transmission Control Protocol, TCP) обладает такими замечательными особенностями, как коррекция ошибок и восстановление данных. Принимающая сторона должна подтвердить получение каждого пакета, в противном случае отправитель будет повторять передачу неподтвержденных пакетов. Приложения, использующие TCP, вправе ожидать надежной передачи данных. В отличие от UDP, протокол TCP называют протоколом с установлением соединения (connected).

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

Два хоста, использующие TCP для обмена данными, должны организовать между собой канал, по которому будут передаваться данные. Первый хост запрашивает открытие соединения, второй хост отвечает на этот запрос, и только после этого первый хост начинает передачу данных. Этот процесс называется тройным рукопожатием (three-way handshake). Подробности на данном этапе нас не интересуют, нам достаточно знать, что это происходит. Аналогичным образом по окончании передачи системы должны выполнить некоторые действия, чтобы закрыть соединение.

Протокол TCP обычно используется такими программами, как программы электронной почты, FTP-клиенты и веб-броузеры, по этой причине для протокола были выбраны наиболее универсальные интервалы тайм-аутов и набор функциональных возможностей.

Транспортные протоколы следующего поколения

Одной интересной особенностью FreeBSD 7.0 является поддержка протокола управления передачей потоков данных (Stream Control Transmission Protocol, SCTP). Это транспортный протокол следующего поколения, разработанный для передачи сложных потоков данных. Реализация протокола во FreeBSD спонсировалась компанией Cisco Systems, которая, по всей видимости, рассматривала свободно распространяемую систему FreeBSD как один из лучших способов вывести данный протокол в мир.

Комментарии запрещены.