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

Задачи сетевого уровня

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

  1. Однозначно идентифицировать все компьютеры в глобальной сети, чтобы их можно было адресовать и отличать друг от друга.
  2. Организовать маршрутизацию данных от одного компьютера к другому через некоторое количество промежуточных узлов.

С развитием концепции глобальной сети на сетевом уровне стека TCP/IP были реализованы возможности по передаче данных из любой сети в любую сеть, независимо от протоколов нижнего уровня. Задачей протокола сетевого уровня IP (Internet Protocol) является обмен между устройствами, которые, вообще говоря, не находятся в одной среде передачи данных. Для этого необходимо определить, во-первых, механизм адресации, чтобы можно было выделить среди множества компьютеров тот, которому предназначены данные, и, во-вторых, механизм маршрутизации, отвечающий за доставку пакетов между различными сетями. Рассмотрим подробнее каждую из этих двух функций протокола IP.

IP-адресация

Адрес устройства в сети, использующий протокол IP версии 4, состоит из четырёх байт, которые обычно записываются как четыре десятичных числа от 0 до 255, разделённые точками. Распределением IP-адресов в масштабах земного шара занимается организация IANA. Эта организация выделяет диапазоны адресов другим организациям, затем эти диапазоны делятся на более мелкие диапазоны и в конце концов присваиваются компьютерным сетям, и внутри сети устройствам присваиваются адреса из присвоенного этой сети диапазона.

Диапазоны IP-адресов организуются так, что у всех компьютеров одной сети первые несколько бит адреса совпадают. Таким образом, IP-адрес можно разделить на две части. Первая из них адресует сеть и одинакова для всех устройств, подключённых к данной среде передачи данных, а вторая -- хост в сети, т. е. конкретное устройство, например компьютер или сетевой принтер. Записывается это следующим образом: после собственно адреса указывается количество бит, адресующих сеть, например 127.0.0.1/8 или 192.168.200.10/24. Количество бит идентификатора хоста (k) позволяет вычислить максимально возможное количество машин в сети: оно равно 2^k-2. Кроме приведённой краткой формой записи маски, существует и другая, когда маску, подобно адресу, записывают в виде четырёх десятичных чисел. При этом равный единице двоичный разряд соответствует адресу сети, а равный нулю --- адресу хоста. Таким образом, краткой записи маски /24 соответствует полная маска 255.255.0.0.

Назначение масок и адресов сети следующее: если адрес сети двух компьютеров совпадает, то они подключены к одной среде передачи данных, и передача между ними является локальной. Если адреса сети назначения отличается от адреса сети отправителя, то речь необходимо определить маршрут следования IP-пакета с данными. Для решения этой задачи существует IP-маршрутизация.

Ранее использовалась несколько иная, классовая, система IP-адресов. В соответствии с ней IP-адреса делятся на четыре класса: A, B, C, D и E. Принадлежность к тому или иному классу определяется следующим образом: рассмотрим IP-адреса как строку битов и выберем те, у которых первый (старший) бит --- 0. Сети с такими адресами являются сетями класса А; их адрес может быть представлен в виде N.H.H.H, где N --- cеть (network), H --- хост (host). Под адрес хоста отводится 3 байта, это означает, что внутри локальной сети может находиться примерно 16 млн компьютеров. Соответственно, адрес сети занимает оставшийся 1 байт. В связи с тем, что адреса класса А имеют 8-разрядный сетевой префикс (т.е. сеть идентифицируется 8 битами), их обозначают записью /8. Cетям класса B (N.N.H.H) соответствуют IP-адреса, начальные биты которых --- 10, сетям класса C (N.N.N.H) --- адреса, начальные биты которых --- 110. Аналогично обозначению сетей класса А, сети классов B, C, D обозначаются /16 и /24.

Сетям класса D соответствуют адреса, начальные биты которых --- 1110. Такие сети используются для для групповой передачи данных. Существуют также сети класса E, их старшие биты --- 1111, это экспериментальные сети.

Рассмотрим примеры IP-адресов с указанием маски сети и их связь с классами сетей: 127.0.0.1/8 --- IP-адрес класса А, 192.168.10.2/24 -- адрес в сети класса С, 10.1.2.15/24 --- адрес в подсети с маской /24 в сети класса А.

Настройка IP-адреса

Для операций с IP-адресами машины в системе Linux можно использовать команду ip addr. Примерный вывод этой команды имеет следующий вид:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:46:43:09:11 brd ff:ff:ff:ff:ff:ff

Как видно из вывода команды ip addr, вся сеть класса А 127.0.0.1/8 по стандарту распределения адресов отведена под локальный сетевой интерфейс, через который данные передаются только в пределах одного компьютера.

Одним из способов задания IP-адреса сетевому интерфейсу является использование команды ip. Выполним команду ip addr add 192.168.200.117/24 dev eth0, после этого введем ip addr, чтобы посмотреть, что получилось.

# ip addr add 192.168.200.117/24 dev eth0
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:46:43:09:11 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.117/24 scope global eth0

Мы научились вручную настраивать IP-адрес и маску компьютера в сети. В соответствии с маской /24 все компьютеры с адресами 192.168.200.xxx будут считаться принадлежащим нашей же сети, а с другими IP-адресами --- каким-то другим сетям. Однако, мы не указали компьютеру, как следует передавать данные, если их получатель находится в не нашей сети. Для этого нужно рассмотреть IP-маршрутизацию.

Отображение IP-адреса в MAC-адрес

Прежде чем переходить к маршрутизации, рассмотрим вопрос передачи данных в пределах одной сети. В случае, если несколько компьютеров объединены средой передачи данных, то каждое устройство может каждому передавать некоторые данные через канальный уровень, при этом определяющим является не IP-адрес хоста, а его MAC-адрес, обычно закреплённый за сетевой картой. Более того, может случиться, что MAC-адрес может связываться с различными IP-адресами с течением времени, как и IP-адрес может связываться с различными MAC-адресами. Поэтому необходимо выяснить, кому передавать фрейм протокола Ethernet, зная только IP абонента. Для этого, прежде чем начнётся передача полезных данных, следует выяснить, на какой MAC-адрес необходимо отправить данные.

Для хранения данных о том, какому IP соответствуют какие MAС, служат ARP-таблицы. При выполнении команды ip n, то можно увидеть ARP-таблицу с адресами соседей по среде передачи данных. Обычно мы увидим там компьютер с адресом 1 в нашей же сети.

# ip n
dev eth0 lladdr 00:10:dc:63:fc:c0 REACHABLE

Если выполнить команду tcpdump arp, то при начале передачи данных какой-то машине можно увидеть, что происходит в сети. Для сброса ARP-таблицы перед экспериментом следует выполнить команду ip n flush all.

# ip n flush all
# tcpdump arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
18:38:02.331053 arp who-has 192.168.200.1 tell pspo.local
18:38:02.331257 arp reply 192.168.200.1 is-at 00:a0:c9:b2:ef:c4 (oui Unknown)
18:38:07.331993 arp who-has pspo.local tell 192.168.200.1
18:38:07.332021 arp reply pspo.local is-at 08:00:46:43:09:11 (oui Unknown)

4 packets captured
4 packets received by filter
0 packets dropped by kernel

Команда tcpdump arp говорит, что мы слушаем протокол ARP, предназначенный для выяснения MAC-адреса по известному IP-адресу. В момент начала передачи данных хосту с адресом 192.168.200.1 произошло следующее:

  • Протокол IP установил, что адрес получателя находится в локальной сети, и можно передавать данные непосредственно через среду передачи данных;
  • Для выяснения MAC-адреса получателя всем узлам, подключённым к среде передачи данных, посылается eth-фрейм. Он представляет собой широковещательный ARP-запрос, который сообщает всем остальным машинам примерно следующее: "кому принадлежит адрес 192.168.200.1 - отзовитесь".
  • Получатели принимают этот eth-фрейм, и хост с IP-адресом 192.168.200.1 сообщает в ответе свой MAC-адрес.
  • Инициатор процесса запоминает выясненный IP-адрес в своей ARP-таблице.

Отметим, что сам протокол ARP относится к канальному уровню, поскольку в нем происходит обмен фреймами протокола Ethernet без использования протокола IP.

IP-маршрутизация

Основная задача на сетевом уровне --- организовать маршрутизацию между двумя компьютерами в разных точках земного шара. Для этого требуется пронумеровать все компьютеры уникальными IP-адресами, что практически невозможно. Поэтому все возможные IP-адреса были разделены на две большие группы: внешние (иногда называемые "белыми") и внутренние ("серые"). Последние не являются уникальными и могут назначаться компьютерам локальной сети по желанию администратора. Для них выделены следующие диапазоны адресов: 127.0.0.0/8 для передачи только в пределах одного хоста и 172.16.0.0/12, 192.168.0.0/16 и 10.0.0.0/8 для выделения адресов в локальных сетях. При этом каждый маршрутизатор в интернете считает, что компьютеров с такими адресами быть не может. Для связи между компьютерами с внутренними и внешними адресами существует специальный механизм трансляции сетевых адресов, который будет рассмотрен позднее.

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

Таким образом, для передачи данных в другие сети необходимо знать адрес как миниму одного маршрутизатора, подключённого к этой же сети. Существуют некие правила, по которым в локальной сети выбираются машины, которым передаются пакеты, не адресованные машинам данной сети. Эти правила и называются маршрутизацией. Простейшим правилом будет выбор для всех внешних адресов единственного маршрутизатора, называющегося маршрутизатором по-умолчанию (default gateway). В общем же случае необходимо написать таблицу, определяющую, какая машина отвечает за пересылку пакетов в Интернет или в другую сеть. У обычных хостов содержимое таблицы ограничивается одним или, реже, несколькими локальными маршрутизаторами.

Для указания маршрутизатора по умолчанию в случае ручной конфигурации интерфейса необходимо указать IP-адрес машины, которая им является. Команда ip route add default via 192.168.200.1 устанавливает 192.168.200.1 в качестве адреса маршрутизатора по умолчанию. После чего, выполнив команду ip route, мы увидим два маршрута; второй, для локальных адресов, появился автоматически. В таблице маршрутизации указывается, каким маршрутизаторам посылать IP-пакеты для разных адресов назначения.

# ip route add default via 192.168.200.1
# ip route
192.168.200.0/24 dev eth0  proto kernel  scope link  src 192.168.200.117
default via 192.168.200.1 dev eth0

Как в результате формируется весь маршрут пакета? Это выполняется динамически: в каждой точке маршрутизации принимается решение, куда IP-пакет отправить дальше. Но что делать очередному маршрутизатору, если пакет отправлять некуда, например маршрутизатор по умолчанию не задан, а адресат в таблице маршрутизации не обнаружен? Для ответа на этот вопрос следует рассмотреть протокол ICMP.

Диагностика сетевого соединения

После настройки IP-адреса машины маски следует проверить работоспособность маршрутизатора по умолчанию, например, отдав команду ping.

$ ping 192.168.200.1
PING 192.168.200.1 (192.168.200.1) 56(84) bytes of data.
64 bytes from 192.168.37.1: icmp_seq=1 ttl=255 time=1.26 ms
64 bytes from 192.168.37.1: icmp_seq=2 ttl=255 time=0.892 ms
64 bytes from 192.168.37.1: icmp_seq=3 ttl=255 time=0.880 ms

Чтобы пояснить происходящее при её выполнении, уместно вспомнить о таком понятии, как протокол. Протокол --- это документ, который описывает, как происходит взаимодействие в сети в различных ситуациях. Таких протоколов очень много, и на каждом из уровней стека TCP/IP действуют свои протоколы. Так, на сетевом уровне существуют протоколы, которые из которых позволяет решать определённый круг задач. Основной протокол сетевого уровня --- IP --- предназначен для передачи полезных данных. Другой задачей сетевого уровня является передача диагностических сообщений. Например, маршрутизатор должен уведомить отправителя, если невозможна организация маршрута до получателя, причем это может обнаружить машина в середине маршрута. В таком случае ей необходимо послать диагностическое сообщение о том, что пакет не будет доставлен. Это одна из многих задач, которые надо решать, когда нам нужно выслать сведения о сложившейся ситуации. Протокол, решающий эти задачи прямо на уровне IP, называется ICMP (Internet Connection Management Protocol). В частности, команда ping  пользуется одним из типов таких сообщений --- эхо-запросами (ICMP Echo Request). Она посылает специальный ICMP-пакет в котором содержится информация о его номере и нечто вроде "ответь мне пожалуйста". Согласно протоколу ICMP получатель обязан отослать по получении эхо-ответ (ICMP Echo Reply).

Несмотря на очевидный системный характер протокола ICMP --- он не несёт никаких данных --- чрезвычайно вредно отключать или ограничивать его. При этом нужно знать, какие типы ICMP действительно нужны, а какие --- нет.

Чтобы проследить весь путь пакета от маршрутизатора к маршрутизатору, можно воспользоваться командой traceroute с указанием IP-адреса пункта назначения, например:

$ traceroute 194.107.17.137
1  192.168.1.1 (192.168.1.1)  2.825 ms  3.585 ms  4.160 ms
2  ppp83-237-4-1.pppoe.mtu-net.ru (83.237.4.1)  14.061 ms  15.617 ms  17.048 ms
...
8  te2-3.cerber.citytelecom.ru (217.65.1.246)  23.526 ms  23.508 ms  23.900 ms
9  altlinux-gw.datahouse.su (89.188.100.246)  24.386 ms  25.619 ms  27.260 ms
10  jabber.altlinux.org (194.107.17.137)  28.575 ms  30.186 ms  31.362 ms

В ответ будут выведены адреса и имена маршрутизаторов, через которые проходит маршрут. Как же это реализовано? Для этого используется специальное поле в IP-пакете, называющееся ttl (Time To Live), которое уменьшается на единицу каждую секунду жизни пакета или при каждом прохождении через маршрутизатор. Соответственно, сначала посылается ICMP-пакет с ttl=1, и при первом прохождении через маршрутизатор ttl обнуляется, о чём маршрутизатор посылает ICMP-сообщение в связи с истечением времени жизни IP-пакета. Далее посылается пакет с ttl=2, и так далее. Это позволяет определить место разрыва сети, если проблема связана, например, с работой интернет-провайдера.


Сведения о ресурсах

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

1

1

1

1