Новые книги

Peter Seibel

interviews 15 of the most interesting computer programmers alivetoday in

, offering a brand-new companion volume to Apress’shighly acclaimed best-seller

by Jessica Livingston. As thewords “at work” suggest, Peter Seibel focuses on how his interviewees tacklethe day-to-day work of programming, while revealing much more, like how theybecame great programmers, how they recognize programming talent in others, andwhat kinds of problems they find most interesting.

Coders at Work

Founders at Work
Монография посвящена основным проблемам, возникающим при разработке и формированию региональных брендов. Подробно анализируется теория и методология брендинга. Представлен механизм формирования брендинга регионального уровня как маркетинговой стратегии развития региона. Монография может быть полезна исследователям в области брендинговых технологий, преподавателям, студентам, аспирантам, а также широкому кругу читателей.

Interface Configuration for IP

Настройка интерфейса для IP

После установки аппаратных средств, как было объяснено в главе 4, Вы должны дать знать об этом сетевому программному обеспечению. Пара команд используется, чтобы конфигурировать сетевые интерфейсы и инициализировать таблицу маршрутизации. Эти задачи выполняются обычно в скрипте инициализации сети при загрузке системы. Эти команды называются ifconfig и route .

ifconfig используется, чтобы сделать интерфейс доступным для ядра, что включает в себя назначение IP-адреса и других параметров и активизацию интерфейса. Активизация означает, что ядро будет посылать и получать IP-пакеты через интерфейс. Самый простой путь установки:

ifconfig interface ip-address

Эта команда связывает адрес ip-address с интерфейсом interface и активизирует его. Все остальные параметры устанавливаются по умолчанию. Например, маска подсети по умолчанию получена из сетевого класса IP-адреса (255.255.0.0 для класса B). ifconfig описан более подробно в конце этой главы.

route позволяет Вам добавлять или удалять маршруты из таблицы маршрутизации. Это может быть использовано так:

route [add|del] [-net|-host] target [if]

Аргументы add и del определяют добавлять или удалять маршрут target. Аргументы -net и -host определяют тип маршрута: к сети или к компьютеру (второй вариант принимается по умолчанию). Аргумент if определяет, к какому сетевому интерфейсу относится команда.

Кольцевой интерфейс (Loopback)

Самый первый интерфейс, который нужно сформировать и активизировать, это интерфейс loopback:

# ifconfig lo 127.0.0.1

Иногда Вы будете видеть фиктивное имя localhost, используемое вместо IP-адреса. ifconfig будет искать имя в файле hosts, где должна быть запись, объявляющая его как имя для адреса 127.0.0.1:

# Sample /etc/hosts entry for localhost
localhost     127.0.0.1

Чтобы просмотреть информацию о конфигурации интерфейса, Вы можете вызвать ifconfig, передав как аргумент имя интерфейса:

$ ifconfig lo
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          Collisions:0

Как Вы можете видеть, интерфейс loopback получил сетевую маску 255.0.0.0, так как адрес 127.0.0.1 принадлежит к классу A.

Теперь Вы можете начать работать с вашей мини-"сетью". Единственное, чего не хватает, это записи в таблице маршрутизации, которая говорит IP, что этот интерфейс можно использовать как маршрут к месту назначения 127.0.0.1. Это делается с помощью команды:

# route add 127.0.0.1

Здесь тоже можно использовать localhost вместо IP-адреса, если он задан в файле /etc/hosts.

Затем вы должны проверить правильность работы, например, используя ping. ping сетевой эквивалент звукового устройства и используется для проверки того, доступен ли IP-адрес и измерения интервала времени между посылкой пакета и получением ответа. Время, требуемое для этого, часто называется round-trip time:

# ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.4 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.4 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=255 time=0.4 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.4 ms

При вызове ping он будет испускать пакеты, пока пользователь его не остановит. ^C отмечает место, где я нажал Ctrl-C для прерывания.

Вышеупомянутый пример показывает, что пакеты доставлены к 127.0.0.1, и ответ пришел к ping почти мгновенно. Это показывает, что вы преуспели во введении вашего первого сетевого интерфейса.

Если вывод который вы получаете от ping не походит на показанный выше, вы нарвались на неприятности. Проверьте ошибки в установочных файлах. Проверьте чтобы ifconfig и route, которые вы используете, были совместимы с ядром, которым Вы пользуетесь, и что ядро вообще компилировалось с разрешенной сетью (если сеть запрещена, вы увидите это по отсутствию каталога /proc/net). Если Вы получаете сообщение об ошибке, "Network unreachable", значит вы неправильно использовали команду route. Удостоверьтесь, что используете тот же самый адрес, что дали ifconfig.

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

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

Интерфейсы Ethernet

Конфигурирование интерфейса Ethernet, идет почти также, как и интерфейса loopback, он только требует больше параметров когда вы используете подсети.

В Virtual Brewery мы с вами разбивали на подсети IP-сеть, которая была первоначально класса B на сети калсса С. При установке интерфейса для нее требовалось написать:

# ifconfig eth0 vstout netmask 255.255.255.0

Эта запись назначает интерфейсу eth0 IP-адрес vstout (172.16.1.2 ). Если бы мы опустили netmask, ifconfig вывел бы netmask из класса сети, что привело бы к неправильной маске подсети 255.255.0.0. Теперь быстренько проверим:

# ifconfig eth0
eth0      Link encap 10Mps Ethernet HWaddr  00:00:C0:90:B3:42
          inet addr 172.16.1.2 Bcast 172.16.1.255 Mask 255.255.255.0
          UP BROADCAST RUNNING  MTU 1500  Metric 1
          RX packets 0 errors 0 dropped 0 overrun 0
          TX packets 0 errors 0 dropped 0 overrun 0

Вы можете видеть, что ifconfig автоматически устанавливает широковещательный адрес (поле Bcast ), равный обычному значению, которое является номером сети с битами хоста, равными 1. Также размер передаваемых сообщений (для данного интерфейса устанавливается максимальный размер Ethernet-пакета) был установлен равным максимальному значению в 1500 байт. Все эти значения могут быть исправлены специальными опциями, которые описаны ниже.

Также как в случае с loopback, вы должны теперь установить маршрутизационную запись, которая сообщает ядру о сети, которая может быть достигнута через eth0. Для Virtual Brewery, это:

# route add -net 172.16.1.0

Сначала это смотрится как волшебство, потому что, действительно, не очевидно, как route обнаруживает, какие сети с какими интерфейсами связаны. Однако, уловка довольно проста: ядро проверяет все интерфейсы, которые были отконфигурированы, и сравнивает адрес места назначения (в этом случае (172.16.1.0) с сетевой частью адреса интерфейса. Единственный интерфейс, который соответствует данному адресу, eth0.

Теперь подумаем, что такое опция -net? Она используется, потому что route может работать с маршрутами к сетям и с маршрутам к отдельным машинам (как вы видели в localhost). Когда route получает адрес в стандарте с точками, он пытается предположить, принадлежит ли этот адрес сети или машине, проверяя биты части машины. Если эта часть адреса ноль, route предполагает, что он обозначает сеть, в противном случае, что адрес машины. Поэтому route решил бы, что 172.16.1.0 означает адрес машины: он не может знать, что мы используем подсети. Поэтому мы должны явно сообщить, что это адрес сети, что делается опцией -net.

Конечно, вышеупомянутая команда немного утомительна для набора и дает много ошибок. Более удобный подход: использование сетевых имен, которые определены в /etc/networks.. Это делает команду более удобочитаемой. Даже опция -net может быть опущена, потому что route теперь знает, что 172.16.1.0 обозначает сеть:

# route add brew-net

Теперь, когда вы закончили основные шаги конфигурации, надо удостовериться, что Ваш Ethernet-интерфейс, действительно, работает правильно. Выберите машину в вашей Ethernet-сети, например, vlager, и наберите:

# ping vlager
PING vlager: 64 byte packets
64 bytes from 172.16.1.1: icmp_seq=0. time=11. ms
64 bytes from 172.16.1.1: icmp_seq=1. time=7. ms
64 bytes from 172.16.1.1: icmp_seq=2. time=12. ms
64 bytes from 172.16.1.1: icmp_seq=3. time=3. ms
^C
----vstout.vbrew.com PING Statistics----
4 packets transmitted, 4 packets received, 0
round-trip (ms)  min/avg/max = 3/8/12

Если вы не видите подобный вывод, значит что-то не так. Если вы сталкиваетесь с необычным количеством потерянных пакетов, это означает проблему аппаратных средств, типа плохого или отсутствующего терминатора и т.д.. Если вы не получаете пакеты вообще, вы должны проверить конфигурацию интерфейса с помощью netstat (описана ниже). Пакетная статистика, показанная ifconfig, должна сообщить, были ли вообще посланы какие-то пакеты. Если у вас есть доступ к удаленной машине, вы должны сходить к той машине и проверить там статистику интерфейса. Таким образом, вы можете точно решить, где пропали пакеты. Кроме того, вы должны посмотреть маршрутизационную информацию с помощью route, чтобы выяснить, имеют ли обе машины правильные записи в таблице маршрутов. route печатает всю таблицу маршрутизации, если его вызвать без аргументов (опция (-n указывает печа- тать вместо адресов имена машин):

# route -n
Kernel routing table
Destination  Gateway  Genmask         Flags Metric Ref Use    Iface
127.0.0.1    *        255.255.255.255 UH    1      0      112 lo
172.16.1.0   *        255.255.255.0   U     1      0       10 eth0

Детальное значение этих полей объясняется ниже. Колонка Flags содержит список флагов, устанавливаемых для каждого интерфейса. U всегда установлен для активных интерфейсов, а H сообщает, что адрес места назначения обозначает машину (хост). Если флаг H установлен для маршрута, который вы считаете сетевым маршрутом, тогда вы должны использовать опцию -net с командой route. Чтобы проверить, используется ли маршрут, который вы ввели, посмотрите на поле Use, которое находится между двумя сообщениями ping.

Маршрутизация через шлюз (Gateway)

В предыдущем разделе я рассмотрел только случай введения хоста с единственным Ethernet-интерфейсом. Достаточно часто приходится сталкиваться с сетями, соединенными с помощью gateway. Этот gateway может просто связывать два или больше Ethernet, а может обеспечивать связь с внешним миром (например, с Internet). Чтобы использовать сервис gateway, вы должны обеспечить сетевому уровню дополнительную информацию о маршрутизации.

Например, Ethernet-сети Virtual Brewery и Virtual Winery связаны через такой gateway, а именно хост vlager. Предположим, что vlager уже был отконфигурирован, и нам осталось только добавить новую запись в таблицу маршрутизации vstout, которая сообщает его ядру, что он может достичь всех хостов сети Winery через vlager. Соответствующее описание маршрута показано ниже. Ключевое слово gw сообщает, что следующий аргумент обозначает gateway:

# route add wine-net gw vlager

Конечно, любой хост в сети Winery, с которым вы желаете работать должен иметь соответствующую запись в таблице маршрутизации для сети Brewery, иначе вы сможете только послать данные, но ответа не получите.

Этот пример описывает gateway, который только переключает пакеты между двумя изолированными Ethernet-сетями. Теперь предположим, что vlager также имеет соединение с Internet (работающее через дополнительную SLIP-связь). Тогда хотелось бы, чтобы пакеты для любой сети, отличной от Brewery, передавались vlager. Это может быть выполнено с помощью установки gateway по умолчанию для vstout:

# route add default gw vlager

Сетевое имя default (по умолчанию) связано с адресом 0.0.0.0, что обозначает маршрут, установленный по умолчанию. Вы не должны добавлять это имя к /etc/networks, потому что это построено в route.

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

Настройка шлюза

Отконфигурировать машину для передачи пакетов между двумя сетями Ethernet довольно просто. Вернемся к vlager, который оборудован двумя Ethernet-платами, каждая из них связана с одной из двух сетей. Все, что вы должны сделать, это сконфигурировать оба интерфейса отдельно, дав им их IP-адреса.

Весьма полезно добавлять информацию относительно двух интерфейсов к файлу hosts путем показанным ниже так, чтобы иметь удобные имена для них:

172.16.1.1      vlager.vbrew.com    vlager vlager-if1
172.16.2.1      vlager-if2

Последовательность команд для создания двух интерфейсов:

# ifconfig eth0 vlager-if1
# route add brew-net
# ifconfig eth1 vlager-if2
# route add wine-net

Если эта последовательность не работает, проверьте, включена ли в ядре поддержка IP forwarding. Для этого посмотрите первое число во второй строке файла /proc/net/snmp, оно должна быть 1.

Интерфейс PLIP

При использовании PLIP-связи для соединения двух машин существуют лишь небольшие отличия от того, что вы должны сделать при использовании Ethernet. Вышеупомянутая связь называется point-to-point (точка с точкой), потому что она соединяет только два хоста ("точки") в противоположность широковещательным (broadcast) сетям.

PLIP предоставляет мобильную связь между машинами. Как пример рассмотрим laptop-компьютер служащего Virtual Brewery, который связан с vlager через PLIP. Laptop назван vlite и имеет только один параллельный порт. Во время загрузки, этот порт будет регистрироваться как plip1. Чтобы сформировать связь, Вы должны отконфигурировать интерфейс plip1, используя следующие команды:

# ifconfig plip1 vlite pointopoint vlager
# route add default gw vlager

Первая команда конфигурирует интерфейс, сообщая ядру, что это point-to-point связь с удаленной машиной vlager . Вторая устанавливает маршрут по умолчанию, используя vlager как gateway. На vlager подобная команда ifconfig необходима, чтобы активизировать связь (route здесь не нужен):

# ifconfig plip1 vlager pointopoint vlite

Интересно, что интерфейс plip1 на vlager не обязан иметь отдельный IP-адрес, но если хочется, можете дать ему адрес 172.16.1.1 .

Теперь мы отконфигурировали маршрутизацию от laptop до сети Brewery, но все еще отсутствует маршрут от любого из хостов Brewery к vlite. Очень тяжелый путь: добавлять определенный маршрут к таблице маршрутизации каждого хоста, который объявит vlager как gateway к vlite:

# route add vlite gw vlager

Гораздо лучше иметь дело с временными маршрутами, используя динамическую маршрутизацию. Один из способов сделать это состoит в запуске демона gated, который вы должны установить на каждом хосте в сети, чтобы он распространял информацию о маршрутах динамически. Самый легкий путь, однако, состoит в том, чтобы использовать proxy ARP. С proxy ARP vlager будет отвечать на любой ARP-запрос для vlite, посылая собственный Ethernet-адрес. Результат: все пакеты для vlite будут закачивать на vlager, который будет передавать их на laptop. Мы будем возвращаться к proxy ARP позже.

Текущие версии net-tools имеют утилиту plipconfig, которая позволяет настроить параметры PLIP timing. IRQ для порта принтера можно задать командой ifconfig.

Интерфейсы SLIP и PPP

Хотя SLIP и PPP всего лишь простые point-to-point связи, подобные PLIP-соединениям, о них есть дополнительная информация. Обычно при установке SLIP-соединения требуется дозвониться до удаленной машины через модем и отрегулировать последовательную линию для SLIP. PPP используется подобным образом. Инструменты, требуемые для создания SLIP или PPP-связи, будут описаны в главе 7 и главе 8.

Тупой (Dummy) интерфейс

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

Проблема автономных хостов в том, что они имеют только одно активное сетевое устройство, loopback, которому обычно назначен адрес 127.0.0.1. Но в некоторых случаях, вы должны послать данные к "официальному" IP-адресу локального хоста. Например, рассмотрим laptop vlite, который был отсоединен от сети. Приложение на vlite может понадобиться послать данные другому приложению на том же самом хосте. Поиск vlite в файле /etc/hosts выдает IP-адрес 172.16.1.65, таким образом приложение пытается послать данные этому адресу. Поскольку интерфейс loopback в настоящее время единственный активный интерфейс на машине, ядро не имеет никаких идей относительно этого адреса! Как следствие, ядро отказывается от пакета и возвращает приложению ошибку.

В этот момент просто необходимо фиктивное устройство. Оно решает эту проблему так же, как loopback. В случае vlite , вы просто даете ему адрес 172.16.1.65 и добавляете новый маршрут, указывающий на него. Каждый пакет для 172.16.1.65 будет рассматривается локально. Требуемые действия:

# ifconfig dummy vlite
# route add vlite

IP-псевдонимы (IP-Alias)

Новые ядра поддерживают свойство, которое может полностью заменить dummy-интерфейс, и имеет другие полезные функции. IP Alias позволяет конфигурировать много IP-адресов на одно физическое устройство. В самом простом случае Вы могли бы копировать функцию dummy-интерфейса, конфигурируя адрес как псевдоним для loopback, и полностью избежать применения интерфейса dummy. В более сложных случаях Вы могли бы конфигурировать ваш компьютер, чтобы он выглядел как несколько машин с разными IP-адресами. Эта конфигурация иногда называется "Virtual Hosting".

Чтобы конфигурировать псевдоним для интерфейса, вы должны сначала гарантировать что ядро компилировалось с поддержкой для IP Alias (проверьте файл /proc/net/ip_alias, если его нет, ядро придется перестроить). Конфигурация IP-псевдонима фактически идентична конфигурированию реального сетевого устройства. Вы используете специальное имя, чтобы указать, что это псевдоним. Например:

# ifconfig lo:0 172.16.1.1
Эта команда создаст псевдоним для кольцевого интерфейса с адресом 172.16.1.1. IP aliases используют переменную n для каждого устройства, где "n" является целым числом. В нашем примере сетевое устройство, на котором мы создаем псевдоним, lo и создается псевдоним номер ноль для него. Этим путем одно физическое устройство может поддерживать ряд псевдонимов.

Каждый псевдоним может обрабатываться как отдельное устройство, однако, оно будет совместно использовать аппаратные средства с другим интерфейсом.