Сегодня я возвращаюсь к теме сетей. Нам предстоит изучить Microsoft TCP/IP. В самой первой статье по TCP/IP я уже говорил про модель OSI. MS как всегда выделилась, и сделала свою реализацию этой модели. Сегодня я напомню тебе OSI и расскажу про MS TCP/IP.
Напомню, что модель OSI (Open Systems Interconnection - взаимодействие открытых систем) предлагает основу программистам для разработки сетевых протоколов. Для того, чтобы программисты не писали протоколы "Кто в лес, кто по дрова", ассоциация ISO разработала спецификацию для протоколов передачи данных по сети. Эта модель описывает уровни и функции, которые должны присутствовать в протоколе. Но при реализации любого протокола не обязательно дословно следовать OSI, потому что это только предложение, которого желательно придерживаться.
Модель состоит из семи уровней:
Физический уровень. - передача битов по физическим каналам (коаксиальный кабель, витая пара, оптоволоконный кабель). Здесь определяются характеристики физических сред и параметры электрических сигналов.
Канальный уровень - передача кадра данных между любыми узлами сетях типовой топологии или соседними узлами произвольной топологии. В качестве адресов на канальном уровне используются МАК-адреса.
Сетевой уровень - доставка пакета любому узлу в сетях произвольной топологии. На этом уровне нет никаких гарантий доставки пакета.
Транспортный уровень - доставка пакета любому узлу с любой топологией сети и заданным уровнем надёжности доставки. На этом уровне имеются средства для установления соединения, буферизации, нумерации и упорядочивания пакетов.
Сеансовый уровень - управление диалогом между узлами. Обеспечена возможность фиксации активной на данный момент стороны.
Уровень представления - здесь возможно преобразование данных (шифрация, компрессия).
Прикладной уровень - набор сетевых сервисов (FTP, E-mail и др.) для пользователя и приложения.
Как работает протокол по этой модели? Всё начинается с прикладного уровня. Пакет попадает на этот уровень и к нему добавляется заголовок и прикладной уровень отправляет этот пакет на следующий уровень (уровень представления). Здесь ему также добавляется свой собственный заголовок, и пакет отправляется дальше. Так до физического уровня, который занимается непосредственно передачей данных. Физический уровень отправляет пакет.
Другая машина, получив пакет начинает обратный отсчёт. Пакет с физического уровня попадает на канальный. Канальный уровень убирает свой заголовок и поднимает пакет выше (на уровень сети). Уровень сети убирает свой заголовок и поднимает пакет выше. Так пакет подымается до уровня приложения, где остаётся чистый пакет без служебной инфы которая была прикреплена на исходной машине перед отправкой пакета.
Рис 1. Модель MS TCP
MS как всегда пошла своим путём и реализовала модель OSI в TCP/IP по-своему. Здесь, вместо семи уровней есть только четыре. На рис 1 я графически сопоставил модель MS TCP и модель OSI. Не смотря на то, что в MS TСP только четыре уровня, они реализуют все семь. Например, Уровень приложения MS TCP реализует в себе три уровня OSI (см рис 1).
Интерфейс сокетов (я больше люблю выражение WinSock) представляет собой программную реализацию, которая облегчает взаимодействие между приложениями и сетью.
NetBIOS наверно придётся изучать отдельно, потому что это достаточно большая тема и на нём я останавливаться не буду.
Очень интересным тут является интерфейс TDI - это программный интерфейс, который работает между уровнями приложения и транспорта MS TCP. Этот интерфейс позволяет создавать приложения сеансового уровня, абсолютно ничего не понимая в транспортном уровне.
Далее идут на уровне транспорта протоколы TCP и UDP.
TCP - отвечает за надёжную передачу данных по сети. Для передачи создаётся виртуальное соединение. После установки связи две машины могут начинать обмен информацией. Каждый TCP-пакет содержит номер порта отправителя и получателя, номер пакета (если данный фрагментированы), контрольную сумму и сами данные. Помимо этого, каждый пакет содержит уникальный номер, который служит защитой от взломов. Этот номер получается случайным образом при установке связи и в течении всего сеанса увеличивается на 1 с каждым последующим пакетом.
UDP - не устанавливает связи и не обеспечивает надёжной передачи данных. Пакеты просто отправляются машине получатели без каких либо ожиданий подтверждения. Если передаваемые данные фрагментированы и хотя бы один пакет затерялся, то восстановить всю информацию уже невозможно.
Межсетевой уровень обеспечивает маршрутизацию пакетов как внутри сети, так и между сетями. Если ты разбираешься в сетевом оборудовании, то ты уже должен был догадаться об этом, потому что все маршрутизаторы работают на третьем уровне. Помимо маршрутизаторов, на этом уровне могут работать и коммутаторы третьего уровня, но это достаточно дорогое оборудование.
Протокол IP похож на UDP протокол. Он также не устанавливает соединения и для передачи данных использует датаграммы. IP пакет включает:
Адрес узла отправителя
Адрес узла получателя
Идентификатор протокола, который работает поверх IP
Контрольная сумма
TTL (Time To Live) время жизни пакета.
Это максимальное количество времени, которое может прожить пакет. Для того, чтобы пакеты не зацикливались в сети из-за ошибочных записей в сети. Если пакет не дошёл до узла назначения за время TTL, то пакет уничтожается. При отправке пакета TTL устанавливается в определённое системой число. Проходя через маршрутизаторы, каждый из них уменьшает это число на единицу. Если число становится равным нулю, то пакет уничтожается.
ARP (Address Resolution Protocol) - это протокол сопоставления адреса. Он также работает на третьем уровне. RARP - это протокол выполняющий обратные действия ARP. Это всё, что тебе нужно знать на этом этапе. Эта тема большая и интересная, поэтому мы поговорим о ней немного позже.
ICMP - это протокол для передачи и получения информации о переданных пакетах. Этот протокол используется в маршрутизаторах для контроля скорости передачи пакетов. Когда моршрутизатор перегружен, то он отправляет ICMP-сообщение, которое убедительно просит узел-отправитель не торопится :) и отсылать пакеты пореже.
IGMP - протокол для управления группами. Его используют узлы для регистрации себя в какой-нибудь группе. Маршрутизаторы используют эту инфу при отправке сообщений предназначенных целой группе.
А вот теперь мы поговорим про ARP (Address Resolution Protocol). Любой пакет передаваемый по сети должен содержать в себе MAC - адрес (аппаратный адрес сетевого устройства). Этот адрес прошит в производителем в сетевое устройство. Если ты хочешь узнать MAC адрес своей карты, то запусти Ipconfig.exe или winipconfig.exe из директории Windows. Для winipconfig.exe нажми кнопку "Сведения>>" и ты сможешь увидеть окно, как на рисунке 2.
Рис 2. winipconfig
В выпадающем списке ты можешь увидеть PPP-адаптер (если ты подключён к Инету) и имя своей сетевой карты (если она есть). Выбирая одно из них, ты можешь увидеть их свойства.
Итак, прежде чем пакет будет отправлен, машина должна знать адрес получателя. Протокол ARP занимается поиском этого адреса. В общем случае поиск MAC адреса происходит так:
Сначала происходит поиск в кэше. Если адрес не найден, то переходим дальше
Посылается широковещательный ARP запрос. В этом запросе устанавливается MAC адрес FF-FF-FF-FF-FF и указывается IP адрес нужной машины. Если какая-нибудь машина в сети знает о существовании этого IP адреса и знает его МАС адрес, то она возвращает ответ с MAC адресом нужной машины. Полученный адрес помещается в кэш.
Если и после этого не найден адрес, то пакет отправляется в шлюз.
Если IP адрес найден в локальной сети, то компьютер получает реальный МАС адрес. Если нет, то запрос отправляется маршрутизатору, который ищет МАС адрес в удалённой сети. Когда он найдёт МАС адрес, он возвращает компьютеру не его, а свой МАС адрес. Таким образом, компьютер будет посылать пакеты на IP а указывать МАС адрес маршрутизатора, а он будет переправлять пакет куда надо. Таким образом маршрутизатор становится "прокси-сервером".
Когда компьютер получает МАС-адрес, то он сохраняет его в кэше. Адреса в этом кэше валяются в течении определённого времени (по умолчанию 10 минут). Если компьютер в течении 10 минут ещё раз обращался по этому IP адресу, то может начаться повторный отсчёт с самого начала. Но такое бывает не на всех системах.
Для просмотра ARP кэша в Windows можно воспользоваться командой ARP с параметром -g или -a.
Существует обратная реализация ARP - RARP (Reverse Address Resolution Protocol). Он выполняет обратное действие для ARP, то есть определяет IP адрес по МАС адресу. Но этот протокол используется очень редко и я даже не могу придумать пример, для его использования. Но я всё же решил упоминуть RARP просто для общего развития.