воскресенье, 25 июля 2010 г.

Сети. Основы. Часть 2.

Продолжение цикла статей о сетях. В данной статье рассматриваются работа системы OSI и протоколов.



Напомню, что оригинал вы можете найти тут. Кроме того, еще раз выражаю свою благодарность Refresh'у.

Понимаем работу системы OSI и протоколов.
В первой "статье" мы получили общее представление о сетях, но правда мало чего поняли.
Сейчас попробую объяснить так чтобы вопрос стало меньше, а понимания больше.

Для демонстрации работы модели OSI разберем следующую картинку:

схема работы модели OSI

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

инкапсуляция данных в модели OSI

После этого на физический уровень в зависимости от используемой среды передачи преобразует полученный фрейм в импульсный сигнал и передаст его в «физическую сеть»
Компьютер #2 сделает все преобразования в обратном порядке: физический уровень примет импульсы, передаст его на канальный уровень. Канальный уровень проанализирует заголовок канального уровня, сделает необходимые операции, и передаст его на сетевой уровень уже без своего заголовка. Такое преобразование будет делать каждый уровень пока данные не дойдут до приложения, которому оно предназначалось.
Так что пакет можно представить в виде матрешки. Данные это самая маленькая матрешка, по мере движения от 7 до 1 уровня она обрастает все больше и больше. На другое устройство придет самая большая матрешка, и по мере продвижения от 1 до 7 уровня, матрешка будет становиться все меньше.

Семь уровней это стандарт, но на практике некоторые уроне выполняются с помощью одного протокола. Например, возьмем самый распространенный стек протоколов TCP/IP. При использовании стека TCP/IP прикладной, представительский и сеансовые уровни заключены в один – прикладной. Т.е. в соответствии с моделью OSI стек протоколов TCP/IP выглядит вот так:

стек протоколов TCP/IP

Сделаю так же маленькое уточнение: в стеке TCP/IP за установление и поддержание сеансов (5 уровень модели OSI) отвечает как уровень приложений, так и частично транспортный.


То есть, если наглядно представить инкапсуляцию данных в стеке протоколов TCP/IP мы получим примерно такую картину:

инкапсуляция данных в стеке протоколов TCP/IP

В обратном направление все работает точно так же, то есть происходит распаковка пакета на каждом из уровней.


Коммутационное оборудование и стек TCP/IP

Теперь разберем коротко, как работает коммутационное оборудование в соответствии со стеком протоколов.
Повторитель(reapiter) работает на физическом уровне, т.е. оперирует только с электрическими сигналами. На вход к нему подаются сигналы с искажением (в любой среде передачи происходит затухание сигнала пропорционально расстоянию), на выходе получаем усиленный сигнал (нормальной формы).
Свитч (Switch) и мост(Bridge) работает на канальном уровне, т.е. оперирует с Ethernet фреймами. на вход к нему подаются импульсы, которые на физическом уровне преобразуются в Ethernet фреймы и передаются на канальный уровень. На канальном уровне вскрывается только заголовок канального уровня, определяется MAC адрес получателя, сопоставляется с внутренней таблицей соответствия MAC адресов и портов свитча. Таблица имеет примерно такой вид:

таблица соответствия

После определения порта на которому подключен данный клиент, пакет снова упаковывается и передается дальше, на нужный порт.
Маршрутизатор (router) работает на сетевом уровне, т.е. оперирует с IP пакетами. на вход к нему подаются импульсы, которые на физическом уровне преобразуются в Ethernet фреймы и передаются на канальный уровень. На канальном уровне вскрывается только заголовок канального уровня и оставшиеся данные (IP пакет) передается на сетевой уровень. На сетевом уровне вскрывается IP пакет, анализируется заголовок IP пакета, определяется IP адрес получателя и отправителя. У маршрутизатора так же существует таблица соответствия, но только значительно сложнее чем у свитча. О нем мы поговорим позже (работа маршрутизатора сложна и в рамках этого материала рассматриваться не будет). После определения порта где находиться получатель, или определения кратчайшего маршрута до него пакет запаковывается обратно и передается в сеть.


Протоколы

Что такое протокол? Протокол это набор правил, инструкций и соглашений с помощью которых осуществляются действия с данными (обмен, упаковка, проверка на целостность, шифрование и т.д.)

Порт - это идентификатор приложения. Т.е. все знают что браузер работает на 80 (HTTP) порту. Это значит что все данные которые будут поступать на этот логический порт будут адресованы только программе-браузеру.


Протоколы стека TCP/IP.

На каждом из уровней стека TCP/IP работают свои протоколы. Коротко разберем некоторые из них.

Прикладной уровень:
На этом уровне работают протоколы, которые у нас всегда «перед глазами»
Позже поговорим о них.

На транспортном уровне работают два протокола TCP и UDP
Отличие их в том, что TCP это транспортный протокол с гарантированной передачей, а UDP c негарантированной. Можно разобрать их работу на примере SMS сообщения: вы отправляете смс сообщение абоненту, и как только он его получил то вам приходит сообщение о доставке. Тогда вы знаете, что первое сообщение до него дошло и можете отсылать второе, потом ждете отчета о доставке 2-ого сообщения и т.д. вот так, в упрощенной форме, и работает протокол TCP. Протокол UDP работает в слепую, т.е. он не ждет сообщение о доставке а посылает их «в слепую». Из-за этого UDP протокол работает быстрее TCP. Так же значение слова порт напрямую связано с протоколами этого уровня. Номер порта содержится в TCP(UDP) заголовке пакета.
Более подробно TCP мы разберем в следующих материалах.

Сетевой уровень.
Вот теперь пришло время поговорить об очень важном и сложном - протоколе IP (Internet Protocol) и об IP адресации.
Каждый узел в сети должен иметь уникальный номер, что бы мы могли обратиться именно к нему. У любого ПК в сети есть как минимум один идентификатор: физический адрес (MAC), который вшивается в сетевую плату еще на заводе. Но MAC адресация очень неудобная и приходилось бы знать все MAC адреса WEB-серверов, чтобы можно было к ним обратиться. Да и маршрутизация с Помощью MAC была бы очень сложна. Поэтому появился протокол IP. Теперь помимо физического адреса каждый компьютер имеет логический (IP адрес). Который должен быть уникальным в пределах данной подсети.

И так что же такое IP адрес?
Это уникальный логический адрес любого устройства в сети, которое однозначно определяет, к какой сети принадлежит данный хост. Сейчас существует 2 версии протокола IP: IPv4 и IPv6. Мы будем разбирать IPv4.
IP адрес это 32 (IPv4) или 128(IPv6) битное число, это значит что если мы запишем IP адрес в двоичной (бинарной) системе то получим 32 разряда. В десятичном виде он записывается 12-ти разрядным числом разделенным знаком (.) на 4 трехзначных числа - октета:
aaa.bbb.ccc.ddd
каждый из октетов кроме первого может принимать значение от 0 до 255 в десятичной(Dec) системе , соответственно от 0 до FF 16-ричной (Hex) и от 00000000 до 11111111 в двоичной (Bin)
Первый октет принимает значение от 0 до 127 включительно, почему так вы поймете позже.
IP адрес логически состоит из 2 частей – номер сети и номер компьютера.

Существуют 2 модели IP адреса: классовая и бесклассовая(CIDR), в классовой модели существуют стандартные классы IP адресов где четко определенное количество сетей и хостов в каждом классе.
Разберем эти классы адресов:

классы адресов

А теперь поясню всю эту таблицу.
Что означает столбец «Двоичный префикс»? Как компьютер определит к какому классу относиться данный IP адрес? Любое цифровое устройство оперирует бинарными выражениями (0 – нет сигнала, 1 - есть сигнал), в том числе компьютеры и любое коммутационное оборудование. Так что для определения класса IP адреса первым битам первого октета (нумерация идет справа налево). Для наглядности запишем IP адреса 92.241.175.142, 191.223.52.1, 207.46.197.32 в двоичном виде:
01011100.11110001.10101111.10001110 - 92.241.175.142
10111111.11011111.00110100.00000001 - 191.223.52.1
11001111.00101110.11000101.00100000 - 207.46.197.32
В первом случаем первый бит равен 0 это значит что IP адрес принадлежит классу A. Во втором случае два первых бита соответствуют классу B. В третьем случае 3 первых бита соответствуют классу С.

Теперь разберем коротко каждый класс.

Класс А: В IP адресах класса А номером сети являются первые 8 бит (1-ый октет)
xxx.yyy.yyy.yyy , где xxx – октет с номером сети, а yyy.yyy.yyy – октеты с номером хоста.
Сети 0.0.0.0 и 127.0.0.0 зарезервированы для служебных целей.
Количество хостов определяется простыми действиями: т.к. номер сети определяется первым октетом, а все остальное адрес хоста то следовательно 8 битов для сетей и 24 для хостов, но первый бит первого октета не учитывается при назначении адреса, значит у нас 7 свободных битов и значит 2^7 = 128 это общее число сетей , теперь отнимаем два так как сети 0.0.0.0 и 127.0.0.0 и получаем «полезное» число сетей равное 127 . А для определения количества хостов В КАЖДОЙ СЕТИ сделаем так - 2^24 = 16777216. Но это еще не все, т.к. адреса в которые используют вместо номера хостов все нули (например 10.0.0.0) указывают на «имя» сети , все единицы (10.255.255.255) указывает на адрес широковещательной рассылки(все активные устройства сети получат сообщение , у которого в получателе стоит этот адрес.) Эти 2 адреса усть в каждом классе и использовать мы их не можем, поэтому от полученного значения числа хостов отнимаем 2 и получаем максимальное количество хостов в сети класса А, а именно - 16 777 214.
Класс B: В IP адресах класса B номером сети являются первые 16 бит (1-ый и 2-ой октет)
xxx.xxx.yyy.yyy , где xxx.xxx – октеты с номером сети с номером сети, а yyy.yyy – октеты с номером хоста.
Количество хостов определяются так же как и в первом случае.

Класс С: В IP адресах класса С номером сети являются первые 24 бита (1-ый, 2-ой, 3-ий октет)
xxx.xxx.xxx.yyy , где xxx.xxx.xxx – октеты с номером сети с номером сети, а yyy – октеты с номером хоста.
Количество хостов определяются так же как и в первом и втором случае.


Диапазоны для локальных сетей.
Существуют специальные диапазоны выделенные для локальных сетей. Адреса из этих диапазонов не используются в Интернет т.е. такие адреса не используются серверами которые напрямую взаимодействуют («смотрят») в глобальную сеть.
Диапазон из класса A: 10.0.0.0 -10.255.255.255( одна сеть, 16777214 хостов)
Диапазон из класса В: 172.16.0.0 -172.31.255.255 (16 сетей, 65534 хостов в каждой)
Диапазон из класса С: 192.168.0.0-192.168.255.255 (255 сетей, 254 хоста в каждой)

Бесклассовая модель (CIDR)
Иногда бывает что надо использовать больше адресов чем предусмотрено классом С но значительно меньше чем у класса B. Например, нам надо использовать 3000 адресов. В локальной сети можно особо не заморачиваться, выбрать класс B и все. А как быть если вы предоставляете услуги интернет-провайдинга, то покупать вместо 3тысяч все 65 тысяч было бы не рационально. Вот тут то нам и поможет бесклассовая модель. Делать мы это будем с помощью маски подсети.
Маска подсети (subnet mask) показывает какие биты в IP адресе используются для обозначения сети, а какие для обозначения хоста. Для классовой модели есть фиксированные маски подсети.
Для класса A это 255.0.0.0 или по другому можно сказать «8-ми битная маска подсети», записывается это в таком виде: например мы имеем сеть 10.0.0.0 с маской подсети 255.0.0.0, по другому можно записать 10.0.0.0/8.
Для класса B это 255.255.0.0. Например для сети 172.22.0.0 можно записать 172.22.0.0/16
Для класса С это 255.255.255.0. Например для сети 192.23.4.0 можно записать 192.23.4.0/24
Почему 8,16,24? Сейчас объясню. Запишем данную маску подсети в двоичном виде:
255.0.0.0 – 11111111.00000000.00000000.00000000
255.255.0.0 – 11111111.11111111.00000000.00000000
255.255.255.0 – 11111111.11111111.11111111.00000000
Посчитаем биты равные 1 в первом случае, их 8. Во втором случае их 16, а в третьем их 24. Тут просматривается закономерность =). Значит после знака (/) пишется количество единиц в маске подсети.
Для наших условий нам надо решить проблему такого характера: включить в одну сеть 3000 компьютеров, не деля их при этом на подсети и как можно более рационально использовать адресное пространство.
Для этого нам надо под хосты выделить число которое максимально близко к 3000. Самое близкое число будет 4096(«полезных адресов» будет 4094) или 2 ^12. Значит маска подсети будет иметь такой вид:
11111111.11111111.11110000.00000000 в двоичном виде, или 255.255.240.0
Значит там где стоят единицы – это место для указания сети, а там где нули это указание хоста.
Итого получаем IP адрес, например, 153.22.33.44/20
Определим адрес сети:

адрес сети

Побитно выполним операцию умножения (конъюнкция)
И получим 10011001.00100110.00100000.00000000 или в десятичном виде – 153.22.32.0 это наша сеть. Теперь определим номер компьютера в сети, для наглядности отделим адрес сети от адреса хоста

адрес сети и адрес хоста

Теперь полученный адрес хоста в десятичный формат и получим 300.
Значит IP адрес 153.22.33.44/20 принадлежит 300-му хосту в сети 153.22.32.0/20.