Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Сети TCP/IP

Хотя UUCP, может быть, и разумный выбор для дешевых сетей связи по телефону, существует большое количество ситуаций, в которых техника "сохранил-передал" оказывается слишком не гибкой, например, в локальных сетях (LAN). Они обычно состоят из небольшого числа машин, расположенных в одном здании или даже на одном этаже, которые связаны для создания однородной рабочей среды. Вы хотели бы разбросать файлы между этими хостами или запускать одно приложение на различных машинах. Эти задачи требуют совершенно другого подхода к организации сети. Вместо отправления полных файлов наряду с описанием работы, все данные разбиваются на маленькие пакеты, которые немедленно отправляются нужному хосту, где они повторно собираются. Этот тип сети называется пакетной (packet-switching) сетью. Среди прочего, это позволяет запускать по сети диалоговые приложения. Цена этого, конечно, резкое увеличение сложности программного обеспечения.

Решение, которое приняли Unix-системы и большинство не-Unix сайтов, известно как TCP/IP. В этом разделе мы будем рассматривать его концепции.

Введение в сети TCP/IP

TCP/IP происходит от проекта, финансируемого американским DARPA (Defense Advanced Research Projects Agency) в 1969. Это была экспериментальная сеть ARPANET, которая была преобразована в эксплуатационную в 1975 после того, как была доказана ее полезность.

В 1983 новый протокол TCP/IP был принят как стандарт и от всех хостов в сети требовалось его использование. Когда ARPANET, наконец, вырос в Inetrnet (ARPANET непосредственно окончил свое существования в 1990), использование TCP/IP распространилось и на сети вне Inetrnet. Наиболее известны локальные сети Unix, но из-за появлении быстрого цифрового телефонного оборудования, типа ISDN, он также имеет большой шанс стать протоколом транспортировки для телефонных сетей.

Для более конкретного рассмотрения TCP/IP повсюду в следующих разделах мы будем пользоваться как примером университетом Groucho Marx (GMU), большинство его отделов используют собственную локальную сеть, а другие используют несколько таких сетей. Они все связаны и подключены к Inetrnet через единственную быстродействующую линию.

Предположим, что Ваша Linux-машина связана с сетью из Unix-машин в отделе математики, имя Вашей машины erdos. Для доступа к хосту quark в отделе физики, введите следующую команду:
$ rlogin quark.physics
Welcome to the Physics Department at GMU
(ttyq2) login:

В ответ на приглашение Вы вводите Ваше сетевое имя (логин), скажем, andres и пароль. Вам дают shell (оболочку) на quark, к которой Вы можете обращаться как будто Вы сидите за системной консолью quark. После того, как Вы покинете оболочку, Вы возвращаетесь к приглашению собственной машины. Сейчас Вы использовали только одно из диалоговых приложений, которые предлагает TCP/IP: remote login.

Пока Вы находитесь на quark, Вам может понадобиться управлять Х11-приложением. Чтобы сказать этому приложению, что Вы хотите видеть окна на экране Вашего хоста, Вы должны отрегулировать среду. Это делается переменной окружения DISPLAY:
$ DISPLAY=erdos.maths:0.0
$ export DISPLAY

Если Вы теперь запускаете приложение, оно будет входить в контакт с Вашим X-сервером вместо quark и отображать все окна на Вашем экране. Конечно, это требует наличия у вас X11. TCP/IP позволяет quark и erdos посылать X11-пакеты туда и обратно, создавая иллюзию, что Вы находитесь на удаленной системе. Сеть здесь почти прозрачна.

Другое очень важное приложение в сетях TCP/IP: NFS (сетевая файловая система, Network File System). Это другая форма создания прозрачной сети, она позволяет монтировать каталоги с других хостов так, чтобы они рассматривались подобно локальным файловым системам. Например, домашние каталоги всех пользователей могут быть на центральной машине, с которой все другие хосты в локальной сети монтируют требуемые каталоги. В результате пользователи могут войти в сеть с любой машины и находиться в том же самом домашнем каталоге. NFS подрпобно рассмотрена в главе 14.

Конечно, это не единственные примеры того, что Вы можете делать в сетях TCP/IP. Ваши возможности почти безграничны.

Теперь мы поближе познакомимся с работой TCP/IP. Вы будете нуждаться в этом, чтобы понять, как и почему Вы должны конфигурировать свою машину. Мы начнем с исследования аппаратных средств.

Ethernet

Среди сетевых аппаратных средств наиболее широко используется повсюду в локальных сетях Ethernet. Он состоит из единственного кабеля с хостами. Скорость передачи зависит от типа Ethernet и составляет 10, 100 или около 1000 мегабит в секунду.

Ethernets бывает трех типов: толстый (thick), тонкий (thin) и витая пара (twisted pair). Тонкий и толстый Ethernet использует коаксиальный кабель, отличающейся толщиной (отсюда и название) и способом подключения машины к кабелю. Тонкий Ethernet использует BNC-коннектор в форме буквы Т, в который Вы вставляете кабель и вкручиваете сзади компьютера в гнездо сетевой платы. Толстый Ethernet требует, чтобы Вы проделали маленькую дырочку в кабеле и воткнули коннектор "методом вампира" (vampire tap). Один или больше хостов может быть присоединено к одному такому коннектору. Тонкий и толстый кабель Ethernet может иметь длину не больше 200 и 500 метров соответственно, поэтому они также названы 10base-2 и 10base-5. Витая пара использует кабель, сделанный из медных проводов, но обычно требует дополнительных аппаратных средств (активных концентраторов, active hubs). Он также известен как 10base-T. Здесь "base" является сокращением от "baseband modulation", это значит, что данные непосредственно поданы на кабель без каких-либо модемов и других подобных устройств. Число в начале показывает скорость в мегабитах в секунду, число в конце показывает максимальную длину кабеля. "T" обозначает витую пару. Витая пара на 100 мегабит в секунду обозначается как "100base-T".

Добавление хоста к толстому Ethernet не слишком сложно, оно даже не разрушает временно сеть. Чтобы добавить машину к сети с тонким Ethernet Вы должны прервать работу сети по крайней мере на несколько минут потому, что надо разрезать кабель, чтобы вставить Т-connector. Витая пара в этом плане очень удобна: в ней используется концентратор (hub), который является точкой обмена данными. Машина может быть подключена к нему или отключена от него независимо от работы других машин в сети.

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

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

Ethernet работает подобно системной шине, где хост может послать пакеты (или кадры, frames) до 1500 байтов длиной другому хосту на том же самом сегменте Ethernet. Хост идентифицируется адресом, состоящим из шести байт, зашитых в Ethernet-плату при ее создании. Эти адреса обычно записываются как последовательность шестнадцатиричных чисел с двумя цифрами отделяемыми двоеточиями, например, aa:bb:cc:dd:ee:ff.

Структура, посланная одной машиной, видна и всем остальным, но только хост места назначения подбирает и обрабатывает ее. Если две машины пробуют послать сообщение одновременно, происходит столкновение ( collision), которое решается двумя машинами с помощью остановки передачи и повторной попытки передачи данных несколько позже. Число столкновений доходит до 30% от пропускной способности сети, но при сильной нагрузке, этот показатель будет расти. Это нормально. Беспокоиться стоит начинать, когда он достигнет 60%. Тут может сильно помочь витая пара: в ней пакеты идут по двум разным проводам и поэтому не сталкиваются. Именно поэтому, все крупные сети делают на витой паре.

Другие типы оборудования

В больших сооружениях, типа университета Groucho Marx, Ethernet обычно не единственный тип используемого оборудования. В Groucho Marx локальная сеть каждого отдела связана с университетской магистралью, которая является оптическим кабелем FDDI (Fiber Distributed Data Interface ). FDDI использует совершенно другой подход к передаче данных, который основывается на рассылке определенных маркеров (tokens ) и только, если машина получает этот маркер, она может послать некий блок (один или несколько пакетов) информации. Главное преимущество FDDI скорость, достигающая 100 Mbps, и максимальная длина кабеля до 200 км. Кроме того, там нет столкновений пакетов из-за того, что сеть основана на передаче маркера.

Если Вы работаете с аппаратурой IBM, часто придется иметь дело с сетью IBM Token Ring. Token Ring является альтернативой Ethernet в LAN и использует решения, аналогичные применяемым в FDDI, но на низкой скорости (4 Mbps или 16 Mbps). В Linux Token Ring настраивается аналогично Ethernet, так что я не буду рассматривать его отдельно. Раньше за право быть наиболее распространенным стандартом бились Ethernet и Token Ring. В конце концов победил Ethernet, но стандарты по своим возможностям находятся примерно на одном уровне.

Есть и совершенно другие сетевые технологии, например, ArcNet и DECNet. Linux поддерживает и их, но из-за малой популярности, я не буду говорить о них в этой работе.

Многие сетевые операторы предлагают пакетные протоколы передачи. Вероятно, наиболее популярный из них стандарт X.25. Многие публичные сети подобно Tymnet в США, Austpac в Австралии и Datex-P в Германии предлагают это обслуживание. X.25 определяет собственный набор протоколов, но часто используется, чтобы соединить сети, работающие под TCP/IP и другими протоколами. Так как IP-пакеты не могут быть прямо отображены на X.25 (и наоборот), они просто вставляются в X.25-пакеты и посылаются по сети. X.25 требует синхронной связи и, следовательно, специальные синхронные аппаратные средства последовательного порта. Можно использовать X.25 с нормальными последовательными портами, если Вы используете специальное устройство PAD (Packet Assembler Disassembler). PAD автономное устройство. Оно обеспечивает асинхронные и синхронные последовательные порты. Это управляет протоколом X.25 так, чтобы простые устройства терминала могли создавать и принимать X.25-подключения. Имеется экспериментальная реализация протокола X.25 для Linux.

Более современный протокол называется Frame Relay. Frame Relay совместно использует ряд технических свойств с X.25, но гораздо больше похож в поведении на IP. Подобно X.25 Frame Relay требует специальных синхронных последовательных аппаратных средств. Из-за их сходства много плат поддерживают оба эти протокола. Доступен вариант, который не требует никаких специальных внутренних аппаратных средств. Это Frame Relay Access Device (FRAD), который формирует пакеты Frame Relay из пакетов Ethernet для передачи по сети. Frame Relay идеально подходит для переноса TCP/IP между сайтами. Linux обеспечивает драйверы многих внутренних устройств Frame Relay.

Если Вы нуждаетесь в работе с высокоскоростной сетью, Вас должен заинтересовать ATM (Asynchronous Transfer Mode). ATM является новой сетевой технологией, специально созданной для того, чтобы обеспечить управляемый, быстрый, с низким временем ожидания обмен данными. Она обеспечивает контроль над качеством обслуживание (QoS). Много компаний создают сети ATM, потому что это позволяет свести много услуг на одну платформу. ATM часто используется для передачи TCP/IP. Networking-HOWTO предлагает информацию относительно поддержки ATM в Linux.

Часто радиолюбители используют свое оборудование для создания сети из своих компьютеров. Это называется пакетное радио (packet radio) или ham-радио. Протокол, используемый ham-радио, назван AX.25 (он получен из X.25). Он также используется для передачи TCP/IP и других протоколов. AX.25 подобно X.25 требует последовательных аппаратных средств, способных к синхронному действию, или внешнее устройство Terminal Node Controller, чтобы преобразовать пакеты. Есть немало плат с поддержкой этого протокола, они имеют общее название "Z8530 SCC based" (по имени наиболее популярного контроллера связи, используемого в проектах). Есть два протокола, которые работают поверх AX.25: NetRom и Rose, являющиеся протоколами сетевого уровня. Linux поддерживает полные реализации AX.25, NetRom и Rose. AX25-HOWTO является хорошим источником информации по использованию этих протоколов в Linux.

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

Internet Protocol

Конечно, Вы не хотели бы, чтобы Ваша сеть ограничивалась только Ethernet. В идеале хотелось бы использовать сеть независимо от того, какими аппаратными средствами это достигается. Например, в больших сооружениях (Groucho Marx) Вы обычно имеете набор отдельных Ethernet, которые должны быть связаны некоторым образом. В GMU в математическом отделе используются два Ethernet: одна сеть быстрых машин для профессоров и студентов последних курсов и другая с медленными машинами для студентов (обе связаны с FDDI).

Эта связь управляется специальным хостом, так называемым gateway, который направляет поступающие и исходящие пакеты, копируя их между двумя Ethernet и FDDI. Например, если Вы в математическом отделе и хотите получить доступ к машине quark в локальной сети физического отдела, сетевое программное обеспечение не может послать пакеты непосредственно quark, потому что он находится на другом Ethernet. Поэтому этим занимается gateway. Gateway (назовем его sophus) посылает эти пакеты другому gateway (niels) в отделе физики, niels же отправляет их на требуемую машину.

Эта схема направления данных удаленному хосту называется маршрутизацией (routing), а пакеты часто называют дэйтаграммами (datagrams). Для простоты обмен дэйтаграммами управляется в соответствии c отдельным протоколом, который является независимым от используемых аппаратных средств: IP или Internet Protocol. В главе 2 мы будем рассматривать IP и routing более подробно.

Основное преимущество IP в том, что он преобразует физически несовместимые сети в одну с виду однородную сеть. Это называется internetworking, в результате получаем "метасеть" называемую internet. Обратите внимание на различие между inetrnet и Internet! Последнее является официальным названием одного специфического глобального inetrnet.

Конечно, IP также требует машинонезависимой схемы адресации. Это достигается с помощью назначения каждому хосту уникального номера размером в 32 бита, названного IP-адресом (IP address). IP-адрес обычно пишется как четыре десятичных числа для каждой 8-битовой части, разделенных точками. Например, quark мог бы иметь IP-адрес 0x954C0C04, который будет записан как 149.76.12.4. Этот формат также назван dotted decimal notation или dotted quad notation, в общем, формат записи с точками. Это известно под именем IPv4 (Internet Protocol, Version 4), потому что новый стандарт IPv6 предлагает намного более гибкую адресацию и другие современные свойства. Но новый стандарт IPv6 войдет в повсеместное использование еще очень не скоро...

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

Мы не будем здесь вдаваться в подробности этого процесса, а сделаем это в главе 2. Пока достаточно помнить, что эти шаги называются hostname resolution, поиск IP-адреса по имени хоста, и address resolution, поиск физического адреса по IP.

IP на последовательных линиях

Здесь стандартом является SLIP (Serial Line IP) или IP для последовательных линий. Есть модификация CSLIP (сжатый SLIP, Compressed SLIP), который использует сжатие IP-заголовков, чтобы оптимизировать IP для относительно низкой пропускной способности последовательной связи. PPP или протокол Point-to-Point Protocol еще один протокол для последовательных линий. PPP имеет большее число возможностей, чем SLIP, включая стадии переговоров о начале связи. Его главное преимущество по сравнению со SLIP в том, что он не ограничивается только транспортировкой IP-пакетов, а предназначен для передачи любого типа дэйтаграм.

Transmission Control Protocol

Но, конечно, посылка пакетов от одного хоста к другому это не все, если Вы вошли на quark. Вы хотите иметь надежную связь между Вашим процессом rlogin на erdos и процессом оболочки на quark. Таким образом, информация, посылаемая туда и обратно, должна быть разбита на пакеты отправителем и повторно собираться в поток приемником. Хотя это кажется тривиальным, здесь появляется несколько достаточно сложных задач.

Очень важно знать об IP, что он ненадежен. Предположим, что десять людей на Вашем Ethernet начали загружать самый последний выпуск XFree86 с GMU FTP-сервера. Такая активность может оказаться слишком большой для того, чтобы gateway переварил ее, потому что он слишком медленный и ограничен количеством памяти. Теперь если Вы пошлете пакет с quark, sophus может не хватить места в буфере, и поэтому он не сможет отправить этот пакет. IP решает эту проблему, просто забывая про данный пакет. Пакет безвозвратно потерян. Таким образом, ответственность за целостность данных перекладывается на поддерживающие связь хосты.

Это происходит в соответствии c другим протоколом, TCP (Transmission Control Protocol), который надстраивается над IP для создания связи с проверкой целостности данных. Существенный плюс TCP то, что он использует IP. Это создает иллюзию простой связи между двумя процессами на Вашем хосте и отдаленной машине так, что Вы не заботитесь о том, как и по какому маршруту Ваши данные фактически путешествуют. A TCP создает дуплексную связь, позволяющую одновременно как посылать, так и получать информацию.

В TCP точки связи определяются IP-адресами хостов и номерами так называемых портов (port) на каждом из хостов. Порты служат для определения процесса, с которым устанавливается связь. Если обратится к примеру с номерами телефонов, то IP-адрес соответствует кодам городов, а номер порта местному номеру телефона.

В примере с rlogin приложение-клиент (rlogin) открывает порт на erdos и соединяется с портом 513 на quark , который прослушивает сервер rlogind. Таким образом и устанавливается TCP-связь. Используя эту связь, rlogind выполняет процедуру определения прав доступа и запускает оболочку. Стандартный ввод/вывод этой оболочки перенаправляются на TCP-связь, таким образом, все, набранное Вами в rlogin на Вашей машине, будет передано через TCP-поток на стандартный ввод оболочки.

User Datagram Protocol

Конечно, TCP не единственный протокол пользователя в сетях TCP/IP. Хоть он и подходит для приложений подобных rlogin, но он излишне надежен и не нужен для приложений типа NFS. Вместо него в них использует UDP (User Datagram Protocol). Подобно TCP, UDP также позволяет приложению-клиенту войти в контакт с сервером, обслуживающим определенный порт на удаленной машине, но он не устанавливает связь для этого. Вместо этого Вы можете использовать его, чтобы посылать отдельные пакеты к месту назначения.

Предположим, что Вы смонтировали директорию TeX с центрального NFS-сервера galois и хотите просмотреть документ, описывающий, как использовать LaTeX. Вы запускаете редактор, который сначала читает указанный файл. Однако, требуется слишком много времени, чтобы установить TCP-связь с galois, послать файл и повторять это снова. Вместо этого на запрос, посланный к galois, тот посылает файл в паре UDP-пакетов, что происходит гораздо быстрее. Однако, UDP не приспособлен для борьбы с потерей пакетов. Этим приходится заниматься NFS.

Еще о портах

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

Важная особенность портов то, что пока существует связь между клиентом и сервером, другая копия сервера может присоединиться к тому же порту и ждать подключения других клиентов. Это разрешает, например, иметь несколько параллельных удаленных входов на один и тот же хост, причем все используют один порт 513. TCP способен отличать эти связи друг от друга, потому что они все прибывают от различных портов или хостов. Например, если Вы дважды войдете на quark с erdos, первый клиент rlogin будет использовать местный порт 1023, а второй будет использовать порт 1022. Однако, будут соединяться с тем же самым портом 513 на quark .

Этот пример показывает использование портов как пунктов, где клиент входит в контакт с определенным портом, чтобы получить соответствующее порту обслуживание. Клиенту необходимо знать надлежащий номер порта, соглашение о назначении этих номеров должно быть достигнуто между администраторами обеих систем. Для услуг, которые широко используются типа rlogin , эти номера должны устанавливаться централизованно. Этим занимается IETF (Internet Engineering Task Force), которая регулярно выпускает статьи RFC. Они, среди прочего, назначают номера портов для общеизвестных услуг. В этом плане наиболее известна статья Assigned Numbers (RFC-1700). Linux использует файл, в котором регистрирует названия доступных другим сервисов и номера портов, к которым определенный сервис прикреплен. Называется этот файл /etc/services.

Стоит заметить, что хотя TCP и UDP полагаются на порты, эти номера не находятся в противоречии. Это означает, что TCP порт 513, например, отличается от UDP порта 513. Фактически, эти порты служат как точки доступа для двух различных услуг, а именно, rlogin (TCP) и rwho (UDP).

Библиотека сокетов

В Unix-подобных операционных системах программное обеспечение, выполняющее все задачи и протоколы, описанные выше, обычно является частью ядра, аналогично сделано и в Linux. Интерфейс программирования, наиболее общий для мира Unix, библиотека гнезд Berkeley (Berkeley Socket Library). Свое название она получила из-за популярной аналогии, которая рассматривает порты как гнезда (розетки). Правда, в современной русской сетевой терминологии устоялся термин "сокет". Она обеспечивает запрос bind, который определяет удаленный хост, транспортный протокол и сервис, к которому программа может присоединиться или слушать (используя системные вызовы connect, listen и accept). Библиотека сокетов обеспечивает не только TCP/IP-сокеты (сокеты типа AF_INET), но также класс, который обрабатывает подключения, локальные для машины (AF_UNIX). Некоторые реализации могут также обрабатывать другие классы подобно XNS (Xerox Networking System) или X.25.

В Linux библиотека сокетов является частью стандартной C-библиотеки libc. Типы сокетов, которые она поддерживает в настоящее время, указаны в таблице 1-1.

Таблица 1-1. Типы сокетов, поддерживаемых libc .

Протокол Классы сокетов
TCP/IP AF_INET и AF_INET6
Локальные соединения AF_UNIX
Сети Novell AF_IPX
X.25 AF_X25
ATM AF_ATMPVC и AF_ATMSVC
Amateur Radio AF_AX25, AF_NETROM и AF_ROSE

Ведутся работы по добавлению сокетов и для других протоколов.