Перейти к основному содержанию
Рецепты Linux

Main navigation

  • Основы
  • Система
  • Команды
  • Программы
  • Дистро
  • Интерфейсы
  • Устройства
  • Доки
User account menu
  • Войти

Строка навигации

  1. Главная
  2. Linux: Введение
  3. Сеть TCP/IP в Linux

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

Создатели первых сетей, объединяющих несколько сред передачи данных, для идентификации абонента таких сетей пытались использовать те же аппаратные адреса. Это оказалось делом неблагодарным: если в ethernet аппаратный адрес уникален всегда, то в других сетях аппаратные адреса могут быть уникальны только в рамках одной среды (например, все устройства нумеруются, начиная с 0) или даже выдаваться динамически, да и форматы аппаратных адресов в разных средах различны. Возикла необходимость присвоить каждому сетевому интерфейсу некоторый единственный на всю глобальную сеть адрес, который бы не зависел от среды передачи данных и всегда имел один и тот же формат.

Адресация

Адрес, определяемый протоколом IP (Internetwork Protocol), состоит из четырёх байтов, записываемых традиционно в десятичной системе счисления и разделяемых точкой. Адрес сетевого интерфейса eth0 из примера — 192.168.102.125. Второй сетевой интерфейс из примера, lo, — так называемая заглушка (loopback), которая используется для огранизации сетевых взаимодействий компьютера с самим собой: любой посланный в заглушку пакет немедленно обрабатывается как принятый оттуда. Заглушка обычно имеет адрес 127.0.0.1.

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

Применяется побитовая операция «И».

Таким образом вычисляется IP-адрес сети. В примере сетевая маска интерфейса eth0 равна 255.255.255.0, т. е. 24 единицы и 8 нулей. Тогда IP-адрес сети будет равен 192.168.102.0. Мефодий заметил, что если сетевая маска выровнена по границе байта, производить двоичные операции вообще не надо: так, в примере можно было просто сказать, что адрес сети занимает три байта, а адрес абонента — оставшийся один.

Заметим, что адрес сети может содержать значащие нули: например, в адресе 10.0.0.1 при сетевой маске 255.255.0.0 адрес сети занимает два байта. из которых второй — полностью нулевой. Для того, чтобы не гадать, какие нули — значащие, а какие — отрезаны маской, к адресу сети принято приписывать уточнение вида /количество_единиц_в_маске. В приведённом случае адрес сети выглядел бы так: 10.0.0.0/16, а в предыдущем — 192.168.102.0/24.

IP-адрес, составленный из адреса сети, за которым следуют все единицы (в примере — 192.168.102.255), называется широковещательным адресом: любой принадлежащий сети 192.168.102.0 компьютер, получивший IP-пакет с адресом получателя 192.168.102.255, должен обработать его, как если бы в поле «получатель» стоял его собственный IP-адрес.

Когда компьютер с некоторым IP-адресом решает отправить пакет другому компьютеру, он выясняет, принадлежит ли адресат той же локальной сети, что и отправитель (т. е. подключены ли они к одной среде передачи данных). Делается это так: на IP-адрес получателя накладывается сетевая маска, и таким образом вычисляется адрес сети, которой принадлежит получатель. Если этот адрес совпадает с адресом сети отправителя, значит, оба находятся в одной локальной сети. Это, в свою очередь, означает, что аппаратный адрес (MAC) получателя должен быть отправителю известен.

MAC-адреса компьютеров локальной сети хранятся в специальной таблице ядра, называемой «таблица ARP». Просмотрть содержимое этой таблицы можно с помощью команды arp -a:

[root@localhost root]# arp -a
 fuji.nipponman.ru (192.168.102.1) at 00:50:56:C0:00:01 [ether] on eth0
 edoh.nipponman.ru (192.168.102.7) at 00:50:56:C3:11:a2 [ether] on eth0
[root@localhost root]# sleep 60
[root@localhost root]# arp -a
[root@localhost root]# ping -c1 192.168.102.1
 PING 192.168.102.1 (192.168.102.1) 56(84) bytes of data.
 64 bytes from 192.168.102.1: icmp_seq=1 ttl=64 time=0.217 ms

 --- 192.168.102.1 ping statistics ---
 1 packets transmitted, 1 received, 0% packet loss, time 0ms
 rtt min/avg/max/mdev = 0.217/0.217/0.217/0.000 ms
[root@localhost root]# arp -a
 fuji.nipponman.ru (192.168.102.1) at 00:50:56:C0:00:01 [ether] on eth0

Пример 2. Просмотр таблицы ARP

Более точно, ARP-таблица отражает соответствие между IP- и MAC-адресами. Таблица эта динамическая: устаревшие соответствия из неё удаляются, так как компьютеру может быть назначен другой IP-адрес, интерфейс можно отключить от сети, заменить и т. д. Если вновь понадобится связаться с компьютером, чей MAC-адрес устрел, соответствие IP и MAC придётся устанавливать по новой. В примере была использована команда ping, посылающая на указанный IP-адрес пакеты служебного протокола ICMP, на который адресат обязан ответить. Если ответа нет, значит, связь по каким-то прчинам невозможна.

Устанавливать соответствие между адресами сетевого и интерфейсного уровня — дело протоколя ARP (Address Resolution Protocol, «протокол преобразования адресов»). В случае преобразования IP в MAC он работает так: отправляется широковещательный ethernet-фрейм типа «ARP-запрос», внутри которого — IP-адрес, что означает «Эй! У кого такой IP?». Каждый работающий компьютер обрабатывает этот фрейм и тот, чей IP-адрес совпадает с запрошенным, возвращает отправителю пустой фрейм типа «ARP-ответ», в поле «отправитель» которого указан искомый MAC-адрес. Это означает «У меня. А что?». Тут ARP-таблица заполняется и первый компьютер готов к инкапсуляции IP-пакета.

Маршрутизация

Более сложный вопрос встаёт, если IP-адрес компьютера-адресата не входит в локальную сеть компьютера-отправителя. Ведь и в этом случае пакет необходимо отослать какому-то абоненту локальной сети, с тем, чтобы тот перенаправил его дальше. Этот абонент, маршрутизатор, подключён к нескольким сетям, и ему вменяется в обязанность пересылать пакеты между ними по определённым правилам. В самом простом случае таких сетей две: «внутренняя», к которой подключены компьютеры, и «внешняя», соединяющая маршрутизатор со всей глобалной сетью. Таблицу, управляющую маршрутизацией пакетов, можно просмотреть с помощью команды netstat -r или route (обе команды имеют ключ «-n», заставляющий их использовать в выдаче IP-адреса, а не имена компьютеров):

[root@localhost root]# route -n
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 192.168.102.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
 127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
 0.0.0.0         192.168.102.1   0.0.0.0         UG    0      0        0 eth0

Пример 3. Простая таблица маршрутизации

На машине Мефодия в таблице маршрутизации всего три записи: одна — про сеть 192.168.102.0/24, доступную по интерфейсу eth0, другая — про сеть 127.0.0.0/8, доступную через заглушку, и последняя — про сеть 0.0.0.0/0, доступную через маршрутизатор (gateway) с адресом 192.168.102.1. Сеть 0.0.0.0/0 — это и есть «весь интернет», потому что ей принадлежат любые IP-адреса (ни одного бита на сетевую маску), такая запись в таблице назывется маршрут по умолчанию. Если маршрут по умолчанию не задан, попытка связаться с удалённым компьютером может окончиться ошибкой «No route to host»: система не сможет определить, кому пересылать пакет.

На маршрутизаторе таблица выглядит посложнее:

[root@fuji root]# route -n
 Kernel IP routing table
 Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
 83.237.29.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
 192.168.102.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
 10.13.0.0       0.0.0.0         255.255.0.0     U     0      0        0 eth0
 127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
 0.0.0.0         83.237.29.1     0.0.0.0         UG    0      0        0 ppp0
[root@fuji root]# ifconfig ppp0
 ppp0     Link encap:Point-to-Point Protocol  
          inet addr:83.237.29.51  P-t-P:83.237.29.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
          RX packets:17104 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23839 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:5879278 (5.6 Mb)  TX bytes:1750644 (1.6 Mb)

Пример 4. Сложная таблица маршрутизации

Начать с того, что вдобавок к сетевым интерфейсам eth0 и eth1 тут наличествует интерфейс типа «точка-точка», ppp0. Это виртуальный интерфейс: он не соответствует никакому сетевому устройству, а организуется по инициативе демона pppd, работающего в соответствии с протоколом PPP (Point to Point Protocol). PPP-соединение позволяет организовать «сеть», состоящую всего из двух абонентов, связанных любой средой передачи данных: двумя модемами и телефоном, тремя проводами, ethernet и т. п.

Значение «MTU: 1492» наводит на мысль о том, что в качестве среды передачи данных был использован именно ethernet (с MTU 1500), так как ещё восемь байтов отводится для служебной информации самого PPP.

Получив IP-пакет, система начинает «примерять» его поочерёдно ко всем записям таблицы маршрутизации, отсортированным в порядке убывания размера сетевой маски (в том же порядке выдаёт их команда route). Если сеть адресата совпадает с сетью из таблицы, пакет нужно пересылать по адресу, указанному в поле «Gateway». Этот адрес используется вместо поля адресата и поиск возобновляется с начала таблицы. Если поле «Gateway» — нулевое, значит, речь идёт об абоненте локальной сети, и пакет надо передать на уровень ниже (eth при этом может обновить ARP-таблицу, ppp — действовать как-то ещё). Если ни одна сеть не подходит, выдаётся сообщение об ошибке. В примере все пакеты, не предназначенные сетям 192.168.102.0/24, 10.13.0.0/15 и 127.0.0.0/8, отправляются на маршрутизатор по умолчанию с адресом 83.237.29.1. Первая же запись рассказывает, как добраться до этого маршрутизатора (точнее, до сети 83.237.29.1/32, что эквивалентно единственному абоненту 83.237.29.1).

Относительно IP-адресов на маршрутизаторе Гуревич как-то заметил, что только один из них — 83.237.29.1 — «настоящий». Он имел в виду стандарт RFC1918, описывающий, какие диапазоны IP-адресов можно использовать в любой внутренней сети. Задача системного администратора — сделать так, чтобы при работе с сетью Internet ни в одном пакете не стояло такого внутреннего адреса отправителя: например, подменять внутренние адреса на единственный внешний («настоящий»). Задача эта решается с помощью межсетевого экрана (firewall), который в Linux называется iptables, но когда Мефодий попросил Гуревича рассказать поподробнее, тот только рукой махнул: надо хорошо знать TCP/IP.

Служебный протокол ICMP

Есть такие протоколы уровня IP, действие которых этим уровнем и ограничиваются. Например, служебный протокол ICMP (Internet Control Message Protocol), предназначенный для передачи служебных сообщений. С однм примером применения ICMP Мефодий уже знаком: это утилита ping. Другое применение ICMP — сообщать отправителю, почему его пакет невозможно доставить адресату, или передавать информацию об изменении маршрута, о возможности фрагментации и т. п. Протоколом ICMP пользуется утилита traceroute, позволяющая приблизительно определять маршрут следования пакета (ключ «-n», как и в команде route, означает, что преобразовывать IP-одреса в доменные имена не надо):

[root@localhost root]# traceroute www.ru -n   
 traceroute to www.ru (194.87.0.50), 30 hops max, 38 byte packets
  1  192.168.102.1  0.223 ms  0.089 ms  0.105 ms
  2  83.237.29.1  25.599 ms  21.390 ms  21.812 ms
  3  195.34.53.53  24.111 ms  21.213 ms  25.778 ms
  4  195.34.53.53  23.614 ms  33.172 ms  22.238 ms
  5  195.34.53.10  43.552 ms  48.731 ms  44.402 ms
  6  195.34.53.81  26.805 ms  21.307 ms  22.138 ms
  7  213.248.67.93  41.737 ms  41.565 ms  42.265 ms
  8  213.248.66.9  50.239 ms  47.081 ms  64.781 ms
  9  213.248.65.42  99.002 ms  81.968 ms  62.771 ms
 10  213.248.78.170  62.768 ms  63.751 ms  78.959 ms
 11  194.87.0.66  101.865 ms  88.289 ms  66.340 ms
 12  194.87.0.50  70.881 ms  67.340 ms  63.791 ms

Пример 5. Определения маршрута пакета

Утилита traceroute показывает список абонентов, через которых проходит пакет по пути к адресату, и потраченное на это время. Однако список этот приблизительный. Дело в том, что первому пакету (точнее, первым трём, так как по умолчанию traceroute шлёт пакеты по три) в специальное поле TTL (Time To Live, время жизни) выставляется значение «1». Каждый маршрутизатор должен уменьшать это значение на 1, и если оно обнулилось, передавать отправителю ICMP-пакет о том, что время жизни закончилось, а адресат так и не найден. Так что на первую серию пакетов отреагирует первый же маршрутизатор, и traceroute выдаст первую строку маршрута. Второй пакет посылается с TTL=2, и, если за две пересылки адресат не достигнут, об этом рапортует второй маршрутизатор. Процесс продолжается до тех пор, пока очередной пакет не «доживёт» до места назначения. Строго говоря, неизвестно, каким маршрутом шла очередная группа пакетов, потому что с тех пор, как посылалась предыдущая группа, какой-нибудь из промежуточных маршрутизаторов мог передумать и послать новые пакеты другим путём.

Перекрёстные ссылки книги для Сетевой уровень

  • Аппаратный и интерфейсный уровни
  • Вверх
  • Транспортный уровень

Book navigation

  • Предисловие
  • Сеанс работы в Linux
  • Терминал и командная строка
  • Структура файловой системы
  • Работа с файловой системой
  • Доступ процессов к файлам и каталогам
  • Права доступа
  • Работа с текстовыми данными
  • Возможности командной оболочки
  • Текстовые редакторы
  • Этапы загрузки системы
  • Работа с внешними устройствами
  • Конфигурационные файлы
  • Управление пакетами
  • Сеть TCP/IP в Linux
    • Сетевые протоколы. Семейство протоколов TCP/IP
    • Аппаратный и интерфейсный уровни
    • Сетевой уровень
    • Транспортный уровень
    • Прикладной уровень
  • Сетевые и серверные возможности
  • Графический интерфейс (X11)
  • Прикладные программы
  • Политика свободного лицензирования

Последние материалы

  • Эмулятор терминала Terminator
    3 hours 51 minute ago
  • Приложение scanimage
    6 days 1 hour ago
  • Утилита sensors
    1 week 2 days ago
  • Сканер Rkhunter
    2 weeks 3 days ago
  • Программа resize2fs
    3 weeks 2 days ago
RSS feed

Secondary menu

  • О проекте

© 2008–2025 Олег Меньшенин mensh@yandex.ru