Версия для печати

Архив документации на OpenNet.ru / Раздел "Документация для Linux" (Многостраничная версия)
Базовый курс Linux Оригинал: skif.bas-net.by
next up previous contents index
Next: Contents   Contents   Index





Alex Otwagin 2002-12-16

next up previous contents index
Next: Contents   Contents   Index





Alex Otwagin 2002-12-16

... кабеля7.1
Эффективная длина кабеля может варьироваться в зависимости от каждой конкретной сети. С улучшением технологии она увеличивается
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... передачи7.2
Диапазон скоростей передачи для некоторых типов кабелей расширяется. Технические достижения в производстве медных проводов привели к такой скорости передачи сигналов, которую ранее нельзя было и предположить
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... шлюзом7.3
С точки зрения теории сетей считается, что термин "шлюз" необходимо применять в отношении тех маршрутизаторов, которые выполняют преобразование протоколов. Строгое употребление термина "шлюз" относится к аппаратно-программным комплексам, функционирующим на седьмом, прикладном уровне модели OSI, которые передают данные между несовместимыми программами или сетями, выполняющими одинаковые функции, но по-разному реализованными (например DECnet и Internet).
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... Это8.1
первая сноска
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
... текст8.2
вторая сноска
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

next up previous index
Next: Введение в ОС Linux Up: base Previous: base   Index


Contents



Alex Otwagin 2002-12-16

next up previous contents index
Next: Права доступа к файлу Up: Файловая система Previous: Домашний каталог   Contents   Index

Ссылки

В Linux имеется тип файлов, которых нет в DOS: символьные ссылки. Он может быть описан как ссылка на файл или каталог и может быть использован вместо файла или каталога, на который она указывает; они сходны с ярлыками в Windows. Примером символьный ссылки может быть /usr/X11, которая указывает на каталог /usr/X11R6, или /dev/modem, который указывает либо на /dev/ttyS0 либо на /dev/ttyS1.

Для того, чтобы создать символьную ссылку, используется команда:

    $ ln -s <имя_файла> <имя_ссылки>
Пример:
    $ ln -s /usr/doc/g77/DOC g77manual.txt
Теперь вы можете ссылаться на g77manual.txt вместо /usr/doc/g77/DOC. Ссылки показываются следующим образом в списке файлов каталога:
  $ ls -F
  g77manual.txt@
  $ ls -l
  (разные вещи...)           g77manual.txt -> /usr/doc/g77/DOC
Отметьте, что каталоги также могут быть доступны по ссылке, поскольку являются частным случаем файлов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Процедура регистрации в системе Up: Работа в ОС Linux Previous: Работа в ОС Linux   Contents   Index

Работа в ОС Linux



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Регистрация с помощью login Up: Работа в ОС Linux Previous: Работа в ОС Linux   Contents   Index

Процедура регистрации в системе

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Выход из системы Up: Процедура регистрации в системе Previous: Процедура регистрации в системе   Contents   Index

Регистрация с помощью login

Установленный при инсталляции загрузчик запускает Linux. В ходе загрузки системы создаются несколько консолей - виртуальных устройств ввода-вывода, которыми могут пользоваться различные компоненты и пользовательские программы системы. В одной из консолей может автоматически запускаться графическая среда X Window System.

При запуске консоли появляется приглашение для входа в систему. Введите в поле Login: регистрационное имя обычного пользователя. Если по каким-либо причинам при установке системы не было создано ни одной регистрационной записи обычного пользователя, введите имя суперпользователя root, а в дальнейшем создайте хотя бы одну регистрационную запись обычного пользователя.

Чтобы получить регистрационное имя, обратитесь к администратору системы(root). Существует несколько правил выбора регистрационного имени. Обычно длина имени составляет от 3 до 8 символов. Оно может состоять из больших или маленьких букв, цифр, символа подчеркивания, но не может начинаться с цифры.

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

        startship
        dmitry100
        very_long_user_name

Суперпользователь (root) может удалять, перемещать, переименовывать или изменять существенно важные параметры любых файлов системы, поэтому ошибки, совершенные начинающим пользователем при работе под этим именем, могут привести систему в некорректное состояние. Никогда, кроме исключительных случаев, не работайте под именем суперпользователя (root)!

После того как Вы введете имя пользователя, в следующей строке будет выведено приглашение Password: Наберите на клавиатуре пароль пользователя и нажмите на клавишу Enter (при этом никакие символы на экране не появляются, и курсор перемещаться не будет).

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

    [user\_name@localhost dir\_name]$
(вместо user\_name будет стоять имя пользователя, под регистрационной записью которого Вы работаете, а вместо dir\_name - название текущего каталога). Дальнейшая работа состоит в запуске различных программ в режиме командной строки.

Если Вы вошли под именем root, приглашение будет иметь вид

    [root@localhost dir\_name]#
Обратите внимание на изменение символа приглашения!



Alex Otwagin 2002-12-16

next up previous contents index
Next: Установка или смена пароля Up: Процедура регистрации в системе Previous: Регистрация с помощью login   Contents   Index

Выход из системы

Для завершения работы ОС и всех приложений и перезагрузки компьютера нажмите на клавиши [Ctrl]-[Alt]-[Del] или введите команду reboot. В последнем случае на экран будет выведено приглашение Password: и Вы должны будете ввести пароль пользователя, под именем которого Вы работаете. Для того чтобы прекратить работу и выключить компьютер, введите команду halt.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Интерфейс командной строки - Up: Процедура регистрации в системе Previous: Выход из системы   Contents   Index

Установка или смена пароля

Для введения пароля нового пользователя или изменения пароля существующего введите в командной строке команду
    passwd имя_пользователя
В ответ на приглашение
   New UNIX password:
введите пароль (допускаются любые символы, прописные и строчные буквы различаются). На экране не отображаются никакие символы, и курсор по мере набора символов не перемещается.

Если введенный пароль слишком простой (например, короче шести символов), об этом будет выдано предупреждение, начинающееся со слов BAD PASSWORD (далее следует описание недостатков пароля). Напоминаем, что Linux - принципиально многопользовательская система, поэтому по умолчанию предполагается, что на Вашем компьютере могут работать самые разные люди, в том числе и способные ``взломать'' Ваш пароль. Поэтому настоятельно рекомендуется использовать достаточно длинные (не менее 6 и не более 256 символов) пароли, состоящие не только из цифр и не содержащие ``словарных'' слов. Разумеется, если компьютер находится в Вашем полном распоряжении и недоступен для посторонних, эти предосторожности представляются чрезмерными. Поэтому Вы можете проигнорировать это сообщение (в данном случае носящее характер предупреждения).

После ввода пароля Вам будет предложено подтвердить введенный пароль. В ответ на приглашение

   Retype new UNIX password:
введите пароль еще раз.

В случае успеха (если дважды был введен одинаковый пароль) выдается сообщение

   passwd: all authentification tokens updated successfully
и программа завершает работу. Если пароли, введенные в первом и во втором случае, не совпадают, выдается сообщение
   Sorry, passwords do not match
и Вам вновь предлагается ввести пароль.

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

   passwd
и в ответ на приглашение
   (current) UNIX password:
ввести текущий пароль. Дальнейшая работа программы аналогична описанной выше, однако в этом случае задание простого пароля не допускается.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Понятие консоли Up: Работа в ОС Linux Previous: Установка или смена пароля   Contents   Index

Интерфейс командной строки - консоль

Рассматриваемые темы:

Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Переключение консолей Up: Интерфейс командной строки - Previous: Интерфейс командной строки -   Contents   Index

Понятие консоли

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

Система Linux поддерживает так называемые ``виртуальные'' консоли, работающие в качестве отдельной консоли, и позволяющие поддержку различных пользовательских сессий, но использующие для взаимодействия с системой единый физический терминал. По умолчанию система Linux конфигурируется с поддержкой 7(семи) ``виртуальных'' консолей. Находясь у консольного терминала, Вы можете свободно переключать ``виртуальные'' консоли, а также регистрироваться в системе с разных консолей одновременно.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Прокрутка текста в консоли Up: Интерфейс командной строки - Previous: Понятие консоли   Contents   Index

Переключение консолей

Для того, чтобы переключиться в нужную консоль, нажмите одновременно клавиши [ALT]-[Fn], где n означает номер нужной консоли. Например, чтобы переключиться в четвертую консоль, нажмите [ALT]-[F4]. Вы можете использовать для переключения консолей клавиши управления курсором (влево и вправо). Так, чтобы переключиться на консоль с меньшим номером (или на последнюю консоль, если Вы находитесь в первой), нажмите [ALT]-[<-]. Для переключения на консоль с большим номером, нажмите [ALT]-[->].

Седьмая консоль зарезервирована для графического интерфейса X Window. Если X Window установлена, этот виртуальный терминал никогда не выводит приглашение регистрации. Вместо этого, если Вы используете X Window, на этом терминале отображается сессия X Window. Если Ваша система настроена на немедленный запуск X, эта виртуальная консоль покажет экран регистрации X Window.

Из системы X Window переключение в другие виртуальные консоли происходит с помощью комбинации клавиш [CTRL]-[ALT]-[Fn].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск команд Up: Интерфейс командной строки - Previous: Переключение консолей   Contents   Index

Прокрутка текста в консоли

Если Вы зарегистрировались в определенной консоли, то при вводе команд новые строки появляются в нижней строке экрана, а ранее набранный текст смещается вверх. Чтобы увидеть текст, введенный ранее, используйте [SHIFT]-[PgUp]. Для перемещения по тексту вперед, используйте [SHIFT]-[PgDn].

Объем текста, который Вы можете пролистать назад, определяется объемом памяти системы.

Примечание: Этот способ прокрутки текста применяется только в командной оболочке shell, в которой Вы окажетесь после регистрации. Он может не работать в консольном приложении или при выполнении определенных команд ОС. Для прокрутки текста в приложениях используйте их собственные возможности прокрутки текста, если таковые имеются.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование инструментов в Linux Up: Работа в ОС Linux Previous: Прокрутка текста в консоли   Contents   Index

Запуск команд

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Структура каталогов Linux Up: Файловая система Previous: Ссылки   Contents   Index

Права доступа к файлу

В Linux файл имеет ``права доступа'' и ``владельца'', который относится к ``группе''. Посмотрите пример:

   $ ls -l /bin/ls
   -rwxr-xr-x  1  root  bin  27281 Aug 15 1995 /bin/ls*
Первое поле содержит права доступа к файлу /bin/ls, который принадлежит пользователю root, группы bin. Опуская другую информацию, запомните, что означает -rwxr-xr-x, слева направо:

Каталог /bin тоже имеет права доступа. Вот поэтому вы не можете удалить файл /bin/ls до тех пор, пока не станете пользователем root: вы просто не имеете прав сделать это. Для изменения прав доступа к файлу используется команда:

     $ chmod <ugoXperm> <file>
где ugo -- это u (пользователь, который является владельцем), g (группа), o (остальные), X -- это либо +, либо -, perm -- это r (чтение), w (запись), или x (выполнение). Вот общие примеры использования команды chmod:
    $ chmod +x file
устанавливает право на выполнения данного файла.
    $ chmod go-rw file
удаляет право на чтение и запись для всех, кроме владельца файла.
    $ chmod ugo+rwx file
дает всем права на чтение, запись и выполнение.
    # chmod +s file
делает так называемый ``setuid'' или ``suid'' файл -- файл, который любой может выполнять с привилегиями владельца. Обычно, это применяется к файлам, владельцем которых является root; часто это важные системный файлы, такие как X-сервер.

Более коротким способом для ссылки на права доступа является использование цифрового обозначения: rwxr-xr-x может быть выражен как 755 (каждый символ соответствует биту: --- равен 0, --x равен 1, -w- равен 2, -wx равен 3...). Это выглядит трудным, но, немного попрактиковавшись, вы поймете концепцию. root, будучи администратором, может изменять права доступа на файлы любого пользователя.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды и их выполнение Up: Запуск команд Previous: Запуск команд   Contents   Index

Использование инструментов в Linux

Тот факт, что ОС Unix, ставшая прародителем Linux, существует уже более 30 лет, наводит на мысль о верности заложенных в ней принципов. Одним из принципов является ``инструментальный'' подход.

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

Каждое из этих монолитных приложений наверняка содержит операцию ``открытия'' файла, то есть чтения его с диска в специально выделенные структуры памяти; большинство из них содержат команды поиска и замены текста, проверки грамматики, печати документа и т.д. Исходный код приложений для выполнения перечисленных задач хранится отделно внутри каждого приложения, занимая лишнее место в памяти и на диске. Это противоречит идеологии Linux.

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

ОС, подобные Linux, не придают приложениям столь значимой роли. Вместо этого, они поставляются со множеством небольших программ, называемых ``инструментами''. Каждый инструмент способен выполнять лишь очень простую, определенную для него задачу - перенаправлять вывод из файлов, посылать вводимую информацию на принтер, сортировать строки в потоке ввода. Отличие состоит в том, что инструмент выполняет свою работу максимально эффективно.

Важным моментом при разработке Unix было введение ``конвейеров'', позволяющих передать результаты работы одного инструмента в качестве исходных данных другому. Зная, что по отдельности делает каждый инструмент и умея их комбинировать, пользователь может создавать достаточно мощные ``цепочки'' команд.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Оболочка bash Up: Запуск команд Previous: Использование инструментов в Linux   Contents   Index

Команды и их выполнение

Инструмент является небольшой программой, выполняющей определенную функцию - обычно несложную специализированную задачу. Например, инструмент hostname выводит сетевое имя, присвоенное данной машине, а инструмент who выводит список пользователей, зарегистрированных в системе в текущий момент. Более объемная программа, выполняющая широкий круг задач, например, обработку изображений или редактирование текста, называется приложением.

И инструмент, и приложение могут принимать ряд параметров (называемых также ``флагами'' или ``опциями''), которые определяют специфику их поведения. Они также могут принимать аргументы, определяющие файл для обработки. Аргументы обычно указываются после всех требуемых параметров.

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

Большие и малые буквы в командах различаются; названия инструментов и приложений обычно записываются строчными буквами.

Чтобы выполнить программу или приложение без указания ему каких-либо параметров или аргументов, наберите его имя после приглашения shell и нажмите [Enter]. Например, для запуска инструмента hostname, введите:

   $ hostname [Enter]
   student_1
   $
Сетевое имя данной системы `student_1'.

Опции всегда начинаются со знака тире `-', за которым следует цифра или буква. Чтобы включить опцию в команду, ее указывают за именем инструмента или приложения. Необходимо всегда разделять название инструмента, опции и каждый из аргументов пробелами.

Иногда опция сама по себе может принимать аргументы. Например, hostname содержит опцию `-F', позволяющую указать имя файла, из которого будет прочитано сетевое имя ; в качестве аргумента она принимает имя файла. Например, для запуска hostname с входным файлом `host.info' введите:

$ hostname -F host.info [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Понятие оболочки Up: Работа в ОС Linux Previous: Команды и их выполнение   Contents   Index

Оболочка bash

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды редактирования в bash Up: Оболочка bash Previous: Оболочка bash   Contents   Index

Понятие оболочки

Оболочка (shell) в Linux - это программа, воспринимающая ввод команд от пользователя и выполняющая их. Это самый основной способ взаимодействия с системой. Как только Вы регистрируетесь в системе, Вы сразу попадаете в определенную оболочку (в зависимости от настройки).

Символ `$' перед курсором называется приглашением (prompt); он сообщает Вам, что система ожидает ввода команды. Перед ним может находиться строка, указывающая имя пользователя, работающего с этой оболочкой и название текущего каталога. Например:

[student@student_1 student]$ _

Если в приглашении вместо символа `$' Вы увидите `#', это значит, что Вы зарегистрировались в качестве суперпользователя. Будьте внимательны и осторожны: сейчас система полностью находится под Вашим контролем; любая ошибка в команде может стать непоправимой. Для каждого пользователя полезно иметь отдельный пользовательский бюджет и пользоваться только им.

В каждой системе Linux есть как минимум одна оболочка, хотя их может быть и несколько. Однако, в большинстве систем Linux стандартной является bash. Все дальнейшие сведения относятся к оболочке bash.

Примечание: Чтобы получить подробную информацию о bash, Вы можете воспользоваться файлом справки `bashref.info'.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование специальных символов Up: Оболочка bash Previous: Понятие оболочки   Contents   Index

Команды редактирования в bash

Таблица, приведенная здесь, описывает комбинации клавиш для редактирования команд в командной строке bash.

Клавиши Описание  
текст Вставить текст о позиции курсора; если справа от курсора уже есть текст, он сдвигается вправо.  
[BKSP] Удалить символ слева от курсора.  
[DEL] Удалить символ, под которым находится курсор  
[Enter] Выполнить команду, набранную после приглашения bash. Курсор может находиться в любом месте командной строки  
Ctrl-a Переместить курсор в начало строки.  
Ctrl-d Эквивалент [DEL]  
Ctrl-e Переместить курсор в конец строки.  
Ctrl-k Удалить весь текст в строке, начиная с позиции курсора до конца строки.  
Ctrl-l Очистить экран терминала  
Ctrl-u Удалить всю введенную строку  
Ctrl-y Вернуть последний удаленный текст, вставив его от позиции курсора.  
$ \leftarrow$ Сдвинуть курсор на один символ влево.  
$ \rightarrow$ Сдвинуть курсор на один символ вправо.  
$ \uparrow$ и $ \downarrow$ Вызвать строку из файла истории команд  


next up previous contents index
Next: Использование специальных символов Up: Оболочка bash Previous: Понятие оболочки   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Автоподстановка команд Up: Оболочка bash Previous: Команды редактирования в bash   Contents   Index

Использование специальных символов

Некоторые символы являются зарезервированными и имеют поэтому специальное собственное значение в оболочке. Чтобы передать один из этих символов команде, Вам нужно заключить весь аргумент в одинарные кавычки (`'').

Если аргумент содержит одинарные кавычки внутри себя (например, слово с апострофом), его можно заключать в двойные кавычки (""). Здесь приведена таблица наиболее употребительных специальных символов.

Символ Описание  
\a Сигнал (звуковой)  
\b Backspace  
\e Escape  
\f Пропуск страницы  
\n Новая строка  
\r Возврат каретки  
\t Горизонтальная табуляция  
\v Вертикальная табуляция  
\\ Обратная наклонная черта  
\NNN ASCII-символ с восьмеричным кодом NNN  



Alex Otwagin 2002-12-16

next up previous contents index
Next: Выполнение нескольких команд Up: Оболочка bash Previous: Использование специальных символов   Contents   Index

Автоподстановка команд

Автоподстановка позволяет bash завершить начало набираемой команды наиболее подходящим способом. Чтобы его использовать, нажмите [TAB], и bash попытается найти подходящее завершение для слова слева от курсора.

Автоподстановка работает для имен файлов и названий команд, все определяется контекстом, в котором Вы нажмете [TAB].

Например, предположим, что Вы хотите использовать в качестве аргумента команды ls имя каталога `/usr/lib/emacs/20.7/i386-redhat-linux-gnu/', которое явялется достаточно длинным. Тогда вместо набора всего имени Вы можете использовать автоподстановку. Отметьте, что попытка нажать [TAB] в первый раз при наборе `/e' приведет к выводу на экран нескольких вариантов названий файлов и каталогов, а вторая попытка, когда набрано `em', сужает область поиска:

$ ls /usr/lib/e[TAB]\\
elm-me+    emacs      entity-map    expect5.30\\
$ ls /usr/lib/em[TAB]

В этом случае оболочка завершит слово `emacs', поскольку это единственный вариант, начинающийся с `em'. Нажмите /[TAB] и оболочка подставит имя каталога `20.4', поскольку он единственный в каталоге `emacs':

$ ls /usr/lib/emacs/[TAB]20.4/

Нажмите [TAB] еще раз и Вы получите следующий единственный каталог внутри `20.4':

$ ls /usr/lib/emacs/20.4/[TAB]i386-debian-linux-gnu/



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление ввода-вывода Up: Оболочка bash Previous: Автоподстановка команд   Contents   Index

Выполнение нескольких команд

Чтобы выполнить последовательность команд, наберите их в командной строке в том порядке, в котором они должны быть выполнены, отделяя каждую команду от предыдущей точкой с запятой (`;'). Используйте эту возможность, если Вам необходимо выполнить несколько неинтерактивных команд. Например, чтобы очистить экран и закончить работу с системой, введите:

$ clear; logout [Enter]

Чтобы выполнить команду hostname три раза, введите:

$ hostname; hostname; hostname [Enter]
student_1
student_1
student_1
$



Alex Otwagin 2002-12-16

next up previous contents index
Next: Cтандартные потоки ввода-вывода Up: Работа в ОС Linux Previous: Выполнение нескольких команд   Contents   Index

Перенаправление ввода-вывода

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление ввода из файла Up: Перенаправление ввода-вывода Previous: Перенаправление ввода-вывода   Contents   Index

Cтандартные потоки ввода-вывода

Оболочка оперирует с вводимой и выводимой информацией посредством файлов специального вида - ``потоков (streams)''. Стандартный вывод - это файл, в который оболочка выводит результаты работы команд - по умолчанию, на экран Вашего терминала. Стандартный ввод (обычно это клавиатура) является источником данных для команд. Если команда считывает данные из стандартного ввода, она делает это до тех пор, пока Вы не введете Ctrl-d в новой строке.

Если команда завершает выполнение с ошибкой, на экран обычно выводится сообщение об ошибке. Это сообщение принадлежит отдельному стандартному потоку для ошибок.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пользователи системы Up: Файловая система Previous: Права доступа к файлу   Contents   Index

Структура каталогов Linux

Только что установленная система Linux имеет дерево каталогов следующей структуры:
/
корневой каталог.
/bin
основные системные программы.
/boot
загрузочные файлы ядра ОС.
/dev
описания устройств компьютера.
/etc
конфигурационные файлы системы и подкаталоги с конфигурационными файлами прикладных программ.
/home
подкаталоги (домашние каталоги) пользователей.
/lib
динамические библиотеки.
/lost+found
информация об удаленных файлах, при некоторых условиях помогающая восстановить данные.
/mnt
подкаталоги стандартные точки монтирования сменных устройств, таких как дисковод CD-ROM.
/root
домашний каталог суперпользователя.
/sbin
системные программы.
/usr
прикладные программы и библиотеки.
/var
рабочие каталоги программ.
Вам следует помещать свои документы и другие файлы только в свой домашний каталог. В нем можно создавать любые нужные Вам подкаталоги, руководствуясь соображениями удобства представления информации. Вам не следует вносить изменения в другие каталоги, за исключением случаев установки новых прикладных программ (в этом случае надо следовать инструкции к дистрибутиву устанавливаемой программы) или редактирования конфигурационных файлов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление вывода в файл Up: Перенаправление ввода-вывода Previous: Cтандартные потоки ввода-вывода   Contents   Index

Перенаправление ввода из файла

Чтобы перенаправить стандартный ввод из файла, используйте оператор `<'. Укажите после имени команды оператор <, а затем имя файла, который будет служить источником ввода. Например, вместо ввода множества параметров вычислительной задачи Вы можете записать их в файл, а затем перенаправить ввод для программы из этого файла. Пусть программа называется programma, а файл данных datafile. Введите следующую команду:

$ programma < datafile [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление ошибок в файл Up: Перенаправление ввода-вывода Previous: Перенаправление ввода из файла   Contents   Index

Перенаправление вывода в файл

Для перенаправления стандартного вывода в файл используйте оператор `>'. Укажите после имени команды оператор >, а затем имя файла, который будет служить приемником вывода. Например, чтобы записать вывод результатов работы программы programma в файл results, введите:

$ programma > result [Enter]

Если Вы перенаправите стандартный вывод в уже существующий файл, он будет перезаписан с начала. Чтобы добавить стандартный вывод к содержимому существующего файла, необходимо использовать оператор `»'. Например, для добавления результатов работы при повторном запуске программы programma в файл results, введите:

$ programma >> result [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание конвейеров Up: Перенаправление ввода-вывода Previous: Перенаправление вывода в файл   Contents   Index

Перенаправление ошибок в файл

Чтобы перенаправить стандартный поток ошибок в файл, используйте оператор `2>'. Укажите после имени команды оператор 2>, а затем имя файла, который будет служить приемником ошибок выполнения программы. Например, чтобы записать ошибки выполнения программы programma в файл programma.errors, введите:

$ programma 2> programma.errors [Enter]

Чтобы добавить стандартный поток ошибок в уже существующий файл, используйте оператор `»' вместо `>'.

$ programma 2>> programma.errors [Enter]

Чтобы перенаправить в один и тот же файл поток вывода и поток ошибок, используйте оператор `SPMamp;>'.

$ programma &> result_with_errors [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Управление заданиями Up: Перенаправление ввода-вывода Previous: Перенаправление ошибок в файл   Contents   Index

Создание конвейеров

Конвейер - это соединение стандартного вывода одной команды со стандартным вводом другой. Вы можете сделать это, указав команды в нужном порядке и разделив их вертикальной чертой `|' (иногда называемой ``трубой (pipe)'').

Например, Вы хотите посмотреть длинный список файлов в каталоге '/usr/bin', используя средство форматирования текста less. Введите:

 $ ls -la /usr/bin | less [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Что такое задания Up: Работа в ОС Linux Previous: Создание конвейеров   Contents   Index

Управление заданиями

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Остановка задания Up: Управление заданиями Previous: Управление заданиями   Contents   Index

Что такое задания

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

Оболочка присваивает каждому заданию уникальный номер. Вы можете использовать его в качестве аргумента, ссылаясь на это задание в командах управления заданиями. При этом необходимо указывать перед номером задания символ `%'.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перевод задания в фоновый Up: Управление заданиями Previous: Что такое задания   Contents   Index

Остановка задания

Чтобы приостановить активное задание, нажмите Сtrl-Z. Это может понадобиться, если Вам нужно срочно выполнить что-либо другое и вернуться к прерванному заданию позже. Прерванное задание будет приостановлено, пока Вы не сделаете его активным или не переведете его в фоновый режим.

После остановки оболочка выведет строку, в которой будет указан номер задания (в квадратных скобках), слово `Stopped', указывающее, что задание остановлено и командная строка, запустившая это задание. Пример:

[1]+ Stopped /usr/bin/mc -P "$@" > "$MC"

В этом примере номер нашего задания - 1, а команда, запустившая приостановленное задание - /usr/bin/mc -P "$@" > "$MC". Символ `+' после номера задания указывает, что этио задание было остановлено последним.

Если Вы попытаетесь завершить работу в системе при наличии остановленных заданий, оболочка предупредит Вас об этом:

   $ logout [Enter]
   There are stopped jobs.
   $



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перевод задания в активный Up: Управление заданиями Previous: Остановка задания   Contents   Index

Перевод задания в фоновый режим

Все новые задания запускаются в активном режиме, если Вы ничего не указываете специально. Чтобы запустить задание в фоновом режиме, необходимо завершать командную строку символом (`&'). Это может пригодиться, когда Вы запускаете неинтерактивные задания, выполняющие большой объем вычислений. Например, чтобы запустить программу programma в фоновом режиме, введите:
   $ programma & [Enter]
   [1] 6575
   $

Оболочка сообщит Вам номер задания ( в данном случае 1) и идентификатор процесса (в данном случае 6575), а эатем появится приглашение оболочки. когда фоновое задание завершится, оболочка выведет на экран номер задания, запустившую его команду и слово `Done', указывающее на успешное завершение задания:

[1]+  Done                    programma

Чтобы перевести в фоновый режим активное задание, сначала остановите его, а затем переведите в фоновый режим командой bg ("background" - фоновый режим). Например, для программы programma выполните:

$ programma [Enter]
C-z

[1]+  Stopped                 programma
$ bg [RET]
[1]+ programma &
$

Если Вы приостановили несколько заданий, укажите в качестве аргумента bg номер задания, которое нужно перевести в фоновый режим. Например, для задания с номером 4 введите: $ bg %4 [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Список заданий Up: Управление заданиями Previous: Перевод задания в фоновый   Contents   Index

Перевод задания в активный режим

Используйте команду fg, чтобы перевести фоновое задание в активный режим. По умолчанию команда fg активирует последнее задание, переведенное в фоновый режим. Чтобы перевести в фоновый режим определенное задание, укажите его номер в качестве аргумента, например, для задачи 3 введите:

$ fg %3 [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Прекращение задания Up: Управление заданиями Previous: Перевод задания в активный   Contents   Index

Список заданий

Чтобы увидеть список заданий, запущенных в данной оболочке, используйте команду jobs:

$ jobs [Enter]
[1]-  Stopped                 programma1
[2]+  Stopped                 programma2
$

Этот пример показывает наличие двух запущенных заданий - programma1 и programma2. Символ `+' указывает на самое последнее запущенное задание, а символ `-' указывает все ранее запущенные заадния. Если в оболочке нет запущенных заданий, jobs ничего не возвращает.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Суперпользователь (root) и обычный Up: Введение в ОС Linux Previous: Структура каталогов Linux   Contents   Index

Пользователи системы



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск заданий в требуемый Up: Управление заданиями Previous: Список заданий   Contents   Index

Прекращение задания

Чтобы немедленно прекратить выполнение текущего активного задания, используйте Ctrl-c. Для прекращения фонового задания используйте команду kill с аргументом, указывающим номер задания. Например, для задания 2:

$ kill %2 [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Настройка оболочки Up: Управление заданиями Previous: Прекращение задания   Contents   Index

Запуск заданий в требуемый момент

Команды batch и at позволяют Вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, Вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).

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

      batch
      первая команда
      . . .
      последняя команда
      <^d>

Если запускается только одна команда, то ее можно ввести в одной командной строке:

        batch command_line

В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем каталоге и перенаправляет вывод в файл dol.file.

      $ batch
      grep dollar * > dol.file
      <^d>
      job 155223141.b at Sun Dec 11:14:54 1989
      $

После того как Вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда Вы запускаете команду в фоновом режиме.

Команда at позволяет Вам указывать точное время выполнения команд. Общий формат команды at:

      at time
      первая команда
      . .  .
      последняя команда
      <^d>
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.

В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:

      $
      at 8:15am Feb 27
      banner happy birthday | mail emily
      <^d>
      $

Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.

Если Вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:

       at -r jobnumber
Если Вы забыли номер задания, то команда at -l распечатает Вам список текущих заданий в очереди batch или at, как показано на следующем экране:
      $ at -l
      CW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989
      user mylogin 453400603.a at Fri Feb 24 08:15:00 1989
      $

Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания "am" и "pm", чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Изменение приглашения оболочки Up: Работа в ОС Linux Previous: Запуск заданий в требуемый   Contents   Index

Настройка оболочки

Рассматриваемые темы:

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание псевдонимов команд Up: Настройка оболочки Previous: Настройка оболочки   Contents   Index

Изменение приглашения оболочки

Переменная оболочки - это некоторая строка символов, доступная по уникальному имени. Оболочка bash содержит в себе специальную переменную с именем PS1, которая определяет текст приглашения оболочки. Чтобы изменить этот текст, Вам нужно изменить содержимое переменной PS1.

Чтобы изменить содержимое переменной, введите ее имя и знак равенства (`='), а затем строку, которая должна заменить существующее значение переменной. Например, для смены приглашения на строку ``Чего изволите'', введите:

$ PS1='Чего изволите: ' [Enter]
Чего изволите:

Мы специально заключаем текст приглашения в кавычки, поскольку он содержит внутри пробелы.

Вы можете поместить в строку приглашения специальные символы для вывода определенного текста. Например, символ `
w' в строке-значении PS1 проводит к выводу на месте приглашения наименования текущего рабочего каталога.

Для смены Вашего приглашения на стандартное приглашение bash - имя рабочего каталога и символ `$' - введите:

$ PS1='\w $ ' [Enter]
~ $

Следующая таблица содержит список специальных символов и описание их назначения.

Символ Назначение  
\a Cимвол Ctrl-g, который вызывает системный звонок  
\d Текущая системная дата  
\h Сетевое имя машины  
\n Символ новой строки  
\t Текущее системное время в формате 24 часов  
\@ Текущее системное время в формате 12 часов am/pm  
\w Имя текущего рабочего каталога  
\u Имя пользователя  
\! Номер следующей команды в истории команд  

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

$ PS1='\d (\h)>' [Enter]
14 Dec 2001 (student)>



Alex Otwagin 2002-12-16

next up previous contents index
Next: Добавление каталога в путь Up: Настройка оболочки Previous: Изменение приглашения оболочки   Contents   Index

Создание псевдонимов команд

Используйте команду alias (псевдоним) для создания псевдонимов, представляющих собой команду или группу команд. Псевдонимы удобно использовать для определения часто употребляемых коротких имен, используемых вместо длинных имен команд. Например, для определения псевдонима bye для команды exit, введите:

$ alias bye="exit" [Enter]

Вы можете также включить в псевдоним опции и аргументы.Например, для того, чтобы сделать псевдоним команды ls -l, введите следующее:

$ alias lsl="ls -l" [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сохранение настроек оболочки Up: Настройка оболочки Previous: Создание псевдонимов команд   Contents   Index

Добавление каталога в путь поиска

Чтобы добавить каталог в системный путь поиска, используйте текстовый редактор и измените значение переменной оболочки `PATH' в файле `.bashrc' в Вашем домашнем каталоге. Например, пусть строка, являющаяся значением `PATH' в файле `.bashrc' выглядит так:

PATH="/usr/bin:/bin:/usr/bin/X11:/usr/games"

Чтобы добавить в этот путь каталог `/home/nancy/bin', отредактируйте ее следующим образом:

PATH="/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/nancy/bin"



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа с файлами Up: Настройка оболочки Previous: Добавление каталога в путь   Contents   Index

Сохранение настроек оболочки

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

Когда Вы впервые регистрируететсь в системе, bash проверяет наличие файла `/etc/profile', и если он существует, оболочка выполняет находящиеся в нем команды. Это наиболее общий, общесистемный файл запуска, который выполняется для всех пользователей; лишь системный администратор может изменить его содержимое.

Далее bash считывает и выполняет команды в файле `.bash_profile', ``скрытом'' файле в Вашем домашнем каталоге. Если Вы хотите, чтобы команда выполнялась при каждой Вашей регистрации в системе, включите ее в этот файл.

Если Вы создаете новую копию оболочки (кроме той, в которую Вы попали после регистрации), bash считывает и выполняет команды в файле `.bashrc' Вашего домашнего каталоге. Команды в этом файле выполняются для всех копий, кроме той, которая стартовала при регистрации пользователя.

Различные файлы конфигурации для стартовой копии оболочки и остальных копий нужны для того, чтобы помещенная в `.bash_profile' конфигурация не изменялась во время всего сеанса работы пользователя в системе. Чтобы избежать повторения одних и тех же команд в разных копиях оболочки, добавьте в конец файла `.bash_profile' следующие строки:

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

Это приведет к запуску файла `.bashrc' из Вашего домашнего каталога при регистрации в системе. Таким образом, Вы можете поместить все настройки в файл `.bashrc', и он будет запускаться в любом случае. Любые настройки в файле `.bash_profile' до этой строки будут запущены только при начальной регистрации.

К примеру, простейший файл `.bash_profile' может выглядеть следующим образом:

# Комментариив скриптах оболочки начинаются с #.
# Эти строки не выполняются bash, и служат для документирования.

# Запуск команд из .bashrc
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

Простейший файл .bashrc может выглядеть так:

# Устанавливаем вывод оглавлений каталогов в цвете.
alias ls="ls --color=auto"

# Пусть "l" выдает подробный листинг каталога.
alias l="ls -l"

# Установим собственный путь поиска.
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:~/bin:."

# Настроим приглашение оболочки.
PS1="[\w] $ "

# Сдеалем файл истории команд длиннее.
HISTSIZE=20000
HISTFILESIZE=20000

# Экспорт переменных, чтобы сделать их известными
# всем переменным, определяемым позже.
export HISTSIZE HISTFILESIZE PATH PS1

Этот `.bashrc' устанавливает несколько полезных псевдонимов команд и использует собственный путь поиска и приглашение оболочки при запуске ее новой копии; из-за содержимого предыдущего `.bash_profile', этот файл `.bashrc' запускается и при регистрации в системе.

Когда Вы покидаете систему, bash считывает и выполняет команды в файле `.bash_logout' в Вашем домашнем каталоге, если этот файл существует. Чтобы выполнить команды при выходе из системы, поместите их в данный файл.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание пустого файла Up: Работа в ОС Linux Previous: Сохранение настроек оболочки   Contents   Index

Работа с файлами

Рассматриваемые темы:

В этом разделе изложены основные принципы работы с файлами в системе Linux. Имена файлов состоят из прописных и строчных букв, цифр, точек (`.'), тире (`-'), и символов подчеркивания (`_'). Имена различаются по способу записи - например, `foo', `Foo' и `FOO' являются разными именами. Как правило, имена файлов обычно записывают строчными буквами.

Linux не требует обязательного использования расширений для имен файлов, но добавление расширений очень удобно и полезно, поскольку позволяет Вам легко определить тип файла с первого взгляда. Файлы могут иметь несколько расширений, например `long.file.with.many.extensions', либо не иметь их вовсе - например, `myfile'. Исполняемые файлы различаются системой не по расширению, а по атрибутам файла. Имя файла перед всеми расширениями называется базовым именем файла.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание каталога Up: Работа с файлами Previous: Работа с файлами   Contents   Index

Создание пустого файла

Для того, чтобы создать пустой новый файл, укажите его желаемое имя в качестве аргумента команды touch. Например, для создания файла `a_fresh_start' в текущем каталоге, наберите:

$ touch a_fresh_start [Enter]

Для создания файла `another_empty_file' в подкаталоге `work/completed' текущего каталога, наберите:

$ touch work/completed/another_empty_file [Enter]

Если файл с таким именем не существует, команда touch создаст его; если же он существует, она изменит время модификации этого файла на текущий момент, как если бы файл использовался.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание дерева каталогов Up: Работа с файлами Previous: Создание пустого файла   Contents   Index

Создание каталога

Чтобы создать новый каталог, используйте команду mkdir, указав в качестве аргумента имя нового каталога. Имена каталогов следуют тем же правилам, что и имена файлов - то есть, отсутствие пробелов, наклонных черт, и других неиспользуемых символов.

Чтобы создать в текущем каталоге новый подкаталог `work', наберите:

$ mkdir work [Enter]

Чтобы создать новый подкаталог `work' в каталоге `/tmp', наберите:

$ mkdir /tmp/work [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Группы пользователей Up: Пользователи системы Previous: Пользователи системы   Contents   Index

Суперпользователь (root) и обычный пользователь

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

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

Даже если Вы являетесь единственным пользователем компьютера, на котором установлена ОС Linux, Вам следует обязательно создать регистрационную запись обычного пользователя и работать с правами этого обычного пользователя, а с правами суперпользователя входить в систему только для операций, требующих таких полномочий. Это связано с тем, что обычный пользователь не в состоянии повредить или удалить никакие файлы, имеющие критически важное значение для работоспособности системы в целом, а суперпользователь - может. Стоит отметить, что операции удаления и перемещения файлов выполняются в Linux значительно менее ``формально'', без многочисленных предупреждений, привычных для пользователей Windows.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перемещение по каталогам Up: Работа с файлами Previous: Создание каталога   Contents   Index

Создание дерева каталогов

Чтобы создать подкаталог вместе со всеми каталогами, расположенными выше, которые еще не существуют, используйте команду mkdir с опцией `-p'. Это очень удобно при создании сложных деревьев каталогов, чтобы не создавать каждый каталог отдельной командой.

Чтобы создать подкаталог `work/completed/2001' - вместе с его корнем `completed', который в свою очередь, является подкаталогом каталога `work' в текущем каталоге, наберите:

$ mkdir -p work/completed/2001 [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Просмотр каталогов Up: Работа с файлами Previous: Создание дерева каталогов   Contents   Index

Перемещение по каталогам

Чтобы изменить текущий рабочий каталог на другой, используйте команду cd с указанием требуемого нового каталога в качестве аргумента.

Чтобы перейти из текущего рабочего каталога в подкаталог `work', наберите:

$ cd work [Enter]

Чтобы вернуться обратно в родительский каталог, введите:

$ cd .. [Enter]

Вы можете также указывать полные имена каталогов. Например, для перехода в каталог `/usr/doc', введите:

$ cd /usr/doc [Enter]

Если не указывать аргументы команде cd, Вы перейдете в свой домашний каталог. Чтобы сделать это, наберите:

$ cd [Enter]

Чтобы вернуться в последний из ранее посещенных Вами каталогов, используйте команду cd и символ `-' в качестве имени каталога. Например, если Вашим рабочим каталогом был каталог `/home/student/work/samples' и Вы использовали cd для перехода в другой каталог, Вы можете в любой момент набрать cd - и вернуться в каталог `/home/student/work/samples'.

Чтобы узнать имя текущего каталога, используйте команду pwd, которая выводит полное имя текущего каталога.Пример:

$ pwd [RET]
/home/student
$



Alex Otwagin 2002-12-16

next up previous contents index
Next: Копирование файлов и каталогов Up: Работа с файлами Previous: Перемещение по каталогам   Contents   Index

Просмотр каталогов

Чтобы просмотреть содержимое каталога, используйте команду ls. В качестве аргумента следует указать имя требуемого каталога. Если аргументы не указаны, ls выведет на экран содержимое текущего рабочего каталога:
$ ls [Enter]
apple   cherry  orange
$
В этом примере текущий рабочий каталог содержит три файла: `apple', `cherry', и `orange'.

Чтобы просмотреть содержимое подкаталога `work' в текущем каталоге, введите:

$ ls work [Enter]

Чтобы просмотреть содержимое каталога `/usr/doc', введите:

$ ls /usr/doc [Enter]

Из листинга по умолчанию Вы не сможете отличить каталоги и исполняемые файлы от обычных. Используйте ключ `-F', который заставит ls поместить символ `/' после имен подкаталогов и символ `*' после имен исполняемых файлов:

$ ls -F [Enter]
repeat* test1   test2   words/
$

В этом примере текущий рабочий каталог содержит исполняемый файл `repeat', каталог `words', и несколько файлов других типов `test1' и `test2'.

Еще один способ просмотра содержимого каталогов - использование ``менеджера файлов'', которых для Linux создано достаточно много; наиболее популярным является ``Midnight Commander'' или mc.

Чтобы вывести более подробный листинг каталога, используйте ls с ключом `-l' (``long''). Листинг будет содержать размер каждого файла в байтах, время последней модификации, тип файла, имя владельца и права доступа.

Для вывода подробной информации о каталоге `/usr/doc/bash', введите:

$ ls -l /usr/doc/bash [Enter]
total 72
-rw-r--r--   1 root    root     13744 Oct 19 22:57 CHANGES.gz
-rw-r--r--   1 root    root      1816 Oct 19 22:57 COMPAT.gz
-rw-r--r--   1 root    root     16398 Oct 19 22:57 FAQ.gz
-rw-r--r--   1 root    root      2928 Oct 19 22:57 INTRO.gz
-rw-r--r--   1 root    root      4751 Oct 19 22:57 NEWS.gz
-rw-r--r--   1 root    root      1588 Oct 19 22:57 POSIX.NOTES.gz
-rw-r--r--   1 root    root      2718 Oct 19 22:57 README.Debian.gz
-rw-r--r--   1 root    root     19596 Oct 19 22:57 changelog.gz
-rw-r--r--   1 root    root      1446 Oct 19 22:57 copyright
drwxr-xr-x   9 root    root      1024 Jul 25  1997 examples
$
Первая строка содержит информацию о полном объеме занимаемого каталогом дискового пространства в блоках по 1024 байта (в данном случае 72). Каждая последующая строка содержит несколько колонок с информацией о каждом файле.

Первая колонка указывает тип файла и права доступа к нему. Первый символ в этой колонке определяет тип файла; тире (`-') означает обычный файл (по умолчанию). Каталоги обозначаются буквой `d', а символические ссылки - буквой `l'. Остальные девять символов в первой колонке указывают права доступа к файлу. Вторая колонка указывает количество жестких ссылов на файл. Третья и четвертая колонки указывают пользователя и группу, которые владеют этим файлом. Пятая колонка содержит размер файла в байтах, шестая - время и дату последней модификации файла, а в последней колонке указано имя файла, к которому относится информация.

Чтобы просмотреть каталог рекурсивно, то есть со всеми содержащимися в нем подкаталогами, используйте опцию `-R'. Например, для текущего каталога введите:

$ ls -R [Enter]
play    work

play:
notes

work:
notes
$
В данном примере текущий рабочий каталог содержит два подкаталога, `work' и `play', но не содержит файлов. Каждый из подкаталогов содержит файл `notes'.

Чтобы вывести полное оглавление все файловой системы, наберите:

$ ls -R / [Enter]

Обычно этот ключ комбинируют с опцией `-l', чтобы вывести наиболее полный листинг файлов системы:

$ ls -lR / [Enter]

Примечание: Некоторые каталоги могут не попасть в листинг, если у Вас нет права доступа к ним.

Чтобы отсортировать список файлов в каталоге по времени создания или модификации, используйте опцию `-t'. Например, чтобы вывести список файлов в каталоге `/usr/tmp', чтобы самые новые файлы были вверху списка, введите:

$ ls -t /usr/tmp [Enter]

По умолчанию, ls не выводит имена файлов, начинающиеся с символа ``точка'' (`.'). Чтобы уменьшить листинг, многие приложения ``скрывают'' файлы конфигурации в Вашем домашнем каталоге, присваивая им имена, начинающиеся с точки; они называются dot-файлы, или ``скрытые''. Каждый каталог имеет два специальных dot-файла: `..' - родительский каталог и `.' - сам этот каталог.

Чтобы увидеть все файлы в каталоге, включая скрытые, используйте опцию `-a'. Например, для текущего каталога:

$ ls -a [Enter]

Чтобы увидеть все файлы, исключая специальные `..' и `.', используйте опцию `'-A:

$ ls -A [Enter]

Чтобы увидеть цветной листинг каталога, используйте ls с ключом `--color' ; тогда все имена файлов будут выведены разными цветами, в зависимости от их содержания. По умолчанию каталоги выводятся синим, текстовые файлы - белым, исполняемые - зеленым и т.д.

Примечание: Обычно для команды `ls -color' создается псевдоним `ls', так что листинг выводится в цвете по умолчанию.

Для того, чтобы вывести граф иерархии каталогов, используйте утилиту tree. Например, для вывода дерева каталогов, начиная с текущего, наберите:

$ tree [Enter]
.
|-- projects
|   |-- current
|   `-- old
|       |-- 1
|       `-- 2
`-- trip
    `-- schedule.txt

4 directories, 3 files
$

В этом примере выводится дерево каталогов, в котором текущий каталог содержит два подкаталога `projects' и `trip'; а каталог `projects', в свою очередь, содержит подкаталоги `current' и `old'.

Чтобы вывести дерево каталогов для определенного каталога, укажите его имя в качестве аргумента tree. Например, для Вашего домашнего каталога, введите:

$ tree ~ [Enter]

Чтобы вывести дерево каталогов, в котором будут присутствовать только имена каталогов, используйте опцию `-d'. Это полезно при выводе полного дерева каталогов системы:

$ tree -d / > tree [Enter]

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

Опция Описание  
--color Вывод имен файлов в цвете, в зависимости от их типа.  
-R Рекурсивный список файлов.  
-a Вывод всех файлов, включая скрытые.  
-d Вывод только имен каталогов, без промсмотра их содержимого.  
-f Вывод содержимого каталога в том порядке, в котором оно записано на диск.  
-l Подробный листинг.  
-r Сортировка содержимого каталога в обратном порядке.  
-s Вывод размера - в блоках по 1K - для каждого файла.  
-t Сортировка по времени создания или модификации файла.  

Примечание: Вы можете комбинировать опции в любом порядке; например, чтобы вывести список файлов, отсортированный по времени, со всеми атрибутами, введите `-lt'. Чтобы рекурсивно отобразить все скрытые файлы и их атрибуты, используйте `-lRa'. Порядок опций не имеет значения, так что `-lRa' означает то же самое, что и `-alR'.


next up previous contents index
Next: Копирование файлов и каталогов Up: Работа с файлами Previous: Перемещение по каталогам   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Перемещение файлов и каталогов Up: Работа с файлами Previous: Просмотр каталогов   Contents   Index

Копирование файлов и каталогов

Для копирования файлов используйте команду cp (``copy''). Она принимает два аргумента: исходный файл, который существует и должен быть скопирован, и целевой файл, который определяет имя файла-копии. cp создает идентичную копию файла, присваивая ей указанное имя целевого файла. Если файл с таким именем уже существует, cp перезаписывает его. Она не изменяет исходный файл.

Чтобы скопировать файл `my-copy' в файл `neighbor-copy', наберите:

$ cp my-copy neighbor-copy [Enter]

Эта команда создает новый файл с именем `neighbor-copy', который является идентичным файлу `my-copy' во всех отношениях, кроме имени файла, имени владельца, группы и времени модификации - новый файл имеет время модификации, указывающее момент его копирования. Файл `my-copy' не изменяется.

Чтобы сохранить все атрибуты оригинального файла, включая его время модификации, имя владельца, группу и права доступа, используйте ключ `-p' (``preserve'')(сохранить).

Чтобы скопировать файл `my-copy' в файл `neighbor-copy', сохранив все атрибуты исходного файла в копии, наберите:

$ cp -p my-copy neighbor-copy [Enter]

Эта команда копирует файл `my-copy' в новый файл `neighbor-copy', полностью идентичный исходному по всем аспектам, кроме имени файла.

Чтобы скопировать каталог вместе со всеми подкаталогами и файлами, которые он содержит, используйте опцию -R - она создает рекурсивную копию указанного каталога и его содержимого.

Чтобы скопировать каталог `public_html' вместе со всеми его файлами и подкаталогами, в новый каталог `private_html', введите:

$ cp -R public_html private_html [Enter]

Опция `-R' не копирует файлы, являющиеся символической ссылкой, и не сохраняет оригинальные права доступа к файлам. Чтобы скопировать каталог рекурсивно, включая все ссылки и учитывая все права доступа, используйте опцию `-a' (``archive''). Это полезно для резервного копирования больших по объему деревьев каталогов.

Чтобы сделать резервную копию дерева каталогов `public_html' в каталог `private_html', введите:

$ cp -a public_html private_html [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление файлов и каталогов Up: Работа с файлами Previous: Копирование файлов и каталогов   Contents   Index

Перемещение файлов и каталогов

Чтобы переместить файл в другое место или изменить его имя, используйте команду mv (``move''). Она принимает два аргумента: имя файла или каталога для перемещения, а затем имя пути для перемещения. Если Вы перемещаете файл в каталог, в котором уже есть файл с таким именем, то он будет перезаписан.

Чтобы переместить файл `notes' из текущего рабочего каталога в каталог `../play', наберите:

$ mv notes ../play [Enter]

Если в родительском каталоге текущего каталога нет подкаталога `play', эта команда переместит файл `notes' в родительский каталог и переименует его в `play'.

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

Чтобы переместить файл `/usr/tmp/notes' в текущий рабочий каталог, введите:

$ mv /usr/tmp/notes . [Enter]

Чтобы переместить каталог, укажите путь к каталогу, который нужно переместить и путь к каталогу-приемнику.

Чтобы переместить каталог `work' из текущего рабочего каталога в каталог `play', введите:

$ mv work play [Enter]

Если каталог `play' уже существует, mv поместит `work' внутрь `play' - эта команда не перезаписывает каталоги.

Переименование файла - это то же самое, что и его перемещение; просто укажите в качестве аргументов файл для переименования и его новое имя.

Чтобы переименовать файл `notes' в `notes.old', введите:

$ mv notes notes.old [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Присвоение файлу нескольких имен Up: Работа с файлами Previous: Перемещение файлов и каталогов   Contents   Index

Удаление файлов и каталогов

Чтобы полностью удалить файл, используйте команду rm ("remove"). Укажите имя удаляемого файла в качестве аргумента.

Чтобы удалить файл `notes' в текущем рабочем каталоге, используйте:

$ rm notes [Enter]

Чтобы удалить каталог со всеми подкаталогами и файлами в нем, используйте опцию `-R' (``recursive''). Например, для удаления каталога `waste' вместе с его содержимым, наберите:

$ rm -R waste [Enter]

Чтобы удалить пустой каталог, используйте команду rmdir; она удаляет каталог, указанный в качестве аргумента. Если Вы укажете каталог, в котором есть файлы или подкаталоги, rmdir сообщит об ошибке.

Чтобы удалить каталог `empty', введите:

$ rmdir empty [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Средства поиска файлов Up: Работа с файлами Previous: Удаление файлов и каталогов   Contents   Index

Присвоение файлу нескольких имен

Ссылки - это специальный вид файлов, являющихся указателями на другие файлы; когда Вы манипулируете ссылкой, Вы одновременно производите действия над файлом, на который она указывает. Существует две разновидности ссылок: ``жесткие'' ссылки и ``символические'' ссылки.

Жесткая ссылка - это еще одно имя для существующего файла; между ссылкой и оригинальным файлом нет никаких различий. Таким образом, если Вы создаете жесткую ссылку от файла `foo' к файлу `bar', а затем удаляете `bar', файл `foo' также удаляется. Каждый файл имеет как минимум одну жесткую ссылку, которой является само имя данного файла. Каталоги всегда имеют как минимум две жестких ссылки - само имя каталога (которое указано в его родительском каталоге) и специальный файл `.' внутри самого каталога. Точно также при создании нового подкаталога родительский каталог получает новую жесткую ссылку на себя - файл `..' внутри нового подкаталога.

Символическая ссылка (называемая также ``symlink/'' или ``soft link'') передает большинство операций над ней - например, чтение или запись - файлу, на который она указывает, также, как и жесткая ссылка. Однако, ее удаление не приводит к удалению оригинального файла.

Используйте команду ln (``link'') для создания ссылок на файлы. В качестве аргумента следует указать имя исходного файла, на который создается ссылка и новое имя самой ссылки. По умолчанию создаются жесткие ссылки.

Чтобы создать жесткую ссылку от `seattle' к `emerald-city', введите:

$ ln seattle emerald-city [Enter]

Чтобы создать вместо жесткой ссылки символическую, используйте опцию `-s'. Пример:

$ ln -s seattle emerald-city [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск файлов с помощью Up: Работа в ОС Linux Previous: Присвоение файлу нескольких имен   Contents   Index

Средства поиска файлов

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск файлов с помощью Up: Средства поиска файлов Previous: Средства поиска файлов   Contents   Index

Поиск файлов с помощью locate

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

Простейший способ найти нужные файлы - использование утилиты GNU locate. Используйте ее, если Вы хотите увидеть список всех файлов в системе, полное имя которых с указанием пути совпадает с определенным образцом - например, все файлы со словом `audio' в любом месте их полного имени, или все файлы, оканчивающиеся на `.cpp'. При определении образца Вы можете использовать любые метасимволы в имени файла.

Чтобы обнаружить все файлы в системе, имя которых содержит слово `audio', введите:

$ locate audio [Enter]

Чтобы найти все файлы, имя которых оканчивается на `.cpp', введите:

$ locate *.cpp [Enter]

Чтобы вывести список скрытых файлов системы, введите:

$ locate /. [Enter]

Примечание: locate НЕ различает прописные и строчные символы

Чтобы увидеть список в удобной форме, перенаправьте вывод locate в утилиту less.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Средства управления файлами Up: Средства поиска файлов Previous: Поиск файлов с помощью   Contents   Index

Поиск файлов с помощью find

Используйте утилиту find для поиска файлов в дереве каталогов по имени файла. Укажите имя дерева каталогов для поиска, а затем, с помощью опции `-name' - имя нужного Вам файла.

Чтобы увидеть список всех файлов системы, которые называются `top', наберите:

$ find / -name top [Enter]

Эта команда проведет поиск во всех каталогах, куда Вам разрешен доступ; если Вы не имеете прав прочесть содержимое каталога, find сообщить, что поиск в данном каталоге Вам запрещен.

Опция `-name' различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname'.

Чтобы увидеть список всех файлов системы, которые называются `top', без учета регистра символов, наберите:

$ find / -iname top [Enter]

Эта команда найдет все файлы, название которых состоит из букв `top' - включая `Top', `top', и `TOP'.

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

Чтобы получить список файлов системы, имена которых начинаются с букв `top', введите:

$ find / -name 'top*' [Enter]

Чтобы получить список файлов системы, имена которых начинаются с букв `top', за которыми следуют еще три символа, введите:

$ find / -name 'top???' [Enter]

Чтобы получить список файлов системы, имена которых начинаются с букв `top', за которыми следуют пять и более символов, введите:

$ find / -name 'top?????*' [Enter]

Чтобы увидеть все файлы с расширением `.tex'в Вашем рабочем каталоге, независимо от их написания, введите:

$ find ~ -iname '*.tex' [Enter]

Чтобы увидеть все файлы в каталоге `/usr/share', содержащие в имени слово `farm', введите:

$ find /usr/share -name '*farm*' [Enter]

Используйте `-regex' вместо `-name' для поиска файлов, имена которых удовлетворяют регулярному выражению, или образцу, описывающему несколько строк.

Чтобы увидеть все файлы в текущем каталоге, имена которых содержат строку `net' или `comm', наберите:

   $ find . -regex '.*\(net\|comm\).*' [Enter]

Примечание: Опция `-regex' совпадает с полным именем файла относительно указанного каталога, а не с отдельным именем файла.

Чтобы найти файлы определенного размера, используйте опцию `-size', указав после нее требуемый размер файла. Размер файла может быть задан в трех различных формах: если перед ним указан знак плюс (`+'), ищутся все файлы, большие, чем указанный размер; если указан знак минус (`-'), ищутся все файлы, меньшие, чем указанный размер; если префикс не указан, ищутся файлы точно указанного размера. (Единица измерения - блок 512 байт; символ `k' после размера указывает килобайты, символ `b' - байты.)

Чтобы вывести список файлов в каталоге `/usr/local', размер которых больше 10,000 килобайт, введите:

$ find /usr/local -size +10000k [Enter]

Чтобы вывести список файлов в домашнем каталоге, размер которых меньше 300 байт, введите:

$ find ~ -size -300b [Enter]

Чтобы вывести список файлов системы, размер которых составляет 42 блока по 512 байт, наберите:

$ find / -size 42 [Enter]

Используйте опцию `-empty' для поиска пустых файлов - т.е. файлов с размером 0 байт. Это полезно для поиска и удаления ненужных файлов.

Чтобы найти все пустые файлы в Вашем домашнем каталоге, введите:

$ find ~ -empty [Enter]

Чтобы найти файлы, модифицированные в определенное время, используйте команду find с опциями `-mtime' или `-mmin'; аргумент опции `-mtime' определяет количество прошедших суток (24 часа), а аргумент `-mmin' - количество прошедших минут.

Чтобы вывести все файлы в каталоге `/usr/local', модифицированные точно 24 часа назад, введите:

$ find /usr/local -mtime 1 [Enter]

Чтобы вывести все файлы в каталоге `/usr', модифицированные 5 минут назад, введите:

$ find /usr -mmin 5 [Enter]

Если Вы хотите указать промежуток времени, поставьте перед числом либо знак плюс (`+'), определяя большее или равное аргументу время, или знак минус (`-'), определяя время, меньшее или равное аргументу.

Чтобы вывести все файлы в каталоге `/usr/local', модифицированные в течение последних 24 часов, введите:

$ find /usr/local -mtime -1 [Enter]

Опция `-daystart' определяет отсчет времени с момента начала текущих суток.

Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные вчера, введите:

$ find ~ -mtime 1 -daystart [Enter]

Чтобы вывести все файлы в каталоге `/usr', модифицированные в течение года, введите:

$ find /usr -mtime +356 -daystart [Enter]

Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные в период от 2 до 4 дней тому назад, наберите:

$ find ~ -mtime 2 -mtime -4 -daystart [Enter]

Чтобы найти файлы, которые новее некоторого файла, введите его имя в качестве аргумента опции `-newer'.

Чтобы вывести все файлы в каталоге `/etc', которые новее файла `/etc/motd', введите:

$ find /etc -newer /etc/motd [Enter]

Чтобы найти все файлы новее определенной даты, используйте следующий трюк: создайте временный файл в каталоге `/tmp' и установите дату его модификации на требуемую с помощью touch, а затем поределите его как аргумент для `-newer'.

Чтобы вывести все файлы в Вашем домашнем каталоге, модифицированные после 4 мая текущего года, введите:

   $ touch -t 05040000 /tmp/timestamp [Enter]
   $ find ~ -newer /tmp/timestamp [Enter]

Чтобы найти файлы, принадлежащие определенному пользователю, укажите имя пользователя в качестве агрумента опции `-user'. Например, для поиска всех файлов в каталоге `/usr/local/fonts', принадлежащих пользователю warwick, наберите:

$ find /usr/local/fonts -user warwick [Enter]

Опция `-group' подобным образом определяет файлы, принадлежащие некоторой группе пользователей.

Чтобы вывести список файлов в каталоге `/dev', принадлежащих группе audio, введите:

$ find /dev -group audio [Enter]

Вы можете использовать команду find для выполнения других команд над найденными файлами, указав требуемые команды в качестве аргуентов опции `-exec'. Если Вы используететв команде строку `''', эта строка в команде будет заменена именем текущего найденного файла. Окончание команды помечается строкой `';''.

Чтобы найти все файлы в каталоге ` /html/' с расширением `.html', и вывести строки из этих файлов, содержащие слово `organic', введите:

$ find ~/html/ -name '*.html' -exec grep organic '{}' ';' [Enter]

Чтобы ввести подтверждение выполнения команды для файла, найденного find, используйте ключ `-ok' вместо `-exec'.

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

$ find ~ -used +365 -ok rm '{}' ';' [Enter]

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

Чтобы вывести список файлов в Вашем домашнем каталоге, имена которых начинаются со строки `top', и которые новее файла `/etc/motd', введите:

$ find ~ -name 'top*' -newer /etc/motd [Enter]

Чтобы сжать все файлы в Вашем домашнем каталоге, размер которых превышает 2 Mb, и которые еще не сжаты с помощью gzip (не имеют расширения `.gz'), введите:

$ find ~ -size +2000000c -regex '.*[^gz]' -exec gzip '{}' ';' [Enter]

Чтобы найти наибольший файл в каталоге, используйте команду ls с опцией `-S', которая сортирует файлы в нисходящем порядке по размеру (обычно ls выводит список файлов по алфавиту). Добавьте опцию `-l', чтобы вывести размер и другие атрибуты файла.Пример:

$ ls -lS [Enter]

Чтобы вывести оглавление каталога, начав с файлов наименьшего размера, используйте ls с ключами `-S' и `-r', которые сортируют вывод в обратном порядке.Пример:

$ ls -lSr [Enter]

Чтобы вывести список каталогов, отсортированных по размеру - то есть размеру всех содержащихся в них файлов - используйте du и sort. Команда du выводит список каталогов в восходящем порядке, начиная с самого маленького; опция `-S' помещает при выводе в первую колонку размер каталога в килобайтах. Укажите требуемое дерево каталогов в качестве аргумента du и перенаправьте вывод в команду sort с ключом `-n', которая отсортирует список по числам.

Чтобы вывести список подкаталогов в текущем дереве каталогов, отсортированный по размеру, введите:

$ du -S . sort -n [Enter]|

Если Вам нужно, чтобы первыми были указаны самые большие каталоги, используйте ключ `-r':

$ du -S . sort -nr [Enter]|

Чтобы быстро определить количество файлов в каталоге, используйте ls и перенаправьте вывод в команду `wc -l', которая выволит количество строк, пришедших на ее вход.

Для вывода общего количества файлов в текущем каталоге введите:

   $ ls | wc -l [RET]
   19
   $
Общее количество файлов - 19.

Поскольку ls по умолчанию не показывает скрытые файлы, приведенная выше команда не будет их учитывать. Опция `-A' для ls позволит посчитать обычные и скрытые файлы:

   $ ls -A | wc -l [RET]
   81
   $

Чтобы посчитать количество файлов во всем дереве каталогов, а не только в отдельном каталоге, используйте find вместо ls, и укажите специальный ключ для find - строку `
! -type d', чтобы исключить вывод и подсчет каталогов.

Чтобы вывести количество файлов в дереве `/usr/share', введите:

$ find /usr/share \! -type d wc -l [Enter]|

Чтобы вывести количество файлов и каталогов в дереве `/usr/share', введите:

$ find /usr/share wc -l [Enter]|

Чтобы вывести количество каталогов в дереве `/usr/share', введите:

$ find /usr/share \! -type f wc -l [Enter]|

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

Чтобы определить, установлен ли в Вашей системе perl и где он расположен, введите:

   $ which perl [RET]
   /usr/bin/perl


next up previous contents index
Next: Средства управления файлами Up: Средства поиска файлов Previous: Поиск файлов с помощью   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Добавление пользователя Up: Пользователи системы Previous: Суперпользователь (root) и обычный   Contents   Index

Группы пользователей

Несколько пользователей могут быть объединены в группу, которой присваивается имя. При создании регистрационной записи пользователя автоматически создается группа, состоящая из одного члена (этого пользователя) и названная так же, как и этот пользователь. Другие группы могут создаваться только суперпользователем.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Определение типа и формата Up: Работа в ОС Linux Previous: Поиск файлов с помощью   Contents   Index

Средства управления файлами

Рассматриваемые темы: Средства управления файлами включают команды для разделения и слияния файлов, их сравнения, упаковки, создания резервных копий, и т.д. Существуют также средства для определения типа содержимого файла и смены времени его модификации.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Изменение времени модификации файла Up: Средства управления файлами Previous: Средства управления файлами   Contents   Index

Определение типа и формата файлов

Когда речь идет о типе файла, это означает, какого рода данные он содержит, т.е. текст, исполняемые команды или некоторые другие данные; эти данные определенным образом организованы внутри файла, и такая организация называется форматом. Например, графический файл может содержать данные в формате JPEG, а текстовый файл - либо простой неформатированный текст, либо текст, размеченный с помощью команд языка TeX.

Команда file анализирует файлы и выводит их тип, а также - если это известно - формат данных, которые они содержат. Укажите имя файла в качестве аргумента, и эта команда выведет имя вместе с описание его типа и формата.

Чтобы определить формат файла `/usr/doc/HOWTO/README.gz', введите:

   $ file /usr/doc/HOWTO/README.gz [Enter]
   /usr/doc/HOWTO/README.gz: gzip compressed data, deflated, original
   filename, last modified: Sun Apr 26 02:51:48 1998, os: Unix
$

Эта команда сообщает, что файл `/usr/doc/HOWTO/README.gz' содержит данные, упакованные с помощью утилиты gzip.

Чтобы определить оригинальный формат данных в упакованном файле, используйте опцию `-z'.

Чтобы определить формат упакованных данных в файле `/usr/doc/HOWTO/README.gz', введите:

   $ file -z /usr/doc/HOWTO/README.gz [Enter]
   /usr/doc/HOWTO/README.gz: English text (gzip compressed data, deflated,
   original filename, last modified: Sun Apr 26 02:51:48 1998, os: Unix)
   $

Примечание: В настоящее время file различает около 100 различных форматов данных, включая тексты на нескольких языках, множество графических и звуковых форматов, а также исполняемые файлы для различных операционных систем.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Разделение файла на меньшие Up: Средства управления файлами Previous: Определение типа и формата   Contents   Index

Изменение времени модификации файла

Для изменения времени модификации файла без исправлений его содержимого используйте команду touch. Укажите имя требуемого файла в качестве аргумента. По умолчанию время модификации устанавливается на текущий момент.

Чтобы сменить время модификации файла `pizzicato' на текущий момент, введите:

$ touch pizzicato [Enter]

Если Вы хотите установить иное время модификации, укажите опцию `-d' и требуемые дату и время в апострофах. Вы можете указать либо дату, либо время, либо и то и другое.

Для установки времени модификации файла `pizzicato' на `17 мая 1999 14:16', введите:

$ touch -d '17 May 1999 14:16' pizzicato [Enter]

Примечание: Если указать только дату, время устанавливается в `0:00'; если не указывать год, будет использован текущий.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сравнение файлов Up: Средства управления файлами Previous: Изменение времени модификации файла   Contents   Index

Разделение файла на меньшие части

Иногда бывает необходимо разделить большой файл на несколько меньших частей. Например, у Вас есть длинный звуковой файл в формате MP3. Пусть этот файл `large.mp3' имеет размер 4,394,422, и Вам нужно переслать его с персонального компьютера на ноутбук, но эти компьютеры не соединены в сеть - тогда единственный способ перенести файл - использовать гибкий диск. Поскольку файл гораздо больше, чем объем гибкого диска, Вам нужно использовать команду split.

Команда split копирует файл, разделяя копию на отдельные файлы указанного размера. В качестве необязательных аргументов ей можно указать имя входного файла (по умолчанию используется стандартный ввод) и префикс имени файла, используемый при записи (по умолчанию используется `x'). Имя выходного файла будет составлено из префикса и групп символов: `aa', `ab', `ac', и т.д. - поэтому именами по умолчанию будут `xaa', `xab', и т.д.

Вы можете указать количество строк в каждом выходном файле с помощью опции `-l', или использовать опцию `-b', чтобы указать количество байтов выходного файла. Чтобы указать размеры файлов в килобайтах или мегабайтах, используйте опцию `-b' с префиксами `k' или `m' соответственно. Если не указано ни `-l', ни`-b', split по умолчанию выводит в каждый файл 1,000 строк.

Чтобы разделить файл `large.mp3' на отдельные файлы по 1 Mb каждый, имена которых начинаются с `large.mp3.', введите:

$ split -b1m large.mp3 large.mp3. [Enter]

Эта команда создает пять новых файлов, имена которых начинаются с `large.mp3.'. Первые четыре файла имеют размер по 1 мегабайту, а последний содержит 200,118 байт - остаток оригинального файла. В файле `large.mp3' никаких изменений не происходит.

Вы можете затем скопировать эти пять файлов на четыре гибких диска (последний файл поместится на диск с одним из больших файлов), перенести их на ноутбук, и собрать их вместе с помощью команды cat.

Чтобы собрать целый файл из частей, введите:

   $ cat large.mp3.* > large.mp3 [Enter]
   $ rm large.mp3.* [Enter]

В этом примере для удаления ненужных файлов после воссоздания оригинального используется команда rm.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Исправление файлов по результатам Up: Средства управления файлами Previous: Разделение файла на меньшие   Contents   Index

Сравнение файлов

Существует несколько утилит для сравнения содержимого файлов различными способами. Эти инструменты особенно полезны для сравнения текста в файлах.

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

Чтобы определить, в чем различаются файлы `master' и `backup', наберите:

$ cmp master backup [Enter]

Чтобы сравнить два файла и получить отчет о различиях в них, используйте утилиту diff. Отчет о различиях форматируется таким образом, чтобы другие утилиты (например, patch) могли использовать его, чтобы сделать сравниваемые файлы идентичными. В качестве аргументов для diff нужно указать имена сравниваемых файлов.

Чтобы сравнить файлы `manuscript.old' и `manuscript.new', введите:

$ diff manuscript.old manuscript.new [Enter]

Отчет о различиях выводится в файл стандартного вывода; чтобы сохранить его в файл на диске, перенаправьте вывод в файл:

$ diff manuscript.old manuscript.new > manuscript.diff [Enter]

В этом случае отчет будет сохранен в файле `manuscript.diff'.

Чтобы нагляднее увидеть различия в двух файлах, используйте команду sdiff; вместо генерации отчета о различиях, она выводит файлы в две колонки, разделяемые пробелами. Различающиеся строки разделяются `|'; строки, встречающиеся только в первом файле, заканчиваются `<', а строки, встречающиеся во втором, начинаются с `>'.

Чтобы сравнить файлы `laurel' и `hardy' на экране, введите:

$ sdiff laurel hardy less [Enter]|

Для одновременного сравнения трех файлов используйте diff3.

Чтобы вывести отчет о различиях между файлами `larry', `curly', и `moe' в файл `stooges', введите:

$ diff3 larry curly moe > stooges [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Упаковка и распаковка файлов Up: Средства управления файлами Previous: Сравнение файлов   Contents   Index

Исправление файлов по результатам сравнения

Для внесения изменений из отчета о различиях в оригинальном и сравниваемом файлах используйте утилиту patch. В качестве аргументов она принимает имя исправляемого файла и имя файла с отчетом о различиях (или файла исправлений). Затем она вносит изменения, указанные в файле исправлений в оригинальный файл. Это особенно удобно для распространения различных версий файла - небольшие файлы исправлений рассылаются по сети гораздо быстрее огромных исходных файлов.

Для обновления файла `manuscript.new' с учетом исправлений `manuscript.diff', введите:

$ patch manuscript.new manuscript.diff [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Файловые архивы - создание, Up: Средства управления файлами Previous: Исправление файлов по результатам   Contents   Index

Упаковка и распаковка файлов

Упаковка файлов очень удобна для хранения или передачи больших файлов. Когда Вы упаковываете файл, Вы укорачиваете его и сохраняете пространство на диске. Алогритм упаковки изменяет данные в файле; чтобы использовать их, Вам нужно сначала распаковать и восстановить их.

Для упаковки файлов используйте команду gzip (``GNU zip''). В качестве аргумента ей нужно указать имена файлов для упаковки; после этого она запишет сжатые версии указанных файлов, добавляя к их именам расширение `.gz', а затем удалит оригинальные файлы.

Для сжатия файла `war-and-peace', введите:

$ gzip war-and-peace [Enter]

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

Как и gzip, gunzip принимает в качестве аргумента имя файлов для обработки. Она распаковывает указанные файлы, записывает результаты в новые файлы без расширения `.gz', а затем удаляет упакованные файлы.

Чтобы распаковать файл `war-and-peace.gz', введите:

$ gunzip war-and-peace.gz [Enter]

Примечание: Вы можете просмотреть содержимое упакованного текстового файла без распаковки с помощью zless.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа с текстом Up: Средства управления файлами Previous: Упаковка и распаковка файлов   Contents   Index

Файловые архивы - создание, просмотр, распаковка

Архивом называется отдельный файл, содержащий набор нескольких файлов и, возможно, каталогов. Архивы обычно используются для пересылки или создания резервных копий наборов файлов и каталогов - в этом случае Вы будете работать только с одним файлом. Этот единственный файл можно легко упаковать и распаковать, при этом файлы в архиве сохранят свою структуру и права доступа к ним.

Для создания, просмотра и извлечения файлов из архива используйте команду tar. Архивы, созданные с помощью tarиногда называются ``tar-файлы'', ``tar-архивы'' или - поскольку все файлы архива скручены в один -- ``tarballs''.

Примечание: Название этой утилиты происходит от слов ``tape archive'' (архив на магнитной ленте), поскольку изначально она использовалась для непосредственной записи архивов на магнитную ленту. Она используется для этих целей и до сих пор, но сейчас архивы почти всегда записываются на диск.

Для создания архива с помощью tar используйте опцию `-c' и укажите имя создаваемого архивного файла с помощью опции `-f'. Обычно используют имя с расширением `.tar', например, `my-backup.tar'.

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

Чтобы создать архив `project.tar' содержимого каталога `project', введите:

$ tar -cvf project.tar project [Enter]

Каталог, для которого создается архив, не изменяется.

При использовании опции `-z' архив перед записью будет упакован. Это равносильно созданию простого архива и последующей упаковке его с помощью gzip, но исключает дополнительные шаги.

Чтобы создать упакованный архив `project.tar.gz' содержимого каталога `project', введите:

$ tar -zcvf project.tar.gz project [Enter]

Примечание: Если Вы используете опцию `-z', Вы должны определить имя архива с расширением `.tar.gz' вместо `.tar', чтобы имя архива указывало на то, что он упакован.

Чтобы просмотреть содержимое архива tar без распаковки, используйте tar с опцией `-t'.

Чтобы увидеть содержимое `project.tar', введите:

$ tar -tvf project.tar [Enter]

Эта команда выведет содержимое архива `project.tar'. Используя опцию `-v' вместе с опцией `-t' заставляет tar выводить кроме имени файла права доступа к нему и время модификации - так же, как и команда ls -l.

Укажите опцию `-z', если Вам нужно посмотреть содержимое упакованных архивов.

Чтобы увидеть содержимое упакованного архива `project.tar.gz', введите:

$ tar -ztvf project.tar [Enter]

Если Вы хотите распаковать архив, упакованный tar< используйте опцию `-x'.

Чтобы распаковать архив `project.tar', введите:

$ tar -xvf project.tar [Enter]

Если архив упакован и имеет расширение `.tar.gz' или `.tgz', укажите опцию `-z'.

Чтобы распаковать упакованный архив `project.tar.gz', введите:

$ tar -zxvf project.tar.gz [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Просмотр текста Up: Работа в ОС Linux Previous: Файловые архивы - создание,   Contents   Index

Работа с текстом

Рассматриваемые темы:

Работа с текстовым материалом является основным занятием пользователя. Существует множество способов просмотра или вывода текста. Если Вам нужно редактировать текст, простейшим способом является работа с текстовым редактором.

Некоторые типы файлов - такие, например, как PostScript, DVI или PDF - часто содержат внутри текст, но технически не являются текстовыми файлами. Такие файлы просматриваются с помощью специальных программ.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Вывод текста Up: Работа с текстом Previous: Работа с текстом   Contents   Index

Просмотр текста

Для удобного просмотра текста по страницам можно использовать less. less работает либо с файлами, либо со стандартным выводом - обычно его используют в качестве последней команды в конвейере, чтобы легко читать вывод от команды.

zless идентичен less, но используется для просмотра упакованных текстовых файлов; он позволяет читать содержимое упакованных текстовых файлов без их распаковки. Практически вся документация в системе в каталогах `/usr/doc' и `/usr/share/doc' состоит из упакованных текстовых файлов.

Для просмотра текстового файла постранично укажите его имя в качестве аргумента команды less. Например, для просмотра файла `README' введите:

$ less README [Enter]

Вы можете перемещаться по документу построчно с помощью клавиши [ $ \downarrow$], или поэкранно с помощью [PgDn]. Чтобы переместиться назад на одну строку, нажмите [$ \uparrow$], а для перемещения назад на экран - [PgUp].

Чтобы прекратить просмотр и выйти из less, нажмите [Q].

С помощью less можно просматривать несколько файлов одновременно, а также определять шаблоны файлов для открытия всех подходящих файлов.

Чтобы прочесть все файлы Linux FAQ в каталоге `/usr/doc/FAQ', введите:

$ less /usr/doc/FAQ/unix-faq-part* [Enter]

Эта команда запускает less, открывает в нем все файлы, подходящие под указанный шаблон `/usr/doc/FAQ/unix-faq-part*', и показывает первый из них:

[viewing-text-less-01]

Примечание: Если Вы указали несколько файлов для просмотра, less показывает их по очереди, начиная с первого загруженного файла. Чтобы перейти к следующему файлу, нажмите [N]; чтобы вернуться к предыдущему, нажмите [P].

Следующая таблица содержит список команд, которые Вы можете использовать при просмотре текста в less.

Команда Назначение  
$ \uparrow$ Прокрутка текста на строку назад.  
$ \downarrow$ Прокрутка текста на строку вперед.  
$ \leftarrow$ или $ \rightarrow$ Прокрутка текста влево или вправо на позицию табуляции.  
PgUp или SPC Прокрутка текста вперед на страницу.  
PgDn Прокрутка текста назад на страницу.  
Ctrl-l Перерисовка экрана.  
/pattern Поиск строк, содержащих образец, вперед по тексту.  
?pattern Поиск строк, содержащих образец, назад по тексту.  
< Перемещение к началу файла.  
> Перемещение к концу файла.  
h Экран справки.  
q Прекращение просмотра и выход из less.  


next up previous contents index
Next: Вывод текста Up: Работа с текстом Previous: Работа с текстом   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Установка или смена пароля Up: Пользователи системы Previous: Группы пользователей   Contents   Index

Добавление пользователя

Для того чтобы добавить регистрационную запись обычного пользователя, сделайте следующее.

Перейдите в текстовую консоль или режим эмуляции терминала и войдите в систему как суперпользователь. Введите в командной строке команду

   adduser имя_пользователя
где имя_пользователя должно состоять из латинских букв и цифр и начинаться с буквы. В системе не должно существовать регистрационной записи с таким же именем. В случае успешного завершения операции создания новой регистрационной записи никаких сообщений не выдается. Создание регистрационный записи происходит в режиме, когда вход пользователя невозможен, поэтому для вновь созданного пользователя необходимо установить пароль.

Команда adduser создает регистрационную запись для нового пользователя (для чего вносит изменения в ряд конфигурационных файлов системы) и создает для него так называемый домашний каталог

   /home/имя_пользователя
содержащий некоторые необходимые файлы и подкаталоги. Этот каталог и файлы в нем принадлежат пользователю, и он имеет полный набор прав для работы с этими файлами и подкаталогами, а также для всех вновь создаваемых им в этом каталоге объектов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Экранный редактор vi Up: Работа с текстом Previous: Просмотр текста   Contents   Index

Вывод текста

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

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

Используйте опцию `-v' для cat, чтобы вывести символы, не отображаемые на печати, например, управляющие символы. При указанной опции cat выводит эти символы в нотации ``с крышкой'', т.е. они представляются сочетанием `^' и символа, соответствующего управляющему символу (например, символ звукового сигнала будет представлен как `^G').

Чтобы вывести управляющие символы файла `translation', введите:

$ cat -v translation | less [Enter]

Чтобы визуально отобразить конец строки в каждой строке, используйте опцию `-E'; она приведет к тому, что в конце каждой строки появится символ `$'.

Полезной является опция `-T', которая выводит все табуляции в виде `^I'.

Опция `-A' комбинирует все три вышеуказанные опции - как если бы Вы указали опции с помощью `-vET'.

Чтобы вывести только начало текстового файла, используйте команду head. По умолчанию она выводит на экран первые десять строк из своего ввода.

Чтобы вывести первые десять строк файла `placement-list', введите:

$ head placement-list [Enter]

Вы можете указать требуемое число строк для вывода. Если Вы укажете больше строк, чем содержится в файле, head просто выведет весь текст.

Чтобы вывести первую строку файла `placement-list', введите:

$ head -1 placement-list [Enter]

Чтобы вывести 66 строк от начала файла `placement-list', введите:

$ head -66 placement-list [Enter]

Чтобы вывести определенное число символов, а не строк, укажите число символов для вывода через аргумент опции `-c'.

Чтобы вывести первый символ файла `placement-list', введите:

$ head -c1 placement-list [Enter]

Утилита tail работает подобно head, но выводит последнюю часть своего ввода. Как и в head, по умолчанию выводятся десять строк.

Чтобы вывести последние десять строк файла `placement-list', введите:

$ tail placement-list [Enter]

Чтобы вывести последние четырнадцать строк файла `placement-list', введите:

$ tail -14 placement-list [Enter]

Иногда требуется просматривать конец файла непрерывно; это полезно для ``растущих'' файлов, записываемых другими процессами. Чтобы непрерывно просматривать конец файла, используйте tail с опцией `-f'. Нажмите Ctrl-c для прекращения просмотра.

Чтобы непрерывно просматривать конец файла `access_log', введите:

$ tail -f access_log [Enter]

Чтобы вывести на экран определенную строку из файла, используйте утилиту sed. Укажите в кавычках номер нужной строки и сочетание `!d'. Вторым аргументом должно быть имя файла.

Чтобы вывести строку 47 из файла `placement-list', введите:

$ sed '47!d' placement-list [Enter]

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

Чтобы вывести строки с 47 по 108 из файла `placement-list', введите:

$ sed '47,108!d' placement-list [Enter]

Вы можете также скомбинировать команды head и tail в конвейер, чтобы добиться нужного результата.

Чтобы вывести десятую строку файла `placement-list', введите:

$ head placement-list tail -1 [Enter]|

Чтобы вывести пятую и четвертую строки с конца файла `placement-list', введите:

$ tail -5 placement-list head -2 [Enter]|

Чтобы вывести 500-й символ файла `placement-list', введите:

$ head -c500 placement-list tail -c1 [Enter]|

Чтобы вывести первый символ пятой строки файла `placement-list', введите:

$ head -5 placement-list tail -1 | head -c1 [Enter]|

Вы можете использовать sed для выделения текста между строками определенного вида и вывода выделенного текста или всего текста, кроме выделенногог участка.Строки для поиска - это либо слова, либо регулярные выражения.

Для выделения определенного абзаца используйте опцию `-n' с указанием строки `'/first/,/last/p'', где first и last - границы выделения. Это полезно, например, для вывода отдельных глав или разделов текста, если Вы знаете способ его разделения.

Чтобы вывести текст из файла `book-draft' между строками `Chapter 3' и `Chapter 4', введите:

$ sed -n '/Chapter 3/,/Chapter 4/p' book-draft [Enter]

Чтобы вывести весь текст, кроме указанного участка, опустите опцию `-n'.

Чтобы вывести весь текст из файла `book-draft', кроме текста между строками `Chapter 3' и `Chapter 4', введите:

$ sed '/Chapter 3/,/Chapter 4/p' book-draft [Enter]



Alex Otwagin 2002-12-16

next up previous contents index
Next: Начальные установки для vi Up: Работа в ОС Linux Previous: Вывод текста   Contents   Index

Экранный редактор vi

Рассматриваемые темы:

Этот раздел посвящен экранному редактору vi. Редактор vi является мощным средством для создания и редактирования файлов. Он предназначен для работы на видеотерминале и использует окна, посредством которых вы можете просматривать текст файла. Несколько простых команд позволяют вам сделать изменения в тексте, которые очень быстро отображаются на экране. Редактор может отобразить одну или несколько строк текста. Он позволяет вам передвигать курсор в любую точку на экране или в файле, создавать, изменять или удалять текст. Вы можете также использовать некоторые команды построчного редактора, такие как глобальные команды, которые позволяют вам изменять множество появлений некоторой строки символов, используя одну команду. Чтобы двигаться по файлу, вы можете прокручивать текст вперед или назад.

Примечание: Не все терминалы обладают способностью прокрутки текста и поэтому средство прокрутки текста редактором vi зависит от типа используемого терминала.

Редактор vi имеет более 100 команд. В этом разделе описаны основные команды, которые позволят вам использовать vi просто, но эффективно.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание нового файла в Up: Экранный редактор vi Previous: Экранный редактор vi   Contents   Index

Начальные установки для vi

В этом подразделе описан процесс установки конфигурации терминала, чтобы редактор vi правильно работал.

Прежде чем начать работать с редактором vi, необходимо сообщить системе Linux, какой тип терминала вы используете. Это связано с тем, что программное обеспечение vi по разному исполнимо на разных терминалах.

Каждому типу терминала соответствует кодовое имя, которое распознается системой Linux.

Чтобы установить конфигурацию вашего терминала, введите:

        TERM= terminal_name
        export TERM
        tput init
В первой строке переменной TERM присваивается конкретное значение (тип терминала). Вторая строка экспортирует это значение; она передает это значение всем программам системы Linux, выполнение которых зависит от типа используемого терминала.

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

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

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

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

Чтобы создать файл .exrc, введите при вызове редактора имя этого файла. Затем в первой строке текста введите спецификацию циклического режима (автоматический возврат каретки). Формат этой опции:

        : set wm=n
где n - число символов на строке экрана, после которого должен автоматически появляться возврат каретки. Он может стоять только между словами, но не между слогами слова.

Например, если вы хотите, чтобы возврат каретки проставлялся за 20-м символом с правой стороны экрана, введите:

         : set wm=20

По окончании запишите содержимое буфера в файл и завершите работу с редактором. В следующий раз, если вы будете работать с vi, то этот файл предоставит вам автоматический возврат каретки.

Чтобы проверить установки и циклический режим для вашего терминала в редакторе vi, введите команду:

         : set

Команду set также можете использовать и для создания или изменения опции циклического режима.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Набор текста в режиме Up: Экранный редактор vi Previous: Начальные установки для vi   Contents   Index

Создание нового файла в редакторе

Чтобы создать файл, введите:
        vi filename
Когда вы введете команду vi с именем файла, vi очистит экран и отобразит окно, в которое вы можете вводить и редактировать текст.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Редактирование текста в командном Up: Экранный редактор vi Previous: Создание нового файла в   Contents   Index

Набор текста в режиме ввода

Редактор vi функционирует в двух режимах: режим ввода и командный режим. В режиме ввода вы можете добавлять и модифицировать текст; в командном режиме вы можете:

Если вы успешно вошли в редактор vi, то сразу же попадаете в командный режим и vi ожидает ввода ваших команд. Чтобы создать текст необходимо:

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

После того как вы закончили создавать текст, нажмите клавишу ESCAPE, чтобы из режима ввода перейти к командному режиму. Теперь вы можете редактировать текст, который вы создали или записали

         <a>
         Create some text
         in the screen editor
         and return to
         command mode.<ESC>
Если вы нажмете клавишу ESCAPE и услышите звуковой сигнал, то это значит, что вы уже перешли в командный режим. Нажатие клавиши ESCAPE в то время, когда вы находитесь в командном режиме, никак не влияет на текст в файле, даже если вы нажмете ее несколько раз.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перемещение курсора по экрану Up: Экранный редактор vi Previous: Набор текста в режиме   Contents   Index

Редактирование текста в командном режиме

В общем случае редактирование файла - это добавление, изменение, удаление текста. Чтобы выполнить эти задачи вы должны научиться переходить от одной страницы текста к другой странице, от одной строки к другой и между определенными точками на строке. В этом подразделе описаны команды добавления и удаления текста и способы премещения курсора.

Клавиши перемещения курсора позволяют вам перемещать курсор по файлу. Курсор можно переместить с помощью следующих клавиш:

h
перемещает курсор на один символ влево;
j
перемещает курсор вниз на одну строку;
k
перемещает курсор вверх на одну строку;
l
перемещает курсор на один символ вправо;

Команды j и k сохраняют позицию курсора на строке. Например, если курсор находился на 17-м символе слева, то когда вы введете команду j или k, то он переместится на новую строку, но будет находиться на 17-м символе. Если символов в новой строке меньше, то курсор переместитcя на последний символ строки.

Примечание. Некоторые терминалы имеют специальные символы управления курсором, помеченные стрелками. Эти стрелки можно использовать вместо клавиш h, j, k, l.

Если перед h, j, k, l поставить число, то курсор передвинется на количество строк/символов, равных числу. Например, если надо передвинуть курсор на 4 строки вверх, введите 4k. Если вы не можете продвинуться дальше в этом направлении, то vi подаст звуковой сигнал и курсор останется на прежнем месте.

Чтобы переместить курсор на 35 строк вниз, введите 35j

Дополнительно к клавишам h и l можно использовать клавиши SPACEBAR и BACKSPACE для перемещения курсора вправо или влево.

<SPACEBAR>
переместить курсор на один символ вправо;
<nSPACEBAR>
переместить курсор на n символов вправо;
<BACKSPACE>
переместить курсор на один символ влево;
<nBACKSPACE>
переместить курсор на n символов влево;

Если вы хотите удалить символ, переместите курсор к этому символу и нажмите x. Перед x может стоять число, которое говорит о том, сколько символов подряд нужно удалить. Редактор vi так корректирует строку, что на месте удаленного символа не остается пустого промежутка или на месте удаленной строки - пустой строки.

В редакторе vi существует две команды для добавления текста: insert(i) и append(a). Чтобы добавить текст с помощью команды i, переместите курсор в нужное место с помощью клавишей h, j, k, l. Затем нажмите i и введите текст. Введенный вами текст появится на экране слева от символа, на который указывает курсор. Этот символ и все остальные справа от курсора будут передвинуты вправо, чтобы освободить место для вашего нового текста. Редактор vi будет хранить символы, вводимые вами, до тех пор, пока вы не нажмете клавишу ESCAPE. Если необходимо, передвинутые символы будут перенесены на следующую строку.

Таким же образом вы можете использовать команду a. Отличие состоит в том, что новый текст появится справа от символа, к которому подведен курсор.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Позиционирование курсора на неотображаемом Up: Экранный редактор vi Previous: Редактирование текста в командном   Contents   Index

Перемещение курсора по экрану

Ранее вы познакомились с тем, как перемещать курсор с помощью клавишей h, j, k, l, а также BACKSPACE и SPACEBAR. В этом подразделе приводятся еще несколько команд, которые помогут вам быстро перемещать курсор по экрану. Эти команды выполняются в командном режиме.

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

Переместить курсор на первый или последний символ в строке можно следующим образом:

$
переместить курсор на последний символ в строке;
0(ноль)
переместить курсор на первый символ в строке;
^
переместить курсор на первый ненулевой символ в строке.

Третий способ позиционирования курсора в строке - это поиск указанного символа на текущей строке. Если символ не найден на текущей строке, то появляется звуковой сигнал и курсор остается на прежнем месте. Существуют команды, которые проводят поиск по шаблону. Они будут описаны далее. Здесь приведем 6 команд для поиска внутри строки: f, F, t, T, :(двоеточие) и ,(запятая). После f, F, t и T вы можете указать символ:

fx
осуществляет поиск указанного символа x справа от текущей позиции курсора;
Fx
осуществляет поиск указанного символа x слева от текущей позиции курсора;
tx
осуществляет перемещение курсора вправо на символ до указанного символа x;
Tx
осуществляет перемещение курсора влево на символ до указанного символа x;
;
повторяет предыдущий поиск символа. Команда ; запоминает символ и ищет следующее появление символа в текущей строке;
,
повторяет предыдущий поиск символа, но в обратном направлении. Команда , запоминает символ и ищет следующее появление символа в текущей строке;

Команда - (минус) перемещает курсор на одну строку вверх, позиционируя его на первом ненулевом символе. Чтобы переместить курсор более чем на один символ, укажите пред знаком минус количество строк. Например, чтобы переместить курсор вверх на 13 строк, введите:

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

Команда + (плюс) перемещает курсор вниз на одну строку и позиционирует на первый непустой символ. Перед командой + можно указать количество строк, на которое вы хотите переместить курсор. Например, чтобы переместить курсор на 9 строк вниз, введите:

         9+

Если некоторые строки расположены ниже текущего экрана, то окно переместится вниз, чтобы открыть их.

Редактор vi предполагает, что слово - это строка символов, которая может включать в себя буквы, цифры и символы подчеркивания. В редакторе vi существует 6 команд позиционирования: w, b, e, W, B и E. Команды w, b, e рассматривают любой символ, отличный от буквы, цифры или подчеркивания, как разделитель, означающий начало или конец слова. Пунктуация до или после пустого пространства является разделителем слов. Символ начала или конца строки также является разделителем.

Команды W, B, E рассматривают пунктуатию как часть слова. Слова разделяются пустым пространством, которое состоит из символов пробел, табуляция и новая строка.

Команды позиционирования:

w
перемещает курсор к началу следующего слова;
nw
перемещает курсор к началу n-го слова; конец строки не останавливает движение курсора. Он продолжает подсчет слов с начала следующей строки;
W
игнорирует все знаки пунктуации и перемещает курсор на следующее после пробела слово;
e
перемещает курсор на последний символ в следующем слове;
E
перемещает курсор на последний символ в слове. Игнорирует все символы пунктуации за исключением пробела. Слова разделяются пробелами;
b
перемещает курсор к первому символу предыдущего слова;
nb
перемещает курсор к первому символу n-го предыдущего слова. Команда b не останавливается в начале строки и продолжает движение к началу строки;
B
используется подобно команде b, за исключением того, что слова разделяются только символами пробел и новая строка. Она рассматривает все другие символы пунктуации как буквы.

Редактор vi также распознает предложения. В редакторе vi предложение заканчивается знаками !, . или ?. Если эти разделители появляются в середине строки, то за ними должны стоять два пробела, чтобы vi их мог распознать.

Вы можете перемещать курсор от предложения к предложению в файле с помощью команд ( - открывающая скобка и ) - закрывающая скобка.

(
перемещает курсор в начало текущего предложения;
n(
перемещает курсор в начало n-го предложения выше текущего предложения;
)
перемещает курсор в начало следующего предложения;
n)
перемещает курсор в начало n-го предложения, следующего за текущим предложением.

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

{
переместить курсор в начало текущего параграфа, который ограничивается пустой строкой;
n{
переместить курсор в начало n-го параграфа, следующего за текущим параграфом;
}
переместить курсор в начало следующего параграфа;
n}
переместить курсор в начало n-го параграфа ниже текущей строки.

Редактор vi предоставляет вам 3 команды, которые позволяют вам позиционировать курсор в окне. Эти команды должны быть введены на верхнем регистре:

H
переместить курсор к первой строке экрана;
M
переместить курсор к средней строке экрана;
L
переместить курсор к последней строке экрана.


next up previous contents index
Next: Позиционирование курсора на неотображаемом Up: Экранный редактор vi Previous: Редактирование текста в командном   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание текста Up: Экранный редактор vi Previous: Перемещение курсора по экрану   Contents   Index

Позиционирование курсора на неотображаемом тексте

В этом подразделе описывается, как переместить курсор на текст, который не отображен на текущем экране. Вы можете сделать это следующим образом:

Четыре команды редактора vi позволяют вам осуществлять прокрутку текста файла. Команды ^f (<CTRL>f) и ^d (<CTRL>d) проводят прокрутку экрана вперед, а команды ^b (<CTRL>b) и ^u (<CTRL>u) - прокрутку экрана назад.

Команда ^f осуществляет прокрутку вперед на одно окно текста, расположенного ниже текущего окна. Редактор vi очищает экран и выводит новое окно. Две последние строки текущего окна отображаются в верхней части нового окна. Если окно дополнено пустыми строками, то они помечаются знаком ~ (тильда)

Команда ^d осуществляет прокрутку на половину экрана, чтобы отобразить текст, расположенный ниже окна. Если курсор находится на последней строке файла и вы нажмете ^d, то vi подаст звуковой сигнал.

Команда ^b осуществляет прокрутку экрана назад на полное окно, чтобы отобразить текст, который находится выше текущего экрана. Редактор vi очищает экран и отображает новое окно. В отличие от команды ^f, команда ^b не оставляет в новом окне строки из текущего окна.

Команда ^u осуществляет прокрутку половины экрана, чтобы отобразить текст, расположенный выше окна. Если курсор достигнет начала файла, то vi подаст звуковой сигнал.

Команда G позиционирует курсор на указанную строку в окне. Если эта строка не находится в текущем экране, то G очищает экран и отображает окно, содержащее эту строку. Если не указана строка, то команда G перемещает курсор на последнюю строку файла:

G
переместить курсор на последнюю строку в файле;
nG
переместить курсор на строку n.

Каждая строка файла имеет номер, соответствующий ее положению в буфере. Чтобы получить номер конкретной строки, переместите курсор на эту строку и введите команду: ^g

В нижней части экрана команда ^g поместит информацию:

Для поиска символов по шаблону вы можете использовать команды /, ?, n и N. Эти команды позволяют осуществлять поиск вперед и назад в буфере следующего появления указанного шаблона символов. Команды n и N позволяют вам повторить последний поиск.

Команда / и следующий за ней шаблон (/pattern) ведет поиск вперед по буферу следующего появления символов, указанных в шаблоне и помещает курсор на первый символ из шаблона. Например, командная строка:

    /Hello world
находит первое появление в буфере слов Hello world и помещает курсор под буквой H.

Команда ? и следующий за ней шаблон (?pattern) ведет поиск в обратном направлении в буфере первого появления символов, указанных в шаблоне и помещает курсор на первый из этих символов. Например, командная строка:

    ?data set design
находит предыдущее появление в буфере слов data set design и помещает курсор под буквой d в слове data.

Эти команды поиска не выполняют циклически возврат в случае окончания строки во время поиска двух или более слов. Например, если вам надо найти появление Hello world и окажется, что слово Hello находится в конце одной строки, а слово world - первое слово последующей строки, то эти команды не найдут Hello world.

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

Команды n и N позволяют повторить предыдущий запрос поиска /pattern или ?pattern:

n
повторить последнюю команду поиска;
N
повторить последнюю команду поиска в обратном направлении.

Команды / и ? не дают вам возможности указать конкретное появление шаблона с помощью числа. То есть, вы не можете, например, запросить поиск 3-го появления шаблона, начиная с текущей позиции.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление текста Up: Экранный редактор vi Previous: Позиционирование курсора на неотображаемом   Contents   Index

Создание текста

Три основные команды позволяют в редакторе vi создавать текст:

a
добавить текст;
i
вставить текст;
o
открыть новую строку, на которой может быть введен текст.

После того, как вы создали текст с помощью одной из этих команд, можете возвратиться в командный режим редактора vi нажав клавишу ESCAPE.

Чтобы в файл добавить текст, воспользуйтесь следующими командами:

a
добавить текст после курсора;
A
добавить текст в конце текущей строки.

Чтобы в файл вставить текст, воспользуйтесь следующими командами:

i
вставить текст до курсора;
I
вставить текст в начале текущей строки до первого ненулевого символа.

Для возврата в командный режим, нажмите клавишу ESCAPE.

Для открытия строки для текста воспользуйтесь следующими командами:

o
создать текст с начала новой строки, расположенной ниже текущей строки. Вы можете ввести эту команду в любом месте текущей строки;
O
создать текст с начала новой строки, расположенной выше текущей строки. Вы можете ввести эту команду в любом месте текущей строки.
Команды открытия создают строку непосредственно выше или ниже текущей строки и переводят вас в режим ввода текста. Курсор располагается в начале новой строки и ожидает от вас ввода текста.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление слов Up: Экранный редактор vi Previous: Создание текста   Contents   Index

Удаление текста

Вы можете удалить текст с помощью нескольких команд в командном режиме и небольшой объем в режиме ввода.

Если вы находитесь в режиме ввода текста редактора vi и хотите удалить символ, воспользуйтесь клавишей BACKSPACE:

BACKSPACE
удалить текущий символ (слева от курсора).

Клавиша BACKSPACE перемещает курсор назад в режиме ввода текста и удаляет каждый символ, который курсор переходит. Однако удаленный символ не стирается с экрана пока вы не нажмете клавишу ESCAPE для возврата в командный режим.

Удалить текст вы можете и с помощью следующих ключей:

^ w
отменить ввод текущего слова;
удалить на текущей строке весь введенный во время данного режима ввода текст;
^ v
удалить специальное значение, если есть, следующих вводимых символов.

Когда вы вводите ^w, курсор возвращается на последнее введенное слово и ожидает на первом символе этого слова. Он не стирает слово с экрана до тех пор, пока вы не нажмете клавишу ESCAPE или не введете новые символы на месте этого слова.

Отменить последнюю введенную команду можно с помощью следующих команд:

u
отменить последнюю команду;
U
восстановить текущую строку в состояние до произведенных изменений.

Если вы случайно удалили строки, то для отмены команды удаления введите команду u. Удаленные строки вновь появятся на экране. Если вы ввели неправильно команду, то введите команду u и неверная команда будет отменена. Команда U будет аннулировать все изменения в текущей строке до тех пор, пока курсор будет находиться на этой строке.

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

Многие команды редактора vi, такие как команды удаления и изменения, предоставляют вам возможность использовать в командной строке команды перемещения курсора. Команды перемещения курсора могут указывать на объект текста: слово, строка, предложение, параграф. В этом случае общий формат команды будет такой:

         [number][command]text_object
Квадратные скобки указывают, что данные компоненты не являются обязательными.

Все команды удаления, выдаваемые в командном режиме сразу же удаляют указанный текст с экрана и оставшуюся часть отображают на экране в обновленном виде.

Команда удаления имеет следующий формат:

        [number]dtext_object
где d - команда удаления; text_object - объект удаления.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление пользователя Up: Пользователи системы Previous: Добавление пользователя   Contents   Index

Установка или смена пароля

Для введения пароля нового пользователя или изменения пароля существующего введите в командной строке команду
    passwd имя_пользователя
В ответ на приглашение
   New UNIX password:
введите пароль (допускаются любые символы, прописные и строчные буквы различаются). На экране не отображаются никакие символы, и курсор по мере набора символов не перемещается.

Если введенный пароль слишком простой (например, короче шести символов), об этом будет выдано предупреждение, начинающееся со слов BAD PASSWORD (далее следует описание недостатков пароля). Напоминаем, что GNU/Linux - принципиально многопользовательская система, поэтому по умолчанию предполагается, что на Вашем компьютере могут работать самые разные люди, в том числе и способные ``взломать'' Ваш пароль. Поэтому настоятельно рекомендуется использовать достаточно длинные (не менее 6 и не более 256 символов) пароли, состоящие не только из цифр и не содержащие ``словарных'' слов. Разумеется, если компьютер находится в Вашем полном распоряжении и недоступен для посторонних, эти предосторожности представляются чрезмерными. Поэтому Вы можете проигнорировать это сообщение (в данном случае носящее характер предупреждения).

После ввода пароля Вам будет предложено подтвердить введенный пароль. В ответ на приглашение

   Retype new UNIX password:
введите пароль еще раз.

В случае успеха (если дважды был введен одинаковый пароль) выдается сообщение

   passwd: all authentification tokens updated successfully
и программа завершает работу. Если пароли, введенные в первом и во втором случае, не совпадают, выдается сообщение
   Sorry, passwords do not match
и Вам вновь предлагается ввести пароль.

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

   passwd
и в ответ на приглашение
   (current) UNIX password:
ввести текущий пароль. Дальнейшая работа программы аналогична описанной выше, однако в этом случае задание простого пароля не допускается.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление параграфов Up: Экранный редактор vi Previous: Удаление текста   Contents   Index

Удаление слов

Вы можете удалить слово или часть слова с помощью команды d. Переместите курсор к первому удаляемому символу и введите команду dw. Символ, расположенный над курсором и последующие за нми будут стерты. Команда dw удаляет одно слово или знак пунктуации и пробелы, которые следуют за ним. Вы можете удалить несколько слов или знаков пунктуации за один раз, если укажете перед командой соответствующее число. Например, чтобы удалить 3 слова и две запятые, введите команду 5dw.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Удаление строк Up: Экранный редактор vi Previous: Удаление слов   Contents   Index

Удаление параграфов

Чтобы удалить параграф, воспользуйтесь командой d{ или d} Помните, что вы можете восстановить удаленный текст с помощью команды u.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Модификация текста Up: Экранный редактор vi Previous: Удаление параграфов   Contents   Index

Удаление строк

Чтобы удалить строку, введите dd. Для удаления нескольких строк укажите перед командой количество удаляемых строк. Например, команда 10dd сотрет 10 строк.

Если вы удаляете несколько строк, то vi отображает в нижней части экрана сообщение типа:

        10 lines deleted
Если ниже текущей строки осталось меньше 10 строк, то прозвучит сигнал и строки не удалятся.

Для удаления всего текста на строке, расположенного после курсора, поместите курсор на первый удаляемый символ и введите D или d$. Эта команда удаляет текст только на текущей строке.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Извлечение и присоединение текста Up: Экранный редактор vi Previous: Удаление строк   Contents   Index

Модификация текста

Один из способов модификации текста представляют команды удаления и команды ввода текста. Другой способ, с помощью которого вы можете изменить текст, это задать команду, позволяющую одновременно удалять и создавать текст. В редакторе vi существуют 3 основные команды изменения текста: r, s и c.

rx
Заменить текущий символ (символ, на который показывает курсор) на x. Эта команда не устанавливает режим ввода текста и, следовательно, нет необходимости нажимать после нее клавишу ESCAPE.

nrx
Заменить n символов на x. После этой команды также не надо нажимать клавишу ESCAPE.

R
Заменяет только те символы, которые введены в режиме ESCAPE. Если будет достигнут конец строки, то эта команда добавит ввод как новый текст.
Например, вы хотите заменить слово acts на ants в следующем предложении:
        The circus has many acts.
Поместите курсор под буквой c в слове acts и введите команду rn. Предложение будет иметь вид:
        The circus has many ants.
Чтобы заменить слово many на 7777, поместите курсор под буквой m в слове many и введите команду 4r7. Команда r заменит слово many на четыре цифры 7:
 The circus has 7777 ants.

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

s
удалить символ, на который указывает курсор и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;
ns
удалить n символов и добавить текст. После окончания ввода текста нажмите клавишу ESCAPE;
S
заменить все символы в строке.

Когда вы вводите команду s, последний символ в строке символов, который будет заменен, переписывается со знаком $. Символ не стирается с экрана, пока вы не введете на его место новый символ, или не нажмете клавишу ESCAPE.

Команда подстановки заменяет символы. Команда изменения заменяет объект текста и затем продолжает добавлять текст с этого места до тех пор, пока вы не нажмете клавишу ESCAPE.

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

ncx
заменить n-ый объект текста типа x (предложение, параграф);
cw
заменить слово или оставшиеся символы в слове на новый текст. Редактор vi печатает знак $, чтобы показать последний символ, который будет заменен;
ncw
заменить n слов;
cc
заменить все символы в строке;
ncc
заменить все символы в текущей строке и n верхних строк;
C
заменить оставшиеся символы в строке от курсора до конца строки;
dfn nC
заменить оставшиеся символы, начиная от курсора в текущей строке и во всех n верхних строках.
Команда c использует знак $, чтобы отметить последний символ, который должен быть замещен. После того как выполнилась команда изменения, вы находитесь в режиме ввода текста и можете вводить любой текст. Тескт будет храниться в буфере, пока вы не нажмете клавишу ESCAPE.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Копирование и перемещение текста Up: Экранный редактор vi Previous: Модификация текста   Contents   Index

Извлечение и присоединение текста

Редактор vi предоставляет набор команд, которые разбивают текст в файл и набор команд, которые копируют часть текста и помещают в другое место в файле.

Вы можете переместить текст из одного места в буфере редактора vi в другое, удалив строки, а затем поместив их в требуемое место. Удаленный текст сохраняется во временном буфере. Переместите курсор на то место, куда вы хотите поместить текст и нажмите клавишу p. Удаленные строки будут добавлены ниже текущей строки.

Удаленная с помощью команды удаления строка может быть помещена в середине другой строки. Позиционируйте курсор между двумя словами, затем нажмите клавишу p. Удаленная строка будет помещена после курсора.

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

Быстрым способом перемещения букв является комбинация команд x и p (xp). Команда x удаляет букву, p - помещает ее после следующего символа. Например, в следующем предложении есть ошибка:

       A line of tetx
Поместите курсор под буквой t в комбинации tx и затем нажмите клавиши x и p. В результате получим:
       A line of text

Вы можете копировать одну или несколько строк текста во временный буфер и затем поместить копию этого текста в определенное место в файле. Чтобы поместить текст на новое место, введите команду y. Команда y имеет следующий общий формат:

    [number]y[text_object]
Копирование строк с помощью команды y не удаляет их с прежнего места в файле, т.е. вы можете поместить один и тот же кусок текста в нескольких местах.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Специальные команды Up: Экранный редактор vi Previous: Извлечение и присоединение текста   Contents   Index

Копирование и перемещение текста с использованием регистров

Перемещение и копирование нескольких разделов текста в различные части файла является утомительной работой. Редактор vi предлагает вам использовать так называемые регистры, в которых вы можете хранить текст до тех пор, пока он вам не понадобится. Сохранить текст вы можете либо с помощью команды y, либо с помощью команды удаления. Использование регистров особенно полезно, если часть текста должна появиться во многих местах в файле. Извлекаемый текст остается в указанном регистре пока вы не завершите работу с ним, либо закончите работу с редактором, либо поместите в этот регистр другой текст.

Общий формат команды:

        [number]["X]command[text_object]
где X - имя регистра, состоящее из одной буквы верхнего регистра. Имени регистра должны предшествовать двойные кавычки.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование команд построчного редактора Up: Экранный редактор vi Previous: Копирование и перемещение текста   Contents   Index

Специальные команды

В этом подразделе приведены специальные команды, которые будут вам весьма полезны:

.
повторить последнюю команду;
j
объединить две строки;
^ l
очистить экран и вновь отобразить его;
~
заменить нижний регистр на верхний и наоборот.

Команда . (точка) повторяет последнюю введенную команду. Очень часто она используется с командой поиска.

Команда j объединяет строки. Чтобы ввести эту команду, поместите курсор на текущей строке и нажмите клавиши SHIFT и j одновременно. Текущая строка объединяется со следующей строкой.

Например, вы имеете две строки текста:

        Dear Mr.
        Smith:
Объединим эти две строки в одну. Поместите курсор под любым символом в первой строке и введите команду j. На экране появится строка:
        Dear Mr. Smith:
Обратите внимание, что редактор vi автоматически ставит пробел между последним словом в первой строке и первым словом второй строки.

Если другой пользователь системы Linux посылает вам собщение с использованием команды write, а вы в это время редактируете с помощью vi, то посланное сообщение появится в вашем текущем окне поверх текста, который вы редактируете. Чтобы восстановить редактируемый текст после того, как вы прочтете посланное сообщение, нужно перейти в командный режим. Если вы находитесь в режиме ввода текста, то нажмите ^l. Редактор vi сотрет сообщение и восстановит окно в том виде, в котором оно было до прихода сообщения.

Чтобы быстро заменить букву нижнего регистра на букву верхнего регистра, надо поместить курсор под этой буквой и нажать клавишу ~ (тильда). Вы можете заменить несколько букв, нажав столько же раз клавишу ~, либо поставив перед тильдой число требуемых замен.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Завершение работы с редактором Up: Экранный редактор vi Previous: Специальные команды   Contents   Index

Использование команд построчного редактора

Редактор vi имеет доступ ко многим командам построчного редактора ex. В этом подразделе обсуждаются некоторые наиболее часто используемые команды.

Команды редактора ex очень похожи на команды редактора ed.

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

Когда вы входите в vi, то содержимое буфера заполняет ваш экран, делая невозможным выдачу команд для shell. Однако вам может это понадобиться. Например, вам необходимо будет получить информацию из другого файла для присоединения ее к текущему тексту. Вы можете получить эту информацию, запустив одну из команд shell, которая отображает текст файла на экране. Например, cat или pg. Однако процедура завершения работы с редактором и повторный вход в редактор потребуют времени и сил. Редактор vi предлагает вам два способа временного выхода из редактора для того, чтобы вы могли ввести команды shell (и даже редактировать другие файлы) не покидая сам редактор. Это команды :sh и :!.

Команда :! позволяет вам выйти из редактора и запустить команду shell одной командной строкой. Находясь в командном режиме редактора vi, введите :!. Эти символы будут напечатаны в низу экрана. Сразу же после символа ! введите команду shell. Shell запустит вашу команду, даст вам ответ и напечатает сообщение:

     Hit return to continue
После того, как вы нажмете клавишу RETURN, vi обновит экран и курсор примет свое прежнее положение.

Команда редактора :sh позволяет вам делать то же самое, но ведет по другому себя на экране. Из командного режима редактора vi введите :sh и нажмите клавишу RETURN. Подсказка команды shell появится на следующей строке. Ведите ваши команды после подсказки так, будто бы вы работаете в нормальном режиме с shell. Когда вы будете готовы вернуться к редактору vi, введите ^d или exit. Экран обновит информация из вашего буфера и курсор вновь переместится на прежнее место.

При временном переходе к shell даже изменение каталогов не мешает возврату к буферу редактора vi при вводе ^d или exit.

Команда w позволяет вам создавать файл, копируя строки текста из файла, который вы в данный момент редактируете, в файл, который вы указали. Чтобы создать новый файл нужно указать строку или строки (номера строк) и имя нового файла в командной строке. Общий формат этой команды:

    :line_number[,line_number]w filename
Например, чтобы записать третью строку буфера в файл three, введите:
    :3w three

При успешном создании нового файла, редактор vi напечатает следующую информацию:

    "three" [New file] 1 line, 20 characters
Чтобы записать текущую строку в файл, укажите . (точку) как адрес строки:
    :.w junk

Создастся новый файл с именем junk. Он будет содержать только текущую строку буфера vi.

Вы можете записать часть буфера в новый файл, обозначив границы строк. Например, чтобы строки с 23-й по 37-ю записать в файл, введите следующую команду:

     :23,37w newfile

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

      :n
где n - номер строки в буфере.

Одним из самых простых способов удаления всех строк от текущей строки и до конца буфера является использование команды d построчного редактора со специальнымим символами для текущей и последней строк:

      :.,$d
где .(точка) - обозначает текущую строку; $ - обозначает последнюю строку.

Чтобы добавить текст из файла ниже указанной строки в буфер редактора, воспользуйтесь командой r. Например, чтобы перенести содержимое файла data в ваш текущий файл, поместите курсор на то место, где должен стоять текст и введите команду:

      :r data
Вместо перемещения курсора вы можете указать номер строки. Например, чтобы вставить файл data после 56-й строки в буфере, введите:
      :56r data

:g/pattern/command
- для каждой строки, содержащей pattern выполнить команду command редактора ex. Построчный редактор напечатает све строки, содержащие pattern;
:s/pattern/new_words
- это команда замены. Построчный редактор отыскивает первое появление символов pattern в текущей строке и заменяет его на new_words;
:s/pattern/new_words/g
- редактор ex заменяет каждое появление pattern в текущей строке;
:g/helix/s//double helix/g
- эта команда осуществляет поиск слова helix. Каждое найденное слово helix заменяется на double helix. Ограничители после команды s позволяют не вводить слово helix каждый раз. Команда запоминает слово между ограничителями после команды g.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Специальные опции для vi Up: Экранный редактор vi Previous: Использование команд построчного редактора   Contents   Index

Завершение работы с редактором vi

Когда вы закончите работу с текстом, необходимо записать содержимое буфера в файл и возвратить управление shell. Для этого нажмите клавишу SHIFT и дважды нажмите Z(ZZ). Редактор сохранил имя того файла, который вы указали в начале сеанса редактирования, и в этот файл перепишет текст из буфера. Обратите внимание, что внизу экрана дается имя файла и количество строк и символов в файле. Затем shell выдает вам подсказку.

Пример.

        <a>
        This is a text file.
        I am adding text to
        a temporary buffer and
        now it is perfect.
        I want to write this file,
        and return to the shell.<ESC><ZZ>
        -
        -
        -
        -
        "stuff" [New file] 6 lines, 135 characters
        $
Вы также можете использовать команды :w и :q редактора vi для записи файла и окончания работы с редактором. Команды редактора начинаются с двоеточия (:) и появляются в последней строке экрана. Команда :w записывает буфер в файл. Команда :q завершает работу редактора и возвращает управление shell. Вы можете ввести эти команды раздельно, или в одной команде :wq

Пять основных команд могут быть использованы для завершения работы с редактором vi. Команды, которым предшествует :, являются командами построчного редактора:

:wq
- записать содержимое буфера vi в файл, который в данный момент редактируется и завершить работу с vi;
ZZ
- записать содержимое буфера, если он изменялся с момента последней записи;
:q
- записать временный буфер в новый файл filename и завершить работу с редактором vi;
:q!
- завершить работу с редактором vi без записи содержимого буфера в файл; не учитываются все изменения, проведенные в буфере;
:q
- завершить работу с редактором vi без записи содержимого буфера в файл. Эта команда работает в том случае, если вы не производили изменений в буфере. В противном случае vi выдаст предупреждающее сообщение о том, что вы должны сохранить буфер или воспользоваться для завершения работы с vi командой :q!.
Что нужно сделать, чтобы дать файлу другое имя? Например, вы хотите записать в новый файл junk. Введите команду:
     :w junk
Затем завершите работу с vi с помощью :q.

Если вы попытаетесь записать в уже существующий файл, то получите предупреждающее сообщение. Например, если вы попытаетесь записать в файл johnson, система выдаст сообщение:

     "johnson" File exists - use "w!johnson" to overwrite

Если вы хотите заменить содержимое существующего файла на содержимое буфера, то воспользуйтесь командой :w!:

     :w! johnson



Alex Otwagin 2002-12-16

next up previous contents index
Next: Средства печати Up: Экранный редактор vi Previous: Завершение работы с редактором   Contents   Index

Специальные опции для vi

Команда vi имеет специальные опции. Они позволяют:

Если случайно произошло прерывание работы редактора vi, то не производится запись текста из буфера обратно в файл. Но vi сохраняет копию буфера. Когда вы вновь зарегистрируетесь в системе Linux, вы можете восстановить файл с помощью опции -r. Введите:

    vi -r filename
Все или почти все изменения, которые вы выполнили до прерывания, вновь появятся в буфере vi, и вы снова сможете продолжить редактирование файла или записать буфер в файл и завершить работу с vi.

Если вы хотите редактировать в одном сеансе более одного файла, то введите команду vi, указав имя каждого файла:

     vi file1 file2
vi ответит, сколько файлов вы будете редактировать. Например:
      2 files to edit
После того, как вы отредактировали первый файл, запишите все изменения из буфера в файл file1:
      :w
Система ответит на эту команду сообщением в низу экрана. В нем она напечатает имя файла, число строк и символов в этом файле. Затем вы можете начать редактировать следующий файл, задав команду:
      :n
Система в низу экрана сообщит вам имя следующего файла, который вы будете редактировать, и число строк и символов в этом файле.

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

      view file



Alex Otwagin 2002-12-16

next up previous contents index
Next: Командный процессор Up: Пользователи системы Previous: Установка или смена пароля   Contents   Index

Удаление пользователя

Иногда необходимо удалить регистрационную запись пользователя (например, зарегистрированного по ошибке). Для того чтобы удалить регистрационную запись пользователя имя\_пользователя, необходимо работать в текстовой консоли с правами суперпользователя. Введите в командной строке команду
   userdel имя_пользователя
Для того чтобы удалить регистрационную запись, а также принадлежащие пользователю файлы, введите в командной строке команду
   userdel -r имя_пользователя
Эта команда удаляет каталог /home/имя_пользователя и все его содержимое. Файлы данного пользователя, расположенные в других местах, не удаляются автоматически, их необходимо находить и удалять вручную.

Удаление файлов, принадлежавших ранее удаленному пользователю, а также любой другой доступ к ним (например, просмотр) возможен только с правами суперпользователя.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Печать файлов с помощью Up: Работа в ОС Linux Previous: Специальные опции для vi   Contents   Index

Средства печати

Рассматриваемые темы:

Наиболее простой путь для печати в операционной системе Linux - это посылка файла для печати прямо на устройство печати. Для того чтобы сделать это, используется команда cat. Зарегистрируйтесь как пользователь root и наберите:

# cat thesis.txt > /dev/lp

В этом случае файл /dev/lp представляет собой символическую ссылку на устройство печати - это может быть матричный или лазерный принтер, или же плоттер.

В целях обеспечения безопасности, только пользователь root и пользователи из той же группы, что и демон принтера (управляющая программа) могут записывать файл прямо на устройство-принтер. Поэтому для доступа к принтеру обычно используют специальные утилиты, такие как lpr, lprm, и lpq.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Просмотр очереди печати с Up: Средства печати Previous: Средства печати   Contents   Index

Печать файлов с помощью lpr

Пользователи обычно используют для печати файлов утилиту lpr. Команда lpr берет на себя заботы о всей предварительной обработке, необходимой для печати файла, и затем передает управление другой программе, lpd, демону линейной печати. Демон линейной печати непосредственно взаимодействует с принтером и указывает ему, как печатать переданный файл.

Когда выполняется команда lpr, она первым делом копирует заданный файл в определенную директорию (spool directory), где файл остается, пока lpd печатает его. Когда lpd получает сообщение о том, что есть файл для печати, он запускает свою копию процесса. Эта копия процесса будет печатать наш файл, в то время как оригинальный процесс будет ждать других запросов. Это позволяет обслуживать много заданий печати одновременно.

Синтаксис lpr очень прост,

$ lpr [ опции ] [ имя_файла ... ]

Если имя_файла не задано, lpr ожидает ввод данных со стандартного ввода (обычно клавиатура, или вывод другой программы). Это позволяет пользователям перенаправлять вывод команд в очередь печати, например, вот так,

$ cat thesis.txt lpr|

или,

$ pr -l60 thesis.txt lpr|

Команда lpr принимает несколько аргументов командной строки, что позволяет пользователям контролировать ее работу. Вот некоторые из часто используемых аргументов:

-Pprinter
определяет, какой из принтеров системы использовать;
-s
создает символическую ссылку вместо копирования файла в директорию спулинга (полезно для больших файлов);
-#num
определяет количество копий печати.
Пример взаимодействия с lpr с использованием опций:

$ lpr -#2 -sP dj thesis.txt

Эта команда создает символическую ссылку на файл thesis.txt в директории спулинга для принтера названного dj, где он будет обработан демоном печати lpd. Затем будет напечатана вторая копия файла thesis.txt.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Отмена задания печати с Up: Средства печати Previous: Печать файлов с помощью   Contents   Index

Просмотр очереди печати с помощью lpq

Для просмотра содержимого очереди печати используется команда lpq. Команда, запущенная без аргументов, возвращает содержимое очереди печати принтера по умолчанию.

Вывод, возвращаемый lpq, может быть полезен для многих целей.

$ lpq
lp is ready and printing
Rank   Owner      Job  Files                            Total Size
active mwf        31   thesis.txt                       682048 bytes



Alex Otwagin 2002-12-16

next up previous contents index
Next: Контроль демона lpd с Up: Средства печати Previous: Просмотр очереди печати с   Contents   Index

Отмена задания печати с использованием команды lprm

Другое полезное свойство любой системы печати - это возможность отмены задания, которое было перед этим помещено в очередь. Чтобы сделать это, используйте команду lprm.

$ lprm -

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

$ lprm 31

отменит задание номер 31 (thesis.txt) на принтере по умолчанию.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Переменная среды PRINTER Up: Средства печати Previous: Отмена задания печати с   Contents   Index

Контроль демона lpd с помощью lpc

Программа lpc используется для контроля принтеров, которые обслуживает демон lpd. Вы можете разрешать или запрещать использование принтера или их очередей, перераспределять задания внутри очереди, и получать информацию о состоянии принтеров и их очередей. Lpc наиболее часто используется в системах, где несколько принтеров установлено на одну машину.

$ lpc

Команда показанная выше запускает программу lpc. По умолчанию, она входит в интерактивный режим и вы можете начинать вводить команды. Другие опции используются для запуска команды lpc в командной строке.

$ lpc status all

Список всех возможных команд перечислен на странице руководства команды lpd, но здесь перечислено несколько главных команд, которые вы должны знать. Любые команды, обозначенные как option, могут быть либо именем принтера (lp, print, etc) или ключевым словом all, которое обозначает все принтера.

disable option
- запрещает добавление любых новых заданий печати
down option
- запрещает все задания на принтере
enable option
- разрешает ввод новых заданий в очередь печати
quit (or exit)
- покинуть lpc
restart option
- перезагрузить lpd для данного принтера
status option
- статус печати принтера
up option
- разрешить все и стартовать новый демон lpd



Alex Otwagin 2002-12-16

next up previous contents index
Next: Разработка приложений Up: Средства печати Previous: Контроль демона lpd с   Contents   Index

Переменная среды PRINTER

Все команды в системе печати Linux принимают опцию -P. Эта опция позволяет пользователю указать, какой принтер использовать для вывода. Если пользователь не указал, какой принтер использовать, тогда будет использоваться устройство по умолчанию.

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

$ PRINTER="printer_name"; export PRINTER

Эти команды могут быть помещены в ваш сценарий входа (.profile для bash), или выполнены из командной строки.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Этапы разработки программных систем Up: base Previous: Переменная среды PRINTER   Contents   Index

Разработка приложений



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Жизненный цикл программных систем Up: Разработка приложений Previous: Разработка приложений   Contents   Index

Этапы разработки программных систем



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Этапы жизненного цикла ПО Up: Этапы разработки программных систем Previous: Этапы разработки программных систем   Contents   Index

Жизненный цикл программных систем

Программная система - это такая система, в которую входит программное обеспечение. В общем случае программная система помимо собственно программ содержит еще и аппаратное обеспечение, а также обычно рассматривается в окружении других программно-аппаратных систем.

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

Жизненный цикл традиционно моделируется в виде некоторого числа последовательных этапов (или стадий, фаз). В настоящее время не выработано общепринятого разбиения жизненного цикла программной системы на этапы. Иногда этап выделяется как отдельный пункт, иногда - входит в качестве составной части в более крупный этап. Могут варьироваться действия, производимые на том или ином этапе. Нет единообразия и в названиях этих этапов. Поэтому попытаемся вначале описать некоторый обобщенный жизненный цикл программной системы, а затем продемонстрируем несколько примеров различных жизненных циклов с указанием аналогий из этого обобщенного цикла.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Примеры описания жизненного цикла Up: Этапы разработки программных систем Previous: Жизненный цикл программных систем   Contents   Index

Этапы жизненного цикла ПО

Обобщенный жизненный цикл можно представить в виде следующей последовательности этапов, которые, в свою очередь, можно также разбить на стадии:
  1. планирование разработки;
  2. определение требований к системе;
    2.1
    выработка требований;
    2.2
    анализ требований;
  3. проектирование системы;
    3.1
    проектирование архитектуры системы;
    3.2
    детальное проектирование компонент системы, в т.ч. для программного обеспечения;
    3.2.1
    общее проектирование программного обеспечения;
    3.2.2
    проектирование отдельных программных компонент;
  4. реализация и тестирование системы;
    4.1
    создание отдельных компонент системы, в т.ч. для программного обеспечения;
    4.1.1
    создание отдельных программных модулей;
    4.1.2
    тестирование отдельных программных модулей;
    4.2
    тестирование компонент системы, в т.ч. программного обеспечения как единого компонента системы;
    4.3
    интегрирование отдельных компонент в систему;
  5. выпуск системы;
  6. эксплуатация системы;
  7. завершение разработки.

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Shell - интерпретатор командного Up: Введение в ОС Linux Previous: Удаление пользователя   Contents   Index

Командный процессор

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

Linux может использовать разные командные процессоры, в том числе несколько одновременно, однако Вам, вероятнее всего, встретится наиболее распространенный из них Bash.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Этап планирования Up: Этапы разработки программных систем Previous: Этапы жизненного цикла ПО   Contents   Index

Примеры описания жизненного цикла

Рассмотрим несколько описаний жизненного цикла программного обеспечения, которые послужат своеобразным комментарием этапам обобщенного жизненного цикла.

В отечественных нормативных документах (например, ГОСТ ЕСПД) принято следующее разграничение на этапы, которое приводится с указанием аналогий из списка, данного в начале раздела:

Подобное описание имеет своим прообразом технологию разработки аппаратных средств и поэтому не вполне учитывает все отличительные особенности проектирования программ. Более подходящим выглядит описание жизненного цикла программного обеспечения, состоящее из 12 этапов, которые очень близки этапам обобщенного жизненного цикла (см. рис. 1.1). В скобках после имени фазы указывается аналог из обобщенного цикла. Практически все этапы заканчиваются проверкой результатов, полученных на соответствующем этапе.

Image figure1.1

Рис. 1.1 Пример жизненного цикла программных систем

  1. Начало проекта и планирование (этап 1). Определяются необходимые действия, планы и организация управления проектом. Определяются меры по обеспечению непрерывного выполнения фаз жизненного цикла.

  2. Анализ целевых требований (2.1). Определяются, без учета средств реализации, общие характеристики системы, которым она должна удовлетворять. Устанавливается, что и как должна делать система.

  3. Анализ системных требований (2.2). Описывается, как должны удовлетворятся запросы пользователя, в терминах конкретных функциональных понятий описываются действия предполагаемой системы, хранимые данные, используемый интерфейс - все это без учета физической реализации. Проверяется пригодность этих конкретных понятий.

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

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

  6. Детальное проектирование программного обеспечения (3.2.2). В терминах используемых программных конструкций производится описание того, как каждый конкретный компонент будет разрабатываться. Описываются режимы использования каждого компонента в системе.

  7. Кодирование и тестирование программного обеспечения (4.1.1 и 4.1.2). Создание, тестирование отдельных модулей, документирование и приемка программных компонентов, которые составляют программную систему.

  8. Интеграция программного обеспечения (частично 4.2). Тестирование работоспособности и функциональной законченности программных частей системы в предсказуемом окружении (аппаратуре и окружающей среде).

  9. Интеграция системы (4.3). Тестирование работоспособности и функциональной законченности частей общей системы в целом.

  10. Приемка и поставка системы (5). Производится приемка системы заказчиком, и поставка ему системы.

  11. Эксплуатация и сопровождение системы (6). Выпуск последующих вариантов или версий системы, необходимость в которых возникает из-за устранений дефектов, отработки измененных требований и т.д.

  12. Завершение проекта (7). Формирование посториорной модели проектных действий с анализом достоинств, недостатков и т.д., и использование их в качестве основания для улучшения процесса разработки.

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

  1. этап планирования, который определяет и координирует действия по разработке программной системы (этап 1);
  2. этап разработки, на котором создается программная система:
  3. интегрированный этап, обеспечивающий коррекцию, проверку, и определение полноты программной системы, а также ее выпуск. Этот этап включает в себя верификацию, контроль за конфигурацией системы, оценку качества и проверку взаимодействия между этапами. Из названия этого этапа видно, что он выполняется совместно с другими этапами на протяжении жизненного цикла системы.

Image figure2

Рис. 1.2 Вариант упрощенного жизненного цикла программной системы.

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

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

На рис. 1.3. показана последовательность этапов разработки программного обеспечения для отдельных компонентов единой программной системы с различными жизненными циклами.

Image figure3

Рис. 1.3 Последовательность этапов разработки компонент программного обеспечения

Для компонента W из множества системных требований к единому продукту формируется подмножество требований, относящихся к данному компоненту, используются эти требования при формировании проекта программного компонента, реализовывают этот проект в исходном коде и тогда интегрирует компонент с аппаратурой. Компонент X показывает использование ранее разработанного программного обеспечения. Компонент Y показывает использование простой отдельной функции, которая может быть закодирована прямо на основе требований к программному обеспечению. Компонент Z показывает использование прототипной стратегии. Обычно, целями прототипирования является лучшее понимание требований к программному обеспечению и уменьшение технических рисков и рисков разработки при создании конечного продукта. Исходные требования используются как базис для получения прототипа. Этот прототип преобразуется в окружение, типичное для конкретного использования системы при разработке. Результатом преобразований является уточненные данные, которые используются для создания конечного программного продукта.

Практически все этапы жизненного цикла объединяются с верификацией.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Этап разработки программной системы Up: Этапы разработки программных систем Previous: Примеры описания жизненного цикла   Contents   Index

Этап планирования

Целями этапа планирования является определение средств для создания программного продукта, которые будут удовлетворять требованиям, предъявляемым к системе, и обеспечивать достаточный уровень надежности. На этом этапе производится:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Этап верификации Up: Этапы разработки программных систем Previous: Этап планирования   Contents   Index

Этап разработки программной системы

Этап разработки программной системы состоит из следующих стадий:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Структура программных продуктов Up: Этапы разработки программных систем Previous: Этап разработки программной системы   Contents   Index

Этап верификации

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Средства программирования в ОС Up: Этапы разработки программных систем Previous: Этап верификации   Contents   Index

Структура программных продуктов

В большей степени программные продукты не являются монолитом и имеют конструкцию (архитектуру) построения - состав и взаимосвязь программных модулей.

Модуль - это самостоятельная часть программы, имеющая определенное назначение и обеспечивающая заданные функции обработки автономно от других программных модулей.

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

Структуризация программ выполняется в первую очередь для удобства разработки, программирования, отладки и внесения изменений в программный продукт. Как правило, программные комплексы большой алгоритмической сложности разрабатываются коллективом разработчиков (2 - 15 и более человек). Управлять разработкой программ в условиях применения промышленных технологий изготовления программ можно лишь на научной основе.

Таким образом, структуризация программных продуктов преследует основные цели:

Структурное ``разбиение'' программ на отдельные составляющие служит основой и для выбора инструментальных средств их создания, хотя имеет место и обратное влияние - выбор инструментальных средств разработчика программного обеспечения определяет типы программных модулей. При создании программных продуктов выделяются многократно используемые модули, проводится их типизация и унификация, за счет чего сокращаются сроки и трудозатраты на разработку программного продукта в целом.

Некоторые программные продукты используют модули из готовых библиотек стандартных подпрограмм, процедур, функций, объектов, методов обработки данных.

На рис. 1.4 приведена типовая структура программного продукта, состоящего из отдельных программных модулей и библиотек процедур, встроенных функций, объектов и т.п.

Image figure4

Рис 1.4. Структура программного продукта

Среди множества модулей различают:

В работе программного продукта активизируются необходимые программные модули. Управляющие модули задают последовательность вызова на выполнение очередною модуля. Информационная связь модулей обеспечивается за счет использования общей базы данных либо межмодульной передачи данных через переменные обмена.

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

Структурно-сложные программные продукты разрабатываются как пакеты программ, и чаще всего они имеют прикладной характер - пакеты прикладных программ, или ППП.

ППП (application program package) - это система программ, предназначенных для решения задач определенного класса.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Компилятор GCC Up: Разработка приложений Previous: Структура программных продуктов   Contents   Index

Средства программирования в ОС Linux

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Основные группы системных функций Up: Средства программирования в ОС Previous: Средства программирования в ОС   Contents   Index

Компилятор GCC

Gcc - это свободно доступный оптимизирующий компилятор для языков C, C++, Ada 95, а также Objective C. Его версии существуют для различных реализаций Unix (а также VMS, OS/2 и других систем PC), и позволяют генерировать код для множества процессоров.

Вы можете использовать gcc для компиляции программ в объектные модули и для компоновки полученных модулей в единую исполняемую программу. Компилятор способен анализировать имена файлов, передаваемые ему в качестве аргументов, и определять, какие действия необходимо выполнить. Файлы с именами типа name.cc (или name.C) рассматриваются, как файлы на языке C++, а файлы вида name.o считаются объектными (т.е., внутримашинным представлением).

Чтобы откомпилировать исходный код C++, находящийся в файле F.cc, и создать объектный файл F.o, выполните команду:

gcc -c <compile-options> F .cc

Здесь строка compile-options указывает возможные дополнительные опции компиляции.

Чтобы скомпоновать один или несколько объектных файлов, полученных из исходного кода C++ - F1.o, F2.o, ... - в единый исполняемый файл F, используйте команду:

gcc -o F <link-options> F1.o F2.o ... -lg++ <other-libraries>

Здесь строка link-options означает возможные дополнительные опции компоновки, а строка other-libraries - подключение при компоновке дополнительных разделяемых библиотек.

Вы можете совместить два этапа обработки - компиляцию и компоновку - в один общий этап с помощью команды:

gcc -o F <compile-and-link-options> F1.cc ... -lg++ <other-libraries>

После компоновки будет создан исполняемый файл F, который можно запустить с помощью команды

./F <arguments>,

где строка arguments определяет аргументы командной строки Вашей программы.

В процессе компоновки очень часто приходится использовать библиотеки. Библиотекой называют набор объектных файлов, сгруппированных в единый файл и проиндексированных. Когда команда компоновки обнаруживает некоторую библиотеку в списке объектных файлов для компоновки, она проверяет, содержат ли уже скомпонованные объектные файлы вызовы для функций, определенных в одном из файлов библиотек. Если такие функции найдены, соответствующие вызовы связываются с кодом объектного файла из библиотеки.

Библиотеки обычно определяются через аргументы вида -llibrary-name. В частности, -lg++ означает библиотеку стандартных функций C++, а -lm определяет библиотеку различных математических функций (sin, cos, arctan, sqrt, и т.д.). Библиотеки должны быть перечислены после исходных или объектных файлов, содержащих вызовы к соответствующим функциям.

Среди множества опций компиляции и компоновки наиболее часто употребляются следующие:

-c

Только компиляция. Из исходных файлов программы создаются объектные файлы в виде name.o. Компоновка не производится.

-Dname=value

Определить имя name в компилируемой программе, как значение value. Эффект такой же, как наличие строки #define name value в начале программы. Часть `=value' может быть опущена, в этом случае значение по умолчанию равно 1.

-o file-name

Использовать file-name в качестве имени для создаваемого gcc файла (обычно это исполняемый файл).

-llibrary-name

Использовать при компоновке указанную библиотеку.

-g

Поместить в объектный или исполняемый файл отладочную информацию для отладчика gdb. Опция должна быть указана и для компиляции, и для компоновки.

-MM

Вывести заголовочные файлы (но не стандартные заголовочные файлы), используемые в каждом исходном файле, в формате, подходящем для утилиты make. Не создавать объектные или исполняемые файлы.

-pg

Поместить в объектный или исполняемый файл инструкции профилирования для генерации информации, используемой утилитой gprof. Опция должна быть указана и для компиляции, и для компоновки. Профилирование - это процесс измерения продолжительности выполнения отдельных участков Вашей программы. Когда Вы указываете -pg, полученная исполняемая программа при запуске генерирует файл статистики. Программа gprof на основе этого файла создает расшифровку, указывающую время, потраченное на выполнения каждой функции.

-Wall

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

-O1

Оптимизация уровня 1. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций. Без указания опций `-O' цель компилятора состoит в том, чтобы уменьшить стоимость трансляции и выдать ожидаемые результаты при отладке. Операторы независимы: если вы останавливаете программу на контрольной точке между операторами, вы можете назначить новое значение любой переменной или поставить счетчик команд на любой другой оператор в функции и получить точно такие результаты, которые вы ожидали из исходного текста. С указанием `-O' компилятор пробует уменьшить размер кода и время исполнения.

-O2

Оптимизация уровня 2. GNU CC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете `-O2'. По сравнения с `-O' эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.

-O3

Оптимизация уровня 3. `-O3' включает все оптимизации, определяемые `-O2', а также включает опцию `inline-functions'.

-O0

Не оптимизировать. Если вы используете многочисленные `-O' опции с номерами или без номеров уровня, действительной является последняя такая опция.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Ассемблеры gas и nasm Up: Средства программирования в ОС Previous: Компилятор GCC   Contents   Index

Основные группы системных функций

Язык C не предоставляет встроенных возможностей для выполнения таких распространенных операций, как ввод/вывод, управление памятью, работа со строками, и т.п. Эти возможности определены в стандартной ``библиотеке'', которая компонуется в Вашу программу.

Библиотека GNU C определяет все библиотечные функции, определенные стандартом ISO C и дополнительные возможности, указанные в стандарте POSIX и иных предписаниях для операционных систем Unix, а также расширения, специфичные для систем GNU. Она является наиболее фундаментальной системной библиотекой и обязательно присутствует в любой системе Linux.

В составе библиотеки можно выделить следующие основные группы функций:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Отладчик GDB Up: Средства программирования в ОС Previous: Основные группы системных функций   Contents   Index

Ассемблеры gas и nasm

Использование языка ассемблера в Linux происходит гораздо реже, чем, например, в DOS. Драйверы устройств в Linux гораздо чаще пишутся на языке C, а затем обрабатываются оптимизирующим компилятором, например, GCC. Однако, если Вам непременно требуется ассемблер, возможность его использования присутствует.

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

GAS - это сокращение от GNU Assembler. Поскольку GAS был разработан для поддержки 32-битных компиляторов Unix, он использует стандартный синтаксис AT&T, который несколько отличается от обычного ассемблера DOS. Основные отличия синтаксиса GAS от синтаксиса Intel:

Индексация выполняется с помощью заключения индексного регистра в скобки, например, in testb $0x80,17(%ebp) (проверить установку старшего бита в байте по смещению 17 от ячейки, указанной %ebp).

Примечание: Существует несколько программ, которые могут помочь Вам преобразовать исходный код для ассемблеров AT&T и Intel; некоторые из них способны на преобразование в двух направлениях.

Ассемблер NASM разрабатывается в рамках The Netwide Assembler project, и представляет собой мощный ассемблер на базе i386, написанный на C, который построен по модульному принципу и обеспечивает поддержку практически вссех известных синтаксисов и форматов объектных файлов.

Используется синтаксис Intel. Поддерживается обработка макроопределений.

Среди поддерживаемых форматов объектных файлов есть bin, aout, coff, elf, as86, obj (DOS), win32, rdf (собственный формат). Кроме того, NASM поставляется с дизассемблером NDISASM.

Как и для GAS, для NASM существует несколько программ для проебразования синтаксиса.

В качестве примера здесь приводятся две программы на ассемблере. Программы написаны с учетом того, что Linux является 32-битной системой, работает в защищенном режиме, имеет плоскую модель памяти, и использует для исполняемых файлов формат ELF.

Программа обычно делится на разделы: .text - для программного кода (только для чтения), .data - для записи данных (чтение-запись), .bss - для неинициализируемых данных (чтение-запись); могут также присутствовать и другие стандартные разделы, а также разделы, определенные пользователем. В программе должен присутствовать как минимум раздел .text.

Пример для NASM (hello.asm)

section .data           ; описание раздела

msg     db      "Hello, world!",0xa ; выводимая строка
len     equ     $ - msg                 ; длина строки

section .text           ; описание раздела

                    ; нам нужно передать точку входа компоновщику или
global _start       ; загрузчику ELF. Обычно они распознают _start по умолчанию.
                    ; Используйте ld -e foo, чтобы переопределить ее.

_start:

; записываем строку в стандартный вывод

        mov     edx,len ; третий аргумент: длина строки
        mov     ecx,msg ; второй аргумент: указатель на строку
        mov     ebx,1   ; первый аргумент: дескриптор файла (stdout)
        mov     eax,4   ; номер системного вызова (sys_write)
        int     0x80 ; обращение к ядру

; и выходим

        mov     ebx,0   ; первый аргумент: код возврата
        mov     eax,1   ; номер системного вызова (sys_exit)
        int     0x80 ; обращение к ядру

Пример для GAS (hello.S)

.data             # описание раздела

msg:
   .string  "Hello, world!\n" # выводимая строка
   len = . - msg        # длина строки

.text             # описание раздела

                  # нам нужно передать точку входа компоновщику или
global _start     # загрузчику ELF. Обычно они распознают _start по умолчанию.
                  # Используйте ld -e foo, чтобы переопределить ее.

_start:

# записываем строку в стандартный вывод

        movl    $len,%edx        # третий аргумент: длина строки
        movl    $msg,%ecx        # второй аргумент: указатель на строку
        movl    $1,%ebx          # первый аргумент: дескриптор файла (stdout)
        movl    $4,%eax          # номер системного вызова (sys_write)
        int     $0x80            # обращение к ядру

# и выходим

        movl    $0,%ebx          # первый аргумент: код возврата
        movl    $1,%eax          # номер системного вызова (sys_exit)
        int     $0x80            # обращение к ядру

Основные опции ассемблера GAS:

--defsym sym=value

Определяет символом sym величину value перед разбором входного файла. value должно быть целой константой. Как и в C, префикс 0x определяет шестнадцатиричное число, а префикс 0 - восьмеричное.

--help

Выводит список опций командной строки.

-I dir

Добавить каталог dir в список поиска для директив `.include'.

-o objfile

Имя объектного файла для вывода из `as'.

-R

Распознавать вложенные в код разделы данных.

--no-warn

Опускать сообщения о предупреждениях.

--fatal-warnings

Рассматривать предупреждения как ошибки.

Основные опции ассемблера NASM:
-h

Вывод информации об опциях и поддерживаемых форматах выходных файлов nasm.

-a

Ассемблировать файл без предварительного препроцессинга.

-e

Выполнить препроцессинг входного файла и вывести результат в stdout (или указанный файл-приемник), но без ассемблирования.

-M

Вывести в stdout зависимости в стиле make-файла.

-E filename

Перенаправлять сообщения об ошибках в файл filename. Опция предназначена для операционных систем, в которых stderr нельзя перенаправить.

-f format

Определить формат выходного файла. Форматы включают в себя bin для плоских двоичных файлов, и aout или elf для создания объектных фалов типа Linux a.out и ELF, соответственно.

-o outfile

Определить точное имя выходного файла, переопределив имя по умолчанию.

-l listfile

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

-s

Выводить сообщения об ошибках в файл стандартного вывода.

-w[+-]foo

Подключить или отключить некоторые классы предупреждающих сообщений, например, -w+orphan-labels или -w-macro-params, чтобы, соответственно, разрешить сообщения о метках в пустой строке или отключить сообщения о неверном количестве параметров в вызовах макросов.

-I directory

Добавить каталог в путь поиска включаемых файлов.


next up previous contents index
Next: Отладчик GDB Up: Средства программирования в ОС Previous: Основные группы системных функций   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Интерфейсы gdb и другие Up: Средства программирования в ОС Previous: Ассемблеры gas и nasm   Contents   Index

Отладчик GDB

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

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

Эти действия требуют, чтобы пользователь отладчика был в состоянии

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

GDB предоставляет все перечисленные возможности. Он называется отладчиком на уровне исходного текста, создавая иллюзию, что Вы выполняете операторы C++ из Вашей программы, а не машинный код, в который они действительно транслируются.

Для иллюстрации мы используем систему, которая компилирует программы на C++ в исполняемые файлы, содержащие машинный код. В результате этого процесса информация об оригинальном коде C++ теряется при трансляции. Отдельный оператор C++ обычно преобразуется в несколько машинных команд, а большинство имен локальных переменных просто теряется. Информация о именах переменных и операторах C++ в Вашей исходной программе не является необходимой для ее выполнения. Поэтому, для правильной работы отладчика на уровне исходного текста, компилятор должен поместить в программу некоторую дополнительную информацию. Обычно ее добавляют к информации, используемой компоновщиком, в исполняемый файл.

Чтобы указать компилятору (gcc), что Вы планируете отлаживать Вашу программу, и поэтому нуждаетесь в дополнительной информации, добавьте ключ -g в опции компиляции и компоновки. Например, если Ваша программа состоит из двух файлов main.C и utils.C, Вы можете откомпилировать ее командами

   gcc -c -g -Wall main.C
   gcc -c -g -Wall utils.C
   gcc -g -o myprog main.ob utils.o

или одной командой

gcc -g -Wall -o myprog main.o utils.o

Обе последовательности команд приводят к созданию исполняемого файла myprog.

чтобы выполнить полученную программу под управлением gdb, введите

gdb myprog

Вы увидите командное приглашение GDB:

(gdb)

Это очень простой, но эффективный тексовый интерфейс отладчика. Его вполне достаточно, чтобы ознакомиться с основными командами gdb.

Когда GDB запускается, Ваша программа в нем еще не выполняется; Вы должны сами сообщить GDB, когда ее запустить. Как только программа приостанавливается в процессе выполнения, GDB ищет определенную строку исходной программы с вызовом определенной функции - либо строку в программе, где произошел останов, либо строку, содержащую вызов функции, в которой произошел останов, либо строку с вызовом функции и т.д. Далее используется термин ``текущее окно'', чтобы сослаться на точку останова.

Как только возникает командное приглашение, Вы можете использовать следующие команды.

help command

Выводит краткое описание команды GDB. Просто help выдает список доступных разделов справки.

run command-line-arguments

Запускает Вашу программу с определенными аргументами командной строки. GDB запоминает переданные аргументы, и простой перезапуск программы с помощью run приводит к использованию этих аргументов.

where

Создает трассу - цепочку вызовов функций, произошедших до попадания программы в текущее место. Синонимом является команда bt.

up

Перемещает текущее окно так, чтобы GDB анализировал место, из которого произошел вызов данного окна. Очень часто Ваша программа может войти в библиотечную функцию - такую, для которой не доступен исходный код, например, в процедуру ввода-вывода. Вам может понадобиться несколько команд up, чтобы перейти в точку программы, которая была выполнена последней.

down

Производит эффект, обратный up.

print E

Выводит значение E в текущем окне программы, где E является выражением C++ (обычно просто переменной). Каждый раз при использовании этой команды, GDB нумерует ее упоминание для будущих ссылок. Например,

(gdb) print A[i] $2 = -16

(gdb) print $2 + ML $3 = -9

сообщает нам, что величина A[i] в текущем окне равна -16, и что при добавлении этого значения к переменной ML получится -9.

quit

Выход из GDB.

Ctrl-c

Если программа запущена через оболочку shell, Ctrl-c немедленно прекращает ее выполнение. В GDB программа приостанавливается, пока ее выполнение не возобновится.

break place

Установить точку останова; программа приостановится при ее достижении. Простейший способ - установить точку останова после входа в функцию, например

(gdb) break MungeData Breakpoint 1 at 0x22a4: file main.C, line 16.

Команда break main остановит выполнение в начале программы.

Вы можете установить точки останова на определенную строку исходного кода:

(gdb) break 19 Breakpoint 2 at 0x2290: file main.C, line 19.

(gdb) break utils.C:55 Breakpoint 3 at 0x3778: file utils.C, line 55.

Когда Вы запустите программу и она достигнет точки останова, Вы увидите сообщение об этом и приглашение, например

Breakpoint 1, MungeData (A=0x6110, N=7) at main.c:16

(gdb)

delete N

Удаляет точку останова с номером N. Если опустить N, будут удалены все точки останова.

cont или continue

Продолжает обычное выполнение программы.

step

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

next

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

finish

Выполняет команды next без остановки, пока не достигнет конца текущей функции.


next up previous contents index
Next: Интерфейсы gdb и другие Up: Средства программирования в ОС Previous: Ассемблеры gas и nasm   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: base Previous: Contents   Contents   Index

Введение в ОС Linux



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Метасимволы Up: Командный процессор Previous: Командный процессор   Contents   Index

Shell - интерпретатор командного языка

В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Средство управления проектом make Up: Средства программирования в ОС Previous: Отладчик GDB   Contents   Index

Интерфейсы gdb и другие отладчики

Хотя gdb можно использовать в shell, никто обычно этого не делает. Программа Emacs предлагает простой интерфейс, который избавит Вас от обльшого количества вводимых команд и поможет избежать ошибок. Выполнив команду Emacs M-x gdb, Вы получите новое окно с запущенным gdb, воспринимающее все сокращенные команды. Emacs также интерпретирует вывод от gdb, чтобы Вам было удобнее. Когда достигается точка останова, Emacs получает от gdb имя файла и номер строки, чтобы показать содержимое этого файла, с отмеченной точкой останова или ошибкой. Когда Вы отлаживаете программу по шагам, Emacs следует за Вами по файлам исходного кода.

KDbg является графическим интерфейсом к gdb в среде KDE. Это означает, что KDbg сам по себе не является отладчиком. Он общается с gdb, отладчиком, использующим командную строку, посылая ему команды и получая их результат, например, значения переменных. Пункты меню и указания мышью преобразуются в последовательность команд gdb, а результат преобразуется к более-менее визуальному представлению, такому как структурное содержимое переменных.

KDbg не может делать больше, чем делает gdb. Например, если имеющаяся у вас версия gdb не поддерживает отладку многопоточных программ, то и KDbg не поможет вам в этом (несмотря на то, что он выводит окно потоков).

Графическим интерфейсом для системы X Window является xxgdb. Интерфейсом для графического представления данных является ddd.

Кроме этого, следует упомянуть отладчик DBX, а среди коммерческих приложений - мощное средство TotalView.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Назначение make Up: Разработка приложений Previous: Интерфейсы gdb и другие   Contents   Index

Средство управления проектом make

Рассматриваемые темы:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Файл описания проекта - Up: Средство управления проектом make Previous: Средство управления проектом make   Contents   Index

Назначение make

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

Утилита UNIX make является простым и наиболее общим решением данной проблемы. В качестве ввода она принимает описание взаимных зависимостей над множеством исходных файлов, а также команды, необходимые для их компиляции. Это описание называется make-файлом. Утилита проверяет ``возраст'' соответствующих файлов, и выполняет все необходимые команды в соответствии с описанием. Для большего удобства она поддерживает несколько стандартных действий и зависимостей по умолчанию, чтобы не описывать их лишний раз.

Существует несколько диалектов make, как среди версий UNIX/Linux, так и в других операционных системх для ПК. Здесь будет описана версия gmake (GNU make).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Алгоритм работы make Up: Средство управления проектом make Previous: Назначение make   Contents   Index

Файл описания проекта - make-файл

Ниже приведен простой make-файл для компиляции простой программы - редактора edit, состоящего из восьми исходных файлов .cc и трех заголовочных файлов (.h).



# Makefile for simple editor

edit : edit.o kbd.o commands.o display.o $ \backslash$
insert.o search.o files.o utils.o
gcc -g -o edit edit.o kbd.o commands.o display.o $ \backslash$
insert.o search.o files.o utils.o -lg++

edit.o : edit.cc defs.h
gcc -g -c -Wall edit.cc
kbd.o : kbd.cc defs.h command.h
gcc -g -c -Wall kbd.cc
commands.o : command.cc defs.h command.h
gcc -g -c -Wall commands.cc
display.o : display.cc defs.h buffer.h
gcc -g -c -Wall display.cc
insert.o : insert.cc defs.h buffer.h
gcc -g -c -Wall insert.cc
search.o : search.cc defs.h buffer.h
gcc -g -c -Wall search.cc
files.o : files.cc defs.h buffer.h command.h
gcc -g -c -Wall files.cc
utils.o : utils.cc defs.h
gcc -g -c -Wall utils.cc

Этот файл содержит последовательность девяти правил. В общем виде правило выглядит так:

<цель_1> <цель_2> ... <цель_n>: <зависимость_1> <зависимость_2> ... <зависимость_n>
   <команда_1>
   <команда_2>
   ...
   <команда_n>
Каждое правило состоит из строки, содержащей два списка имен, разделенных двоеточием, за которыми следуют одна или несколько строк, начинающихся с табуляции. Любая строка может быть продолжена, как показано выше, если закончить ее наклонной чертой, которая действует как пробел, соединяя строку с последующей. Символ `#' указывает начало комментария, который продолжается до конца данной строки.

Цель (target) - это некий желаемый результат, способ достижения которого описан в правиле. Цель может представлять собой имя файла. В этом случае правило описывает, каким образом можно получить новую версию этого файла.

Цель также может быть именем некоторого действия. В таком случае правило описывает, каким образом совершается указанное действие. Подобного рода цели называются псевдоцели (pseudotargets) или абстрактные цели (phony targets).

Зависимость (dependency)- это некие "исходные данные", необходимые для достижения указанной в правиле цели. Можно сказать что зависимость - это "предварительное условие" для достижения цели. Зависимость может представлять собой имя файла. Этот файл должен существовать, для того чтобы можно было достичь указанной цели. Зависимость также может быть именем некоторого действия. Это действие должно быть предварительно выполнено перед достижением указанной в правиле цели.

Команды - это действия, которые необходимо выполнить для обновления либо достижения цели. Утилита make отличает строки, содержащие команды, от прочих строк make-файла по наличию символа табуляции (символа с кодом 9) в начале строки. Это команды shell (то есть команды, которые Вы можете выполнять в оболочке Linux), которые выполняются в определенном порядке, чтобы создать или обновить цель правила (обычно говорят обновить - update).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Переменные в make-файлах Up: Средство управления проектом make Previous: Файл описания проекта -   Contents   Index

Алгоритм работы make

Типичный make-файл проекта содержит несколько правил. Каждое из правил имеет некоторую цель и некоторые зависимости. Смыслом работы make является достижение цели, которую она выбрала в качестве главной цели (default goal). Если главная цель является именем действия (то есть абстрактной целью), то смысл работы make заключается в выполнении соответствующего действия. Если же главная цель является именем файла, то программа make должна построить самую "свежую" версию указанного файла.

Главная цель может быть прямо указана в командной строке при запуске make. В следующем примере make будет стремиться достичь цели edit (получить новую версию файла edit):

make edit

Если не указывать какой-либо цели в командной строке, то make выбирает в качестве главной первую, встреченную в make-файле цель. Схематично, ``верхний уровень'' алгоритма работы make можно представить так:

make()
    {
        главная_цель = ВыбратьГлавнуюЦель()

        ДостичьЦели( главная_цель )
    }

После того как главная цель выбрана, make запускает ``стандартную'' процедуру достижения цели. Сначала в make-файле ищется правило, которое описывает способ достижения этой цели (функция НайтиПравило). Затем, к найденному правилу применяется обычный алгоритм обработки правил (функция ОбработатьПравило).

ДостичьЦели( Цель )
    {
        правило = НайтиПравило( Цель )

        ОбработатьПравило( правило )
    }

Обработка правила разделяется на два основных этапа. На первом этапе обрабатываются все зависимости, перечисленные в правиле (функция ОбработатьЗависимости). На втором этапе принимается решение - нужно ли выполнять указанные в правиле команды (функция НужноВыполнятьКоманды). При необходимости, перечисленные в правиле команды выполняются (функция ВыполнитьКоманды).

ОбработатьПравило( Правило )
    {
        ОбработатьЗависимости( Правило )

        если НужноВыполнятьКоманды( Правило )
            {
            ВыполнитьКоманды( Правило )
            }
    }

Функция ОбработатьЗависимости поочередно проверяет все перечисленные в правиле зависимости. Некоторые из них могут оказаться целями каких-нибудь правил. Для этих зависимостей выполняется обычная процедура достижения цели (функция ДостичьЦели). Те зависимости, которые не являются целями, считаются именами файлов. Для таких файлов проверяется факт их наличия. При их отсутствии, make аварийно завершает работу с сообщением об ошибке.

ОбработатьЗависимости( Правило )
    {
        цикл от i=1 до Правило.число_зависимостей
            {
            если ЕстьТакаяЦель( Правило.зависимость[ i ] )
                {
                ДостичьЦели( Правило.зависимость[ i ] )
                }
            иначе
                {
                ПроверитьНаличиеФайла( Правило.зависимость[ i ] )
                }
            }
    }

На стадии обработки команд решается вопрос - нужно ли выполнять описанные в правиле команды или нет. Считается, что нужно выполнять команды если:

В противном случае (если ни одно из вышеприведенных условий не выполняется) описанные в правиле команды не выполняются. Алгоритм принятия решения о выполнении команд схематично можно представить так:
НужноВыполнятьКоманды( Правило )
    {
        если Правило.Цель.ЯвляетсяАбстрактной()
            return  true

        //  цель является именем файла

        если ФайлНеСуществует( Правило.Цель )
            return  true

        цикл от i=1 до Правило.Число_зависимостей
            {
            если Правило.Зависимость[ i ].ЯвляетсяАбстрактной()
                return  true
            иначе
                //  зависимость является именем файла
                {
                если ВремяМодефикации( Правило.Зависимость[ i ] )  >
                 ВремяМодефикации( Правило.Цель )
                    return  true
                }
            }

        return  false
    }

В указанном примере целью по умолчанию является edit. Первым шагом по его обновлению является обновление всех фалов объектов (.o), перечисленных как зависимости. Обновление edit.o, в свою очередь, требует обновления edit.cc и defs.h. Предполагается, что edit.cc является исходным файлов, из которого создается edit.o, а defs.h является заголовочным файлом, который включается в edit.cc. Правил, указывающих на эти файлы, нет; поэтому, они, как минимум, должны просто существовать. Теперь edit.o считается готовым, если он изменен позже, чем edit.cc или defs.h (если он страше их, это значит, что один из этих файлов изменился со времени последней компиляции edit.o). Если edit.o старше своих зависимостей, gmake выполняет действие ``gcc -g -c -Wall edit.cc'', создавая новый edit.o. Когда edit.o и все другие файлы .o будут обновлены, они будут собраны вместе действием ``gcc -g -o edit ...'', чтобы создать программу edit, если либо edit еще не существует, либо любой из файлов .o новее, чем существующий файл edit.

Чтобы вызвать gmake для этого примера, используйте команду

gmake -f <makefile-name> <target-names>

где <target-names> - это имена целей, которые Вы хотите обновить, а <makefile-name>, заданное после ключа -f, является именем make-файла. По умолчанию, целью является первое правило в файле. Вы можете (обычно так и делают) опустить -f makefile-name, и в этом случае по умолчанию будет выбрано имя makefile или Makefile, если любой из этих файлов существует.

Обычно каждый каталог содержит исходный код для простой части программы. Принимая правило, что имя программы соответствует первой цели, и что make-файл для каталога называется makefile, Вы добьетесь того, что вызов команды gmake без аргументов в любом каталоге приведет к обновлению части программы в этом каталоге.

Для одной и той же цели может быть несколько правил, но не более чем одно правило для цели должно иметь действия. Поэтому, мы может переписать последнюю часть примера следующим образом.


edit.o : edit.cc

gcc -g -c -Wall edit.cc
kbd.o : kbd.cc
gcc -g -c -Wall kbd.cc
commands.o : command.cc
gcc -g -c -Wall commands.cc
display.o : display.cc
gcc -g -c -Wall display.cc
insert.o : insert.cc
gcc -g -c -Wall insert.cc
search.o : search.cc
gcc -g -c -Wall search.cc
files.o : files.cc
gcc -g -c -Wall files.cc
utils.o : utils.cc
gcc -g -c -Wall utils.cc

edit.o kbd.o commands.o display.o $ \backslash$
insert.o search.o files.o utils.o: defs.h
kbd.o commands.o files.o : command.h
display.o insert.o search.o files.o : buffer.h

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Шаблонные правила Up: Средство управления проектом make Previous: Алгоритм работы make   Contents   Index

Переменные в make-файлах

GNU Make поддерживает два способа задания переменных, которые несколько различаются по смыслу. Первый способ - традиционный, с помощью оператора '=':

compile_flags = -O3 -funroll-loops -fomit-frame-pointer

Такой способ поддерживают все варианты утилиты make. Его можно сравнить, например, с заданием макроса в языке Си.

#define compile_flags "-O3 -funroll-loops -fomit-frame-pointer"

Значение переменной, заданной с помощью оператора '=', будет вычислено в момент ее использования. Например, при обработке make-файла:

var1 = one
var2 = $(var1) two
var1 = three

all:
    @echo $(var2)

на экран будет выдана строка ``three two''. Значение переменной var2 будет вычислено непосредственно в момент выполнения команды echo, и будет представлять собой текущее значение переменной var1, к которому добавлена строка ``two''. Как следствие - одна и та же переменная не может одновременно фигурировать в левой и правой части выражения, так как это может привести к бесконечной рекурсии. GNU Make распознает подобные ситуации и прерывает обработку make-файла. Следующий пример вызовет ошибку:

compile_flags = -pipe $(compile_flags)

GNU Make поддерживает также и второй, новый способ задания переменной - с помощью оператора ':=':

compile_flags := -O3 -funroll-loops -fomit-frame-pointer

В этом случае переменная работает подобно ``обычным'' текстовым переменным в каком-нибудь из языков программирования. Вот приблизительный аналог этого выражения на языке C++:

string compile_flags = "-O3 -funroll-loops -fomit-frame-pointer";

Значение переменной вычисляется в момент обработки оператора присваивания. Если, например, записать

var1 := one
var2 := $(var1) two
var1 := three

all:
     @echo $(var2)

то при обработке такого make-файла на экран будет выдана строка ``one two''.

Переменная может ``менять'' свое поведение в зависимости от того, какой из операторов присваивания был к ней применен последним. Одна и та же переменная на протяжении своей жизни вполне может вести себя и как ``макрос'' и как ``текстовая переменная''.

Зависимости цели edit в примерах выше являлись аргументами для команд компоновки. Можно избежать их повторения, определив переменную, которая будет содержать имена всех объектных файлов.


# Makefile for simple editor

OBJS = edit.o kbd.o commands.o display.o $ \backslash$
insert.o search.o files.o utils.o
edit : $(OBJS)
gcc -g -o edit $(OBJS)

Строка, начинающаяся с ``OBJS ='' определяет переменную OBJS, на которую можно в дальнейшем сослаться через ``$(OBJS)'' или ``$OBJS''. Эти более поздние ссылки приводят к тому, что обозначение OBJ будет дословно заменяться, прежде чем правило будет обработано. Иногда неудобно, что и gmake и shell используют `$' как префикс для ссылок на переменные; gmake определяет `$$', такое же, как `$', позволяя Вам передавать `$' в shell, если это необходимо.

Иногда Вам может понадобиться величина, выглядящая как обычная переменная, но с некоторыми уточнениями. Например, задавая переменную со списком имен всех исходных файлов, Вы можете захотеть задать имена всех получающихся объектных файлов. Можно переопределить OBJS следующим образом.


SRCS = edit.cc kbd.cc commands.cc display.cc 
$ \backslash$

insert.cc search.cc files.cc utils.cc
OBJS = $(SRCS:.cc=.o)
Суффикс уточнения `:.cc=.o' определяет необходимые уточнения. Теперь у нас есть переменные для имен всех исходных и объектных файлов, при этом не пришлось повторять в определениях множество имен.

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


edit.o: edit.cc

gcc $(DEBUG) -c -Wall edit.cc
то команда типа gmake DEBUG=-g ... приведет к использованию ключа -g (добавить символическую информацию отладчика) при компиляции, а отсутствие DEBUG=-g исключит использование этого ключа. Определения переменных в командной строке имеют преимущество перед определениями внутри make-файла, что позволяет задать в make-файле значения по умолчанию.

Переменные, не установленные любым из перечисленных методов, могут быть установлены как переменные среды. Поэтому, последовательность команд

setenv DEBUG -g gmake ...

для последнего примера также приведет к использованию ключа -g во время компиляции.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Специальные действия Up: Средство управления проектом make Previous: Переменные в make-файлах   Contents   Index

Шаблонные правила

Шаблонные правила (implicit rules или pattern rules) - это правила, которые могут быть применены к целой группе файлов. В этом их отличие от обычных правил - описывающих отношения между конкретными файлами.

Традиционные реализации make поддерживают так называемую ``суффиксную'' форму записи шаблонных правил:

.<расширение_файлов_зависимостей>.<расширение_файлов_целей>:
    <команда_1>
    <команда_2>
    ...
    <команда_n>

Например, следующее правило говорит о том, что все файлы с расширением "o" зависят от соответствующих файлов с расширением "cpp":

.cpp.o:
        gcc -c $^

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

Шаблонные правила позволяют упростить make-файл и сделать его более универсальным.

В самом первом примере все правила компиляции для получения файлов типа .o имеют одинаковую форму. Очень неудобно повторять их снова и снова; это может привести к ошибке при написании make-файла. Поэтому gmake можно указать - для известных стандартных случаев - действия и имена файлов по умолчанию для создания различных типов файлов. Для наших целей наиболее важным является то, что gmake известно, как создать файл F.o из исходного файла F.cc, и известен тот факт, что файл F.o зависит от файла F.cc. gmake автоматически использует правило


F.o : F.cc

$(CXX) -c -Wall $(CXXFLAGS) F.cc
которое вызывается, чтобы создать F.o, если существует файл C++ с именем F.cc, но не определяет точные действия для создания F.o. Использование префикса ``CXX'' является следствия соглашения об именах для переменных, связанных с C++. Также создается команда

F : F.o

$(CC) $(LDFLAGS) F.o $(LOADLIBES) -o F
чтобы сообщить о том, как создать исполняемый файл F из F.o.

В результате предыдущий пример можно переписать следующим образом.


# Makefile for simple editor

SRCS = edit.cc kbd.cc commands.cc display.cc $ \backslash$
insert.cc search.cc files.cc utils.cc

OBJS = $(SRCS:.cc=.o)
CC = gcc
CXX = gcc
CXXFLAGS = -g
LOADLIBES = -lg++

edit : $(OBJS)
edit.o : defs.h
kbd.o : defs.h command.h
commands.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h



Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание make-файлов Up: Средство управления проектом make Previous: Шаблонные правила   Contents   Index

Специальные действия

Часто удобно иметь цели, которым не ставится в соответствие никакая генерация файлов. Если действия цели не создают файла с соответствующим именем, то исходя из принципов работы gmake действия для цели будут выполняться всякий раз, когда gmake обратится к ней. Обычно это используют для помещения в make-файл стандартной операции ``очистки'', определяющей способ удаления неиспользуемых файлов. Например, Вы часто можете встретить в make-файле такое правило:

clean:

rm -f *.o

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

Программа gmake обычно выводит инофрмацию о выполнении каждого действия, но иногда это не желательно. Поэтому символ `@' в начале действия может запретить вывод по умолчанию. Вот пример его обычного использования:


edit : $(OBJS)|

@echo Linking edit ...
@gcc -g -o edit $(OBJS)
@echo Done
Результатом этих действий будет то, что в начале компиляции Вы увидите строку ``Linking edit...'', а в конце компиляции - строку ``Done''.

Когда gmake встречает действие, возвращающее ненулевой код выхода, т.е. сообщение об ошибке по соглашениям UNIX, его стандартной реакцией является прекращение обработки. Коды ошибок от строк действий, начинающихся с символа `-' (возможно с предшествующим `@') игнорируются. Ключ -k для gmake приводит в случае ошибки к прекращению обработки только текущего правила (и всех, зависящих от него целей), позволяя продолжить обработку всех последующих.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Механизмы межпроцессных взаимодействий Up: Средство управления проектом make Previous: Специальные действия   Contents   Index

Создание make-файлов

Наилучший способ создания make-файлов - наличие заготовки, которую можно адаптирповать под нужную программу. Пример заготовки приведен на рис. 1. Скопировав подобную заготовку и заменив разделы, ограниченные символами <> нужным текстом (см. рис. 2), Вы получите работающий make-файл.


PROGRAM = <REPLACE WITH PROGRAM NAME>
LOADLIBES = <EXTRA LOAD LIBRARIES> -lg++
CXX.SRCS = <C++ SOURCE FILE NAMES>
CC = gcc
LDFLAGS = -g
CXX = gcc
CXXFLAGS = -g -Wall -fno-builtins
OBJS = $(CXX.SRCS:.cc=.o)
$(PROGRAM) : $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) $(LOADLIBES) -o $(PROGRAM)
clean:
/bin/rm -f *.o $(PROGRAM) *~
depend:
$(CXX) -MM $(CXX.SRCS)

### <DEPENDENCIES ON .h FILES GO HERE>

Рис. 1. Пример заготовки Make-файла для простых программ на C++.

PROGRAM = edit

LOADLIBES = -lg++
CXX.SRCS = edit.cc kbd.cc commands.cc display.cc $ \backslash$
insert.cc search.cc files.cc utils.cc
CC = gcc
LDFLAGS = -g
CXX = gcc
CXXFLAGS = -g -Wall -fno-builtins
OBJS = $(CXX.SRCS:.cc=.o)
$(PROGRAM) : $(OBJS)
$(CC) $(LDFLAGS) $(OBJS) $(LOADLIBES) -o $(PROGRAM)
clean:
/bin/rm -f *.o $(PROGRAM) *~
depend:
$(CXX) -MM $(CXX.SRCS)

###edit.o : defs.h
kbd.o : defs.h command.h
commands.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

Рис.2. Make-файл, созданный из заготовки рис.1.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: base Previous: Создание make-файлов   Contents   Index

Механизмы межпроцессных взаимодействий



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск всех символов (метасимвол Up: Командный процессор Previous: Shell - интерпретатор командного   Contents   Index

Метасимволы

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Очереди сообщений Up: Механизмы межпроцессных взаимодействий Previous: Механизмы межпроцессных взаимодействий   Contents   Index

Введение

ОС UNIX поддерживает три типа средств межпроцессной связи:

В данной главе описываются системные вызовы, предназначенные для работы с каждым из них.

В главу включено несколько примеров программ, демонстрирующих использование этих системных вызовов. При написании программ главное внимание уделялось их ясности, а не эффективности.

Средства межпроцессной связи ОС UNIX имеют много общих черт, подробно описанных на примере очередей сообщений. В разделах, посвященных семафорам и разделяемым сегментам памяти, основное внимание сосредоточено на специфике именно этих механизмов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование очередей сообщений Up: Механизмы межпроцессных взаимодействий Previous: Введение   Contents   Index

Очереди сообщений

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

Процесс, прежде чем послать или принять какое-либо сообщение, должен попросить систему породить необходимые для обработки данных операций программные механизмы. Процесс делает это при помощи системного вызова msgget. Обратившись к нему, процесс становится владельцем/создателем некоторого средства обмена сообщениями; кроме того, процесс специфицирует первоначальные права на выполнение операций для всех процессов, включая себя. Впоследствии владелец/создатель может уступить право собственности или изменить права на операции при помощи системного вызова msgctl, однако на протяжении всего времени существования средства обмена сообщениями создатель остается создателем. Другие процессы, обладающие соответствующими правами, для выполнения различных управляющих действий также могут использовать системный вызов msgctl.

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

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

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание очередей сообщений Up: Очереди сообщений Previous: Очереди сообщений   Contents   Index

Использование очередей сообщений

Перед тем, как посылать или принимать сообщения, должны быть созданы очередь сообщений с уникальным идентификатором и ассоциированная с ней структура данных. Порожденный уникальный идентификатор называется идентификатором очереди сообщений (msqid); он используется для обращений к очереди сообщений и ассоциированной структуре данных.

Говоря об очереди сообщений следует иметь в виду, что реально в ней хранятся не сами сообщения, а их описатели, имеющие следующую структуру:

        struct msg {
          struct msg *msg_next; /* Указатель на следующее
                                   сообщение */
          long msg_type;        /* Тип сообщения */
          short msg_ts;         /* Размер текста сообщения */
          short msg_spot;       /* Адрес текста сообщения */
        };
Приведенное определение находится во включаемом файле <sys/msg.h>.

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

 struct msqid_ds {
   struct ipc_perm msg_perm; /* Структура прав на
                                выполнение операций */
   struct msg *msg_first;    /* Указатель на первое
                                сообщение в очереди */
   struct msg *msg_last;     /* Указатель на последнее
                                сообщение в очереди */
   ushort msg_cbytes;        /* Текущее число байт
                                в очереди */
   ushort msg_qnum;          /* Число сообщений
                                в очереди */
   ushort msg_qbytes;        /* Макс. допустимое число
                                байт в очереди */
   ushort msg_lspid;         /* Ид-р последнего
                                отправителя */
   ushort msg_lrpid;         /* Ид-р последнего
                                получателя */
   time_t msg_stime;         /* Время последнего
                                отправления */
   time_t msg_rtime;         /* Время последнего
                                получения */
   time_t msg_ctime;         /* Время последнего
                                изменения */
};
Это определение также находится во включаемом файле <sys/msg.h>. Поле msg_perm данной структуры использует в качестве шаблона структуру ipc_perm, которая задает права на операции с сообщениями и определяется так:
        struct ipc_perm {
          ushort uid;  /* Идентификатор пользователя */
          ushort gid;  /* Идентификатор группы */
          ushort cuid; /* Идентификатор создателя очереди */
          ushort cgid; /* Ид-р группы создателя очереди */
          ushort mode; /* Права на чтение/запись */
          ushort seq;  /* Последовательность номеров
                          используемых слотов */
          key_t  key;  /* Ключ */
        };
Последнее определение находится во включаемом файле <sys/ipc.h>, общем для всех средств межпроцессной связи.

Если в аргументе msgflg системного вызова msgget установлен только флаг IPC_CREAT, выполняется одно из двух действий:

Действие определяется по значению аргумента key. Если еще не существует идентификатора msqid со значением ключа key, выполняется первое действие, то есть для данного ключа выделяется новый уникальный идентификатор и создаются ассоциированные с ним очередь сообщений и структура данных (при условии, что не будет превышен соответствующий системный лимит).

Кроме того, можно специфицировать ключ key со значением IPC_PRIVATE. Если указан такой ``личный'' ключ, для него обязательно выделяется новый уникальный идентификатор и создаются ассоциированные с ним очередь сообщений и структура данных (при условии, что это не приведет к превышению системного лимита). При выполнении утилиты ipcs поле KEY для подобного идентификатора msqid из соображений секретности содержит нули.

Если идентификатор msqid со специфицированным значением ключа key уже существует, выполняется второе действие, то есть возвращается ассоциированный идентификатор. Если Вы желаете трактовать возвращение существующего идентификатора как ошибку, в передаваемом системному вызову аргументе msgflg нужно установить флаг IPC_EXCL.

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

После того, как созданы очередь сообщений с уникальным идентификатором и ассоциированная с ней структура данных, можно использовать системные вызовы семейства msgop (операции над очередями сообщений) и msgctl (управление очередями сообщений).

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

Для управления очередями сообщений используется системный вызов msgctl. Он позволяет выполнять следующие управляющие действия:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование msgget Up: Очереди сообщений Previous: Использование очередей сообщений   Contents   Index

Создание очередей сообщений

В данном пункте детально описывается системный вызов msgget и приводится программа-пример, иллюстрирующая его использование.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Создание очередей сообщений Previous: Создание очередей сообщений   Contents   Index

Использование msgget

В справочной статье для msgget синтаксис данного системного вызова описан так:
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>

        int msgget (key, msgflg)
        key_t key;
        int msgflg;
Тип key_t описан во включаемом файле <sys/types.h> при помощи typedef как целый тип.

Целочисленное значение, возвращаемое в случае успешного завершения системного вызова, есть идентификатор очереди сообщений (msqid). В случае неудачи результат равен -1.

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

Целое число, передаваемое в качестве аргумента msgflg, удобно рассматривать как восьмеричное. Оно задает права на выполнение операций и флаги.

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

Права на операции Восьмеричное значение
Чтение для владельца 0400
Запись для владельца 0200
Чтение для группы 0040
Запись для группы 0020
Чтение для остальных 0004
Запись для остальных 0002

В каждом конкретном случае нужная комбинация прав задается как результат побитного ИЛИ значений, соответствующих элементарным правам. Так, правам на чтение / запись для владельца и на чтение для членов группы и прочих пользователей соответствует восьмеричное число 0644. Отметим полную аналогию с правами доступа к файлам.

Флаги определены во включаемом файле <sys/ipc.h>. В следующей таблице сведены мнемонические имена флагов и соответствующие им восьмеричные значения:

Флаг Восьмеричное значение
IPC_CREAT 0001000
IPC_EXCL 0002000

Значение аргумента msgflg в целом является, следовательно, результатом побитного ИЛИ (операция | в языке C) прав на выполнение операций и флагов, например:

        msqid = msgget (key, (IPC_CREAT | 0644));
        msqid = msgget (key, (IPC_CREAT | IPC_EXCL | 0400));
Как уже указывалось, системный вызов вида

msqid = msgget (IPC_PRIVATE, msgflg);

приведет к попытке выделения нового идентификатора очереди сообщений и ассоциированной информации независимо от значения аргумента msgflg. Попытка может быть неудачной только из-за превышения системного лимита на общее число очередей сообщений, задаваемого настраиваемым параметром MSGMNI.

При использовании флага IPC_EXCL в сочетании с IPC_CREAT системный вызов msgget завершается неудачей в том и только в том случае, когда с указанным ключом key уже ассоциирован идентификатор. Флаг IPC_EXCL необходим, чтобы предотвратить ситуацию, когда процесс полагает, что получил новый (уникальный) идентификатор очереди сообщений, в то время как это не так. Иными словами, когда используются и IPC_CREAT и IPC_EXCL, при успешном завершении системного вызова обязательно возвращается новый идентификатор msqid.

В справочной статье по msgget описывается начальное значение ассоциированной структуры данных, формируемое при успешном завершении системного вызова. В статье содержится перечень условий, приводящих к ошибкам, и соответствующих им мнемонических имен для значений переменной errno.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Управление очередями сообщений Up: Создание очередей сообщений Previous: Использование msgget   Contents   Index

Программа-пример

В данном пункте приводится программа-пример, управляемая посредством меню. Она позволяет поупражняться со всевозможными комбинациями в использовании системного вызова msgget, проследить, как передаются аргументы и получаются результаты.

Имена переменных выбраны максимально близкими к именам, используемым в спецификации синтаксиса системного вызова, что облегчает чтение программы.

Выполнение программы начинается с приглашения ввести шестнадцатеричный ключ key, восьмеричный код прав на операции и, наконец, выбираемую при помощи меню комбинацию флагов (строки 14-30). В меню предлагаются все возможные комбинации, даже бессмысленные, что позволяет при желании проследить за реакцией на ошибку.

Затем выбранные флаги комбинируются с правами на операции, после чего выполняется системный вызов, результат которого помещается в переменную msqid (строка 49). Контроль успешного завершения системного вызова производится в строке 50. Если значение msqid равно -1, выдается сообщение об ошибке и выводится значение внешней переменной errno (строки 52, 53). Если ошибки не произошло, выводится значение полученного идентификатора очереди сообщений (строка 57).

Далее приводится текст программы-примера. Здесь и далее номера строк служат только для ссылок и не являются частью программы.

     1  /* Программа иллюстрирует
     2     возможности системного вызова msgget()
     3     (получение идентификатора очереди сообщений) */

     4  #include <stdio.h>
     5  #include <sys/types.h>
     6  #include <sys/ipc.h>
     7  #include <sys/sem.h>
     8  #include <errno.h>

     9  main ()
    10  {
    11    key_t key;        /* Тип описан как целое */
    12    int opperm, flags;    /* Права на операции и флаги */
    13    int msgflg, msqid;

    14    /* Ввести требуемый ключ */
    15    printf ("\nВведите шестнадцатеричный ключ: ");
    16    scanf ("%x", &key);

    17    /* Ввести права на операции */
    18    printf ("\nВведите права на операции ");
    19    printf ("в восьмеричной записи: ");
    20    scanf ("%o", &opperm);

    21    /* Установить требуемые флаги */
    22    printf ("\nВведите код, соответствущий ");
    23    printf ("нужной комбинации флагов:\n");
    24    printf ("  Нет флагов           = 0\n");
    25    printf ("  IPC_CREAT            = 1\n");
    26    printf ("  IPC_EXCL             = 2\n");
    27    printf ("  IPC_CREAT и IPC_EXCL = 3\n");
    28    printf ("  Выбор                = ");

    29    /* Получить флаги, которые нужно установить */
    30    scanf ("%d", &flags);

    31    /* Проверить значения */
    32    printf ("\nключ = 0x%x, права = 0%o, флаги = %d\n",
    33            key, opperm, flags);

    34    /* Объединить флаги с правами на операции */
    35  switch (flags) {
    36    case 0:     /* Флаги не устанавливать */
    37      msgflg = (opperm | 0);
    38      break;
    39    case 1:     /* Установить флаг IPC_CREAT */
    40      msgflg = (opperm | IPC_CREAT);
    41      break;
    42    case 2:     /* Установить флаг IPC_EXCL */
    43      msgflg = (opperm | IPC_EXCL);
    44      break;
    45    case 3:     /* Установить оба флага */
    46      msgflg = (opperm | IPC_CREAT | IPC_EXCL);
    47  }

    48  /* Выполнить системный вызов msgget */
    49  msqid = msgget (key, msgflg);

    50  if (msqid == -1) {
    51    /* Сообщить о неудачном завершении */
    52    printf ("\nmsgget завершился неудачей!\n"
    53    printf ("Код ошибки = %d\n", errno);
    54  }
    55  else
    56    /* При успешном завершении сообщить msqid */
    57    printf ("\nИдентификатор msqid = %d\n", msqid);

    58  exit (0);
    59  }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование msgctl Up: Очереди сообщений Previous: Программа-пример   Contents   Index

Управление очередями сообщений

В данном пункте детально описывается использование системного вызова msgctl и приводится программа-пример, позволяющая поупражняться со всеми его возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Управление очередями сообщений Previous: Управление очередями сообщений   Contents   Index

Использование msgctl

В справочной статье msgctl синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>

        int msgctl (msqid, cmd, buf)
        int msqid, cmd;
        struct msqid_ds *buf;
При успешном завершении результат равен нулю; в случае неудачи возвращается -1.

В качестве аргумента msqid должен выступать идентификатор очереди сообщений, предварительно полученный при помощи системного вызова msgget.

Управляющее действие определяется значением аргумента cmd. Допустимых значений три:

IPC_STAT

Поместить информацию о состоянии очереди, содержащуюся в структуре данных, ассоциированной с идентификатором msqid, в пользовательскую структуру, на которую указывает аргумент buf.

IPC_SET

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

IPC_RMID

Удалить из системы идентификатор msqid, ликвидировать чередь сообщений и ассоциированную с ней структуру данных.

Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, процесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Чтобы выполнить действие IPC_STAT, требуется право на чтение.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Операции над очередями сообщений Up: Управление очередями сообщений Previous: Использование msgctl   Contents   Index

Программа-пример

Назначение переменных, описанных в программе:

command

Код управляющего действия.

choice

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

msqid_ds

Структура для хранения информации об очереди.

Программа ведет себя следующим образом. Прежде всего предлагается ввести допустимый идентификатор очереди сообщений, который заносится в переменную msqid (строки 15, 16). Это значение требуется в каждом системном вызове msgctl.

Затем нужно ввести код выбранного управляющего действия (строки 17-22); он заносится в переменную command.

Если выбрано действие IPC_STAT (код 1), системный вызов выполняется (строка 31) и распечатывается информация о состоянии очереди (строки 32-39); в программе распечатываются только те поля структуры, которые могут быть переустановлены. Отметим, что если системный вызов завершается неудачей, распечатывается информация о состоянии очереди на момент последнего успешного выполнения системного вызова. Кроме того, выводится сообщение об ошибке и распечатывается значение переменной errno (строки 90, 91). Если системный вызов завершается успешно, выводится сообщение, уведомляющее об этом, и значение использованного идентификатора очереди сообщений (строки 95, 96).

Если выбрано действие IPC_SET (код 2), программа прежде всего получает информацию о текущем состоянии очереди сообщений с заданным идентификатором (строка 45). Это необходимо, поскольку пример обеспечивает изменение только одного поля за один раз, в то время как системный вызов изменяет всю структуру целиком. Кроме того, если в одно из полей структуры, находящейся в об- ласти памяти пользователя, будет занесено некорректное значение, это может вызвать неудачи в выполнении управляющих действий, повторяющиеся до тех пор, пока значение поля не будет исправлено. Затем программа предлагает ввести код, соответствующий полю структуры, которое должно быть изменено (строки 46-53). Этот код заносится в переменную choice. Далее, в зависимости от указанного поля, программа предлагает ввести то или иное новое значение (строки 54-79). Значение заносится в соответствующее поле структуры данных, расположенной в области памяти пользователя, и выполняется системный вызов (строка 81).

Если выбрано действие IPC_RMID (код 3), выполняется системный вызов (строка 86), удаляющий из системы идентификатор msqid, очередь сообщений и ассоциированную с ней структуру данных. Отметим, что для выполнения этого управляющего действия аргумент buf не требуется, поэтому его значение может быть заменено нулем (NULL).

      1 /* Программа иллюстрирует
      2    возможности системного вызова msgctl()
      3    (управление очередями сообщений) */

      4 #include <stdio.h>
      5 #include <sys/types.h>
      6 #include <sys/ipc.h>
      7 #include <sys/msg.h>

      8 main ()
      9 {
     10   extern int errno;
     11   int msqid, command, choice, rtrn;
     12   struct msqid_ds msqid_ds, *buf;
     13   buf = &msqid_ds;

     14   /* Ввести идентификатор и действие */
     15   printf ("Введите идентификатор msqid: ");
     16   scanf ("%d", &msqid);

     17   printf ("Введите номер требуемого действия:\n");
     18   printf ("  IPC_STAT = 1\n");
     19   printf ("  IPC_SET  = 2\n");
     20   printf ("  IPC_RMID = 3\n");
     21   printf ("  Выбор    = ");
     22   scanf ("%d", &command);

     23   /* Проверить значения */
     24   printf ("идентификатор = %d, действие = %d\n",
     25           msqid, command);

     26   switch (command) {
     27     case 1: /* Скопировать информацию
     28                о состоянии очереди сообщений
     29                в пользовательскую структуру
     30                и вывести ее */
     31       rtrn = msgctl (msqid, IPC_STAT, buf);
     32       printf ("\n Идентификатор пользователя = %d\n",
     33               buf->msg_perm.uid);
     34       printf ("\n Идентификатор группы = %d\n",
     35               buf->msg_perm.gid);
     36       printf ("\n Права на операции = 0%o\n",
     37               buf->msg_perm.mode);
     38       printf ("\n Размер очереди в байтах = %d\n",
     39               buf->msg_qbytes);
     40       break;

     41     case 2: /* Выбрать и изменить поле (поля)
     42                 ассоциированной структуры данных */
     43       /* Сначала получить исходное значение
     44          структуры данных */
     45       rtrn = msgctl (msqid, IPC_STAT, buf);
     46       printf ("\nВведите номер поля, ");
     47       printf ("которое нужно изменить:\n");
     48       printf ("  msg_perm.uid  = 1\n");
     49       printf ("  msg_perm.gid  = 2\n");
     50       printf ("  msg_perm.mode = 3\n");
     51       printf ("  msg_qbytes    = 4\n");
     52       printf ("  Выбор         = ");
     53       scanf ("%d", &choice);

     54       switch (choice) {
     55         case 1:
     56           printf ("\nВведите ид-р пользователя: ");
     57           scanf ("%d", &buf->msg_perm.uid);
     58           printf ("\nИд-р пользователя = %d\n",
     59                   buf->msg_perm.uid);
     60           break;
     61         case 2:
     62           printf ("\nВведите ид-р группы: ");
     63           scanf ("%d", &buf->msg_perm.gid);
     64           printf ("\nИд-р группы = %d\n",
     65                   buf->msg_perm.uid);
     66           break;

     67         case 3:
     68           printf ("\nВведите восьмеричный код прав: ");
     69           scanf ("%o", &buf->msg_perm.mode);
     70           printf ("\nПрава на операции = 0%o\n",
     71                   buf->msg_perm.mode);
     72           break;

     73         case 4:
     74           printf ("\nВведите размер очереди = ");
     75           scanf ("%d", &buf->msg_qbytes);
     76           printf ("\nЧисло байт в очереди = %d\n",
     77                   buf->msg_qbytes);
     78           break;
     79       }

     80       /* Внести изменения */
     81       rtrn = msgctl (msqid, IPC_SET, buf);
     82       break;

     83    case 3: /* Удалить идентификатор и
     84               ассоциированные с ним очередь
     85               сообщений и структуру данных */
     86      rtrn = msgctl (msqid, IPC_RMID, NULL);
     87   }

     88   if (rtrn == -1) {
     89     /* Сообщить о неудачном завершении */
     90     printf ("\nmsgctl завершился неудачей!\n");
     91     printf ("\nКод ошибки = %d\n", errno);
     92   }

     93   else {
     94     /* При успешном завершении сообщить msqid */
     95     printf ("\nmsgctl завершился успешно,\n");
     96     printf ("идентификатор = %d\n", msqid);
     97   }

     98   exit (0);
     99 }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование операций Up: Очереди сообщений Previous: Программа-пример   Contents   Index

Операции над очередями сообщений

В данном пункте детально описывается использование системных вызовов msgsnd() и msgrcv() и приводится программа-пример, позволяющая поупражняться со всеми их возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск по одному символу Up: Метасимволы Previous: Метасимволы   Contents   Index

Поиск всех символов (метасимвол *)

Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем каталоге, за исключением тех, которые начинаются с точки. Чтобы посмотреть метасимвол * в действии, введите его как аргумент в команде echo: echo *. В ответ система распечатает перечень всех имен файлов в вашем текущем каталоге.

Символ * может представлять символы в любой части имени файла. Например, если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы, то вы можете выдать запрос, основываясь на этом факте. Если в вашем каталоге находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то для отображения всех этих файлов на экране введите команду:

      ls F*E

Вы можете, например, с помощью метасимвола * найти все файлы с именами memo в системном каталоге:

      ls */memo



Alex Otwagin 2002-12-16

next up previous contents index
Next: Посылка сообщений Up: Операции над очередями сообщений Previous: Операции над очередями сообщений   Contents   Index

Использование операций

В справочной статье msgop синтаксис упомянутых системных вызовов описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>

        int msgsnd (msqid, msgp, msgsz, msgflg)
        int msqid;
        struct msgbuf *msgp;
        int msgsz, msgflg;

        int msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
        int msqid;
        struct msgbuf *msgp;
        long msgtyp;
        int  msgsz, msgflg;



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Прием сообщений Up: Использование операций Previous: Использование операций   Contents   Index

Посылка сообщений

При успешном завершении системного вызова msgsnd() результат равен нулю; в случае неудачи возвращается -1.

В качестве аргумента msqid должен выступать идентификатор очереди сообщений, предварительно полученный при помощи системного вызова msgget.

Аргумент msgp является указателем на структуру в области памяти пользователя, содержащую тип посылаемого сообщения и его текст.

Аргумент msgsz специфицирует длину массива символов в структуре данных, указываемой аргументом msgp, то есть длину сообщения. Максимально допустимый размер данного массива определяется системным параметром MSGMAX.

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

Аргумент msgflg позволяет специфицировать выполнение над сообщением ``операции с блокировкой''; для этого флаг IPC_NOWAIT должен быть сброшен (msgflg & IPC_NOWAIT = 0). Блокировка имеет место, если либо текущее число байт в очереди уже равно максимально допустимому значению для указанной очереди (то есть значению поля msg_qbytes или MSGMNB), либо общее число сообщений во всех очередях равно максимально допустимому системой (системный параметр MSGTQL). Если в такой ситуации флаг IPC_NOWAIT установлен, системный вызов msgsnd() завершается неудачей и возвращает -1.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Использование операций Previous: Посылка сообщений   Contents   Index

Прием сообщений

При успешном завершении системного вызова msgrcv() результат равен числу принятых байт; в случае неудачи возвращается -1.

В качестве аргумента msqid должен выступать идентификатор очереди сообщений, предварительно полученный при помощи системного вызова msgget.

Аргумент msgp является указателем на структуру в области памяти пользователя, содержащую тип принимаемого сообщения и его текст.

Аргумент msgsz специфицирует длину принимаемого сообщения. Можно указать, что в случае, если значение данного аргумента меньше, чем длина сообщения в массиве, должна возникать ошибка (см. описание аргумента msgflg).

Аргумент msgtyp используется для выбора из очереди первого сообщения определенного типа. Если значение аргумента равно нулю, запрашивается первое сообщение в очереди, если больше нуля - первое сообщение типа msgtyp, а если меньше нуля - первое сообщение наименьшего из типов, которые не превосходят абсолютной величины аргумента msgtyp.

Аргумент msgflg позволяет специфицировать выполнение над сообщением ``операции с блокировкой''; для этого должен быть сброшен флаг IPC_NOWAIT (msgflg & IPC_NOWAIT = 0). Блокировка имеет место, если в очереди сообщений нет сообщения с запрашиваемым типом (msgtyp). Если флаг IPC_NOWAIT установлен и в очереди нет сообщения требуемого типа, системный вызов немедленно завершается неудачей. Аргумент msgflg может также специфицировать, что системный вызов должен заканчиваться неудачей, если размер со- общения в очереди больше значения msgsz; для этого в данном аргументе должен быть сброшен флаг MSG_NOERROR (msgflg & MSG_NOERROR = 0). Если флаг MSG_NOERROR установлен, сообщение обрезается до длины, указанной аргументом msgsz.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Семафоры Up: Операции над очередями сообщений Previous: Прием сообщений   Contents   Index

Программа-пример

Назначение переменных, описанных в программе:

sndbuf

Используется в качестве буфера, содержащего посылаемое сообщение (строка 12); шаблон при описании этой переменной - структура данных msgbufl (строки 9-12). Структура msgbufl является почти точной копией структуры msgbuf, описание которой находится во включаемом файле <sys/msg.h>. Единственное различие состоит в том, что длина символьного массива в msgbufl равна максимально допустимому размеру сообщения для данной конфигурации (MSGMAX), в то время как в msgbuf она устанавливается равной единице, чтобы отвечать требованиям компилятора. По этой причине нельзя использовать в пользовательской программе описание msgbuf непосредственно, то есть пользователь должен сам определять поля данной структуры.

rcvbuf

Используется в качестве буфера, содержащего принимаемое сообщение (строка 12); шаблон при описании этой переменной - структура данных msgbufl (строки 9-12).

i

Используется как счетчик символов при вводе с клавиатуры и занесении в массив, а также отслеживает длину сообщения при выполнении системного вызова msgsnd(); кроме того, используется как счетчик при выводе принятого сообщения после выполнения системного вызова msgrcv().

c

Содержит символ, возвращаемый функцией getchar() (строка 45).

flag

При выполнении системного вызова msgsnd() содержит значение, определяющее, нужен ли флаг IPC_NOWAIT (строка 55).

flags

При выполнении системного вызова msgrcv() содержит значение, определяющее комбинацию флагов IPC_NOWAIT и MSG_NOERROR (строка 103).

choice

Содержит признак, определяющий выбранную операцию - посылка или прием сообщения (строка 27).

Отметим, что в программе структура данных msqid_ds снабжается указателем на нее (строка 19), указатель соответствующим образом инициализируется (строка 20); это позволяет следить за полями ассоциированной структуры данных, которые могут измениться в результате операций над сообщениями. При помощи системного вызова msgctl() (действие IPC_STAT) программа получает значения полей ассоциированной структуры данных и выводит их (строки 74-82 и 145-152).

Прежде всего программа запрашивает, какую операцию нужно выполнить - послать или принять сообщение. Должно быть введено число, соответствующее требуемой операции; это число заносится в переменную choice (строки 21-27).

Если выбрана операция посылки сообщения, указатель msgp инициализируется адресом структуры данных sndbuf (строка 30). После этого запрашивается идентификатор очереди сообщений, в которую должно быть послано сообщение; идентификатор заносится в переменную msqid (строки 31-34). Затем должен быть введен тип сообщения; он заносится в поле mtype структуры данных, указываемой значением msgp (строка 34).

После этого программа приглашает ввести с клавиатуры текст посылаемого сообщения и выполняет цикл, в котором символы читаются и заносятся в массив mtext структуры данных (строки 43-46). Ввод продолжается до тех пор, пока не будет обнаружен признак конца файла; для функции getchar() таким признаком является символ CTRL+D, непосредственно следующий за символом возврата каретки. После того как признак конца обнаружен, определяется размер сообщения (строки 47, 48) - он на единицу больше значения счетчика i, поскольку элементы массива, в который заносится сообщение, нумеруются с нуля. Следует помнить, что сообщение будет содержать заключительные символы и, следовательно, будет казаться, что сообщение на три символа короче, чем указывает аргумент msgsz.

Чтобы обеспечить пользователю обратную связь, текст сообщения, содержащийся в массиве mtext структуры sndbuf, немедленно выводится (строки 49-51).

Следующее, и последнее, действие заключается в определении, должен ли быть установлен флаг IPC_NOWAIT. Чтобы выяснить это, программа предлагает ввести 1, если флаг установить нужно, или любое другое число, если не нужно (строки 52-59). Введенное значение заносится в переменную flag. Если введена единица, аргумент msgflg полагается равным IPC_NOWAIT, в противном случае msgflg устанавливается равным нулю.

После этого выполняется системный вызов msgsnd() (строка 63). Если вызов завершается неудачей, выводится сообщение об ошибке, а также ее код (строки 64-66). Если вызов завершается успешно, печатается возвращенное им значение, которое должно быть равно нулю (строки 69-71).

При каждой успешной посылке сообщения обновляются три поля ассоциированной структуры данных. Изменения можно описать следующим образом:

msg_qnum

Определяет общее число сообщений в очереди; в результате выполнения операции увеличивается на единицу.

msg_lspid

Содержит идентификатор процесса, который последним послал сообщение; полю присваивается соответствующий идентификатор.

msg_stime

Содержит время последней посылки сообщения, время измеряется в секундах, начиная с 00:00:00 1 января 1970 года (по Гринвичу).

После каждой успешной операции посылки сообщения значения этих полей выводятся (строки 76-82)

Если указано, что требуется принять сообщение, начальное значение указателя msgp устанавливается равным адресу структуры данных rcvbuf (строка 87).

Запрашивается код требуемой комбинации флагов, который заносится в переменную flags (строки 94-103). Переменная msgflg устанавливается в сответствии с выбранной комбинацией (строки 104- 119).

В заключение запрашивается, сколько байт нужно принять; указанное значение заносится в переменную msgsz (строки 120-123).

После этого выполняется системный вызов msgrcv() (строка 130) Если вызов завершается неудачей, выводится сообщение об ошибке, а также ее код (строки 131-133). Если вызов завершается успешно, программа сообщает об этом, а также выводит размер и текст сообщения (строки 135-144).

При каждом успешном приеме сообщения обновляются три поля ассоциированной структуры данных. Изменения можно описать следующим образом:

msg_qnum

Определяет общее число сообщений в очереди; в результате выполнения операции уменьшается на единицу.

msg_lrpid

Содержит идентификатор процесса, который последним получил сообщение; полю присваивается соответствующий идентификатор.

msg_rtime

Содержит время последнего получения сообщения, время измеряется в секундах, начиная с 00:00:00 1 января 1970 года (по Гринвичу).

Далее следует текст программы.
   1 /* Программа иллюстрирует
   2    возможности системных вызовов msgsnd() и msgrcv()
   3    (операции над очередями сообщений) */

   4 #include <stdio.h>
   5 #include <sys/types.h>
   6 #include <sys/ipc.h>
   7 #include <sys/msg.h>

   8 #define MAXTEXTSIZE 8192

   9 struct msgbufl {
  10   long mtype;
  11   char mtext [MAXTEXTSIZE];
  12 } sndbuf, rcvbuf, *msgp;

  13 main ()
  14 {
  15   extern int errno;
  16   int flag, flags, choice, rtrn, i, c;
  17   int rtrn, msqid, msgsz, msgflg;
  18   long msgtyp;
  19   struct msqid_ds msqid_ds, *buf;
  20   buf = &msqid_ds;

  21   /* Выбрать требуемую операцию */
  22   printf ("\nВведите код, соответствующий ");
  23   printf ("посылке или приему сообщения:\n");
  24   printf ("  Послать = 1\n");
  25   printf ("  Принять = 2\n");
  26   printf ("  Выбор   = ");
  27   scanf ("%d", &choice);

  28   if (choice == 1) {
  29     /* Послать сообщение */
  30     msgp = &sndbuf; /* Указатель на структуру */

  31     printf ("\nВведите идентификатор ");
  32     printf ("очереди сообщений,\n");
  33     printf ("в которую посылается сообщение: ");
  34     scanf ("%d", &msqid);

  35     /* Установить тип сообщения */
  36     printf ("\nВведите положительное число - ");
  37     printf ("тип сообщения: ");
  38     scanf ("%d", &msgp->mtype);

  39     /* Ввести посылаемое сообщение */
  40     printf ("\nВведите сообщение: \n");

  41     /* Управляющая последовательность CTRL+D
  42        завершает ввод сообщения */

  43     /* Прочитать символы сообщения
  44        и поместить их в массив mtext */
  45     for (i = 0; ((c = getchar ()) != EOF); i++)
  46       sndbuf.mtext [i] = c;

  47     /* Определить размер сообщения */
  48     msgsz = i + 1;

  49     /* Выдать текст посылаемого сообщения */
  50     for (i = 0; i < msgsz; i++)
  51       putchar (sndbuf.mtext [i]);

  52     /* Установить флаг IPC_NOWAIT, если это нужно */
  53     printf ("\nВведите 1, если хотите установить ");
  54     printf ("флаг IPC_NOWAIT: ");
  55     scanf ("%d", &flag);
  56     if (flag == 1)
  57       msgflg = IPC_NOWAIT;
  58     else
  59       msgflg = 0;

  60     /* Проверить флаг */
  61     printf ("\nФлаг = 0%o\n", msgflg);

  62     /* Послать сообщение */
  63     rtrn = msgsnd (msqid, msgp, msgsz, msgflg);
  64     if (rtrn == -1) {
  65       printf ("\nmsgsnd завершился неудачей!\n");
  66       printf ("Код ошибки = %d\n", errno);
  67     }
  68     else {
  69       /* Вывести результат; при успешном
  70          завершении он должен равняться нулю */
  71       printf ("\nРезультат = %d\n", rtrn);

  72       /* Вывести размер сообщения */
  73       printf ("\nРазмер сообщения = %d\n", msgsz);

  74       /* Опрос измененной структуры данных */
  75       msgctl (msqid, IPC_STAT, buf);

  76       /* Вывести изменившиеся поля */
  77       printf ("Число сообщений в очереди = %d\n",
  78               buf->msg_qnum);
  79       printf ("Ид-р последнего отправителя = %d\n",
  80               buf->msg_lspid);
  81       printf ("Время последнего отправления = %d\n",
  82               buf->msg_stime);
  83     }
  84   }

  85   if (choice == 2) {
  86     /* Принять сообщение */
  87     msgp = &rcvbuf;

  88     /* Определить нужную очередь сообщений */
  89     printf ("\nВведите ид-р очереди сообщений: ");
  90     scanf ("%d", &msqid);

  91     /* Определить тип сообщения */
  92     printf ("\nВведите тип сообщения: ");
  93     scanf ("%d", &msgtyp);

  94     /* Сформировать управляющие флаги
  95        для требуемых действий */
  96     printf ("\nВведите код, соответствущий ");
  97     printf ("нужной комбинации флагов:\n");
  98     printf ("  Нет флагов               = 0\n");
  99     printf ("  MSG_NOERROR              = 1\n");
 100     printf ("  IPC_NOWAIT               = 2\n");
 101     printf ("  MSG_NOERROR и IPC_NOWAIT = 3\n");
 102     printf ("  Выбор                    = ");
 103     scanf ("%d", &flags);

 104     switch (flags) {
 105       /* Установить msgflg как побитное ИЛИ
 106          соответствующих констант */
 107       case 0:
 108         msgflg = 0;
 109         break;
 110       case 1:
 111         msgflg = MSG_NOERROR;
 112         break;
 113       case 2:
 114         msgflg = IPC_NOWAIT;
 115         break;
 116       case 3:
 117         msgflg = MSG_NOERROR | IPC_NOWAIT;
 118         break;
 119     }

 120     /* Определить, какое число байт принять */
 121     printf ("\nВведите число байт, которое ");
 122     printf ("нужно принять (msgsz): ");
 123     scanf ("%d", &msgsz);

 124     /* Проверить значение аргументов */
 125     printf ("\nИдентификатор msqid = %d\n", msqid);
 126     printf ("Тип сообщения = %d\n", msgtyp);
 127     printf ("Число байт = %d\n", msgsz);
 128     printf ("Флаги = %o\n", msgflg);

 129     /* Вызвать msgrcv для приема сообщения */
 130     rtrn = msgrcv (msqid, msgp, msgsz, msgtyp, msgflg);

 131     if (rtrn == -1) {
 132       printf ("\nmsgrcv завершился неудачей!\n");
 133       printf ("Код oшибки = %d\n", errno);
 134     }
 135     else {
 136       printf ("\nmsgrcv завершился успешно,\n");
 137       printf ("идентификатор очереди = %d\n", msqid);

 138         /* Напечатать число принятых байт,
 139            оно равно возвращаемому значению */
 140         printf ("Принято байт: %d\n", rtrn);

 141         /* Распечатать принятое сообщение */
 142         for (i = 0; i < rtrn; i++)
 143           putchar (rcvbuf.mtext [i]);
 144     }

 145     /* Опрос ассоциированной структуры данных */
 146     msgctl (msqid, IPC_STAT, buf);

 147     printf ("\nЧисло сообщений в очереди = %d\n",
 148             buf->msg_qnum);
 149     printf ("Ид-р последнего получателя = %d\n",
 150             buf->msg_lrpid);
 151     printf ("Время последнего получения = %d\n",
 152             buf->msg_rtime);
 153   }

 154   exit (0);
 155 }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование семафоров Up: Механизмы межпроцессных взаимодействий Previous: Программа-пример   Contents   Index

Семафоры

Рассматриваемые в данном разделе средства позволяют процессам взаимодействовать, изменяя значения объектов, называемых семафорами. Значение семафора - это целое число в диапазоне от 0 до 32767. Поскольку во многих приложениях требуется более одного семафора, ОС UNIX предоставляет возможность создавать множества семафоров. Их максимальный размер ограничен системным парамет- ром SEMMSL. Множества семафоров создаются при помощи системного вызова semget.

Процесс, выполнивший системный вызов semget, становится владельцем / создателем множества семафоров. Он определяет, сколько будет семафоров в множестве; кроме того, он специфицирует первоначальные права на выполнение операций над множеством для всех процессов, включая себя. Впоследствии данный процесс может уступить право собственности или изменить права на операции при помощи системного вызова semctl, предназначенного для управления семафорами, однако на протяжении всего времени существования множества семафоров создатель остается создателем. Другие процессы, обладающие соответствующими правами, для выполнения прочих управляющих действий также могут использовать системный вызов semctl.

Над каждым семафором, принадлежащим множеству, при помощи системного вызова semop можно выполнить любую из трех операций:

Для выполнения первых двух операций у процесса должно быть право на изменение, для выполнения третьей достаточно права на чтение. Чтобы увеличить значение семафора, системному вызову semop следует передать требуемое число. Чтобы уменьшить значение семафора, нужно передать требуемое число, взятое с обратным знаком; если результат получается отрицательным, операция не может быть успешно выполнена. Для третьей операции нужно передать 0; если текущее значение семафора отлично от нуля, операция не может быть успешно выполнена.

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

При отсутствии флага IPC_NOWAIT системный вызов semop может быть приостановлен до тех пор, пока значение семафора, благодаря действиям другого процесса, не позволит успешно завершить операцию (ликвидация множества семафоров также приведет к завершению системного вызова). Подобные операции называются ``операциями с блокировкой''. С другой стороны, если обработка завершается неудачей и не указано, что выполнение процесса должно быть приостановлено, операция над семафором называется ``операцией без блокировки''.

Системный вызов semop оперирует не с отдельным семафором, а с множеством семафоров, применяя к нему ``массив операций''. Массив содержит информацию о том, с какими семафорами нужно оперировать и каким образом. Выполнение массива операций с точки зрения пользовательского процесса является неделимым действием. Это значит, во-первых, что если операции выполняются, то только все вместе и, во-вторых, что другой процесс не может получить доступ к промежуточному состоянию множества семафоров, когда часть операций из массива уже выполнилась, а другая часть еще не успела.

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание множеств семафоров Up: Семафоры Previous: Семафоры   Contents   Index

Использование семафоров

Перед тем как использовать семафоры (выполнять операции или управляющие действия), нужно создать множество семафоров с уникальным идентификатором и ассоциированной структурой данных. Уникальный идентификатор называется идентификатором множества семафоров (semid); он используется для обращений к множеству и структуре данных.

С точки зрения реализации множество семафоров представляет собой массив структур. Каждая структура соответствует семафору и определяется следующим образом:

        struct sem {
          ushort semval;  /* Значение семафора */
          short  sempid;  /* Идентификатор процесса, выпол-
                             нявшего последнюю операцию */
          ushort semncnt; /* Число процессов, ожидающих
                             увеличения значения семафора */
          ushort semzcnt; /* Число процессов, ожидающих
                             обнуления значения семафора */
        };
Определение находится во включаемом файле <sys/sem.h>.

С каждым идентификатором множества семафоров ассоциирована структура данных, содержащая следующую информацию:

        struct semid_ds {
          struct ipc_perm sem_perm; /* Структура прав на
                                       выполнение операций */
          struct sem *sem_base;     /* Указатель на первый
                                       семафор в множестве */
          ushort sem_nsems;         /* Количество семафоров в
                                       множестве */
          time_t sem_otime;      /* Время последней операции */
          time_t sem_ctime;         /* Время последнего
                                       изменения */
        };
Это определение также находится во включаемом файле <sys/sem.h>. Следует отметить, что поле sem_perm данной структуры использует в качестве шаблона структуру ipc_perm, общую для всех средств межпроцессной связи.

Системный вызов semget аналогичен вызову msgget (разумеется, с заменой слов ``очередь сообщений'' на ``множество семафоров''). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В аналогичных ситуациях semget терпит неудачу. Единственное отличие состоит в том, что при создании требуется посредством аргумента nsems указывать число семафоров в множестве.

После того как созданы множество семафоров с уникальным идентификатором и ассоциированная с ним структура данных, можно использовать системные вызовы semop для операций над семафорами и semctl для выполнения управляющих действий.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Управление семафорами Up: Семафоры Previous: Использование семафоров   Contents   Index

Создание множеств семафоров

Для создания множества семафоров служит системный вызов semget. В справочной статье semget синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>

        int semget (key, nsems, semflg)
        key_t key;
        int nsems, semflg;
Целочисленное значение, возвращаемое в случае успешного завершения, есть идентификатор множества семафоров (semid). В случае неудачи результат равен -1.

Смысл аргументов key и semflg тот же, что и у соответствующих аргументов системного вызова msgget. Аргумент nsems задает число семафоров в множестве. Если запрашивается идентификатор существующего множества, значение nsems не должно превосходить числа семафоров в множестве.

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

В справочной статье semget описывается начальное значение ассоциированной структуры данных, формируемое в случае успешного завершения системного вызова.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование semctl Up: Семафоры Previous: Создание множеств семафоров   Contents   Index

Управление семафорами

В данном пункте детально описывается использование системного вызова semctl и приводится программа-пример, позволяющая по- упражняться со всеми его возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Управление семафорами Previous: Управление семафорами   Contents   Index

Использование semctl

В справочной статье semctl синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>

        int semctl (semid, semnum, cmd, arg)
        int semid, cmd;
        int semnum;
        union semun {
          int val;
          struct semid_ds *buf;
          ushort *array;
        } arg;
Результат системного вызова semctl в случае успешного завершения зависит от выполняемого управляющего действия. Как правило он равен 0, но четыре действия (GETVAL, GETPID, GETNCNT и GETZCNT) являются исключениями. При возникновении ошибки всегда возвращается -1.

Аргументы semid и semnum определяют множество или отдельный семафор, над которым выполняется управляющее действие. В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget. Аргумент semnum задает номер семафора в множестве. Семафоры нумеруются с нуля.

Назначение аргумента arg зависит от управляющего действия, которое определяется значением аргумента cmd. Допустимы следующие действия:

GETVAL

Получить значение семафора и выдать его в качестве результата.

SETVAL

Установить значение семафора равным arg.val.

GETPID

Получить идентификатор процесса, последним выполнявшего операцию над семафором, и выдать его в качестве результата.

GETNCNT

Получить число процессов, ожидающих увеличения значение семафора, и выдать его в качестве результата.

GETZCNT

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

GETALL

Прочитать значения всех семафоров множества и поместить их в массив, на который указывает arg.array.

SETALL

Установить значения всех семафоров множества равными значениям элементов массива, на который указывает arg.array.

IPC_STAT

Поместить информацию о состоянии множества семафоров, содержащуюся в структуре данных, ассоциированной с идентификатором semid, в пользовательскую структуру, на которую указывает arg.buf.

IPC_SET

В структуре данных, ассоциированной с идентификатором semid, переустановить значения действующих идентификаторов пользователя и группы, а также прав на операции. Нужные значения извлекаются из структуры данных, на которую указывает arg.buf.

IPC_RMID

Удалить из системы идентификатор semid, ликвидировать множество семафоров и ассоциированную с ним структуру данных.

Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, процесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Для выполнения управляющих действий SETVAL и SETALL требуется право на изменение, а для выполнения остальных действий - право на чтение.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Операции над множествами семафоров Up: Управление семафорами Previous: Использование semctl   Contents   Index

Программа-пример

        /* Программа иллюстрирует
           возможности системного вызова semctl()
           (управление семафорами) */

        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>

        #define MAXSETSIZE 25

        main ()
        {
          extern int errno;
          struct semid_ds semid_ds;
          int length, rtrn, i, c;
          int semid, semnum, cmd, choice;
          union semun {
            int val;
            struct semid_ds *buf;
            ushort array [MAXSETSIZE];
          } arg;

          /* Инициализация указателя на структуру данных */
          arg.buf = &semid_ds;

          /* Ввести идентификатор множества семафоров */
          printf ("Введите ид-р множества семафоров: ");
          scanf ("%d", &semid);

          /* Выбрать требуемое управляющее действие */
          printf ("\nВведите номер требуемого действия:\n");
          printf ("  GETVAL   = 1\n");
          printf ("  SETVAL   = 2\n");
          printf ("  GETPID   = 3\n");
          printf ("  GETNCNT  = 4\n");
          printf ("  GETZCNT  = 5\n");
          printf ("  GETALL   = 6\n");
          printf ("  SETALL   = 7\n");
          printf ("  IPC_STAT = 8\n");
          printf ("  IPC_SET  = 9\n");
          printf ("  IPC_RMID = 10\n");
          printf ("  Выбор    = ");
          scanf ("%d", &cmd);

          /* Проверить значения */
          printf ("идентификатор = %d, команда = %d\n",
                  semid, cmd);

          /* Сформировать аргументы и выполнить вызов */
          switch (cmd) {
            case 1:     /* Получить значение */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETVAL, 0);
              printf ("\nЗначение семафора = %d\n", rtrn);
              break;

            case 2:     /* Установить значение */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              printf ("\nВведите значение: ");
              scanf ("%d", &arg.val);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, SETVAL, arg.val);
              break;

            case 3:     /* Получить ид-р процесса */
             rtrn = semctl (semid, 0, GETPID, 0);
             printf ("\Последнюю операцию выполнил: %d\n",rtrn);
             break;

            case 4:    /* Получить число процессов, ожидающих
                          увеличения значения семафора */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETNCNT, 0);
              printf ("\nЧисло процессов = %d\n", rtrn);
              break;

            case 5:    /* Получить число процессов, ожидающих
                          обнуления значения семафора */
              printf ("Введите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETZCNT, 0
              printf ("\nЧисло процессов = %d\n", rtrn);
              break;

            case 6:    /* Опросить все семафоры */
              /* Определить число семафоров в множестве */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              length = arg.buf->sem_nsems;
              if (rtrn == -1)
                goto ERROR;
              /* Получить и вывести значения всех
                 семафоров в указанном множестве */
              rtrn = semctl (semid, 0, GETALL, arg.array);
              for (i = 0; i < length; i++)
                printf (" %d", arg.array [i]);
              break;

            case 7:    /* Установить все семафоры */
              /* Определить число семафоров в множестве */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              length = arg.buf->sem_nsems;
              if (rtrn == -1)
                goto ERROR;
              printf ("\nЧисло семафоров = %d\n", length);
              /* Установить значения семафоров множества */
              printf ("\nВведите значения:\n");
              for (i = 0; i < length; i++)
                scanf ("%d", &arg.array [i]);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, 0, SETALL, arg.array);
              break;

            case 8:     /* Опросить состояние множества */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              printf ("\nИдентификатор пользователя = %d\n",
                      arg.buf->sem_perm.uid
              printf ("Идентификатор группы = %d\n",
                      arg.buf->sem_perm.gid);
              printf ("Права на операции = 0%o\n",
                      arg.buf->sem_perm.mode);
              printf ("Число семафоров в множестве = %d\n",
                      arg.buf->sem_nsems);
              printf ("Время последней операции = %d\n",
                      arg.buf->sem_otime);
              printf ("Время последнего изменения = %d\n",
                      arg.buf->sem_ctime);
              break;

            case 9:    /* Выбрать и изменить поле
                          ассоциированной структуры данных */
              /* Опросить текущее состояние */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              if (rtrn == -1)
                goto ERROR;

              printf ("\nВведите номер поля, ");
              printf ("которое нужно изменить: \n");
              printf ("  sem_perm.uid  = 1\n");
              printf ("  sem_perm.gid  = 2\n");
              printf ("  sem_perm.mode = 3\n");
              printf ("  Выбор         = ");
              scanf ("%d", &choice);

              switch (choice) {
                case 1:         /* Изменить ид-р владельца */
                  printf ("\nВведите ид-р владельца: ");
                  scanf ("%d", &arg.buf->sem_perm.uid);
                  printf ("\nИд-р владельца = %d\n",
                          arg.buf->sem_perm.uid);
                  break;

                case 2:         /* Изменить ид-р группы */
                  printf ("\nВведите ид-р группы = ");
                  scanf ("%d", &arg.buf->sem_perm.gid);
                  printf ("\nИд-р группы = %d\n",
                          arg.buf->sem_perm.uid);
                  break;

                case 3:      /* Изменить права на операции */
                  printf ("\nВведите восьмеричный код прав: ");
                  scanf ("%o", &arg.buf->sem_perm.mode);
                  printf ("\nПрава = 0%o\n",
                          arg.buf->sem_perm.mode);
                  break;
              }

              /* Внести изменения */
              rtrn = semctl (semid, 0, IPC_SET, arg.buf);
              break;

            case 10:    /* Удалить ид-р множества семафоров и
                           ассоциированную структуру данных */
              rtrn = semctl (semid, 0, IPC_RMID, 0);
          }
          if (rtrn == -1) {
            /* Сообщить о неудачном завершении */
            ERROR:
            printf ("\nsemctl завершился неудачей!\n");
            printf ("\nКод ошибки = %d\n", errno);
          }
          else {
            printf ("\nmsgctl завершился успешно,\n");
            printf ("идентификатор semid = %d\n", semid);
          }

          exit (0);
        }


Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск одного набора (метасимвол Up: Метасимволы Previous: Поиск всех символов (метасимвол   Contents   Index

Поиск по одному символу (метасимвол ?)

Метасимвол ? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш каталог содержит следующие файлы:

      Chapter1
      Chapter2
      Chapter5
      Chapter9
      Chapter11
то введите команду ls с метасимволом ? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:
      $ ls Chapter?
      Chapter1
      Chapter2
      Chapter5
      Chapter9
      $
Хотя метасимвол осуществляет поиск одного символа, вы можете использовать его для поиска более одного символа в имени файла. Например, вы получите перечень всех остальных глав в текущем каталоге, если введете следующую команду:
      ls Chapter??
И, конечно, чтобы получить список всех глав в текущем каталоге, используйте метасимвол *:
      ls Chapter*



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование semop Up: Семафоры Previous: Программа-пример   Contents   Index

Операции над множествами семафоров

В данном пункте детально описывается использование системного вызова semop и приводится программа-пример, позволяющая поупражняться со всеми его возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Операции над множествами семафоров Previous: Операции над множествами семафоров   Contents   Index

Использование semop

В справочной статье semop синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>

        int semop (semid, sops, nsops)
        int semid;
        struct sembuf *sops;
        unsigned nsops;
При успешном завершении результат системного вызова равен нулю; в случае неудачи возвращается -1.

В качестве аргумента semid должен выступать идентификатор множества семафоров, предварительно полученный при помощи системного вызова semget.

Аргумент sops (массив структур) определяет, над какими семафорами будут выполняться операции и какие именно. Структура, описывающая операцию над одним семафором, определяется следующим образом:

        struct sembuf {
          short sem_num; /* Номер семафора */
          short sem_op;  /* Операция над семафором */
          short sem_flg; /* Флаги операции */
        };
(см. включаемый файл <sys/sem.h>).

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

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

Допустимые значения флагов операций (поле sem_flg):
IPC_NOWAIT

Если какая-либо операция, для которой задан флаг IPC_NOWAIT, не может быть успешно выполнена, системный вызов завершается неудачей, причем ни у одного из семафоров не будет изменено значение

SEM\_UNDO

Данный флаг задает проверочный режим выполнения операции; он предписывает аннулировать ее результат даже в случае успешного завершения системного вызова semop. Иными словами, блокировка всех операций (в том числе и тех, для которых задан флаг SEM_UNDO) выполняется обычным образом, но когда наконец все операции могут быть успешно выполнены, операции с флагом SEM_UNDO игнорируются.

Аргумент nsops специфицирует число структур в массиве. Макси- мально допустимый размер массива определяется системным пара- метром SEMOPM, то есть в каждом системном вызове semop можно выполнить не более SEMOPM операций.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Разделяемые сегменты памяти Up: Операции над множествами семафоров Previous: Использование semop   Contents   Index

Программа-пример

       /* Программа иллюстрирует
          возможности системного вызова semop()
          (операции над множеством семафоров) */


       #include <stdio.h>
       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

       #define MAXOPSIZE 10

       main ()
       {
         extern int errno;
         struct sembuf sops [MAXOPSIZE];
         int semid, flags, i, rtrn;
         unsigned nsops;

       /* Ввести идентификатор множества семафоров */
       printf ("\nВведите идентификатор множества семафоров,");
       printf ("\nнад которым будут выполняться операции: ");
       scanf ("%d", &semid);
       printf ("\nИд-р множества семафоров = %d", semid);

       /* Ввести число операций */
       printf ("\nВведите число операций ");
       printf ("над семафорами из этого множества: \n");
       scanf ("%d", &nsops);
       printf ("\nЧисло операций = %d", nsops);

       /* Инициализировать массив операций */
       for (i = 0; i < nsops; i++) {
         /* Выбрать семафор из множества */
         printf ("\nВведите номер семафора: ");
         scanf ("%d", &sops [i].sem_num);
         printf ("\nНомер = %d", sops [i].sem_num);

       /* Ввести число, задающее операцию */
       printf ("\nЗадайте операцию над семафором: ");
       scanf ("%d", &sops [i].sem_op);
       printf ("\nОперация = %d", sops [i].sem_op);

       /* Указать требуемые флаги */
       printf ("\nВведите код, ");
       printf ("соответствующий требуемым флагам:\n");
       printf ("  Нет флагов            = 0\n");
       printf ("  IPC_NOWAIT            = 1\n");
       printf ("  SEM_UNDO              = 2\n");
       printf ("  IPC_NOWAIT и SEM_UNDO = 3\n");
       printf ("  Выбор                 = ");
       scanf ("%d", &flags);

       switch (flags) {
         case 0:
           sops [i].sem_flg = 0;
           break;
         case 1:
           sops [i].sem_flg = IPC_NOWAIT;
           break;
         case 2:
           sops [i].sem_flg = SEM_UNDO;
           break;
         case 3:
           sops [i].sem_flg = IPC_NOWAIT | SEM_UNDO;
           break;
       }
       printf ("\nФлаги = 0%o", sops [i].sem_flg);
     }

     /* Распечатать все структуры массива */
     printf ("\nМассив операций:\n");
     for (i = 0; i < nsops; i++) {
       printf ("  Номер семафора = %d\n", sops [i].sem_num);
       printf ("  Операция = %d\n", sops [i].sem_op);
       printf ("  Флаги = 0%o\n", sops [i].sem_flg);
     }

     /* Выполнить системный вызов */
     rtrn = semop (semid, sops, nsops);
     if (rtrn == -1) {
       printf ("\nsemop завершился неудачей!\n");
       printf ("Код ошибки = %d\n", errno);
     }
     else {
       printf ("\nsemop завершился успешно.\n");
       printf ("Идентификатор semid = %d\n", semid);
       printf ("Возвращенное значение = %d\n", rtrn);
     }

     exit (0);
   }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование разделяемых сегментов памяти Up: Механизмы межпроцессных взаимодействий Previous: Программа-пример   Contents   Index

Разделяемые сегменты памяти

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

Разделение памяти обеспечивает наиболее быстрый обмен данными между процессами.

Работа с разделяемой памятью начинается с того, что процесс при помощи системного вызова shmget создает разделяемый сегмент, специфицируя первоначальные права доступа к сегменту (чтение и / или запись) и его размер в байтах. Чтобы затем получить доступ к разделяемому сегменту, его нужно присоединить посредством системного вызова shmat(), который разместит сегмент в виртуальном пространстве процесса. После присоединения, в соответствии с правами доступа, процессы могут читать данные из сегмента и записывать их (быть может, синхронизируя свои действия с помощью семафоров).

Когда разделяемый сегмент становится ненужным, его следует отсоединить, воспользовавшись системным вызовом shmdt().

Для выполнения управляющих действий над разделяемыми сегментами памяти служит системный вызов shmctl(). В число управляющих действий входит предписание удерживать сегмент в оперативной памяти и обратное предписание о снятии удержания. После того, как последний процесс отсоединил разделяемый сегмент, следует выполнить управляющее действие по удалению сегмента из системы.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Создание разделяемых сегментов памяти Up: Разделяемые сегменты памяти Previous: Разделяемые сегменты памяти   Contents   Index

Использование разделяемых сегментов памяти

Прежде чем воспользоваться разделением памяти, нужно создать разделяемый сегмент с уникальным идентификатором и ассоциированную с ним структуру данных. Уникальный идентификатор называется идентификатором разделяемого сегмента памяти (shmid); он используется для обращений к ассоциированной структуре данных, которая определяется следующим образом:

        struct shmid_ds {
          struct ipc_perm shm_perm; /* Структура прав на
                                       выполнение операций */
          int    shm_segsz;         /* Размер сегмента */
          struct region *shm_reg;   /* Указатель на структуру
                                       области памяти */
          char   pad [4];           /* Информация для
                                       подкачки */
          ushort shm_lpid;          /* Ид-р процесса, вып.
                                       последнюю операцию */
          ushort shm_cpid;          /* Ид-р процесса,
                                       создавшего сегмент */
          ushort shm_nattch;        /* Число присоединивших
                                       сегмент */
          ushort shm_cnattch;       /* Число удерживающих
                                       сегмент в памяти */
          time_t shm_atime;         /* Время последнего
                                       присоединения */
          time_t shm_dtime;         /* Время последнего
                                       отсоединения */
          time_t shm_ctime;         /* Время последнего
                                       изменения */
        };
(см. включаемый файл <sys/shm.h>).

Следующая таблица содержит информацию о возможных состояниях разделяемых сегментов памяти:

Бит удержания Бит подкачки Бит размещения Состояние
0 0 0 Неразмещенный сегмент
0 0 1 В памяти
0 1 0 Не используется
0 1 1 На диске
1 0 0 Не используется
1 0 1 Удержан в памяти
1 1 0 Не используется
1 1 1 Не используется

Состояния, упомянутые в таблице, таковы:

Системный вызов shmget аналогичен вызову semget (разумеется, с заменой слов ``множество семафоров'' на ``разделяемый сегмент памяти''). Он также предназначен для получения нового или опроса существующего идентификатора, а нужное действие определяется значением аргумента key. В аналогичных ситуациях shmget терпит неудачу. Единственное отличие состоит в том, что задается не число семафоров в множестве, а размер сегмента в байтах.

После того, как создан уникальный идентификатор разделяемого сегмента памяти и ассоциированная с ним структура данных, можно использовать системные вызовы семейства shmop (операции над разделяемыми сегментами) и shmctl (управление разделяемыми сегментами).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Управление разделяемыми сегментами памяти Up: Разделяемые сегменты памяти Previous: Использование разделяемых сегментов памяти   Contents   Index

Создание разделяемых сегментов памяти

Для создания разделяемого сегмента памяти служит системный вы- зов shmget. Синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        int shmget (key, size, shmflg)
        key_t key;
        int size, shmflg;
Целочисленное значение, возвращаемое в случае успешного завершения, есть идентификатор разделяемого сегмента (shmid). В случае неудачи результат равен -1.

Смысл аргументов key и shmflg тот же, что и у соответствующих аргументов системного вызова semget. Аргумент size задает размер разделяемого сегмента в байтах.

Системный параметр SHMMNI определяет максимально допустимое число уникальных идентификаторов разделяемых сегментов памяти (shmid) в системе. Попытка его превышения ведет к неудачному завершению системного вызова.

Системный вызов завершится неудачей и тогда, когда значение аргумента size меньше, чем SHMMIN, либо больше, чем SHMMAX. Данные системные параметры специфицируют, соответственно, минимальный и максимальный размеры разделяемого сегмента памяти.

В справочной статье shmget описывается начальное значение ассоциированной структуры данных, формируемое в случае успешного завершения системного вызова.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование shmctl Up: Разделяемые сегменты памяти Previous: Создание разделяемых сегментов памяти   Contents   Index

Управление разделяемыми сегментами памяти

В данном пункте детально описывается использование системного вызова shmctl и приводится программа-пример, позволяющая поупражняться со всеми его возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Управление разделяемыми сегментами памяти Previous: Управление разделяемыми сегментами памяти   Contents   Index

Использование shmctl

В справочной статье shmctl синтаксис данного системного вызова описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        int shmctl (shmid, cmd, buf)
        int shmid, cmd;
        struct shmid_ds *buf;
При успешном завершении результат равен нулю; в случае неудачи возвращается -1.

В качестве аргумента shmid должен выступать идентификатор разделяемого сегмента памяти, предварительно полученный при помощи системного вызова shmget.

Управляющее действие определяется значением аргумента cmd. Допустимы следующие значения:

IPC_STAT

Поместить информацию о состоянии разделяемого сегмента, содержащуюся в структуре данных, ассоциированной с идентификатором shmid, в пользовательскую структуру, на которую указывает аргумент buf.

IPC_SET

В структуре данных, ассоциированной с идентификатором shmid, переустановить значения действующих идентификаторов пользователя и группы, а также прав на операции. Нужные значения извлекаются из структуры данных, на которую указывает аргумент buf.

IPC_RMID

Удалить из системы идентификатор shmid, ликвидировать разделяемый сегмент памяти и ассоциированную с ним структуру данных.

SHM_LOCK

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

SHM_UNLOCK

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

Чтобы выполнить управляющее действие IPC_SET или IPC_RMID, процесс должен иметь действующий идентификатор пользователя, равный либо идентификаторам создателя или владельца очереди, либо идентификатору суперпользователя. Управляющие действия SHM_LOCK и SHM_UNLOCK может выполнить только суперпользователь. Для выполнения управляющего действия IPC_STAT процессу требуется право на чтение.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Операции над разделяемыми сегментами Up: Управление разделяемыми сегментами памяти Previous: Использование shmctl   Contents   Index

Программа-пример

        /* Программа иллюстрирует
           возможности системного вызова shmctl()
           (операции управления разделяемыми сегментами) */

        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        main ()
        {
          extern int errno;
          int rtrn, shmid, command, choice;
          struct shmid_ds shmid_ds, *buf;
          buf = &shmid_ds;

          /* Ввести идентификатор сегмента и действие */
          printf ("Введите идентификатор shmid: ");
          scanf ("%d", &shmid);

          printf ("Введите номер требуемого действия:\n");
          printf ("  IPC_STAT   = 1\n");
          printf ("  IPC_SET    = 2\n");
          printf ("  IPC_RMID   = 3\n");
          printf ("  SHM_LOCK   = 4\n");
          printf ("  SHM_UNLOCK = 5\n");
          printf ("  Выбор      = ");
          scanf ("%d", &command);

          /* Проверить значения */
          printf ("\nидентификатор = %d, действие = %d\n",
                  shmid, command);

          switch (command) {
            case 1:     /* Скопировать информацию
                           о состоянии разделяемого сегмента
                           в пользовательскую структуру
                           и вывести ее */

              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("\nИд-р пользователя = %d\n",
                      buf->shm_perm.uid);
              printf ("Ид-р группы пользователя = %d\n",
                      buf->shm_perm.gid);
              printf ("Ид-р создателя = %d\n",
                      buf->shm_perm.cuid);
              printf ("Ид-р группы создателя = %d\n",
                      buf->shm_perm.cgid);
              printf ("Права на операции = 0%o\n",
                      buf->shm_perm.mode);
              printf ("Последовательность номеров ");
                      buf->shm_perm.cgid);
              printf ("используемых слотов = 0%x\n",
                      buf->shm_perm.seq);
              printf ("Ключ = 0%x\n", buf->shm_perm.key);
              printf ("Размер сегмента = %d\n", buf->shm_segsz);
              printf ("Выполнил последнюю операцию = %d\n",
                      buf->shm_lpid);
              printf ("Создал сегмент = %d\n", buf->shm_cpid);
              printf ("Число присоединивших сегмент = %d\n",
                      buf->shm_nattch);
              printf ("Число удерживаюших в памяти = %d\n",
                      buf->shm_cnattch);
              printf ("Последнее присоединение = %d\n",
                      buf->shm_atime);
              printf ("Последнее отсоединение = %d\n",
                       buf->shm_dtime);
              printf ("Последнее изменение = %d\n",
                       buf->shm_ctime);
              break;

            case 2:     /* Выбрать и изменить поле (поля)
                           ассоциированной структуры данных */
              /* Получить исходные значения структуры данных */
              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("Введите номер изменяемого поля:\n");
              printf ("  shm_perm.uid  = 1\n");
              printf ("  shm_perm.gid  = 2\n");
              printf ("  shm_perm.mode = 3\n");
              printf ("  Выбор         = ");
              scanf ("%d", &choice);

              switch (choice) {
                case 1:
                  printf ("\nВведите ид-р пользователя: "),
                  scanf ("%d", &buf->shm_perm.uid);
                  printf ("\nИд-р пользователя = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 2:
                  printf ("\nВведите ид-р группы: "),
                  scanf ("%d", &buf->shm_perm.gid);
                  printf ("\nИд-р группы = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 3:
                  printf ("\nВведите восьмеричный код прав: ");
                  scanf ("%o", &buf->shm_perm.mode);
                  printf ("\nПрава на операции = 0%o\n",
                          buf->shm_perm.mode);
                  break;
              }

             /* Внести изменения */
             rtrn = shmctl (shmid, IPC_SET, buf);
             break;

          case 3:      /* Удалить идентификатор и
                          ассоциированную структуру данных */
            rtrn = shmctl (shmid, IPC_RMID, NULL);
            break;


          case 4:     /* Удерживать разделяемый сегмент
                         в памяти */
            rtrn = shmctl (shmid, SHM_LOCK, NULL);
            break;

          case 5:    /* Перестать удерживать сегмент в памяти */
            rtrn = shmctl (shmid, SHM_UNLOCK, NULL);
        }

        if (rtrn == -1) {
          /* Сообщить о неудачном завершении */
          printf ("\nshmctl завершился неудачей!\n");
          printf ("\nКод ошибки = %d\n", errno);
        }
        else {
          /* При успешном завершении сообщить ид-р shmid */
          printf ("\nshmctl завершился успешно, ");
          printf ("идентификатор shmid = %d\n", shmid);
        }

        exit (0);
      }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование операций Up: Разделяемые сегменты памяти Previous: Программа-пример   Contents   Index

Операции над разделяемыми сегментами памяти

В данном пункте детально описывается использование системных вызовов shmat и shmdt и приводится программа-пример, позволяющая поупражняться со всеми их возможностями.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Специальные символы Up: Метасимволы Previous: Поиск по одному символу   Contents   Index

Поиск одного набора (метасимвол [])

Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш каталог содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква ``c'', либо буква ``r'', либо буква ``f'' в указанной позиции. Пример:

      $ ls [crf]at
      cat         fat       rat
      $
Символы, которые могут быть сгруппированы в скобки, называются классом символов.

Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем каталоге содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете chapter[1-5], то shell найдет файлы c chapter1 по chapter5.

Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Присоединение сегментов Up: Операции над разделяемыми сегментами Previous: Операции над разделяемыми сегментами   Contents   Index

Использование операций

В справочной статье shmop синтаксис упомянутых системных вызовов описан так:

        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        int shmat (shmid, shmaddr, shmflg)
        int shmid;
        char *shmaddr;
        int shmflg;

        int shmdt (shmaddr)
        char *shmaddr;


Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Отсоединение сегментов Up: Использование операций Previous: Использование операций   Contents   Index

Присоединение сегментов

При успешном завершении системного вызова shmat() результат равен адресу, который получил присоединенный сегмент; в случае неудачи возвращается -1. Разумеется, чтобы использовать результат shmat() как указатель, его нужно преобразовать к требуемому типу.

В качестве аргумента shmid должен выступать идентификатор разделяемого сегмента, предварительно полученный при помощи системного вызова shmget.

Аргумент shmaddr задает адрес, по которому сегмент должен быть присоединен, то есть тот адрес в виртуальном пространстве пользователя, который получит начало сегмента. Не всякий адрес является приемлемым. Можно порекомендовать адреса вида

        0x80000000
        0x80040000
        0x80080000
         . . .
Если значение shmaddr равно нулю, система выбирает адрес присоединения по своему усмотрению.

Аргумент shmflg используется для передачи системному вызову shmat() флагов SHM_RND и SHM_RDONLY. Наличие первого из них означает, что адрес shmaddr следует округлить до некоторй системно-зависимой величины. Второй флаг предписывает присоединить сегмент только для чтения; если он не установлен, присоединенный сегмент будет доступен и на чтение, и на запись (если процесс обладает соответствующими правами).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Программа-пример Up: Использование операций Previous: Присоединение сегментов   Contents   Index

Отсоединение сегментов

При успешном завершении системного вызова shmdt() результат равен нулю; в случае неудачи возвращается -1.

Аргумент shmaddr задает начальный адрес отсоединяемого сегмента.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа с сокетами Up: Операции над разделяемыми сегментами Previous: Отсоединение сегментов   Contents   Index

Программа-пример

        /* Программа иллюстрирует
           возможности системных вызовов shmat() и shmdt()
           (операции над разделяемыми сегментами памяти) */
        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        main ()
        {
          extern int errno;
          int shmid, shmaddr, shmflg;
          int flags, attach, detach, rtrn, i;

          /* Цикл присоединений для данного процесса */
          printf ("\nВведите число присоединений ");
          printf ("для процесса (1-4): ");
          scanf ("%d", &attach);
          printf ("\nЧисло присоединений = %d\n", attach);

          for (i = 0; i < attach; i++) {
            /* Ввести идентификатор разделяемого сегмента */
            printf ("\nВведите ид-р разделяемого сегмента,\n");
            printf ("над которым нужно выполнить операции: ");
            scanf ("%d", &shmid);
            printf ("\nИд-р сегмента = %d\n", shmid);

            /* Ввести адрес присоединения */
            printf ("\nВведите адрес присоединения ");
            printf ("в шестнадцатеричной записи: ");
            scanf ("%x", &shmaddr);
            printf ("\nАдрес присоединения = 0x%x\n", shmaddr);

       /* Выбрать требуемые флаги */
       printf ("\nВведите номер нужной комбинации флагов:\n");
       printf ("  SHM_RND              = 1\n");
       printf ("  SHM_RDONLY           = 2\n");
       printf ("  SHM_RND и SHM_RDONLY = 3\n");
       printf ("  Выбор                = ");
       scanf ("%d", &flags);

       switch (flags) {
         case 1:
           shmflg = SHM_RND;
           break;
         case 2:
           shmflg = SHM_RDONLY;
           break;
         case 3:
           shmflg = SHM_RND | SHM_RDONLY;
           break;
       }
       printf ("\nФлаги = 0%o", shmflg);

       /* Выполнить системный вызов shmat */
       rtrn = shmat (shmid, shmaddr, shmflg);
       if (rtrn == -1) {
         printf ("\nshmat завершился неудачей!\n");
         printf ("\Код ошибки = %d\n", errno);
       }
       else {
         printf ("\nshmat завершился успешно.\n");
         printf ("Идентификатор shmid = %d\n", shmid);
         printf ("Адрес = 0x%x\n", rtrn);
       }
     }

     /* Цикл отсоединений для данного процесса */
     printf ("\nВведите число отсоединений ");
     printf ("для процесса (1-4): ");
     scanf ("%d", &detach);
     printf ("\nЧисло отсоединений = %d\n", detach);

     for (i = 0; i < detach; i++) {
       /* Ввести адрес отсоединения */
       printf ("\nВведите адрес отсоединяемого сегмента ");
       printf ("в шестнадцатеричной записи: ");
       scanf ("%x", &shmaddr);
       printf ("\nАдрес отсоединения = 0x%x\n", shmaddr);

       /* Выполнить системный вызов shmdt */
       rtrn = shmdt (shmaddr);
       if (rtrn == -1) {
         printf ("\nshmdt завершился неудачей!\n");
         printf ("\Код ошибки = %d\n", errno);
       }
       else {
         printf ("\nshmdt завершился успешно,\n");
         printf ("идентификатор shmid = %d\n", shmid);
       }
     }

     exit (0);
   }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция socket Up: Механизмы межпроцессных взаимодействий Previous: Программа-пример   Contents   Index

Работа с сокетами



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция bind Up: Работа с сокетами Previous: Работа с сокетами   Contents   Index

Функция socket

Эта функция используется для создания сокета. Прототип:

int socket (int domain, int type, int protocol);

Первый параметр - домен - накладывает определенные ограничения на формат используемых процессом адресов и их интерпретацию. При работе с одной ЭВМ используется UNIX-домен, где адреса интерпретируются как имена файлов в UNIX. В этом случае в качестве первого параметра указывается константа AF-UNIX (AF - Address Family).

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

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

Третий параметр позволяет программисту выбрать нужный протокол для канала связи. Если этот параметр равен нулю, ОС выберет нужный протокол автоматически.

Функция socket возвращает целое положительное число - номер сокет-дескриптора (который можно использовать, например, в функциях read и write аналогично файловому дескриптору). Если же сокет по каким-либо причинам не был создан (например, очень много открытых файлов), возвращается -1, а в переменную "errno" записывается причина неудачи.

Константы, используемые в качестве аргументов при вызове socket, определены во включаемых файлах sys/socket.h и sys/types.h.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция listen Up: Работа с сокетами Previous: Функция socket   Contents   Index

Функция bind

Эта функция используется сервером для присваивания сокету имени. До выполнения функции bind (т.е. присваивания какого-либо имени, вид которого зависит от адресного домена ) сокет недоступен программам-клиентам.

Прототип:

int bind(int s, char * name, int namelen);

Первый параметр - сокет-дескриптор, который данная функция именует. Второй параметр - указатель на структуру имени сокета, тип которой зависит от домена. Для UNIX-домена этот тип называется sockaddr_un, он определен во включаемом файле sys/un.h и выглядит таким образом:

struct sockaddr_un
{
 short sun_family;
 char sun_path[108];
};
В качестве первого элемента структуры, обозначающего класс адресов, мы будем использовать константу AF_UNIX, второй элемент - имя файла, который будет соответствовать используемому сокету.

Файл c именем, указанным в sun_path, действительно создается, поэтому после окончания работы с данным сокетом надо выполнить функцию unlink, в противном случае другие программы, которые попытаются использовать данное имя, получат сообщение об ошибке.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция accept Up: Работа с сокетами Previous: Функция bind   Contents   Index

Функция listen

Функция listen используется сервером, чтобы информировать ОС, что он ожидает ("слушает") запросы связи на данном сокете. Без такой функции всякое требование связи с этим сокетом будет отвергнуто.

Прототип:

int listen(int s, int backlog);

Первый аргумент - сокет для прослушивания, второй аргумент (backlog) - целое положительное число, определяющее, как много запросов связи может быть принято на сокет одновременно. В большинстве систем это значение должно быть не больше пяти. Заметим, что это число не имеет отношения к числу соединений, которое может поддерживаться сервером. Аргумент backlog имеет отношение только к числу запросов на соединение, которые приходят одновременно. Число установленных соединений может превышать это число.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция connect Up: Работа с сокетами Previous: Функция listen   Contents   Index

Функция accept

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

Прототип: int accept(int s, char * name, int* anamelen);

Первый аргумент функции - сокет-дескриптор для принятия связей от клиентов. Второй аргумент - указатель на адрес клиента (структура sockaddr ) для соответствующего домена. Третий аргумент - указатель на целое число - длину структуры адреса. Второй и третий аргументы заполняются соответствующими значениями в момент установления связи клиента с сервером и позволяют серверу точно определить, с каким именно клиентом он общается. Если сервер не интересуется адресом клиента, в качестве второго и третьего аргументов можно задать NULL-указатели.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция send Up: Работа с сокетами Previous: Функция accept   Contents   Index

Функция connect

Функция connect используется процессом-клиентом для установления связи с сервером.

Прототип:

int connect(int s, char * name, int namelen);

Первый аргумент - сокет-дескриптор клиента. Второй аргумент - указатель на адрес сервера (структура sockaddr) для соответствующего домена. Третий аргумент - целое число - длина структуры адреса.

Функция возвращает 0, если вызов успешный, и -1 иначе.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск команды в фоновом Up: Командный процессор Previous: Поиск одного набора (метасимвол   Contents   Index

Специальные символы

shell имеет также и другие символы, которые выполняют различные полезные функции.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция recv Up: Работа с сокетами Previous: Функция connect   Contents   Index

Функция send

Функция служит для записи данных в сокет.

Прототип:

int send(int s, char * buf, int len, int flags);

Первый аргумент - сокет-дескриптор, в который записываются данные. Второй и третий аргументы - соответственно, адрес и длина буфера с записываемыми данными. Четвертый параметр - это комбинация битовых флагов, управляющих режимами записи. Если аргумент flags равен нулю, то запись в сокет (и, соответственно, считывание ) происходит в порядке поступления байтов. Если значение flags есть MSG_OOB, то записываемые данные передаются потребителю вне очереди.

Функция возвращает число записанных в сокет байтов ( в нормальном случае должно быть равно значению параметра len ) или -1 в случае ошибки. Отметим, что запись в сокет не означает, что данные приняты на другом конце соединения процессом-потребителем. Для этого процесс-потребитель должен выполнить функцию recv ( см. ниже ). Таким образом, функции чтения и записи в сокет выполняются асинхронно.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция shutdown Up: Работа с сокетами Previous: Функция send   Contents   Index

Функция recv

Функция служит для чтения данных из сокета.

Прототип:

int recv(int s, char * buf, int len, int flags);

Первый аргумент - сокет-дескриптор, из которого читаются данные. Второй и третий аргументы - соответственно, адрес и длина буфера для записи читаемых данных. Четвертый параметр - это комбинация битовых флагов, управляющих режимами чтения. Если аргумент flags равен нулю, то считанные данные удаляются из сокета. Если значение flags есть MSG_PEEK, то данные не удаляются и могут быть считаны последущим вызовом ( или вызовами ) recv.

Функция возвращает число считанных байтов или -1 в случае ошибки. Следует отметить, что нулевое значение не является ошибкой. Оно сигнализирует об отсутствии записанных в сокет процессом-поставщиком данных.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функция close Up: Работа с сокетами Previous: Функция recv   Contents   Index

Функция shutdown

Эта функция используется для немедленного закрытия всех или части связей на сокет.

Прототип:

int shutdown(int s, int how);

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Примеры Up: Работа с сокетами Previous: Функция shutdown   Contents   Index

Функция close

Эта функция закрывает сокет и разрывает все соединения с этим сокетом. В отличие от функции shutdown функция close.может дожидаться окончания всех операций с сокетом, обеспечивая "нормальное", а не аварийное закрытие соединений.

Прототип:

int close (int s);

Аргумент функции - закрываемый сокет-дескриптор.

Пример-оболочка программы "Клиент"

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define ADDRESS "mysocket" /* адрес для связи */
void main ()
{	char c;
	int i, s, len;
	FILE *fp;
	struct sockaddr_un sa;
/* получаем свой сокет-дескриптор: */
	if ((s = socket (AF_UNIX, SOCK_STREAM, 0))<0)
	{
	perror ("client: socket"); exit(1);
	}
/* создаем адрес, по которому будем связываться с сервером: */
	sa.sun_family = AF_UNIX;
	strcpy (sa.sun_path, ADDRESS);
/* пытаемся связаться с сервером: */
	len = sizeof ( sa.sun_family) + strlen ( sa.sun_path);
	if ( connect ( s, &sa, len) < 0 ){
		perror ("client: connect"); exit (1);
	}


/*--------------------------------------------- */

/* читаем сообщения сервера */
	fp = fdopen (s, "r");
	c = fgetc (fp);
/* обрабатываем информацию от сервера
 ...................................
*/

/* посылаем ответ серверу */
	send (s, "client", 7, 0);

/* продолжаем диалог с сервером, пока в этом есть
 необходимость
 ............................
*/

/* завершаем сеанс работы   */
	close (s);
	exit (0);
}

Пример-оболочка программы "Сервер"

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define ADDRESS "mysocket" /* адрес для связи */
void main ()
{ 	char c;
	int i, d, d1, len, ca_len;
	FILE *fp;
	struct sockaddr_un sa, ca;
/* получаем свой сокет-дескриптор: */
	if((d = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
	{
	 perror ("client: socket"); exit (1);
	}
/* создаем адрес, c которым будут связываться клиенты */
	sa.sun_family = AF_UNIX;
	strcpy (sa.sun_path, ADDRESS);
/*  связываем адрес с сокетом;
	уничтожаем файл с именем ADDRESS, если он существует,
	для того, чтобы вызов bind завершился успешно
*/
	unlink (ADDRESS);
	len = sizeof ( sa.sun_family) + strlen (sa.sun_path);
	if ( bind ( d, &sa, len) < 0 ) {
		perror ("server: bind"); exit (1);
	}
/* слушаем запросы на сокет */
	if ( listen ( d, 5) < 0 ) {
		perror ("server: listen"); exit (1);
	}
/* связываемся с клиентом через неименованный сокет с 	дескриптором d1:
*/
	if (( d1 = accept ( d, &ca, &ca_len)) < 0 ) {
		perror ("server: accept"); exit (1);
	}

/* ------------------------------------------ */

/* пишем клиенту: */
	send (d1, "server", 7, 0);

/* читаем запрос клиента */
	fp = fdopen (d1, "r");
	c = fgetc (fp);
/* ................................ */
/* обрабатываем запрос клиента,
 посылаем ответ и т.д.
   ...........................
*/

/* завершаем сеанс работы */
	close (d1);
	exit (0);
}



Alex Otwagin 2002-12-16

next up previous contents index
Next: Очереди сообщений Up: Механизмы межпроцессных взаимодействий Previous: Функция close   Contents   Index

Примеры



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Семафоры Up: Примеры Previous: Примеры   Contents   Index

Очереди сообщений

  /* Программа иллюстрирует
     возможности системного вызова msgget()
     (получение идентификатора очереди сообщений) */

  #include <stdio.h>
  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/sem.h>
  #include <errno.h>

  main ()
  {
    key_t key;        /* Тип описан как целое */
    int opperm, flags;    /* Права на операции и флаги */
    int msgflg, msqid;

    /* Ввести требуемый ключ */
    printf ("\nВведите шестнадцатеричный ключ: ");
    scanf ("%x", &key);

    /* Ввести права на операции */
    printf ("\nВведите права на операции ");
    printf ("в восьмеричной записи: ");
    scanf ("%o", &opperm);

    /* Установить требуемые флаги */
    printf ("\nВведите код, соответствущий ");
    printf ("нужной комбинации флагов:\n");
    printf ("  Нет флагов           = 0\n");
    printf ("  IPC_CREAT            = 1\n");
    printf ("  IPC_EXCL             = 2\n");
    printf ("  IPC_CREAT и IPC_EXCL = 3\n");
    printf ("  Выбор                = ");

    /* Получить флаги, которые нужно установить */
    scanf ("%d", &flags);

    /* Проверить значения */
    printf ("\nключ = 0x%x, права = 0%o, флаги = %d\n",
            key, opperm, flags);

    /* Объединить флаги с правами на операции */
  switch (flags) {
    case 0:     /* Флаги не устанавливать */
      msgflg = (opperm | 0);
      break;
    case 1:     /* Установить флаг IPC_CREAT */
      msgflg = (opperm | IPC_CREAT);
      break;
    case 2:     /* Установить флаг IPC_EXCL */
      msgflg = (opperm | IPC_EXCL);
      break;
    case 3:     /* Установить оба флага */
      msgflg = (opperm | IPC_CREAT | IPC_EXCL);
  }

  /* Выполнить системный вызов msgget */
  msqid = msgget (key, msgflg);

  if (msqid == -1) {
    /* Сообщить о неудачном завершении */
    printf ("\nmsgget завершился неудачей!\n"
    printf ("Код ошибки = %d\n", errno);
  }
  else
    /* При успешном завершении сообщить msqid */
    printf ("\nИдентификатор msqid = %d\n", msqid);

  exit (0);
  }



 /* Программа иллюстрирует
    возможности системного вызова msgctl()
    (управление очередями сообщений) */

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/ipc.h>
 #include <sys/msg.h>

 main ()
 {
   extern int errno;
   int msqid, command, choice, rtrn;
   struct msqid_ds msqid_ds, *buf;
   buf = &msqid_ds;

   /* Ввести идентификатор и действие */
   printf ("Введите идентификатор msqid: ");
   scanf ("%d", &msqid);

   printf ("Введите номер требуемого действия:\n");
   printf ("  IPC_STAT = 1\n");
   printf ("  IPC_SET  = 2\n");
   printf ("  IPC_RMID = 3\n");
   printf ("  Выбор    = ");
   scanf ("%d", &command);

   /* Проверить значения */
   printf ("идентификатор = %d, действие = %d\n",
           msqid, command);

   switch (command) {
     case 1: /* Скопировать информацию
                о состоянии очереди сообщений
                в пользовательскую структуру
                и вывести ее */
       rtrn = msgctl (msqid, IPC_STAT, buf);
       printf ("\n Идентификатор пользователя = %d\n",
               buf->msg_perm.uid);
       printf ("\n Идентификатор группы = %d\n",
               buf->msg_perm.gid);
       printf ("\n Права на операции = 0%o\n",
               buf->msg_perm.mode);
       printf ("\n Размер очереди в байтах = %d\n",
               buf->msg_qbytes);
       break;

     case 2: /* Выбрать и изменить поле (поля)
                 ассоциированной структуры данных */
       /* Сначала получить исходное значение
          структуры данных */
       rtrn = msgctl (msqid, IPC_STAT, buf);
       printf ("\nВведите номер поля, ");
       printf ("которое нужно изменить:\n");
       printf ("  msg_perm.uid  = 1\n");
       printf ("  msg_perm.gid  = 2\n");
       printf ("  msg_perm.mode = 3\n");
       printf ("  msg_qbytes    = 4\n");
       printf ("  Выбор         = ");
       scanf ("%d", &choice);

       switch (choice) {
         case 1:
           printf ("\nВведите ид-р пользователя: ");
           scanf ("%d", &buf->msg_perm.uid);
           printf ("\nИд-р пользователя = %d\n",
                   buf->msg_perm.uid);
           break;
         case 2:
           printf ("\nВведите ид-р группы: ");
           scanf ("%d", &buf->msg_perm.gid);
           printf ("\nИд-р группы = %d\n",
                   buf->msg_perm.uid);
           break;

         case 3:
           printf ("\nВведите восьмеричный код прав: ");
           scanf ("%o", &buf->msg_perm.mode);
           printf ("\nПрава на операции = 0%o\n",
                   buf->msg_perm.mode);
           break;

         case 4:
           printf ("\nВведите размер очереди = ");
           scanf ("%d", &buf->msg_qbytes);
           printf ("\nЧисло байт в очереди = %d\n",
                   buf->msg_qbytes);
           break;
       }

       /* Внести изменения */
       rtrn = msgctl (msqid, IPC_SET, buf);
       break;

    case 3: /* Удалить идентификатор и
               ассоциированные с ним очередь
               сообщений и структуру данных */
      rtrn = msgctl (msqid, IPC_RMID, NULL);
   }

   if (rtrn == -1) {
     /* Сообщить о неудачном завершении */
     printf ("\nmsgctl завершился неудачей!\n");
     printf ("\nКод ошибки = %d\n", errno);
   }

   else {
     /* При успешном завершении сообщить msqid */
     printf ("\nmsgctl завершился успешно,\n");
     printf ("идентификатор = %d\n", msqid);
   }

   exit (0);
 }


 /* Программа иллюстрирует
    возможности системных вызовов msgsnd() и msgrcv()
    (операции над очередями сообщений) */

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/ipc.h>
 #include <sys/msg.h>

 #define MAXTEXTSIZE 8192

 struct msgbufl {
   long mtype;
   char mtext [MAXTEXTSIZE];
 } sndbuf, rcvbuf, *msgp;

 main ()
 {
   extern int errno;
   int flag, flags, choice, rtrn, i, c;
   int rtrn, msqid, msgsz, msgflg;
   long msgtyp;
   struct msqid_ds msqid_ds, *buf;
   buf = &msqid_ds;

   /* Выбрать требуемую операцию */
   printf ("\nВведите код, соответствующий ");
   printf ("посылке или приему сообщения:\n");
   printf ("  Послать = 1\n");
   printf ("  Принять = 2\n");
   printf ("  Выбор   = ");
   scanf ("%d", &choice);

   if (choice == 1) {
     /* Послать сообщение */
     msgp = &sndbuf; /* Указатель на структуру */

     printf ("\nВведите идентификатор ");
     printf ("очереди сообщений,\n");
     printf ("в которую посылается сообщение: ");
     scanf ("%d", &msqid);

     /* Установить тип сообщения */
     printf ("\nВведите положительное число - ");
     printf ("тип сообщения: ");
     scanf ("%d", &msgp->mtype);

     /* Ввести посылаемое сообщение */
     printf ("\nВведите сообщение: \n");

     /* Управляющая последовательность CTRL+D
        завершает ввод сообщения */

     /* Прочитать символы сообщения
        и поместить их в массив mtext */
     for (i = 0; ((c = getchar ()) != EOF); i++)
       sndbuf.mtext [i] = c;

     /* Определить размер сообщения */
     msgsz = i + 1;

     /* Выдать текст посылаемого сообщения */
     for (i = 0; i < msgsz; i++)
       putchar (sndbuf.mtext [i]);

     /* Установить флаг IPC_NOWAIT, если это нужно */
     printf ("\nВведите 1, если хотите установить ");
     printf ("флаг IPC_NOWAIT: ");
     scanf ("%d", &flag);
     if (flag == 1)
       msgflg = IPC_NOWAIT;
     else
       msgflg = 0;

     /* Проверить флаг */
     printf ("\nФлаг = 0%o\n", msgflg);

     /* Послать сообщение */
     rtrn = msgsnd (msqid, msgp, msgsz, msgflg);
     if (rtrn == -1) {
       printf ("\nmsgsnd завершился неудачей!\n");
       printf ("Код ошибки = %d\n", errno);
     }
     else {
       /* Вывести результат; при успешном
          завершении он должен равняться нулю */
       printf ("\nРезультат = %d\n", rtrn);

       /* Вывести размер сообщения */
       printf ("\nРазмер сообщения = %d\n", msgsz);

       /* Опрос измененной структуры данных */
       msgctl (msqid, IPC_STAT, buf);

       /* Вывести изменившиеся поля */
       printf ("Число сообщений в очереди = %d\n",
               buf->msg_qnum);
       printf ("Ид-р последнего отправителя = %d\n",
               buf->msg_lspid);
       printf ("Время последнего отправления = %d\n",
               buf->msg_stime);
     }
   }

   if (choice == 2) {
     /* Принять сообщение */
     msgp = &rcvbuf;

     /* Определить нужную очередь сообщений */
     printf ("\nВведите ид-р очереди сообщений: ");
     scanf ("%d", &msqid);

     /* Определить тип сообщения */
     printf ("\nВведите тип сообщения: ");
     scanf ("%d", &msgtyp);

     /* Сформировать управляющие флаги
        для требуемых действий */
     printf ("\nВведите код, соответствущий ");
     printf ("нужной комбинации флагов:\n");
     printf ("  Нет флагов               = 0\n");
     printf ("  MSG_NOERROR              = 1\n");
     printf ("  IPC_NOWAIT               = 2\n");
     printf ("  MSG_NOERROR и IPC_NOWAIT = 3\n");
     printf ("  Выбор                    = ");
     scanf ("%d", &flags);

     switch (flags) {
       /* Установить msgflg как побитное ИЛИ
          соответствующих констант */
       case 0:
         msgflg = 0;
         break;
       case 1:
         msgflg = MSG_NOERROR;
         break;
       case 2:
         msgflg = IPC_NOWAIT;
         break;
       case 3:
         msgflg = MSG_NOERROR | IPC_NOWAIT;
         break;
     }

     /* Определить, какое число байт принять */
     printf ("\nВведите число байт, которое ");
     printf ("нужно принять (msgsz): ");
     scanf ("%d", &msgsz);

     /* Проверить значение аргументов */
     printf ("\nИдентификатор msqid = %d\n", msqid);
     printf ("Тип сообщения = %d\n", msgtyp);
     printf ("Число байт = %d\n", msgsz);
     printf ("Флаги = %o\n", msgflg);

     /* Вызвать msgrcv для приема сообщения */
     rtrn = msgrcv (msqid, msgp, msgsz, msgtyp, msgflg);

     if (rtrn == -1) {
       printf ("\nmsgrcv завершился неудачей!\n");
       printf ("Код oшибки = %d\n", errno);
     }
     else {
       printf ("\nmsgrcv завершился успешно,\n");
       printf ("идентификатор очереди = %d\n", msqid);

         /* Напечатать число принятых байт,
            оно равно возвращаемому значению */
         printf ("Принято байт: %d\n", rtrn);

         /* Распечатать принятое сообщение */
         for (i = 0; i < rtrn; i++)
           putchar (rcvbuf.mtext [i]);
     }

     /* Опрос ассоциированной структуры данных */
     msgctl (msqid, IPC_STAT, buf);

     printf ("\nЧисло сообщений в очереди = %d\n",
             buf->msg_qnum);
     printf ("Ид-р последнего получателя = %d\n",
             buf->msg_lrpid);
     printf ("Время последнего получения = %d\n",
             buf->msg_rtime);
   }

   exit (0);
 }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Разделяемые сегменты памяти Up: Примеры Previous: Очереди сообщений   Contents   Index

Семафоры

        /* Программа иллюстрирует
           возможности системного вызова semctl()
           (управление семафорами) */

        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/sem.h>

        #define MAXSETSIZE 25

        main ()
        {
          extern int errno;
          struct semid_ds semid_ds;
          int length, rtrn, i, c;
          int semid, semnum, cmd, choice;
          union semun {
            int val;
            struct semid_ds *buf;
            ushort array [MAXSETSIZE];
          } arg;

          /* Инициализация указателя на структуру данных */
          arg.buf = &semid_ds;

          /* Ввести идентификатор множества семафоров */
          printf ("Введите ид-р множества семафоров: ");
          scanf ("%d", &semid);

          /* Выбрать требуемое управляющее действие */
          printf ("\nВведите номер требуемого действия:\n");
          printf ("  GETVAL   = 1\n");
          printf ("  SETVAL   = 2\n");
          printf ("  GETPID   = 3\n");
          printf ("  GETNCNT  = 4\n");
          printf ("  GETZCNT  = 5\n");
          printf ("  GETALL   = 6\n");
          printf ("  SETALL   = 7\n");
          printf ("  IPC_STAT = 8\n");
          printf ("  IPC_SET  = 9\n");
          printf ("  IPC_RMID = 10\n");
          printf ("  Выбор    = ");
          scanf ("%d", &cmd);

          /* Проверить значения */
          printf ("идентификатор = %d, команда = %d\n",
                  semid, cmd);

          /* Сформировать аргументы и выполнить вызов */
          switch (cmd) {
            case 1:     /* Получить значение */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETVAL, 0);
              printf ("\nЗначение семафора = %d\n", rtrn);
              break;

            case 2:     /* Установить значение */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              printf ("\nВведите значение: ");
              scanf ("%d", &arg.val);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, SETVAL, arg.val);
              break;

            case 3:     /* Получить ид-р процесса */
             rtrn = semctl (semid, 0, GETPID, 0);
             printf ("\Последнюю операцию выполнил: %d\n",rtrn);
             break;

            case 4:    /* Получить число процессов, ожидающих
                          увеличения значения семафора */
              printf ("\nВведите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETNCNT, 0);
              printf ("\nЧисло процессов = %d\n", rtrn);
              break;

            case 5:    /* Получить число процессов, ожидающих
                          обнуления значения семафора */
              printf ("Введите номер семафора: ");
              scanf ("%d", &semnum);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, semnum, GETZCNT, 0
              printf ("\nЧисло процессов = %d\n", rtrn);
              break;

            case 6:    /* Опросить все семафоры */
              /* Определить число семафоров в множестве */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              length = arg.buf->sem_nsems;
              if (rtrn == -1)
                goto ERROR;
              /* Получить и вывести значения всех
                 семафоров в указанном множестве */
              rtrn = semctl (semid, 0, GETALL, arg.array);
              for (i = 0; i < length; i++)
                printf (" %d", arg.array [i]);
              break;

            case 7:    /* Установить все семафоры */
              /* Определить число семафоров в множестве */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              length = arg.buf->sem_nsems;
              if (rtrn == -1)
                goto ERROR;
              printf ("\nЧисло семафоров = %d\n", length);
              /* Установить значения семафоров множества */
              printf ("\nВведите значения:\n");
              for (i = 0; i < length; i++)
                scanf ("%d", &arg.array [i]);
              /* Выполнить системный вызов */
              rtrn = semctl (semid, 0, SETALL, arg.array);
              break;

            case 8:     /* Опросить состояние множества */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              printf ("\nИдентификатор пользователя = %d\n",
                      arg.buf->sem_perm.uid
              printf ("Идентификатор группы = %d\n",
                      arg.buf->sem_perm.gid);
              printf ("Права на операции = 0%o\n",
                      arg.buf->sem_perm.mode);
              printf ("Число семафоров в множестве = %d\n",
                      arg.buf->sem_nsems);
              printf ("Время последней операции = %d\n",
                      arg.buf->sem_otime);
              printf ("Время последнего изменения = %d\n",
                      arg.buf->sem_ctime);
              break;

            case 9:    /* Выбрать и изменить поле
                          ассоциированной структуры данных */
              /* Опросить текущее состояние */
              rtrn = semctl (semid, 0, IPC_STAT, arg.buf);
              if (rtrn == -1)
                goto ERROR;

              printf ("\nВведите номер поля, ");
              printf ("которое нужно изменить: \n");
              printf ("  sem_perm.uid  = 1\n");
              printf ("  sem_perm.gid  = 2\n");
              printf ("  sem_perm.mode = 3\n");
              printf ("  Выбор         = ");
              scanf ("%d", &choice);

              switch (choice) {
                case 1:         /* Изменить ид-р владельца */
                  printf ("\nВведите ид-р владельца: ");
                  scanf ("%d", &arg.buf->sem_perm.uid);
                  printf ("\nИд-р владельца = %d\n",
                          arg.buf->sem_perm.uid);
                  break;

                case 2:         /* Изменить ид-р группы */
                  printf ("\nВведите ид-р группы = ");
                  scanf ("%d", &arg.buf->sem_perm.gid);
                  printf ("\nИд-р группы = %d\n",
                          arg.buf->sem_perm.uid);
                  break;

                case 3:      /* Изменить права на операции */
                  printf ("\nВведите восьмеричный код прав: ");
                  scanf ("%o", &arg.buf->sem_perm.mode);
                  printf ("\nПрава = 0%o\n",
                          arg.buf->sem_perm.mode);
                  break;
              }

              /* Внести изменения */
              rtrn = semctl (semid, 0, IPC_SET, arg.buf);
              break;

            case 10:    /* Удалить ид-р множества семафоров и
                           ассоциированную структуру данных */
              rtrn = semctl (semid, 0, IPC_RMID, 0);
          }
          if (rtrn == -1) {
            /* Сообщить о неудачном завершении */
            ERROR:
            printf ("\nsemctl завершился неудачей!\n");
            printf ("\nКод ошибки = %d\n", errno);
          }
          else {
            printf ("\nmsgctl завершился успешно,\n");
            printf ("идентификатор semid = %d\n", semid);
          }

          exit (0);
        }



       /* Программа иллюстрирует
          возможности системного вызова semop()
          (операции над множеством семафоров) */


       #include <stdio.h>
       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

       #define MAXOPSIZE 10

       main ()
       {
         extern int errno;
         struct sembuf sops [MAXOPSIZE];
         int semid, flags, i, rtrn;
         unsigned nsops;

       /* Ввести идентификатор множества семафоров */
       printf ("\nВведите идентификатор множества семафоров,");
       printf ("\nнад которым будут выполняться операции: ");
       scanf ("%d", &semid);
       printf ("\nИд-р множества семафоров = %d", semid);

       /* Ввести число операций */
       printf ("\nВведите число операций ");
       printf ("над семафорами из этого множества: \n");
       scanf ("%d", &nsops);
       printf ("\nЧисло операций = %d", nsops);

       /* Инициализировать массив операций */
       for (i = 0; i < nsops; i++) {
         /* Выбрать семафор из множества */
         printf ("\nВведите номер семафора: ");
         scanf ("%d", &sops [i].sem_num);
         printf ("\nНомер = %d", sops [i].sem_num);

       /* Ввести число, задающее операцию */
       printf ("\nЗадайте операцию над семафором: ");
       scanf ("%d", &sops [i].sem_op);
       printf ("\nОперация = %d", sops [i].sem_op);

       /* Указать требуемые флаги */
       printf ("\nВведите код, ");
       printf ("соответствующий требуемым флагам:\n");
       printf ("  Нет флагов            = 0\n");
       printf ("  IPC_NOWAIT            = 1\n");
       printf ("  SEM_UNDO              = 2\n");
       printf ("  IPC_NOWAIT и SEM_UNDO = 3\n");
       printf ("  Выбор                 = ");
       scanf ("%d", &flags);

       switch (flags) {
         case 0:
           sops [i].sem_flg = 0;
           break;
         case 1:
           sops [i].sem_flg = IPC_NOWAIT;
           break;
         case 2:
           sops [i].sem_flg = SEM_UNDO;
           break;
         case 3:
           sops [i].sem_flg = IPC_NOWAIT | SEM_UNDO;
           break;
       }
       printf ("\nФлаги = 0%o", sops [i].sem_flg);
     }

     /* Распечатать все структуры массива */
     printf ("\nМассив операций:\n");
     for (i = 0; i < nsops; i++) {
       printf ("  Номер семафора = %d\n", sops [i].sem_num);
       printf ("  Операция = %d\n", sops [i].sem_op);
       printf ("  Флаги = 0%o\n", sops [i].sem_flg);
     }

     /* Выполнить системный вызов */
     rtrn = semop (semid, sops, nsops);
     if (rtrn == -1) {
       printf ("\nsemop завершился неудачей!\n");
       printf ("Код ошибки = %d\n", errno);
     }
     else {
       printf ("\nsemop завершился успешно.\n");
       printf ("Идентификатор semid = %d\n", semid);
       printf ("Возвращенное значение = %d\n", rtrn);
     }

     exit (0);
   }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа с сокетами Up: Примеры Previous: Семафоры   Contents   Index

Разделяемые сегменты памяти

        /* Программа иллюстрирует
           возможности системного вызова shmctl()
           (операции управления разделяемыми сегментами) */

        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        main ()
        {
          extern int errno;
          int rtrn, shmid, command, choice;
          struct shmid_ds shmid_ds, *buf;
          buf = &shmid_ds;

          /* Ввести идентификатор сегмента и действие */
          printf ("Введите идентификатор shmid: ");
          scanf ("%d", &shmid);

          printf ("Введите номер требуемого действия:\n");
          printf ("  IPC_STAT   = 1\n");
          printf ("  IPC_SET    = 2\n");
          printf ("  IPC_RMID   = 3\n");
          printf ("  SHM_LOCK   = 4\n");
          printf ("  SHM_UNLOCK = 5\n");
          printf ("  Выбор      = ");
          scanf ("%d", &command);

          /* Проверить значения */
          printf ("\nидентификатор = %d, действие = %d\n",
                  shmid, command);

          switch (command) {
            case 1:     /* Скопировать информацию
                           о состоянии разделяемого сегмента
                           в пользовательскую структуру
                           и вывести ее */

              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("\nИд-р пользователя = %d\n",
                      buf->shm_perm.uid);
              printf ("Ид-р группы пользователя = %d\n",
                      buf->shm_perm.gid);
              printf ("Ид-р создателя = %d\n",
                      buf->shm_perm.cuid);
              printf ("Ид-р группы создателя = %d\n",
                      buf->shm_perm.cgid);
              printf ("Права на операции = 0%o\n",
                      buf->shm_perm.mode);
              printf ("Последовательность номеров ");
                      buf->shm_perm.cgid);
              printf ("используемых слотов = 0%x\n",
                      buf->shm_perm.seq);
              printf ("Ключ = 0%x\n", buf->shm_perm.key);
              printf ("Размер сегмента = %d\n", buf->shm_segsz);
              printf ("Выполнил последнюю операцию = %d\n",
                      buf->shm_lpid);
              printf ("Создал сегмент = %d\n", buf->shm_cpid);
              printf ("Число присоединивших сегмент = %d\n",
                      buf->shm_nattch);
              printf ("Число удерживаюших в памяти = %d\n",
                      buf->shm_cnattch);
              printf ("Последнее присоединение = %d\n",
                      buf->shm_atime);
              printf ("Последнее отсоединение = %d\n",
                       buf->shm_dtime);
              printf ("Последнее изменение = %d\n",
                       buf->shm_ctime);
              break;

            case 2:     /* Выбрать и изменить поле (поля)
                           ассоциированной структуры данных */
              /* Получить исходные значения структуры данных */
              rtrn = shmctl (shmid, IPC_STAT, buf);
              printf ("Введите номер изменяемого поля:\n");
              printf ("  shm_perm.uid  = 1\n");
              printf ("  shm_perm.gid  = 2\n");
              printf ("  shm_perm.mode = 3\n");
              printf ("  Выбор         = ");
              scanf ("%d", &choice);

              switch (choice) {
                case 1:
                  printf ("\nВведите ид-р пользователя: "),
                  scanf ("%d", &buf->shm_perm.uid);
                  printf ("\nИд-р пользователя = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 2:
                  printf ("\nВведите ид-р группы: "),
                  scanf ("%d", &buf->shm_perm.gid);
                  printf ("\nИд-р группы = %d\n",
                          buf->shm_perm.uid);
                  break;

                case 3:
                  printf ("\nВведите восьмеричный код прав: ");
                  scanf ("%o", &buf->shm_perm.mode);
                  printf ("\nПрава на операции = 0%o\n",
                          buf->shm_perm.mode);
                  break;
              }

             /* Внести изменения */
             rtrn = shmctl (shmid, IPC_SET, buf);
             break;

          case 3:      /* Удалить идентификатор и
                          ассоциированную структуру данных */
            rtrn = shmctl (shmid, IPC_RMID, NULL);
            break;


          case 4:     /* Удерживать разделяемый сегмент
                         в памяти */
            rtrn = shmctl (shmid, SHM_LOCK, NULL);
            break;

          case 5:    /* Перестать удерживать сегмент в памяти */
            rtrn = shmctl (shmid, SHM_UNLOCK, NULL);
        }

        if (rtrn == -1) {
          /* Сообщить о неудачном завершении */
          printf ("\nshmctl завершился неудачей!\n");
          printf ("\nКод ошибки = %d\n", errno);
        }
        else {
          /* При успешном завершении сообщить ид-р shmid */
          printf ("\nshmctl завершился успешно, ");
          printf ("идентификатор shmid = %d\n", shmid);
        }

        exit (0);
      }



        /* Программа иллюстрирует
           возможности системных вызовов shmat() и shmdt()
           (операции над разделяемыми сегментами памяти) */
        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>

        main ()
        {
          extern int errno;
          int shmid, shmaddr, shmflg;
          int flags, attach, detach, rtrn, i;

          /* Цикл присоединений для данного процесса */
          printf ("\nВведите число присоединений ");
          printf ("для процесса (1-4): ");
          scanf ("%d", &attach);
          printf ("\nЧисло присоединений = %d\n", attach);

          for (i = 0; i < attach; i++) {
            /* Ввести идентификатор разделяемого сегмента */
            printf ("\nВведите ид-р разделяемого сегмента,\n");
            printf ("над которым нужно выполнить операции: ");
            scanf ("%d", &shmid);
            printf ("\nИд-р сегмента = %d\n", shmid);

            /* Ввести адрес присоединения */
            printf ("\nВведите адрес присоединения ");
            printf ("в шестнадцатеричной записи: ");
            scanf ("%x", &shmaddr);
            printf ("\nАдрес присоединения = 0x%x\n", shmaddr);

       /* Выбрать требуемые флаги */
       printf ("\nВведите номер нужной комбинации флагов:\n");
       printf ("  SHM_RND              = 1\n");
       printf ("  SHM_RDONLY           = 2\n");
       printf ("  SHM_RND и SHM_RDONLY = 3\n");
       printf ("  Выбор                = ");
       scanf ("%d", &flags);

       switch (flags) {
         case 1:
           shmflg = SHM_RND;
           break;
         case 2:
           shmflg = SHM_RDONLY;
           break;
         case 3:
           shmflg = SHM_RND | SHM_RDONLY;
           break;
       }
       printf ("\nФлаги = 0%o", shmflg);

       /* Выполнить системный вызов shmat */
       rtrn = shmat (shmid, shmaddr, shmflg);
       if (rtrn == -1) {
         printf ("\nshmat завершился неудачей!\n");
         printf ("\Код ошибки = %d\n", errno);
       }
       else {
         printf ("\nshmat завершился успешно.\n");
         printf ("Идентификатор shmid = %d\n", shmid);
         printf ("Адрес = 0x%x\n", rtrn);
       }
     }

     /* Цикл отсоединений для данного процесса */
     printf ("\nВведите число отсоединений ");
     printf ("для процесса (1-4): ");
     scanf ("%d", &detach);
     printf ("\nЧисло отсоединений = %d\n", detach);

     for (i = 0; i < detach; i++) {
       /* Ввести адрес отсоединения */
       printf ("\nВведите адрес отсоединяемого сегмента ");
       printf ("в шестнадцатеричной записи: ");
       scanf ("%x", &shmaddr);
       printf ("\nАдрес отсоединения = 0x%x\n", shmaddr);

       /* Выполнить системный вызов shmdt */
       rtrn = shmdt (shmaddr);
       if (rtrn == -1) {
         printf ("\nshmdt завершился неудачей!\n");
         printf ("\Код ошибки = %d\n", errno);
       }
       else {
         printf ("\nshmdt завершился успешно,\n");
         printf ("идентификатор shmid = %d\n", shmid);
       }
     }

     exit (0);
   }



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение в сети Up: Примеры Previous: Разделяемые сегменты памяти   Contents   Index

Работа с сокетами

Пример-оболочка программы "Клиент"

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define ADDRESS "mysocket" /* адрес для связи */
void main ()
{	char c;
	int i, s, len;
	FILE *fp;
	struct sockaddr_un sa;
/* получаем свой сокет-дескриптор: */
	if ((s = socket (AF_UNIX, SOCK_STREAM, 0))<0)
	{
	perror ("client: socket"); exit(1);
	}
/* создаем адрес, по которому будем связываться с сервером: */
	sa.sun_family = AF_UNIX;
	strcpy (sa.sun_path, ADDRESS);
/* пытаемся связаться с сервером: */
	len = sizeof ( sa.sun_family) + strlen ( sa.sun_path);
	if ( connect ( s, &sa, len) < 0 ){
		perror ("client: connect"); exit (1);
	}


/*--------------------------------------------- */

/* читаем сообщения сервера */
	fp = fdopen (s, "r");
	c = fgetc (fp);
/* обрабатываем информацию от сервера
 ...................................
*/

/* посылаем ответ серверу */
	send (s, "client", 7, 0);

/* продолжаем диалог с сервером, пока в этом есть
 необходимость
 ............................
*/

/* завершаем сеанс работы   */
	close (s);
	exit (0);
}

Пример-оболочка программы "Сервер"

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define ADDRESS "mysocket" /* адрес для связи */
void main ()
{ 	char c;
	int i, d, d1, len, ca_len;
	FILE *fp;
	struct sockaddr_un sa, ca;
/* получаем свой сокет-дескриптор: */
	if((d = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
	{
	 perror ("client: socket"); exit (1);
	}
/* создаем адрес, c которым будут связываться клиенты */
	sa.sun_family = AF_UNIX;
	strcpy (sa.sun_path, ADDRESS);
/*  связываем адрес с сокетом;
	уничтожаем файл с именем ADDRESS, если он существует,
	для того, чтобы вызов bind завершился успешно
*/
	unlink (ADDRESS);
	len = sizeof ( sa.sun_family) + strlen (sa.sun_path);
	if ( bind ( d, &sa, len) < 0 ) {
		perror ("server: bind"); exit (1);
	}
/* слушаем запросы на сокет */
	if ( listen ( d, 5) < 0 ) {
		perror ("server: listen"); exit (1);
	}
/* связываемся с клиентом через неименованный сокет с 	дескриптором d1:
*/
	if (( d1 = accept ( d, &ca, &ca_len)) < 0 ) {
		perror ("server: accept"); exit (1);
	}

/* ------------------------------------------ */

/* пишем клиенту: */
	send (d1, "server", 7, 0);

/* читаем запрос клиента */
	fp = fdopen (d1, "r");
	c = fgetc (fp);
/* ................................ */
/* обрабатываем запрос клиента,
 посылаем ответ и т.д.
   ...........................
*/

/* завершаем сеанс работы */
	close (d1);
	exit (0);
}



Alex Otwagin 2002-12-16

next up previous contents index
Next: Понятие о вычислительной сети Up: base Previous: Работа с сокетами   Contents   Index

Введение в сети



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Последовательное выполнение команд (символ Up: Специальные символы Previous: Специальные символы   Contents   Index

Запуск команды в фоновом режиме (символ &)

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

     command &

Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.

Когда вы запускаете команду в фоновом режиме, то система Linux выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду.

Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Концепции построения сети Up: Введение в сети Previous: Введение в сети   Contents   Index

Понятие о вычислительной сети



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Локальные вычислительные сети (ЛВС, Up: Понятие о вычислительной сети Previous: Понятие о вычислительной сети   Contents   Index

Концепции построения сети

Основное назначение компьютерных сетей - совместное использование ресурсов и осуществление интерактивной связи как внутри одной фирмы, так и за ее пределами. Ресурсы (resources) - это данные, приложения и периферийные устройства, такие, как внешний дисковод, принтер, мышь, модем или джойстик. Понятие интерактивной связи компьютеров подразумевает обмен сообщениями в реальном режиме времени.

До появления компьютерных сетей каждый пользователь должен был иметь свой принтер, плоттер и другие периферийные устройства. Чтобы совместно использовать принтер, существовал единственный способ - пересесть за компьютер, подключенный к этому принтеру. Сети позволяют целому ряду пользователей одновременно ``владеть'' данными на носителях прямого доступа и периферийными устройствами. Если нескольким пользователям надо распечатать документ, все они могут обратиться к сетевому принтеру.

Самая простая сеть (network) состоит как минимум из двух компьютеров, соединенных друг с другом кабелем. Это позволяет им использовать данные совместно. Все сети (независимо от сложности) основываются именно на этом простом принципе. Рождение компьютерных сетей было вызвано практической потребностью - иметь возможность для совместного использования данных. Персональный компьютер - прекрасный инструмент для создания документа, подготовки таблиц, графических данных и других видов информации, но при этом Вы не можете быстро поделиться своей информацией с другими. Когда не было сетей, приходилось распечатывать каждый документ, чтобы другие пользователи могли работать с ним, или в лучшем случае - копировать информацию на дискеты. Одновременная обработка документа несколькими пользователями исключалась. Подобная схема работы называется работой в автономной среде.

Сетью называется группа соединенных компьютеров и других устройств. А концепция соединенных и совместно использующих ресурсы компьютеров носит название сетевого взаимодействия. Компьютеры, входящие в сеть, могут совместно использовать:

Данный список постоянно пополняется, так как возникают новые способы совместного использования ресурсов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Расширенные и глобальные ВС Up: Понятие о вычислительной сети Previous: Концепции построения сети   Contents   Index

Локальные вычислительные сети (ЛВС, LAN)

Первоначально компьютерные сети были небольшими и объединяли до десяти компьютеров и один принтер. Технология передачи данных ограничивала размеры сети, в том числе количество компьютеров в сети и ее физическую длину. Например, в начале 1980-х годов наиболее популярный тип сетей состоял не более чем из 30 компьютеров, а длина кабеля не превышала 185 м (600 футов). Такие сети легко располагались в пределах одного этажа здания или небольшой организации. Для маленьких фирм подобная конфигурация подходит и сегодня. Эти сети называются локальными вычислительными сетями [ЛВС (LAN)].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Два типа ЛВС - Up: Понятие о вычислительной сети Previous: Локальные вычислительные сети (ЛВС,   Contents   Index

Расширенные и глобальные ВС (WAN)

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Одноранговые сети Up: Понятие о вычислительной сети Previous: Расширенные и глобальные ВС   Contents   Index

Два типа ЛВС - одноранговые сети и сети с выделенным сервером

Все сети имеют некоторые общие компоненты, функции и характеристики. В их числе

Несмотря на определенные сходства, сети разделяются на два типа:

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Сети с выделенным сервером Up: Два типа ЛВС - Previous: Два типа ЛВС -   Contents   Index

Одноранговые сети

В одноранговой сети все компьютеры равноправны: нет иерархии среди компьютеров и нет выделенного (dedicated) сервера. Как правило, каждый компьютер функционирует и как клиент, и как сервер; иначе говоря, нет отдельного компьютера, ответственного за администрирование всей сети. Все пользователи самостоятельно решают, что на своем компьютере можно сделать общедоступным по сети и кому.


Размеры.

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


Стоимость.

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


Операционные системы.

В одноранговой сети требования к производительности и к уровню зашиты для сетевого программного обеспечения, как правило, ниже, чем в сетях с выделенным сервером. Выделенные серверы функционируют исключительно в качестве серверов. UNIX/Linux поддерживают одноранговые сети используя сетевую файловую систему NFS, а также сервис сети LAN server (smb).

Одноранговая сеть характеризуется рядом стандартных решений:


Целесообразность применения.

Одноранговая сеть вполне подходит там, где:

Если эти условия выполняются, то, скорее всего, выбор одноранговой сети будет правильным (чем сети на основе сервера).


Некоторые соображения.

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


Администрирование.

Сетевое администрирование (administration) решает ряд задач, в том числе:

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


Разделяемые ресурсы.

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


Требования к серверу.

В одноранговой сети каждый компьютер должен:

Сеть на основе сервера требует более мощных серверов, поскольку они должны обрабатывать запросы всех клиентов сети.


Защита.

Элементарная защита подразумевает установку пароля на разделяемый ресурс, например на каталог. Централизованно управлять защитой в одноранговой сети очень сложно, так как каждый пользователь устанавливает ее самостоятельно, да и ``общие'' ресурсы могут находиться на всех компьютерах, а не только на центральном сервере. Такая ситуация представляет серьезную угрозу для всей сети, кроме того, некоторые пользователи могут вообще не установить защиту. Если для Вас вопросы конфиденциальности являются принципиальными, рекомендуем выбрать сеть на основе сервера.


Подготовка пользователя.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевые топологии Up: Два типа ЛВС - Previous: Одноранговые сети   Contents   Index

Сети с выделенным сервером

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

С увеличением размеров сети и объема сетевого трафика необходимо увеличивать количество серверов. Распределение задач среди нескольких серверов гарантирует, что каждая задача будет выполняться самым эффективным способом из всех возможных.


Специализированные серверы.

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

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


Значение программного обеспечения.

Сетевой сервер - это прежде всего программное обеспечение, а не компьютерное железо. В среде современных операционных систем UNIX/Linux и OS/2 сервер представляет собой программу, выполняющуюся от имени некоторого пользователя, и не являющуюся частью оперционной системы. Это стало возможным вследствие хорошо продуманного модульного дизайна как самой ОС, так и интерфейсов OC-приложение. В принципе любой пользователь, владеющий необходимыми знаниями в области сетей и прикладного программирования, может написать полноценный сервер без того, чтобы вникать в недра ядра, драйверов и остальных дебрей ОС.


Разделение ресурсов.

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


Защита.

Одним из основных аргументов выбора сети на основе сервера является, как правило, безопасность данных.


Резервное копирование данных.

Поскольку жизненно важная информация расположена централизованно, т.е. сосредоточена на одном или нескольких серверах, несложно обеспечить ее регулярное резервное копирование (backup).


Избыточность.

Данные дублируются в реальном времени аппаратно-программными средствами сервера. Это гарантирует, что в случае повреждения основной области хранения данных информация не будет потеряна.


Количество пользователей.

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


Аппаратное обеспечение.

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


Комбинированные сети.

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

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

Тем не менее, комбинированные сети - наиболее распространенный тип сетей, но для их правильной реализации и надежной защиты необходимы определенные знания и навыки планирования.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Шина (Bus) Up: Введение в сети Previous: Сети с выделенным сервером   Contents   Index

Сетевые топологии

Термин ``топология'', или ``топология сети'', характеризует физическое расположение компьютеров, кабелей и других компонентов сети. Кроме термина ``топология'', иногда для описания физической компоновки употребляют также термины «физическое расположение», «компоновка», «диаграмма», «карта». Топология сети обуславливает ее характеристики. В частности, выбор той или иной топологии влияет на состав необходимого сетевого оборудования, на характеристики сетевого оборудования, на возможности расширения сети и способ управления сетью.

Чтобы совместно использовать ресурсы или выполнять другие сетевые задачи компьютеры должны быть подключены друг к другу. Для этой цели в большинстве сетей применяется кабель. Топология определяет способ взаимодействия компьютеров в сети. Различным видам топологий соответствуют различные методы взаимодействия, и эти методы оказывают большое влияние на сеть.


Базовые топологии

0.1mm
\begin{picture}(1340,511)
\put(198,311){\circle{80}}
\put(198,351){\line(0,1){10...
...{\line(0,1){40}}
\put(78,11){a)}
\put(498,11){b)}
\put(978,11){c)}
\end{picture}

Рис. 1. Сетевые топологии. a - звезда, b - кольцо, c - шина.

Существуют три основные сетевые топологии:

Звездообразная сеть, звезда (star).
В этом случае рабочие станции соединены напрямую с компьютером, выполняющим объединяющие функции в сети. Это может быть файл-сервер или хост-компьютер.
Кольцевая сеть, кольцо (ring).
Все компьютеры в сети увязаны друг с другом в кольце, при этом сообщение передающей станции прежде чем достигнет адресата может пройти через множество других.
Шинная сеть, шина (bus)
Все компьютеры сети подключены к центральному кабелю (иногда называемому магистраль или шина).

Хотя сами по себе базовые топологии несложны, в реальности часто встречаются довольно сложные комбинации, объединяющие свойства нескольких топологий.

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

0.1mm
\begin{picture}(1128,318)
\put(148,248){\circle{60}}
\put(148,28){\circle{60}}
\...
...{40}}
\put(658,248){\line(3,2){40}}
\put(658,38){\line(3,2){36}}
\end{picture}

Рис. 2. Топологии: тетраэдр, куб, полносвязная.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Звезда (Star) Up: Сетевые топологии Previous: Сетевые топологии   Contents   Index

Шина (Bus)

Топологию ``шина'' часто называют ``линейной шиной'' (linear bus). Данная топология относится к наиболее простым и широко распространенным топологиям. В ней используется один кабель, именуемый магистралью или сегментом, вдоль которого под ключены все компьютеры сети. В сети с топологией ``шина'' компьютеры адресуют данные конкретному компьютеру, передавая их по кабелю в виде электрических сигналов. Чтобы понять процесс взаимодействия компьютеров по шине, Вы должны уяснить следующие понятия:


Передача сигнала

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

Так как данные в сеть передаются лишь одним компьютером, ее производительность зависит от количества компьютеров, подключенных к шине. Чем их больше, т.е. чем больше компьютеров, ожидающих передачи данных, тем медленнее сеть. Однако вывести прямую зависимость между пропускной способностью сети и количеством компьютеров в ней нельзя. Ибо, кроме числа компьютеров, на быстродействие сети влияет множество факторов, в том числе:

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


Отражение сигнала

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


Терминатор

Чтобы предотвратить отражение электрических сигналов, на каждом конце кабеля устанавливают терминаторы (terminators), поглощающие эти сигналы. Все концы сетевого кабеля должны быть к чему-нибудь подключены, например, к компьютеру или к баррел-коннектору - для увеличения длины кабеля. К любому свободному - неподключенному - концу кабеля должен быть подсоединен терминатор, чтобы предотвратить отражение электрических сигналов.


Нарушение целостности сети

Разрыв сетевого кабеля происходит при его физическом разрыве или отсоединен одного из его концов. Возможна также ситуация, когда на одном или нескольких концах кабеля отсутствуют терминаторы, что приводит к отражению электрических сигналов в кабеле и прекращению функционирования сети. Сеть «падает». Сами по себе компьютеры в сети остаются полностью работоспособными, но до тех пор, пока сегмент разорван, они не могут взаимодействовать друг с другом.


Расширение ЛВС

Увеличение участка, охватываемого сетью, вызывает необходимость ее расширения. В сети с топологией ``шина'' кабель обычно удлиняется двумя способами.

  1. Для соединения двух отрезков кабеля можно воспользоваться баррел-коннектором (barrel connector). Но злоупотреблять ими не стоит, так как сигнал при этом ослабевает. Лучше купить один длинный кабель, чем соединять несколько коротких отрезков. При большом количестве ``стыковок'' нередко происходит искажение сигнала.

  2. Для соединения двух отрезков кабеля служит репитер (repeater). В отличие от коннектора, он усиливает сигнал перед передачей его в следующий сегмент. Поэтому предпочтительнее использовать репитер, чем баррел-коннектор или даже один длинный кабель: сигналы на большие расстояния пойдут без искажений.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Кольцо (Ring) Up: Сетевые топологии Previous: Шина (Bus)   Contents   Index

Звезда (Star)

Это самая старая топология сетевых вычислений. При топологии ``звезда'' все компьютеры с помощью сегментов кабеля подключаются к одному центральному компьютеру или кластеру.

В настоящее время часто говорят о топологии «Звезда» имея в виду звездообразное географическое расположение компьютеров, при том, что реальная топология не имеет с географией ничего общего. В этом случае в качестве центрального компьютера выступает пассивное с точки зрения обработки данных, устройство, именуемому концентратором (hub). Топология определяет не географическое расположение компьютеров, а пути и порядок прохождения данных. Звезда отличается тем, что не предоставляет возможности двум компьютерам в сети обмениваться данными иначе, чем с помощью посредника - центрального компьютера. Подмена терминологии возникла в связи с появлением ПК и агрессивным продвижением вычислительных технологий, отрицающих центральный элемент вычислительной сети, и основанных на одноранговых моделях вычислений.

В сетях с топологией «звезда» подключение кабеля и управление конфигурацией сети централизованы. Но есть и недостаток: так как все компьютеры подключены к центральному компьютеру (хост-компьютер), для больших сетей значительно увеличивается расход кабеля. К тому же, если центральный компьютер выйдет из строя, нарушится работа всей сети. В обмене данными между двумя компьютерами всегда участвует центральный - хост-компьютер. Данные компьютера-отправителя сначала достигают хост-компьютера, затем транслируются последним компьютеру-получателю. На первый взгляд данная топология кажется не слишком удобной, однако в данном случае несколько компьютеров в сети могут вести передачу данных одновременно, в то время как шинная топология и топология маркерного кольца в каждый момент времени выделяют только один компьютер, которому позволено передавать данные.

А если выйдет из строя только один компьютер (или кабель, соединяющий его с концентратором), то лишь этот компьютер не сможет передавать или принимать данные по сети. На остальные компьютеры в сети это не повлияет.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Отмена специального значения (метасимвол Up: Специальные символы Previous: Запуск команды в фоновом   Contents   Index

Последовательное выполнение команд (символ ;)

В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд):

     command1; command2; command3

Система Linux выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.

Например, введите:

        cd; pwd; ls
shell выполнит эти команды последовательно:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Комбинированные топологии Up: Сетевые топологии Previous: Звезда (Star)   Contents   Index

Кольцо (Ring)

При топологии ``кольцо'' компьютеры подключаются к кабелю, замкнутому в кольцо. Поэтому у кабеля просто не может быть свободного конца, к которому надо подключать терминатор. Сигналы передаются по кольцу в одном направлении и проходят через каждый компьютер. В отличие от пассивной топологии «шина», здесь каждый компьютер выступает в роли репитера, усиливая сигналы и передавая их следующему компьютеру. Поэтому, если выйдет из строя один компьютер, функционирование сети может нарушиться. В реальной ситуации этого не случается, поскольку подсоединение узла к кольцу выполняется специальным образом.


Передача маркера

Один из принципов передачи данных в кольцевой сети носит название передачи маркера (token). Суть его такова. Маркер последовательно, от одного компьютера к другому, передается до тех пор, пока его не получит тот, который ``хочет'' передать данные. Передающий компьютер изменяет маркер, помещает электронный адрес в данные и посылает их по кольцу.

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

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


Концентраторы (hub)

В настоящее время одним из стандартных компонентов сетей становится концентратор. Концентратор

Активные концентраторы

Среди концентрпторов выделяются активные (active hub) и пассивные (passive hub). Активные концентраторы регенерируют и передают сигналы так же, как это делают повторители сигнала - репитеры (repeater). Иногда их называют многопортовыми репитерами. С помощью активного хаба можно подключить дополнительные узлы в сеть или увеличить расстояние между узлами.

Пассивные концентраторы

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

Гибридные концентраторы

Гибридные концентраторы (hybrid) позволяют подключать кабели различных типов. Сети на основе концентраторов легко расширяются за счет подключения дополнительных концентраторов.

Некоторые соображения

Использование концентраторов дает ряд преимуществ. Разрыв кабеля в сети с обычной топологией «линейная шина» приведет к падению всей сетинию. Между тем разрыв кабеля, подключеного к концентратору нарушит работу только данного сегмента. Остальные сегменты останутся работоспособными.

К числу других преимуществ использования концентраторов относятся:


Коммутаторы (Switches)

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Физическая среда передачи Up: Сетевые топологии Previous: Кольцо (Ring)   Contents   Index

Комбинированные топологии

В настоящее время чаще всего используются топологии, которые комбинируют топологию сети по принципу шины, звезды и кольца.


Звезда-шина

Звезда-шина (star-bus) - это комбинация топологий «шина» и «звезда». Чаще всего это выглядит так: несколько сетей с топологией ``звезда'' объединяются при помощи магистральной линейной шины. В этом случае выход из строя одного компьютера не оказывает никакого влияния на сеть - остальные компьютеры по-прежнему взаимодействуют друг с другом. А выход из строя концентратора повлечет за собой остановку подключенных к нему компьютеров и концентраторов.


Звезда-кольцо

Звезда-кольцо (star-ring) кажется несколько похожей на звезду-шину. И в той, и в другой топологии компьютеры подключены к концентратору, который фактически и формирует кольцо или шину. Отличие в том, что концентраторы в звезде-шине соединены магистральной линейной шиной, а в звезде-кольце на основе главного концентратора они образуют звезду.


Выбор топологии

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

Топология Преимущества Недостатки
1emШина

Экономный расход кабеля. Сравнительно недорогая и несложная в использовании среда передачи. Простота, надежность. Легко расширяется.

При значительных объемах трафика уменьшается пропускная способноси сети. Трудно локализовать проблемы. Выход из строя кабеля останавливает работу многих пользователей.

1emКольцо

Все компьютеры имеют равный доступ. Количество пользователей не оказывает сколько-нибудь значительного влияния нa производительность.

Выход из строя одного компьютерам может вывести из строя всю сеть. Трудно локализовать проблемы. Изменение конфигурации сети требует остановки работы всей сети

1emЗвезда

Легко модифицировать сеть, добавляя новые компьютеры. Централизованный контроль и управление. Выход из строя одного компьютера не влияет на работоспособность сети.

Выход из строя центрального узла выводит из строя всю сеть.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Кабель Up: Введение в сети Previous: Комбинированные топологии   Contents   Index

Физическая среда передачи



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: коаксиальный кабель (Coax) Up: Физическая среда передачи Previous: Физическая среда передачи   Contents   Index

Кабель


Основные группы кабелей

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Витая пара (Twisted Pair) Up: Кабель Previous: Кабель   Contents   Index

коаксиальный кабель (Coax)

Коаксиальный кабель бывает двух видов: тонкий и толстый.


Тонкий (thin) коаксиальный кабель

Тонкий (thin) коаксиальный кабель способен передавать сигнал на расстояние до 180 м (около 607 футов) без его заметного искажения, вызванного затуханием. Производители оборудования выработали специальную маркировку для различных типов кабелей. Тонкий коаксиальный кабель относится к группе, которая называется семейством RG-58, его волновое сопротивление равно 50 Ом. Волновое сопротивление (impedance) - это электромагнитная характеристика, определяющая сопротивление кабеля переменному току рабочей частоты кабеля. Волновое сопротивление не зависит от длины коаксиального кабеля и полностью определяется его конструкцией. Основная отличительная особенность этого семейства - медная жила. Она может быть сплошной или состоять из нескольких переплетенных проводов.

Кабель Описание  
1emRG-58 /U Сплошная медная жила  
RG-58 A/U Переплетенные провода  
RG-58 C/U Военный стандарт для RG-58 A/U  
RG-59 Используется для широкополосной передачи (например, в кабельном телевидении)  
RG-6 Имеет больший диаметр по сравнению с RG-59, предназначен для более высоких частот, но может применяться и для широкополосной передачи  
RG-62 Используется в сетях ArcNet  


Толстый коаксиальный кабель

Толстый (thick) коаксиальный кабель - относительно жесткий кабель с диаметром около 1 см (около 0,5 дюймов). Иногда его называют «стандартный Ethernet», посколь ку он был первым типом кабеля, применяемым в Ethernet - популярной сетевой архитектуре. Медная жила этого кабеля толще, чем у тонкого коаксиального кабеля.

Чем толще жила у кабеля, тем большее расстояние способен преодолеть сигнал. Следовательно, толстый коаксиальный кабель передает сигналы дальше, чем тонкий, - до 500 м (около 1640 футов). Поэтому толстый коаксиальный кабель иногда используют в качестве основного кабеля [магистрали (backbone)], который соединяет несколько небольших сетей, построенных на тонком коаксиальном кабеле. Для подключения к толстому коаксиальному кабелю применяют специальное устройство - трансивер к (transceiver).

Трансивер снабжен специальным коннектором, который назван весьма впечатляюще -``зуб вампира'' (vampire tap) или ``пронзающий ответвитель''(piercing tap). Этот зуб проникает через изоляционный слой и вступает в непосредственный физический контакт с проводящей жилой. Чтобы подключить трансивер к сетевому адаптеру, надо кабель трансивера подключить к коннектору AUI-порта сетевой платы. Этот коннектор известен также как DIX-коннектор (Digital Intel Xerox), в соответствии с названиями фирм-разработчиков, или коннектор DB-15.


Сравнение двух типов коаксиальных кабелей

Как правило, чем толще кабель, тем сложнее с ним работать. Тонкий коаксиальный кабель гибок, прост в установке и относительно недорог. Толстый кабель трудно гнуть, и, следовательно, его сложнее устанавливать. Это очень существенный недостаток, особенно если необходимо проложить кабель по трубам или желобам. Толстый коаксиальный кабель дороже тонкого, но при этом он передает сигналы на большие расстояния.


Оборудование для подключения коаксиального кабеля

Для подключения тонкого коаксиального кабеля к компьютеру используются называемые ВМС-коннекторы (British Naval Connector, BNC). В семействе BNC несколько основных компонентов:


Классы коаксиальных кабелей и требования пожарной безопасности

Выбор того или иного класса коаксиальных кабелей зависит от того, где этот кабель будет прокладываться. Существует два класса коаксиальных кабелей:

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

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

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

При прокладке сетевого кабеля следует следовать строительным ГОСТ'ам и СНИП'ам, в которых учтены требования пожарной и электрической безопасности.


Некоторые соображения

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


next up previous contents index
Next: Витая пара (Twisted Pair) Up: Кабель Previous: Кабель   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: оптоволоконный кабель (fiber optics) Up: Кабель Previous: коаксиальный кабель (Coax)   Contents   Index

Витая пара (Twisted Pair)

Самая простая витая пара (twisted pair) - это два перевитых вокруг друг друга изолированных медных провода. Существует два типа тонкого кабеля: неэкранированная (unshielded) витая пара (UTP) и экранированная (shielded) витая пара (STP).

Несколько витых пар часто помещают в одну защитную оболочку. Их количество в таком кабеле может быть разным. Завивка проводов позволяет избавиться от электрических помех, наводимых соседними парами и другими источниками, например двигателями, реле и трансформаторами.


Неэкранированная витая пара

Неэкранированная витая пара (спецификация lOBaseT) широко используется в ЛВС, максимальная длина сегмента составляет 100 м (328 футов). Неэкранированная витая пара состоит из двух изолированных медных проводов. Существует несколько спецификаций, которые регулируют количество витков на единицу длины - в зависимости от назначения кабеля. Во многих странах UTP также используется в телефонных сетях.

Неэкранированная витая пара определена в особом стандарте - Electronic Industries Association and the Telecommunications Industries Association (EIA/T1A) 568 Commercial Building Wiring Standart.

EIA/T1A 568 на основе UTP устанавливает стандарты для различных случаев, гарантируя единообразие продукции. Эти стандарты включают пять категорий UTP.

[Категория 1] Традиционный телефонный кабель, по которому можно передавать только речь, но не данные. Большинство телефонных кабелей, произведенных до 1983 года, относится к категории 1.

[Категория 2] Кабель, способный передавать данные со скоростью до 4 Мбит/с. Состоит из четырех витых пар.

[Категория 3] Кабель, способный передавать данные со скоростью до 10 Мбит/с. Состоит из четырех витых пар с девятью витками на метр.

[Категория 4] Кабель, способный передавать данные со скоростью до 16 Мбит/с. Состоит из четырех витых пар.

[Категория 5] Кабель, способный передавать данные со скоростью до 100 Мбит/с. Состоит из четырех витых пар медного провода.

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

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


Экранированная витая пара

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


Компоненты кабельной системы

Для построения развитой кабельной системы и упрощения работы с ней используется ряд компонентов:



Alex Otwagin 2002-12-16

next up previous contents index
Next: передача сигналов Up: Кабель Previous: Витая пара (Twisted Pair)   Contents   Index

оптоволоконный кабель (fiber optics)


Оптоволоконный кабель

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

Оптическое волокно - чрезвычайно тонкий стеклянный цилиндр, называемый жилой (core), покрытый слоем стекла, называемого оболочкой, с иным, чем у жилы, коэффицентом преломления. Иногда оптоволокно производят из пластика. Пластик проще в использовании, но он передает световые импульсы на меньшие расстояния по сравнению со стеклянным оптоволокном. Каждое стеклянное оптоволокно передает сигналы только в одном направлении, поэтому кабель состоит из двух волокон с отдельными коннекторами. Одно из них служит для передачи, а другое - для приема. Жесткость волокон увеличивается покрытием из пластика, а прочность - волокнами из кевлара.

Передача по оптоволоконному кабелю не подвержена электрическим помехам и ведется на чрезвычайно высокой скорости (в настоящее время до нескольких Гбит/с, теоретически возможная скорость - 200000 Мбит/с). По нему можно передавать световой импульс на многие километры. Более всего оптоволоконный кабель подходит для передачи данных с очень высокой скоростью и по надежной (защищенной) среде передачи.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Кабельная система IBM Up: Кабель Previous: оптоволоконный кабель (fiber optics)   Contents   Index

передача сигналов

Для передачи по кабелю кодированных сигналов используют две технологии: узкополосную передачу и широкополосную передачу.


Узкополосная передача (baseband)

Узкоополосные системы передают данные в виде цифрового сигнала частоты. Сигналы представляют собой дискретные электрические или световые импульсы. При таком способе вся емкость коммуникационного канала используется для передачи одного импульса, или, другими словами, цифровой сигнал использует всю полосу пропускания кабеля. Полоса пропускания - это разница между максимальной и минимальной частотой, которая может быть передана по кабелю. Каждое устройство в сетях с узкополосной передачей посылает данные в обоих направлениях, а некоторые могут одновременно и передавать их, и принимать.

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


Широкополосная передача

Широкополосные (broadband) системы передают данные в виде аналогового сигнала, который использует некоторый интервал частот. Сигналы представляют собой непрерывные (а не дискретные) электромагнитные или оптические волны. При таком способе сигналы передаются по физической среде в одном направлении.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сравнение кабелей Up: Физическая среда передачи Previous: передача сигналов   Contents   Index

Кабельная система IBM

IBM разработала собственную кабельную систему, со своими номерами, стандарми, спецификациями и назначениями. Многие из этих параметров близки к спецификациям других разработчиков. Кабельная система IBM была представлена в 1984 году. Она определила следующие компоненты:

Уникальным компонентом стал соединитель кабеля. Он отличается от стандартного BNC-коннектора и других соединителей тем, что является не папой, не мамой, а «гермафродитом»: любые два можно соединить друг с другом. Эти соединители требуют использования лицевых щитов и распределительных панелей специальной конструкции.

Кабельная система IBM классифицирует кабели по типам. Например, кабель категории 3 (речевая UTP) в терминах IBM представляет собой тип 3. Классификация помогает выбрать тот кабель, который в наибольшей степени подходит к конкретным условиям.

Одной из физических характеристик кабеля является его толщина, для обозначения которой обычно используют величину, называемую «калибр» (gage). Калибр измеряется в единицах AWG. AWG - это система измерений, определяющая толщину проводов. Чем больше толщина провода, тем меньше его AWG-номер. В качестве точки отсчета часто используют толщину телефонного провода. Она равна 22 AWG. Следовательно, провод толщиной 14 AWG толще телефонного, провод толщиной 26 AWG - тоньше.


Классификация кабелей IBM

1emТип Стандартное наименование Описание
Тип 1 Экранированная витая пара (STP) Две пары проводов 22 AWG, покрытых плетеным экраном - для компьютеров и модулей множественного доступа (MAU)
Тип 2 Кабель для передачи речи и данных Экранированный кабель для передачи речи и данных; состоит из двух витых пар проводов 22 AWG, заключенных в экранирующую оплетку, - для передачи данных, из четырех витых пар проводов 26 AWG - для передачи речи
Тип 3 Кабель для передачи речи Неэкранированный кабель для передачи речи; состоит из четырех витых пар проводов 22 или 24 AWG со сплошной жилой
Тип 4 Еще не определен  
Тип 5 Оптоволоконный кабель Два 62,5/125-микронных оптоволокна - промышленный стандарт
Тип 6 Комутационный кабель Две витые пары проводов 26 AWG с двойным слоем фольги и оплеткой
Тип 7 Еще не определен  
Тип 8 Ковровый кабель Имеет плоский соединитель для прокладки под коврами. Две витые пары проводов 26 AWG. Длина кабеля не превышает половину длины кабеля типа 1
Тип 9 Пленумный Огнеупорный. Две экранированные витые пары проводов


Выбор кабеля

Чтобы выбрать наиболее подходящий тип кабеля, следует иметь в виду следующие моменты:

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

При покупке кабеля (как, впрочем, и любых других сетевых компонентов) в ряде случаев можно найти компромисс между его стоимостью и характеристиками. Однако, надо иметь в виду, что в случае выбора относительно дешевого кабеля с учетом текущей нагрузки дальнейшее развитие сети будет существенно ограничено. Практика реальной эксплуатации сетей показывает, что экономия на кабельной системе приводит в конце концов к ощутимым потерям. Если срок обновления персональных компьютеров в корпорациях и фирмах не превышает трех лет, то кабельные системы делаются на десятки лет, что связано с проведением строительно-монтажных работ с привлечением персонала высокой квалификации. За редким исключением почти всю стоимость кабельной системы составляет человеческий труд и налоги (стоимость материалов обычно не превышает 10..15 % стоимости всей КС в развитых странах Европы и Северной Америке, в Беларуси - 30..40 %). В связи с этим имеет смысл сразу строить КС с прицелом на 10-15 лет вперед прогнозируя рост как количества узлов сети, так и изменение состава и объема удельного траффика.

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


next up previous contents index
Next: Сравнение кабелей Up: Физическая среда передачи Previous: передача сигналов   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Беспроводные сети Up: Физическая среда передачи Previous: Кабельная система IBM   Contents   Index

Сравнение кабелей

1.4emХарактеристика Тонкий коаксиальный кабель (10Base2) Толстый коаксиальный кабель (10Base5)
1.4emСтоимость Дороже витой пары Дороже тонкого коаксиального кабеля
1.4emЭффективная длина кабеля7.1 185 м (около 607 футов) 500 м (около 1640 футов)
1.4emСкорость передачи7.2 10 Мбит/с 10 Мбит/с
1.4emГибкость Довольно гибкий Менее гибкий
1.4emПростота установки Прост в установке Прост в установке
1.4emПодверженность помехам Хорошая защита от помех Хорошая защита от помех
1.4emОсобые свойства Электронные компоненты дешевле, чем у витой пары Электронные компоненты дешевле, чем у витой пары

1.4emРекомендуемое применение Средние или большие сети с высокими требованиями к защите данных Средние или большие сети с высокими требованиями к защите данных


Резюме

Выбор адекватного сетевого кабеля зависит от ряда факторов, в число которых входят простота установки, экранирование, требования к уровню защите, скорость передачи (в Мбит/с) и затухание сигнала. Существует три основные группы кабелей: коаксиальный кабель, витая пара и оптоволоконный кабель.

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

Витая пара может быть экранированной и неэкранированной. Неэкранированная витая пара (UTP) делится на пять категорий, из которых пятая наиболее популярная в сетях. Экранированная витая пара (STP) поддерживает передачу сигналов на более высоких скоростях и на большие расстояния, чем UTP.

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

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

IBM разработала собственную кабельную систему и классификацию кабелей Например, кабель типа 1 - экранированная витая пара, предназначенная для пердачи речи и данных, т.е. всем известная STP.

Кабели - общепринятая среда обмена данными между компьютерами. Однако сегодня появляются технологии беспроводной передачи, которые избавят нас от трудностей физических соединений. На следующем занятии Вы познакомитесь с основами технологии беспроводной связи.


next up previous contents index
Next: Беспроводные сети Up: Физическая среда передачи Previous: Кабельная система IBM   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Отмена специального значения (метасимвол Up: Специальные символы Previous: Последовательное выполнение команд (символ   Contents   Index

Отмена специального значения (метасимвол ``слэш'')

Символ \(``слэш'') позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файл trail, который содержит следующий текст:

     The all * game
     was held in Summit.
Чтобы найти символ звездочка (*) в файле, воспользуйтесь командой grep:
      $ grep \* trail
      The all * game
      $
команда grep найдет символ * в тексте и отобразит строку, в которой она появилась. Без символа \, символ звездочка будет интерпретироваться shell как метасимвол.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевые адаптеры Up: Физическая среда передачи Previous: Сравнение кабелей   Contents   Index

Беспроводные сети


Беспроводная среда

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

Словосочетание «беспроводная среда» может ввести в заблуждение, поскольку как бы означает полное отсутствие проводов в сети. В действительности же это не так. Обычно беспроводные компоненты взаимодействуют с сетью, в которой В качестве среды передачи используется кабель. Такая сеть со смешанными компонентами называется гибридной.


Возможности

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


Применение

Трудность установки кабеля - фактор, который дает беспроводной среде неоспоримое преимущество. Она может оказаться особенно полезной в следующих ситуациях: в помещениях, заполненных людьми (например, в прихожей или приемной);


Типы беспроводных сетей

В зависимости от технологии беспроводные сети можно разделить на три типа:

Основные различия между этими типами сетей - параметры передачи. Локальные и расширенные локальные вычислительные сети используют передатчики и приемники, принадлежащие той организации, в которой функционирует сеть. Для перносных компьютеров в качестве среды передачи сигналов выступают AT&T, МCI, Sprint, местные телефонные компании и их общедоступные службы.


Локальные вычислительные сети

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


Точки доступа

Трансивер, называемый иногда точкой доступа (access point), обеспечивает обмен сигналами между компьютерами с беспроводным подключением и остальной сетью. В беспроводных ЛВС используются небольшие настенные трансиверы. Они устанавливают радиоконтакт между переносными устройствами. Такую сеть нельзя назвать полностью беспроводной именно из-за использования этих трансиверов.


Способы передачи

Беспроводные локальные сети используют четыре способа передачи данных:


Инфракрасное излучение

Все инфракрасные беспроводные сети используют для передачи данных инфракрасные лучи. В подобных системах необходимо генерировать очень сильный сигнал, так как в противном случае значительное влияние будут оказывать другие источники, например окна. Этот способ позволяет передавать сигналы с большой скоростью, поскольку инфракрасный свет имеет широкий диапазон частот. Инфракрасные сети способны нормально функционировать на скорости 10 Мбит/с. Существует четыре типа инфракрасных сетей

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


Лазер

Лазерная технология похожа на инфракрасную тем, что требует прямой видимс между передатчиком и приемником. Если по каким-либо причинам луч будет прерван это прервет и обмен данными.


Радиопередача в узком спектре (одночастотная передача)

Этот способ напоминает вешание обыкновенной радиостанции. Пользователи настраивают передатчики и приемники на определенную частоту. При этом прямая видимость необязательна, площадь вещания составляет около $ 46500
м^2$ (500 000 квадратных футов).

Сигнал высокой частоты, который используется, не проникает через металлические или железобетонные преграды. Доступ к такому способу связи осуществляется через поставщика услуг, например Motorola. Поставщик услуг соответствует всем требованиям FCC (Federal Communications Commission). Связь относительно медленная (около 4.8 Мбит/с).


Радиопередача в рассеянном спектре

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

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

Чтобы защитить данные от несанкционированного доступа, применяют кодирование. Скорость передачи в 250 Кбит/с (килобит в секунду) относит данный способ к разряду самых медленных. Но есть сети, построенные на его основе, которые передают данные со скоростью до 2 Мбит/с на расстояние до 3,2 км на открытом пространстве и до 120 м внутри здания. Это тот самый понтовый случай для настоящих пацанов, когда технология позволяет получить по-настоящему беспроводную сеть.


Передача «точка-точка»

Данный способ передачи несколько выходит за рамки существующего определения сети. Технология передачи «точка-точка» предусматривает обмен данными только между компьютерами, в отличие от взаимодействия между несколькими компьютерами и периферийными устройствами. Однако, чтобы организовать сеть с беспроводной передачей, надо использовать дополнительные компоненты, такие, как одиночные и хост-трансиверы. Их можно устанавливать как на автономных компьютерах, так и на компьютерах, подключенных к сети.

Эта технология, основанная на последовательной передаче данных, обеспечивает:

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


Расширенные локальные сети

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


Многоточечное беспроводное соединение

Компонент, называемый беспроводным мостом (wireless bridge), помогает установить связь между удаленными сетями без участия кабеля. Мост может использовать технологию радиопередачи в рассеянном спектре для создания магистрали, соединяющей несколько сетей. Расстояние между ними, в зависимости от условий, может достигать нескольких километров. Стоимость эксплуатации такого устройства зачастую оказывается ниже аренды линии связи.


Беспроводные мосты дальнего действия

Если расстояние, которое покрывает беспроводной мост, недостаточно, можно установить мост дальнего действия. Для работы с сетями Ethernet и Token Ring на расстояниях до 40 км он также использует технологию радиопередачи в рассеяном спектре. Его стоимость (как и обыкновенного беспроводного моста) может оказаться вполне удовлетворительной, так как отпадут затраты на аренду микроволновых каналов или линий Т1. Линия Т1 - это стандартная цифровая линия, предназначенная для передачи данных со скоростью до 1,544 Мбит/с. По ней можно передавать и речь, и данные.


Мобильные сети

В беспроводных мобильных сетях в качестве среды передачи выступают телефонные системы и общественные службы. При этом используются:

Работники, которые постоянно находятся в разъездах, могут воспользоваться этой технологией: имея при себе переносные компьютеры или PDA (Personal Digital Assistants), они будут обмениваться электронной почтой, файлами и другой информацией.

Такая форма связи удобна, но довольно медленна. Скорость передачи от 8 Кбит/с до 28,8 Кбит/с. А если запущена система коррекции ошибок, скорость становится еще меньше. Для подключения переносных компьютеров к основной сети применяют беспроводные адаптеры, использующие технологию сотовой связи. Небольшие антенны, установленные на переносных компьютерах, связывают их с окружающим радиоретрансляторами.


Пакетное радиосоединение

При пакетном радиосоединении данные разбиваются на пакеты (подобные сетевым пакетам), в которых содержится следующая информация:

Пакеты передаются на спутник, который транслирует их в широковещательном режиме. Затем устройства с соответствующим адресом принимают эти пакеты.


Сотовые сети

Сотовые цифровые пакеты данных (Cellular Digital Packet Data, CDPD) используют ту же технологию, что и сотовые телефоны. Они передают данные по существующим для передачи речи сетям в те моменты, когда эти сети не заняты. Это очень быстрая технология связи с задержкой в доли секунды, что делает ее вполне приемлемой для передачи в реальном масштабе времени. В сотовых сетях, как и в других беспроводных сетях, необходимо найти способ который позволит подключиться к существующей кабельной сети.

Nortel out of Mississauga (Онтарио, Канада) - компания, которая производит интерфейсный блок Ethernet (Ethernet Interface Unit, EIU), предназначенный для этой цели.


Микроволновые системы

Микроволновая технология помогает организовать взаимодействие между зданиями в небольших, компактных системах, например в университетских городках. В настоящее время микроволновая технология наиболее распространенный в Соединенных Штатах метод передачи данных на дальние расстояния. Он идеален при взаимодействии в прямой видимости двух точек, таких, как:

Микроволновая система состоит из следующих компонентов.


next up previous contents index
Next: Сетевые адаптеры Up: Физическая среда передачи Previous: Сравнение кабелей   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Передача и управление данными Up: Введение в сети Previous: Беспроводные сети   Contents   Index

Сетевые адаптеры



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевой адрес Up: Сетевые адаптеры Previous: Сетевые адаптеры   Contents   Index

Передача и управление данными

Платы сетевого адаптера выступают в качестве физического интерфейса, или соединения, между компьютером и сетевым кабелем. Платы обычно вставляются в слоты расширения компьютеров. Чтобы обеспечить физическое соединение между компьютером и сетью, к ответствующему разъему, или порту платы (после ее установки) подключается сетвой кабель.

Назначение платы сетевого адаптера:

Плата сетевого адаптера, кроме того, принимает данные из кабеля и переводит их в форму, понятную центральному процессору компьютера.

Плата сетевого адаптера состоит из аппаратной части и встроенных программ, записанных в ПЗУ. Эти программы реализуют функции подуровней ``Управления логической связью и Управления доступом к среде Канального уровня'' модели OSI.


Подготовка данных

Перед тем как отослать данные в сеть, плата сетевого адаптера переводит их из параллельного представления, понятного компьютеру, в последовательное (сериальное), в котором они могут передаваться по сетевому кабелю. Внутри компьютера данные передаются по шинам шириной в 8, 16, 32, 64 и более бит. По шине данные передаются параллельно (parallel). В сетевом кабеле данные транспортируются в виде последовательного потока бит.

Плата сетевого адаптера принимает параллельные данные и организует их для последовательной (serial), побитовой, передачи. Этот процесс завершается переводом цифровых данных компьютера в электрические и оптические сигналы, которые и передаются по сетевым кабелям. Устройство, которое выполняет преобразование последовательного потока бит в электрические и оптические сигналы в кабеле - трансивер.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Конфигурация (порты, прерывания, память) Up: Сетевые адаптеры Previous: Передача и управление данными   Contents   Index

Сетевой адрес

Помимо преобразования данных, плата сетевого адаптера должна указать свое местонахождение, или адрес, чтобы ее могли отличить от остальных плат. Этой цели служит сетевой адрес платы. Сетевые адреса (network address) определяются комитетом IEEE. Этот комитет закрепляет за каждым производителем плат сетевого адаптера некоторый интервал адресов. Производители зашивают эти адреса в микросхемы. Благодаря этому каждая плата и, следовательно, каждый компьютер имеют уникальный адрес в сети.

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

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

Часто данные поступают быстрее, чем их способна передать плата сетевого адаптера, поэтому временно они помещаются в буфер.


Передача и управление данными

Перед тем как послать данные по сети, плата сетевого адаптера проводит электронный диалог с принимающей платой, во время которого они обговаривают :

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Внешний и внутренний трансивер Up: Сетевые адаптеры Previous: Сетевой адрес   Contents   Index

Конфигурация (порты, прерывания, память)

Параметры платы сетевого адаптера должны быть корректно установлены, чтобы ее работа протекала правильно. В их число входят:


Примечание

Параметры платы сетевого адаптера иногда устанавливаются в программном обеспечении, но они должны совпадать с установками, заданными на плате перемычками или DIP-переключателями. Дополнительную информацию о настройке платы с помощью переключателей можно получить из ее документации.


Прерывание

Линии запроса прерывания - это физические линии, по которым различные устройства (например, порты ввода/вывода, клавиатура, драйверы дисков и платы сетевого адаптера) могут послать микропроцессору компьютера запросы на обслуживание, или на прерывание. Линии запроса прерывания встроены в аппаратуру компьютера, они имеют различные уровни приоритетов, что позволяет процессору определить наиболее важный из запросов.

Посылая компьютеру запрос, плата сетевого адаптера использует прерывание (interrupt) - электрический сигнал, который направляется центральному процессору компьютера. Все устройства в компьютере должны пользоваться разными линиями запроса прерывания, или прерыванием (IRQ). Линия запроса прерывания задается при настройке устройства. (Примеры см. в таблице.)

В большинстве случаев в PC платы сетевого адаптера используют прерывание 1RQ3, IRQ5, IRQ10 или IRQ11. Если есть выбор, рекомендуем отдать предпочтение IRQ5, тем более что это значение установлено по умолчанию во многих системах. Чтобы определить, какие значения прерываний установлены по умолчанию в системе можно воспользоваться диагностическими утилитами или заглянуть в файл \var\log.....

Если ни IRQ3, ни IRQ5 недоступны, выберите другой доступный номер пррывания из свободных.

IRQ Компьютер с процессором 80286 (или выше)  
1em2 (9) EGA/VGA  
3 Доступен [если не занят вторым последовательным портом (COM2, COM4) или мышью  
4 СОМ1, СОМЗ  
5 Доступен [если не занят вторым параллельным портом (LPT2) или звуковой платой]  
6 Контроллер дисковода  
7 Параллельный порт (LPT1)  
8 Часы реального времени  
10 Доступен  
11 Доступен  
12 Мышь (PS/2)  
13 Математический сопроцессор  
14 Контроллер жесткого диска  
15 Доступен  


Базовый порт ввода/вывода

Базовый порт ввода/вывода (base i/o port) определяет канал, по которому передаются данные между устройством компьютера (например, платой сетевого адаптера) и центральным процессором. Для центрального процессора порт выглядит как адрес. Каждое устройство системы должно иметь уникальный адрес базового порта ввода/вывода. Современные платы сетевых адаптеров используют протокол plug-n-play для установки большинства параметров конфигурации еще до начала загрузки ОС.

Адреса портов ввода/вывода, занятые устройствами, оюычно приводятся в документации на компьютер. Чтобы узнать какие адреса какими устройствами используются можно можно воспользовавшись диагностическими утилитами или заглянув в файл \var\log.....


Базовый адрес памяти

Базовый адрес памяти (base address) указывает на ту область памяти компьютера (RAM), которая используется платой сетевого адаптера в качестве буфера для входящих и исходящих кадров данных. Этот адрес иногда называют начальным адресом RAM. Часто базовым адресом памяти у платы сетевого адаптера является D8000. (Иногда последний нуль не указывается: вместо D8000 пишется D800.) Следует выбирать базовый адрес памяти, не занятый другим устройством.

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

Некоторые платы сетевого адаптера имеют параметр, позволяющий выделить определенный объем памяти для хранения кадров данных. Например, есть платы, в которых Вы можете выделить 16 Кб или 32 Кб памяти. Чем больше памяти Вы выделяете, тем выше скорость сети, но тем меньше памяти остается для других целей.


next up previous contents index
Next: Внешний и внутренний трансивер Up: Сетевые адаптеры Previous: Сетевой адрес   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Совместимость Up: Сетевые адаптеры Previous: Конфигурация (порты, прерывания, память)   Contents   Index

Внешний и внутренний трансивер

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Системная архитектура (ISA, EISA, Up: Сетевые адаптеры Previous: Внешний и внутренний трансивер   Contents   Index

Совместимость

Чтобы обеспечить совместимость компьютера и сети, плата сетевого адаптера должна отвечать следующим требованиям:

Например, плата, которая должна работать в компьютере Apple в сети с топологией «шина», не будет работать в компьютере IBM в сети с топологией «кольцо». Сеть топологии «кольцо» требует плату, которая физически отличается от применяемой в сети топологии «шина», к тому же Apple использует другой метод взаимодействия по сети и внутреннюю системную шину, нежели IBM.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Кабели и соединители Up: Сетевые адаптеры Previous: Совместимость   Contents   Index

Системная архитектура (ISA, EISA, PCI, MCI)

К распространенным типам архитектуры шины данных относятся ISA, EISA, Micro Channel" и PCI. Каждая из них физически отличается от остальных.


ISA (Industry Standard Architecture).

ISA - это архитектура, используемая в компьютерах IBM PC, XT, AT и совместимых с ними. Чтобы дополнить систему различными адаптерами, необходимо установить платы в слоты расширения. В 1984 году (когда IBM представила IBM PC/AT) ISA была расширена с 8 разрядов до 16. ISA - это название самого слота (8- или 16-разрядного). 8-разрядные слоты короче 16-разрядных, которые состоят из двух слотов, следующих один за другим. Поэтому 8-разрядная плата может быть вставлена в разрядные слоты, но не наоборот. ISA была стандартной архитектурой персональных компьютеров, пока Compaq и сколько других компаний не разработали шину EISA.


EISA (Extended Industry Standard Architecture).

Этот стандарт шины был представлен в 1988 году консорциумом из девяти компьютерных компаний: AST" Research, Inc., Compaq, Epson, Hewlett-Packard, NEC, Olivetti, Tandy, Wyse Technology и Zenith. EISA предлагает 32-разрядную шину, совместимую с ISA. Кроме того, она поддерживает дополнительные возможности, которыми обладает шина Micro Channel Architecture (MCA), разработанная IBM.


MCA (Micro Channel Architecture).

IBM представила этот стандарт в 1988 году как часть своего проекта PS/2. Эта архитектура электрически и физически несовместима с шиной ISA. В отличие от ISA, Micro Channel работает и как 16-разрядная, и как 32-разрядная шина. Особенностью данной шины является возможность параллельной и независимой работы нескольких активных процессорных устройств, таких как несколько ЦПУ, видеопроцессор и пр. Эта шина может использоваться как центральный элемент вычислительной системы, объединяющий процессоры, видеопроцессоры, процессоры управления доступом к данным и каналам ввода/вывода.


PCI (Peripheral Component Interconnect).

Это 32-разрядная локальная шина, которая используется в настоящее время в большинстве компьютеров с процессором Pentium и в компьютерах Apple Power Macintosh. В отличие от MCI PCI имеет существенные ограничения как на число устройств, взаимодействующих на шине, так и на их функциональность. Распространилась данная шина не благодаря своим качествам, а вследствие агрессивного маркетинга со стороны крупных корпораций.

Считается, что архитектура PCI удовлетворяет большинству требований технологии Plug and Play, целью которой является возможность изменять конфигурацию персонального компьютера без вмешательства пользователя, т.е. максимально упростить подключение любого устройства.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Производительность сети Up: Сетевые адаптеры Previous: Системная архитектура (ISA, EISA,   Contents   Index

Кабели и соединители

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

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

Если у платы сетевого адаптера более одного интерфейсного разъема, выбор дого из них производится с помощью перемычек или DIP-переключателей, расположенных на самой плате, либо программно. Чтобы правильно сконфигурировать сетевую плату, следует читать ее документацию. Ниже приведены три примера типичных соединителей, которые можно найти на плате сетевого адаптера.

Для подключения тонкого коаксиального кабеля используют разъем, представленный на рисунке 2.29.

Для подключения толстого коаксиального кабеля применяется 15-контактный AUI-кабель, соединяющий 15-контактный (DB-15) разъем платы сетевого адаптер внешним трансивером, который для подключения к толстому коаксиальному кабелю использует так называемый «зуб вампира». Внимание! Внешне очень похож на порт AUI игровой порт, который обычно присутствует на мультимедийных платах.

Для подключения витой пары прменяется разъем RJ-45, показанный на рис. 2.31. С виду он напоминает телефонный RG-11, но крупнее по габаритам и имеет 8 контактов а не 4, как телефонный.

Некоторые сетевые технологии используют телефонный разъем RJ-11. Их иногда называют pre-10BaseT.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Специализированные платы сетевого адаптера Up: Сетевые адаптеры Previous: Кабели и соединители   Contents   Index

Производительность сети

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

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

Итак, к факторам, от которых зависит скорость передачи данных, относятся следующие.


Серверы

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


Рабочие станции

Рабочие станции могут использовать менее дорогие сетевые платы, если их работа с сетью ограничена приложениями, генерирующими небольшой объем сетевого трафика (например, текстовыми процессорами). Другие приложения (например, базы данных или инженерные приложения) довольно быстро перегрузят сетевые платы, не отвечающие их требованиям.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование кавычек для отмены Up: Специальные символы Previous: Отмена специального значения (метасимвол   Contents   Index

Отмена специального значения (метасимвол кавычки)

Отменить специальное значение символа вы также можете с помощью метасимвола кавычки. Одиночные кавычки ('...') отменяют специальное значение всех символов за исключением самих одиночных кавычек. Двойные кавычки (``...'') отменяют специальное значение всех символов, за исключением символов двойные кавычки, $ и `(слабое ударение). Использование кавычек удобно для цифровых специальных символов.

Например, ваш файл trail содержит строку:

      He really wondered why? Why???
Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой grep:
      $ grep '???' trail
      He really wondered why? Why???
      $



Alex Otwagin 2002-12-16

next up previous contents index
Next: BootROM (удаленная загрузка станций Up: Сетевые адаптеры Previous: Производительность сети   Contents   Index

Специализированные платы сетевого адаптера


Платы сетевого адаптера беспроводных сетей

Платы сетевого адаптера беспроводных сетей разработаны для большинства основных сетевых операционных систем. Вместе с такими платами часто поставляют:

Указанные платы сетевого адаптера могут быть использованы для построения беспроводных локальных сетей или для беспроводного подключения станций к кабельной ЛВС. Часто подобные платы применяются вместе с так называемым беспроводным концентратором. Это устройство функционирует как трансивер для передачи и приема сигналов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Функционирование сетей Up: Сетевые адаптеры Previous: Специализированные платы сетевого адаптера   Contents   Index

BootROM (удаленная загрузка станций по сети)

Бывают ситуации, когда безопасность данных настолько важна, что рабочие станции не оборудуются жесткими и гибкими дисками. Эта мера гарантирует, что пользователи не смогут ни скопировать данные на какой-либо магнитный носитель, ни вынести диск с рабочего места. Однако (поскольку обычно компьютер загружается с дискеты или с жесткого диска) необходимо иметь другой источник загрузки программного обеспечения, запускающего компьютер и подключающего его к сети. В таких случаях плата сетевого адаптера снабжается специальной микросхемой ПЗУ удаленной загрузки (remote-boot PROM), которая содержит код для загрузки компьютера и для подключения его к сети (зависит от сетевой операционной системы). С такой микросхемой бездисковые рабочие станции при запуске могут подключаться к сети. Использование удаленной загрузки позволяет организовать любую вычислительную среду на любом компьютере, что очень важно в больших организациях и для мобильных пользователей. IBM поставляет такую технологию под названием Work Space on Demand (WSoD).


Резюме

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

Существуют специализированные платы сетевых адаптеров, например, для высокоскоростого обмена данными, для беспроводных сетей и бездисковых рабочих станций (в системах с повышенными требованиями к безопасности данных).

При выборе платы сетевого адаптера необходимо учитывать:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевые модели и их Up: Введение в сети Previous: BootROM (удаленная загрузка станций   Contents   Index

Функционирование сетей



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Модель OSI/ISO Up: Функционирование сетей Previous: Функционирование сетей   Contents   Index

Сетевые модели и их соответствие

В настоящее время при анализе сетевого взаимодействия широко используется архитектурный подход, при котором функции, выполняются сетью, представляются иерархическими. Согласно данным представлениям сетевые системы описываются в контексте т.н. Эталонной модели взаимодействия открытых систем (Open System Interconnection (OSI) Reference Model), которую разработала Международная организация по стандартизации (ISO). Модель OSI состоит из семи уровней программного обеспечения и (или) аппаратных средств, каждый из которых соответствует определенному уровню абстракции.

Модель OSI/ISO стандартизирует обмен информацией между системами. Если две системы используют один и тот же набор стандартов, то они открыты друг для друга. В реальной сети источниками и приемниками информации являются прикладные процессы, имеющие различную природу. Например, в качестве токого процесса может выступать оператор, обслуживающий банковский терминал или программаное обеспечение для управления базой данных, управления тех процессами на предприятиях. Функции прикладных процессов, которые связаны с обеспечением взаимодействия, называются прикладными объектами. С точки зрения OSI такие объекты являются частями открытых систем. С другой стороны, для осуществления взаимодействия прикладными объектами необходим обмен данными между системами, частями которых эти объекты являются, для чего необходима некая физическая среда (кабели, радиоканал и т.д.).

Таким образом, модель OSI/ISO основана на четырех элементах:

Термин «соединение» в данном контексте имеет широкое толкование. Его следует понимать как кооперацию прикладных объектов, принимающую различные формы. Это может быть и межпроцессорная связь, относящаяся к обмену информацией и синхронизации действий между прикладными процессами; представление данных, относящееся ко всем аспектам создания и поддержания описаний и преобразований данных; управление ресурсами, с помощью которых инициируются прикладные процессы OSI, обеспечение целостности и сохранности данных во время функционирования открытых систем. Модель OSI не ограничивается только передачей информации между системами, но затрагивает вопросы взаимодействия для решения общих задач.

Функции взаимосвязи, образующие открытую систему, в своей совокупности чрезвычайно сложны. Поэтому в модели ISO они структурируются путем разбиения на уровни. При этом каждая открытая система представляется в виде иерархически расположенных подсистем (рис. ). Подсистемы, выполняющие схожие наборы функций взимосвязи, образуют уровень. Для локализации функций используется понятие объекта. Таким образом, подсистема N-уровня (N-подсистема) состои т из одного или нескольких N-объектов.

За исключением верхнего, каждый N-уровень обеспечивает для объектов (N+1)-уровня N-услуги (N-сервис, N-служба). В том случае, когда N-объект не может самостоятельно обеспечить полную поддержку услуг, запрашиваемых (N+1)-объектом, он вызывает другие N-объекты для помощи в обеспечении запроса на обслуживание. Для выполнения такого взаимодействия N-объекты любого уровня, исключая нижний, связываются посредством набора услуг, предоставляемых (N-1)-уровнем (Рис ). Предполагается, что объекты нижнего уровня связываются непосредственно через физические средства, которые их соединяют. Услуги N-уровня предоставляются путем выполнения N-Функций внутри N-уровня, а также использования услуг, получаемых от (N-1)-уровня.

Взаимосвязь между N-объектами осуществляется подж управлением одного или нескольких N-протоколов. Объекты и протоколы одного уровня показаны на Рис. Объекты (N+1)-уровня могут связываться между собой только с помощью услуг, предоставляемых объектами N-уровня. Возможны случаи, когда услуги, предоставляемые N-уровнем, не позволяют обеспечить прямое взаимодействие между всеми (N+1)-объектами. В таком случае взаимодействие может осуществляться, если некоторый другой (N+1)-объект выполняет функцию ретранслятора (Рис). Тот факт, что связь ретранслируется цепочкой (N+1)-объектов, неизвестен ни N-уровню, ни (N+2)-уровню.


Функции уровней

Произвольный уровень может быть описан теми функциями, которые в нем выполняются. Эти функции в общем случае включают в сябя:


Выбор протокола

На N-уровне могут использоваться несколько протоколов. Для организации N-соединения необходимо, чтобы N-объекты выбрали единый N-протокол, иначе они просто не поймут друг друга. Это может быть сделано как до организации соединения, так и во время установления соединения использованием идентификатора N-протокола.


Установление и расторжение соединения

Для установления N-соединения необходимо, чтобы (N-1)-уровень представил (N-1)-соединение (услуги по передаче данных N-уровня) и оба N-объекта были способны выполнить выполнить обмен данными по протоколу.

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

Расторжение N-соединения в нормальных условиях производится по инициативе одного из связанных с ним (N+1)-объектов. Расторжение N-соединения может быть инициировано одним из поддерживающих его N-объектов в случае сбоя, ошибок в N-уровне или нижележащих уровнях. В зависимости от условий расторжение может как привести так и не привести к потере данных N-пользователя.

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


Мультиплексирование и рассщепление соединений

Между N- и (N-1)-соединениями возможны следующие отношения (Рис. ):

При мультиплексировании необходимо осуществлять функции, связанные с идентификацией данных, относящихся к разным N-соединениям, поскольку эти данные поступают на N-уровень ``вперемешку'', управлять каждым N-соединением в отдельности, чтобы не превысить пропускной способности партнера и осуществлять планирование - предусматривать появление новых N-соединений, которые отображаются в существующее (N-1)-соединение.

Расщепление связано с управлением (N-1)-соединениями, используемыми для одного N-соединения. Это управление включает всебя принятие решений о том, сколько (N-1)-соединений и с каким характеристиками необходимо запрашивать. Передаваемые по N-соединению данные дробятся и передаются по разным (N-1)-соединениям. Следовательно, порядок их поступления к адресату может отличаться от порядка передачи. Для сохранения последовательности данных необходимы специальные функции контроля и восстановления.


Передача нормальных (обычных) данных

Взаимодействие N-объектов осуществляется с помощью обмена N-протокольными блоками данных (N-PDB), которые содержат управляющую информацию N-протокола и, возможно, данные пользователя. Эти данные генерируются (N+1)-объектами. Они передаются по N-соединению прозрачно без какого бы то ни было изменения их структуры.

Данные пользователя могут передаваться как в фазе передачи данных, так и в фазе установления и расторжения N-соединения. В фазе передачи данных используются функции управления потоком, сегментирования, блокирования и сцепления данных, сериализации и защиты от ошибок.


Передача срочных (внеочередных) данных

Срочные данные (urgent data) - данные, которые обрабатываются с более высоким приоритетом по отношению к обычным данным. Срочные данные обычно используются для целей сигнализации, экстренного уведомления о сбоях и т.д. Поток срочных данных не зависит от состояния потока обычных данных. Можно представить, что соединение состоит как бы из двух подканалов, один - для нормальных данных, другой - для срочных. Каждый из подканалов управляется независимо. Такая модель справедлива при условии, что на приемном конце срочные данные появляются не позже нормальных, перед которыми они были переданы. Поскольку предполагается, что срочный поток используется сравнительно редко и для передачи небольших порций данных, для управления срочным потоком могут ипользоваться упрощенные механизмы управления потоком.


Управление потоком данных

Различают два типа управления потоком: протокольное, при котором регулируется скорость передачи N-PDB между N-объектами, и интерфейсное, при котором регулируется скорость передачи данных между (N-1) и N-объектом.

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


Сегментирование, блокирование и сцепление данных

Протокольные блоки данных (PDB) различных уровней обычно отличаются по размерам. Может оказаться, что размер (N+1)-PDB больше максимального размера N-PDB. В этом случае для передачи (N+1)-PDB по N-соединению необходимо в N-уровне выполнить сегментирование, т.е разбиение (N+1)-PDB на на последовательные сегменты с длиной, не превышающей размер поля данных N-PDB. Для сохранения идентичности (N+1)-PDB необходимо вставлять в N-PDB, содержащими сегменты (N+1)-PDB, специальные данные, позволяющие прои звести сборку исходных (N+1)-PDB при приеме.

Блокирование - функция N-уровня, позволяющая объединить несколько (N+1)-PDB в один. Это может потребоваться в том случае, когда максимальная длина (N+1)-PDB много меньше длины поля данных N-PDB.

Сцепление - функция (N+1)-уровня, позволяющая объеденить несколько (N+1)-PDB В один блок. При этом N-уровень воспринимает результат сцепления как один (N+1)-PDB (и может произвести сегментацию, как ему удобно).


Сериализация (организация последовательности)

Эта функция связана с тем, что (N-1)-услуги, предоставляемые (N-1)-уровнем, могут не гарантировать доставку данных в том же порядке, в каком они были представлены N-уровнем. Если N-уровень нуждается в том, чтобы сохранить порядок данных, передаваемых через (N-1)-уровень, он должен содержать механизмы сериализации (организации последовательности). Сериализация может потрбовать дополнительной N-протокольной управляющей информации, например порядковых номеров фрагментов передавемых анных.


Защита от ошибок

Функции защиты от ошибок состоят из трех компонентов: подтверждения, обнаружения ошибок и уведомления о них, возврата в исходное состояние.

Функция подтверждения может использоваться N-объектами для достижения более высокой вероятности обнаружения потери N-PDB, чем это обеспечивает (N-1)-уровень. Каждый N-PDB, передаваемый между N-объектами-корреспондентами, должен идентифицироваться единственным образом так, чтобы получатель мог информировать отправителя о его приеме. Функция подтверждения также способна установить факт неприема N-PDB и принять соответствующие восстановительные меры.

Схема однозначной идентификации N-PDB может также использоваться для поддержки других функций, таких как сегментация и сериализация.

Функция обнаружения ошибок и уведомления о них может использоваться N-протоколом для обеспечения более высокой вероятности обнаружения ошибок и искажений PDB, чем это обеспечивается услугами (N-1)-уровня. Обнаружение ошибок и уведомление могут потребовать, чтобы в N-протокольную управляющую информацию были включены дополнительные идентификаторы.

Некоторые услуги требуют возврата в исходное сотояние для восстановления после потенри синхронизации между N-объектами-корреспондентами. Функция возврата в исходное сотояние устанавливает N-объекты-корреспонденты в заранее определенное состояние с возможной потерей или дублированием данных.


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

Функция маршрутизации в N-уровнеобеспечивает прохождение данных через цепочку N-объектов. Тот факт, что передача осуществляется спомощью промежуточных объектов, не известен ни нижним, ни верхним уровням. Объект, участвующий в маршрутизации, может иметь таблицу маршрутизации.

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

На принимающей стороне пакет проходит через все уровни в обратном порядке. Аппаратура и программное обеспечение на каждом уровне читает информацию пакета, затем удаляет информацию, добавленную к пакету на этом же уровне отправляющей стороной, передает пакет следующему уровню. Когда пакет дойдет до прикладного уровня, вся адресная информация будет удалена и данные примут свой первоначальный вид. Таким образом, за исключением самого нижнего уровня сетевой модели, никакой иной уровень узла-отправителя не может непосредственно послать информацию соответствующему уровню узла-получателя. Информация на узле-отправителе должна пройти через все уровни сверху вниз. Затем она передается по сетевому кабелю на узел-получатель и проходит все уровни снизу вверх, пока не достигнет того же уровня, с которого была послана на узле-отправителе.



Subsections
next up previous contents index
Next: Модель OSI/ISO Up: Функционирование сетей Previous: Функционирование сетей   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Проект 802 Up: Сетевые модели и их Previous: Сетевые модели и их   Contents   Index

Модель OSI/ISO

В модели OSI/ISO сетевые функции распределены между семью уровнями.

Уровень Наименование ФУНКЦИЯ
1em1 Физический Собственно кабель или физический носитель
2 Канальный Передача и прием пакетов, определение аппаратных адресов
3 Сетевой Маршрутизация и ведение учета
4 Транспортный Обеспечение корректной сквозной пересылки данных
5 Сеансовый Аутентификация и проверка полномочий
6 Представления данных Интерпретация и сжатие данных
7 Прикладной Предоставление услуг на уровне конечного пользователя: почта, регистрация и т.д.

В числе "семь" нет ничего магического, просто в разработке Эталонной модели участвовали семь комитетов, и для каждого из них был создан один уровень. Схема OSI - не просто абстрактная модель; ее сопровождает реальный набор "стандартных" протоколов. Создание системы OSI началось в первой половине 80-х годов и растянулось на многие годы. Пока комитеты ISO спорили о своих стандартах, за их спиной менялась вся концепция организации сетей и по всему миру внедрялся протокол TCP/IP.

Каждому уровню соответствуют различные сетевые операции, оборудование и протоколы.

0.1mm
\begin{picture}(1098,565)
\put(-4,460){Прикладной}
\put(-4,400){Представительный...
...put(696,280){4}
\put(696,220){3}
\put(696,160){2}
\put(696,100){1}
\end{picture}

Рис. 1. Семь уровней модели OSI


На рис. 1 представлена многоуровневая архитектура модели OSI. На каждом уровне выполняются определенные сетевые функции, которые взаимодействуют с функциями соседних уровней, вышележащего и нижележащего. Например, Сеансовый уровень должен взаимодействовать только с Представительным и Транспортным. Все эти функции подробно описаны.


Прикладной уровень

Уровень 7, Прикладной (Application Layer), - самый верхний уровень модели OS1.

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


Представительный уровень

Уровень 6, Представительный (Presentation Layer),

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

Функции представительного уровня включают:

  1. запрос на установление сеанса;
  2. передачу данных;
  3. согласование и пересогласование выбора синтаксиса;
  4. преобразование синтаксиса, включая преобразование данных,
  5. форматирование и специальные преобразования (сжатие, шифрование/дешифрование).

Сущность второй и третьей функции заключается в следующем. Существует три варианта синтаксиса данных: синтаксис отправителя, синтаксис получателя и синтаксис, используемый объектами представительного уровня (синтаксис пердачи). Любые или два из них могут быть иденитичными. Уровень представления содержит функции, необходимое для преобразования между синтаксисом передачи и каждым из синтаксисов прикладных объектов по мере необходимости. Единого синтаксиса передачи для всей OSI не существует поэтому представительные объекты-корреспонденты согласуют синтаксис в процессе установления соединения. Представительный объект должен знать синтаксис своего прикладного объекта и согласованный синтаксис передачи. Согласование синтаксиса передачи осуществляется в процессе диалога между объектами представительного уровня либо в процессе установления соединения, либо в любое время в процессе передачи данных.

Представительный уровень отвечает за преобразование протоколов, трансляцию данных, их шифрование, смену или преобразование применяемого набора символов (кодовой таблицы) и расширение графических команд. Представительский уровень, кроме того, управляет сжатием данных для уменьшения передаваемых битов. На этом уровне в Win/DOS работает утилита, называемая редиректором (redirector). Ее назначение - переадресовать операции ввода/вывода к ресурсам сервера Lan Manager.


Сеансовый уровень

Уровень 5, Сеансовый (Session Layer)

Сеансовый уровень предназначен для организации и синхронизации диалога и управления обменом данными. С этой целью уровень предоставляет услуги по установлению сеансового соединения между двумя представительными объектами и поддержанию упорядоченного взаимодействия при обмене данными между ними. Для осуществления передачи данных между представительными объектами сеанс отображается на транспортное соединение и использует последнее. Сеанс может быть расторгнут сеансовыми или представительными объектами.

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

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


Транспортный уровень

Уровень 4, Транспортный (Transport Layer)

Транспортный уровень обеспечивает прозрачную передачу данных между сеансовыми объектами и освобождает их от функций, связанных с надежной и экономически эффективной передачей данных. Уровень оптимизирует использолвание имеющихся сетевых ресурсов представляя транспортный сервис при минимальной стоимости. Оптимизация выполняется при ограничениях, накладываемых всеми взаимодействующими в пределах сети сеансовыми объектами, с одной стороны, и возможностями и параметрами сетевого сервиса, который используется транспортным уровнем, с другой. Протоколы транспортного уровня предназначены для межконцевого (point-to-point) взаимодействия, где концы определяются как транспортные объекты-корреспонденты. Транспортный уровень освобождается от маршрутизации и ретрансляции и занимается исключительно обеспечением взаимодействия между оконечными открытыми системами. Транспортные функции зависят от сетевого сервиса и включают:

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


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

Уровень 3, Сетевой (Network Layer)

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

Сетевой уровень определяет маршрут транспортного объекта-отправителя к транспортному бъекту-получателю и обеспечивает независимость от особенностей маршрутизации и ретрансляции, связанных с установлением и использованием данного сетевого соединения. Это тот случай, когда несколько [под]сетей используются последовательно или параллельно.

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

Функции сетевого уровня:

Сетевые соединения могут иметь различную конфигурацию - от простого двух-точечного соединения до сложной комбинации подсетей с различными характеристиками. Обычно сетевые функции разделяются на подуровни. Б.м. подробно такое разделение описано в оригинальных документах ISO, описывающих модель OSI.


Канальный уровень

Уровень 2, Канальный (Data Link Layer),

Канальный уровень осуществляет передачу кадров (frames) данных от cетевого уровня к физическому. Кадры - это логически организованная структура в которую можно помещать данные. Канальный уровень узла-получателя упаковывает сырой поток битов, поступающих от физического уровня, в кадры данных.

На рис. 3.3 представлен простой кадр данных, где идентификатор отправителя-адрес узла-отправителя, а идентификатор получателя © адрес узла-получателя. Управляющая информация используется для маршрутизации, а также указывает на тип пакета и сегментацию. Данные - собственно передаваемая информация. CRC (Избыточный циклический код) - это сведения, которые помогут выявить ошибки, что, в свою очередь, гарантирует правильный прием информации.

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

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

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

Функции канального уровня:


Физический уровень

Уровень 1, Физический (Physical Layer)

Это самый нижний в модели OSI. Этот уровень осуществляет передачу неструктурированного, ©сырого© потока бит по физической среде (например, по сетевому кабелю).

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

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

На этом уровне определяется способ соединения сетевого кабеля с платой сетевого адаптера, в частности, количество контактов в разъемах и их функции. Кроме того, здесь определяется способ передачи данных по сетевому кабелю.

Физический уровень предназначен для передачи битов (нулей и единиц) от одного компьютера к другому. Уровень отвечает за кодирование данных и синхронизацию битов, гарантируя, что переданная единица будет воспринята именно как единица, а не как ноль. Также физический уровень устанавливает длительность каждого бита и способ перевода бита в соответствующие электрические или оптические импульсы, передаваемые по сетевому кабелю.

Нижние уровни 1-й и 2-й определяют физическую среду передачи данных и сопутствующие задачи, такие, как передача битов данных через плату сетевого адаптера и кабель. Самые верхние уровни определяют, каким способом осуществляется доступ приложений к услугам связи. Чем выше уровень, тем более сложную задачу он решает.

Каждый уровень предоставляет несколько услуг (т.е. выполняет несколько операций), подготавливающих данные для доставки по сети на другой компьютер. Уровни отделяются друг от друга границами - интерфейсами. Все запросы от одного уровня (другому передаются через интерфейс. Каждый уровень использует услуги нижележащего уровня.

Взаимодействие уровней модели OSI

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


next up previous contents index
Next: Проект 802 Up: Сетевые модели и их Previous: Сетевые модели и их   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Сети пакетной передачи данных Up: Сетевые модели и их Previous: Модель OSI/ISO   Contents   Index

Проект 802


Модель IEEE Project 802

В конце 70-х годов, когда ЛВС стали восприниматься в качестве потенциального инструмента для ведения бизнеса, IEEE пришел к выводу, что необходимо определить для них стандарты. В результате был выпущен Project 802, названный в соответствии с годом и месяцем своего издания (1980 год, февраль). Хотя публикация стандартов IEEE опередила публикацию стандартов ISO, оба проекта велись приблизительно в одно время и при полном обмене информацией, что и привело к рождению двух совместимых моделей. Project 802 установил стандарты для физических компонентов сети - интерфейсных плат и кабельной системы, с которыми имеют дело физический и канальныи уровни модели OSI.

Итак, эти стандарты, называемые 802-спецификациями, распространяются:

Спецификации 802 определяют способы, в соответствии с которыми платы сетевых адаптеров осуществляют доступ к физической среде и передают по ней данные. Сюда относятся соединение, поддержка и разъединение сетевых устройств.

Стандарты ЛВС, определенные Project 802, делятся на 12 категорий, каждая из которых имеет свой номер.

802.1 © объединение сетей.  
802.2 © Управление логической связью.  
802.3 © ЛВС с множественным доступом, контролем несущей и обнаружением коллизий (Ethernet).  
802.4 ЛВС топологии ©шина© с передачей маркера.  
802.5 ЛВС топологии ©кольцо© с передачей маркера (Token Ring).  
802.6 сеть масштаба города (Metropolitan Area Network, MAN).  
802.7 © Консультативный совет по широковещательной технологии (Broadcast Technical Advisory Group  
802.8 © Консультативный совет по оптоволоконной технологии (Fiber-Optic Technical Advisory Group).  
802.9 © Интегрированные сети с передачей речи и данных (Integrated Voice/Data Networks).  
802.10 Безопасность сетей.  
802.11 Беспроводная сеть.  
802.12 ЛВС с доступом по приоритету запроса (Demand Priority Access LAN, 1OObaseVG - AnyLan).  


Расширения модели OSI

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

IEEE Project 802 относился именно к этим двум уровням и привел к созданию ряда спецификаций, определивших доминирующие среды ЛВС. Канальный уровень делится комитетом IEEE на два подуровня:


Управление логической связью

Подуровень LLC устанавливает канал связи и определяет использование логических точек интерфейса, называемых точками доступа к услугам (service access points, SAP). Другие компьютеры, ссылаясь на точки доступа к услугам, могут передавать информацию с подуровня LLC на верхние уровни OSI. Эти стандарты определены в категории 802.2.


Управление доступом к среде

Подуровень MAC является нижним из двух подуровней. Он обеспечивает совместный доступ сетевых адаптеров к физическому уровню. Подуровень MAC напрямую связан с платой сетевого адаптера и отвечает за безошибочную передачу данных между двумя компьютерами сети. Категории 802.3, 802.4, 802.5 и 802.12 определяют стандарты как для этого подуровня, так и для первого уровня модели OSI, физического.


next up previous contents index
Next: Сети пакетной передачи данных Up: Сетевые модели и их Previous: Модель OSI/ISO   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Структура пакетов Up: Функционирование сетей Previous: Проект 802   Contents   Index

Сети пакетной передачи данных

Данные обычно содержатся в больших по размерам файлах. Однако сети не будут нормально работать, если компьютер посылает этот блок данных целиком. Существует две причины, замедляющие работу сети при передаче по кабелю больших блоков данных. Во-первых, такой блок, посылаемый одним компьютером, заполняет кабель и связывает© работу всей сети, т.е. препятствует взаимодействию остальных сетевых компонентов. Во-вторых, возникновение ошибок при передаче крупных блоков приведет к повторной передаче всего блока. А если поврежден небольшой блок данных, то требуется повторная передача именно этого небольшого блока, что значительно экономит время.

Чтобы быстро и легко, не тратя времени на ожидания, передавать по сети данные их необходимо разбить на небольшие управляемые блоки. Эти блоки называются пакетам©(packet) или кадрами (frame). Хотя термины пакет и кадр©схожи, полными синонимами они все-таки не являются.

Существуют различия между типами сетей, которые©эти термины отражают.

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

При разбиении данных на пакеты сетевая операционная система добавляет к каждому пакету специальную управляющую информацию. Эта информация обеспечивает:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Формирование пакетов (инкапсуляция) Up: Сети пакетной передачи данных Previous: Сети пакетной передачи данных   Contents   Index

Структура пакетов

Пакеты могут содержать несколько типов данных:

Некоторые компоненты являются обязательными для всех типов пакетов:

Компоненты пакета группируются в три раздела: заголовок, данные и трейлер.


Заголовок

Заголовок включает:


Данные

Эта часть пакета - собственно передаваемые данные. В зависимости от типа сети её размер может меняться. Но для большинства сетей он составляет от 512 байтов (0,5 Кб) до 4 Кб. Так как обычно размер исходных данных гораздо больше 4 Кб, для помещения в пакет их необходимо разбивать на меньшие блоки. При передаче объемного файла может потребоваться много пакетов.


Трейлер (концевик, терминатор)

Содержимое трейлера зависит от метода связи, или протокола. Чаще всего трейлер содержит информацию для проверки ошибок, называемую циклическим избыточным кодом (Cyclical Redundancy Check, CRC). CRC - это число, получаемое в результате математических преобразований над пакетом и исходной информацией. Когда пакет достигает местоназначения, эти преобразования повторяются. Если результат совпадает с CRC, с высокой вероятностью можно считать, что пакет принят без ошибок.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Интерфейсы и протоколы. Протокольные Up: Сети пакетной передачи данных Previous: Структура пакетов   Contents   Index

Формирование пакетов (инкапсуляция)

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

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


Адресация пакета

Большинство пакетов в сети адресуется конкретному компьютеру, и, как результат, только он один реагирует на них. Каждая плата сетевого адаптера©видит все пакеты, в передаваемые по сегменту кабеля, но только при совпадении адреса назначения пакета с адресом компьютера она прерывает его работу.

Используется также и широковещательная адресация (broadcast addressing). На пакет с таким типом адреса одновременно реагирует множество компьютеров в сети.

В крупномасштабных сетях, покрывающих огромные территории (или государства), предлагается несколько возможных маршрутов для передачи данных. Коммутирующие и соединяющие сетевые компоненты используют адресную информацию пакетов для определения наилучшего из маршрутов.


Рассылка пакетов

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Кратко о NetBEUI, X.25, Up: Функционирование сетей Previous: Формирование пакетов (инкапсуляция)   Contents   Index

Интерфейсы и протоколы. Протокольные стеки

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

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

Несколько протоколов могут работать совместно. Это так называемый стек, или набор, протоколов. Как сетевые функции распределены по всем уровням модели OST, так и протоколы совместно работают на различных уровнях стека протоколов. Уровни в стеке протоколов соответствуют уровням модели OSI. В совокупности протоколы дают полную характеристику функциям и возможностям стека.


Работа протоколов

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


Компьютер-отправитель

Компьютер-отправитель в соответствии с протоколом выполняет следующие действия:


Компьютер-получатель

Компьютер-получатель в соответствии с протоколом выполняет те же действия, только в обратном порядке:

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


Маршрутизируемые и немаршрутизируемые протоколы

До середины 80-х годов большинство локальных сетей были изолированными. Они обслуживали один отдел или одну компанию и редко объединялись в крупные системы. Однако, когда локальные сети достигли высокого уровня развития и объем передаваемой ими коммерческой информации возрос, ЛВС стали компонентами больших сетей.

Данные, передаваемые из одной локальной сети в другую по одному из возможных маршрутов, называются маршрутизированными. Протоколы, которые поддерживают передачу данных между сетями по нескольким маршрутам, называются маршрутизируемыми (routable) протоколами. Так как маршрутизируемые протоколы могут использоваться для объединения нескольких локальных сетей в глобальную сеть, их роль постоянно возрастает.


Протоколы в многоуровневой архитектуре

Несколько протоколов, которые работают в сети одновременно, обеспечивают следуюшие операции с данными:

Работа различных протоколов должна быть скоординирована так, чтобы исключить конфликты или незаконченные операции. Этого можно достичь с помощью разбиения на уровни. Стеки протоколов Стек протоколов (protocol stack) - это комбинация протоколов. Каждый уровень определяет различные протоколы для управления функциями связи или ее подсистемами. Каждому уровню присущ свой набор правил.

Так же как и уровни в модели OSI, нижние уровни стека описывают правила взаимодействия оборудования, изготовленного разными производителями. А верхние уровни описывают правила для проведения сеансов связи и интерпретации приложений. Чем выше уровень, тем сложнее становятся решаемые им задачи и связанные с этими задачами протоколы.


Привязка

Процесс, который называется привязка, позволяет с достаточной гибкостью настраивать сеть, т.е. сочетать протоколы и платы сетевых адаптеров, как того требует ситуация. Например, 2 стека протоколов, IPX/SPX и TCP/IP, могут быть привязаны к одной плате сетевого адаптера. Если на компьютере более одной платы сетевого адаптера, то стек проколов может быть привязан как к одной, так и к нескольким платам сетевого адаптера.

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

Обычно привязку выполняют сразу при установке операционной системы или протокола.

Например, если TCP/IP первый протокол в списке привязки, то именно он будет использоваться при попытке установить связь. Если попытка неудачна, компьютер попытается установить соединение используя следующий по порядку протокол в списке привязки. Привязка (binding) не ограничивается установкой соответствия стека протоколов и платы сетевого адаптера. Стек протоколов должен быть привязан (или ассоцииров к компонентам, уровни которых и выше, и ниже его уровня. Так, TCP/IP может быть привязан к Сеансовому уровню NetBIOS, а внизу - к драйверу пл сетевого адаптера. Драйвер, в свою очередь, привязан к плате сетевого адаптера.


Стандартные стеки

В компьютерной промышленности в качестве стандартных моделей протоколов разработано несколько стеков. Вот наиболее важные из них:

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


Прикладные протоколы

Прикладные протоколы работают на верхнем уровне модели OSI. Они обеспечивают взаимодействие приложений и обмен данными между ними. К наиболее популярным прикладным протоколам относятся:

АРРС (Advanced Program-to-Program Communication) - одноранговый SNA-протокол фирмы IBM, используемый в основном на AS/400CS);  
FTAM (File Transfer Access and Management) - протокол OSI доступа к файлам;  
X.400 протокол CCITT для международного обмена электронной почтой;  
Х.500 протокол CCITT служб файлов и каталогов на нескольких системах;  
SMTP (Simple Mail Transfer Protocol) - протокол Интернета для обмена электронной почтой;  
FTP (File Transfer Protocol) - протокол Интернета для передачи файлов;  
SNMP (Simple Network Management Protocol) - протокол Интернета для мониторинга сети и сетевых компонентов;  
Telnet протокол Интернета для регистрации на удаленных хостах и обработки данных на них;  
SMBs (Server Message Blocks, блоки сообщений сервера) и клиентские оболочки или редиректоры;  
NCP (Novell NetWare Core Protocol) и клиентские оболочки или редиректоры фирмы Novell;  
Apple Talk и Apple Share набор сетевых протоколов фирмы Apple;  
AFP (AppleTalk Filling Protocol) - протокол удаленного доступа к файлам фирмы Apple;  
DAP (Data Access Protocol) © протокол доступа к файлам сетей DECnet.  


Транспортные протоколы

Транспортные протоколы поддерживают сеансы связи между компьютерами и обеспечивают надежный обмен данными между ними. К популярным транспортным протоколам относятся:

TCP (Transmission Control Protocol) - TCP/I Р-протокол для гарантированной доставки данных, разбитых на последовательность фрагментов;  
SPX© часть набора протоколов IPX/SPX (Internetwork Packet Exchange/Sequential Packet Exchange) для данных, разбитых на последовательность фрагментов, фирмы Novell;  
NetBEUI [NetBIOS (Network Basic Input/Output System) Extended User Interface - расширенный интерфейс пользователя] - устанавливает сеанссы связи между компьютерами (NetBIOS) и предоставляет верхним уровням транспортные услуги (NetBEUI);  
АТР, NBP (AppleTalk Transaction Protocol), (Name Binding Protocol) -© протоколы сеансов связи и транспортировки данных фирмы Apple.  


Сетевые протоколы

Сетевые протоколы обеспечивают услуги связи. Эти протоколы управляют несколькими типами данных: адресацией, маршрутизацией, проверкой ошибок и запросами на повторную передачу. Сетевые протоколы, кроме того, определяют правила для осуществления связи в конкретных сетевых средах, например Ethernet или Token Ring.

К наиболее популярным сетевым протоколам относятся:

IP (Internet Protocol) - TCP/IP-протокол для передачи пакетов;  
IPX (Internetwork Packet Exchange) - протокол фирмы NetWare для передачи и маршрутизации пакетов;  
NetBEUI транспортный протокол, обеспечивающий услуги транспортировки, данных для сеансов и приложений NetBIOS;  
DDP (Datagram Delivery Protocol) - AppleTalk-протокол транспортировки данных.  


Стандарты протоколов

Модель OSI помогает определить, какие протоколы нужно использовать на каждом уровне. Продукты от разных производителей, которые соответствуют этой модели могут вполне корректно взаимодействовать друг с другом.


next up previous contents index
Next: Кратко о NetBEUI, X.25, Up: Функционирование сетей Previous: Формирование пакетов (инкапсуляция)   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Загрузка ОС Linux Up: Введение в ОС Linux Previous: Введение в ОС Linux   Contents   Index

Введение

Linux(GNU/Linux) представляет собой версию операционной системы Unix. Linux - многозадачная, многопользовательская сетевая операционная система. Она поддерживает стандарты открытых систем и протоколы сети Интернет. Эта операционная система может быть бесконфликтно установлена на одном компьютере с MS-DOS, Windows 9x/NT/2000, а также клонами Unix. Все компоненты системы, включая исходные тексты, распространяются с лицензией на свободное копирование и установку для неограниченного числа пользователей.

Linux дает возможность использовать следующие преимущества:

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

ВНИМАНИЕ! Не следует без необходимости работать под именем root, предоставляющим права системного администратора; создайте для себя регистрационную запись обычного пользователя и работайте под этим именем.

ВНИМАНИЕ! В отличие от Windows 9x и MS-DOS в GNU/Linux различаются строчные и прописные буквы в именах файлов, каталогов, пользователей и других объектов.

Проект ОС GNU/Linux был предложен финским программистом Линусом Торвальдсом. Сейчас в создании системы принимают участие тысячи разработчиков по всему миру. Авторские права на каждую из программ сохраняются за ее создателями, сами программы свободно распространяются на основе Публичной лицензии GNU, предусматривающей свободное копирование и модификацию программ с обязательным указанием авторов первичных кодов и без права на коммерческое использование. Любой человек может написать свою программу и включить ее в состав дистрибутива GNU/Linux или модифицировать уже существующую и опубликовать ее, например, в Интернет с соблюдением вышеуказанных условий.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление ввода и вывода Up: Специальные символы Previous: Отмена специального значения (метасимвол   Contents   Index

Использование кавычек для отмены значения символа пробел

Кавычки аналогично обратной косой черте часто используются для отмены специального значения пробела. shell интерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение.

Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки. Чтобы найти два слова "The all" в файле trail, введите следующую команду:

      $ grep 'The all' trail
      The all * game
      $
Особенно полезно применение отмены специального значения пробела для функции banner, которая использует пробел как разделитель аргументов и печатает аргументы на отдельных строках.

Чтобы напечатать более одного аргумента на одной строке, заключите слова в двойные кавычки. Например, если вы введете:

      banner happy birthday to you
то команда banner напечатает ваше сообщение на 4-х строках. Если вы введете:
      banner happy birthday "to you"
то команда banner напечатает ваше сообщение на 3-х строках, причем слова "to" и "you" напечатает на одной строке.

Команда banner печатает сообщения на экране терминала большими плакатного размера буквами.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Передача сигнала по кабелю. Up: Функционирование сетей Previous: Интерфейсы и протоколы. Протокольные   Contents   Index

Кратко о NetBEUI, X.25, IPX/SPX, AppleTalk, OSI, Dec, APPC(SNA)


NetBEUI

NetBEUI - расширенный интерфейс NetBIOS. Первоначально NetBIOS и NetBEUI были тесно связаны и рассматривались как один протокол. Затем некоторые производители ЛВС так обособили NetBIOS, протокол Сеансового уровня, что он уже не мог использоваться наряду с другими маршрутизируемыми транспортными протоколами. NetBIOS (Network Basic Input/Output System - сетевая базовая система ввода/вывода) - это IBM-интерфейс Сеансового уровня с ЛВС, который выступает в качестве прикладного интерфейса с сетью.

Этот протокол предоставляет программам средства для осуществления сеансов связи с другими сетевыми программами. Он очень популярен, так как поддерживается многими приложениями. NetBEUI - небольшой, быстрый и эффективный протокол Транспортного уровня, который поставляется со всеми сетевыми продуктами фирмы Microsoft и IBM для PC.

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

Основной недостаток NetBEUI - сам он не поддерживает маршрутизацию.


X.25

Х.25 - набор протоколов для сетей с коммутацией пакетов. Его использовали службы коммутации, которые должны были соединять удаленные терминалы с мэйнфреймами.


XNS

Xerox Network System (XNS) был разработан фирмой Xerox для своих сетей Ethernet. Его широкое использование началось с 80-х годов, но постепенно он был вытеснен протоколом TCP/IP. XNS - большой и медленный протокол, к тому же он применяет значительное количество широковещательных сообщений, что увеличивает трафик сети.


IPX/SPX

Internetwork Packet Exchange/Sequenced Packet Exchange (IPX/SPX) - стек протоколов, используемый в сетях Novell. Как и NetBEUI, относительно небольшой и быстрый протокол. Но, в отличие от NetBEUI, он поддерживает маршрутизацию. IPX/SPX©-©наследник© XNS.


АРРС

АРРС (Advanced Program-to-Program Communication) - транспортный протокол фирмы IBM, часть Systems Network Architecture (SNA). Он позволяет приложениям, работающим на разных компьютерах, непосредственно взаимодействовать и обмениваться данными.


AppleTalk

AppleTalk - собственный стек протоколов фирмы Apple Computer, позволяющий компьютерам Arpple Macintosh совместно использовать файлы и принтеры в сетевой среде.


Набор протоколов OSI

Набор протоколов OSI - полный стек протоколов, где каждый протокол соответствует конкретному уровню модели OSI. Набор содержит маршрутизируемые и транспортные протоколы, серии протоколов IEEE Project 802, протокол Сеансового уровня, Представительского уровня и несколько протоколов Прикладного уровня. Они обеспечивают пол нофункциональность сети, включая доступ к файлам, печать и эмуляцию терминала.


DECnet

DECnet - собственный стек протоколов фирмы Digital Equipment Corporation. Этот набор аппаратных и программных продуктов реализует архитектуру Digital Network! Architecture (DNA). Указанная архитектура определяет сети на базе локальных вычислительных сетей Ethernet, сетей FDDI MAN (Fiber Distributed Data Interface Metropolitan Area Network) и глобальных вычислительных сетей, которые используют средства передачи конфиденциальных и общедоступных данных. DECnet может использовать как протоколы TCP/IP и OSI, так и свои собственные. Данный протокол принадлежит к числу маршрутизируемых.

Несколько раз DECnet обновлялся; каждое обновление называется фазой. Текущая версия - DECnet Phase V. Используются как собственные протоколы DEC, так и достаточно полная реализация набора протоколов OSI.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Множественный доступ с контролем Up: Функционирование сетей Previous: Кратко о NetBEUI, X.25,   Contents   Index

Передача сигнала по кабелю. Методы доступа.

Метод доступа -это набор правил, которые определяют, как компьютер должен отправлять и принимать данные по сетевому кабелю.

В сети несколько компьютеров должны иметь совместный доступ к кабелю. Однако, если два компьютера попытаются одновременно передавать данные, их сигналы будут мешать©друг другу и данные будут испорчены. Это называется «коллизия».

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

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

Существует три способа предотвратить одновременную попытку использовать кабель:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Доступ с передачей маркера Up: Передача сигнала по кабелю. Previous: Передача сигнала по кабелю.   Contents   Index

Множественный доступ с контролем несущей


Множественный доступ с контролем несущей и обнаружением коллизий

При множественном доступе с контролем несущей и обнаружением коллизий (сокращенно CSMA/CD) все компьютеры в сети - и клиенты, и серверы © «прослушивают» кабель,стремясь обнаружить передаваемые данные (т.е. трафик).

  1. Компьютер «понимает», что кабель свободен (т.е. трафик отсутствует).
  2. Компьютер может начать передачу данных.
  3. Пока кабель не освободится (в течение передачи данных), ни один из сетевых компьютеров не может вести передачу.

В случае коллизии компьютеры приостанавливают передачу на случайный интервал времени, а затем вновь стараются отправить пакеты.

В то же время способность обнаружить коллизии - причина, которая ограничивает область действия метода. Из-за ослабления сигнала при расстояниях свыше 2500 м (1,5 мили) механизм обнаружения коллизий не эффективен. Если расстояние до передающего компьютера превышает это ограничение, некоторые компьютеры могут не «услышать»©его и начнут передачу данных, что приведет к коллизии и разрушению пакетов данных.

CSMA/CD известен как состязательный метод, поскольку сетевые компьютеры конкурируют между собой за право передавать данные. Он кажется достаточно громоздким, но современные реализации CSMA/CD настолько быстры, что пользователи даже не задумываются над тем, что применяют состязательный метод доступа.

Чем больше компьютеров в сети, тем интенсивнее сетевой трафик. При интенсивном трафике число коллизий возрастает, а это приводит к замедлению сети (уменьшению ее пропускной способности). Поэтому в некоторых ситуациях метод CSMA/CD может оказаться недостаточно быстрым. После каждой коллизии обоим компьютерам приходится возобновлять передачу, Если сеть очень загружена, повторные попытки опять могут привести к коллизиям, но уже с другими компьютерами. Теперь уже четыре компьютера (два от первой неудачной попытки и два от второй неудачной попытки первых) будут возобновлять передачу. Результат может оказаться тем же, что и в предыдущем случае, только пострадавших компьютеров станет еще больше. Такое лавинообразное нарастание вторных передач может парализовать работу всей сети.

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

Сеть с методом доступа CSMA/CD, обслуживающая многих пользователей, которые работают с несколькими системами управления базами данных (критическое числоло пользователей зависит от аппаратных компонентов, кабельной системы и сетев программного обеспечения), может практически остановиться из-за чрезмерного сетвого трафика.


Множественный доступ с контролем несущей и предотвращением коллизий

Множественный доступ с контролем несущей и предотвращением коллизий (сок щенно CSMA/CA) основан на том, что каждый компьютер перед передачей данных в сеть сигнализирует о своем намерении, поэтому остальные компьютеры узнают о готовящейся передаче и могут избежать коллизий. Однако широковещательное оповещение увеличивает общий трафик сети уменьшает ее пропускную способность. Поэтому CSMA/CA работает медленнее, чем CSMA/CD.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Доступ по приоритету запроса Up: Передача сигнала по кабелю. Previous: Множественный доступ с контролем   Contents   Index

Доступ с передачей маркера

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

Когда какой-либо компьютер «наполнит» маркер своей информацией и пошлет его по сетевому кабелю, другие компьютеры уже не могут передавать данные. Поскольку в каждый момент времени только один компьютер будет использовать маркер, то в сети не возникнет ни состязания, ни коллизий, ни временных пауз.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевые архитектуры Up: Передача сигнала по кабелю. Previous: Доступ с передачей маркера   Contents   Index

Доступ по приоритету запроса

Доступ по приоритету запроса - относительно новый метод доступа, разработана для стандарта сети Ethernet со скоростью передачи данных 100 Мбит/с 1OOVG-AnyLAN. Он стандартизован IEEE в категории 802.12. Этот метод доступа основан на том, что все сети 1OOVG-AnyLAN строятся только из концентраторов и оконечных узлов. Концентраторы управляют доступом к кабелю последовательно опрашивая все узлы в сети и выявляя запросы на передачу. Концентратор, должен знать все адреса, связи и узлы и проверять их работоспособность. Оконечным узлом, в соответствии со спецификацией 1OOVG-AnyLAN, может быть компьютер, мост, маршрутизатор или коммутатор.

Как и при CSMA/CD, при доступе по приоритету запроса два компьютера могут бороться за право передать данные. Однако только последний метод реализует схему, по которой определенные типы данных - если возникло состязание, - имеют соответствующий приоритет. Получив одновременно два запроса, концентратор вначале отдаст предпочтение запросу с более высоким приоритетом. Если запросы имеют одинаковый приоритет, они будут обслужены в произвольном порядке. В сетях с использованием доступа по приоритету запроса каждый компьютер может одновременно передавать и принимать данные, поскольку для этих сетей разработана специальная схема кабеля. В них применяется восьмипроводной кабель, по каждой паре проводов сигналы передаются с частотой 25 МГц.

В сетях, где реализован доступ по приоритету запроса, связь устанавливается только между компьютером-отправителем, концентратором и компьютером-получателем. Такой вариант более эффективен, чем CSMA/CD, где передача осуществляется для всей сети. В среде с доступом по приоритету запроса каждый концентратор ©«знает»©только те оконечные узлы и репитеры, которые непосредственно подключены к нему, тогда как в среде с CSMA/CD каждый концентратор «знает» адреса всех узлов сети.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Ethernet Up: Функционирование сетей Previous: Доступ по приоритету запроса   Contents   Index

Сетевые архитектуры



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: TokenRing Up: Сетевые архитектуры Previous: Сетевые архитектуры   Contents   Index

Ethernet

Сетевая архитектура (network architecture) © это комбинация стандартов, топологий и протоколов, необходимых для создания работоспособной сети.

В конце 60-х годов Гавайский университет разработал глобальную вычислительную сеть (ГВС) под названием ALOHA. Как Вы, вероятно, помните из материала предыдущих занятий, ГВС охватывает большие пространства, чем ЛВС. Универси2тет, располагая обширной территорией, решил объединить в сеть все имеющиеся в его распоряжении компьютеры. Одним из ключевых аспектов созданной сети явилось использование метода доступа CSMA/CD.

Эта сеть и послужила основой для современных сетей Ethernet. В 1972 году Роберт Меткалф и Дэвид Боггс (Исследовательский центр Пало Альто фирмы Xerox) разработали кабельную систему и схему передачи сигналов, а в 1975 году © первый продукт Ethernet. Первоначальная версия Ethernet представляла собой систему со скоростью передачи 2,94 Мбит/с и объединяла более 100 компьютеров с помощью кабеля длиной в 1 км. Сеть Ethernet фирмы Xerox имела такой успех, что компании Xerox, Intel Corporation и Digital Equipment Corporation разработали стандарт для Ethernet со скоростью передачи 10 Мбит/с. Сегодня ее рассматривают как спецификацию, описывающую метод кабельного соединения и совместного использования компьютеров и информационных систем.

Спецификация Ethernet выполняет те же функции, что Физический и Канальный уровни модели OSI. Эта разработка лежит в основе спецификации IEEE 802.3.


Основные характеристики

Ethernet - самая популярная в настоящее время сетевая архитектура. Она использует узкополосную передачу со скоростью 10 Мбит/с, топологию «шина»©, а для регулирования трафика в основном сегменте кабеля -© CSMA/CD. Среда (кабель) Ethernet является пассивной, т.е. получает питание от компьютера. Следовательно, она прекратит работу из-за физического повреждения или неправильного подключения терминатора.


Характеристики Ethernet

1.2emОсновная топология - шина
1.2emДругие топологии - звезда-шина
1.2emТип передачи - узкополосная
1.2emМетод доступа - CSMA/CD
1.2emСпецификация - IEEE 802.3
1.2emСкорость передачи данных - 10 и 100 Мбит/с
1.2emКабельная система - толстый и тонкий COAX, UTP


Формат кадра

Ethernet разбивает данные на пакеты (кадры), формат которых отличается от формата пакетов, используемого в других сетях. Кадры представляют собой блоки информации, передаваемые как единое целое. Кадр Ethernet может иметь длину от 64 до 1518 байтов, но сама структура кадра Ethernet использует, по крайней мере, 18 байтов, поэтому размер блока данных в Ethernet - от 46 до 1500 байтов. Каждый кадр содержит управляющую информацию и имеет общую с другими кадрами организацию.

Например, передаваемый по сети кадр Ethernet II используется для протокола TCP/IP. Кадр состоит из частей, которые перечислены в таблице.

1em Поле кадра Описание  
1.2em1 Преамбула Отмечает начало кадра  
1.2em2 Местоназначение и источник Указывает адрес источника и адрес приемника  
1.2em3 Тип Используется для идентификации протокола сетевого уровня (IP или IPX)  
1.2em4 CRC (Циклический избыточный код) - поле информации для проверки ошибок  

Сети Ethernet используют различные варианты кабелей и топологий.

Скорость передачи 10 Мбит/с.

Тип Скорость передачи, Мбит/с Кабель Кеннектор  
10BaseT 10 3, 4, 5 UTP RG-45  
10Base2 10 тонкий BNC  
10Base5 10 толстый DIX, AUI  
10BaseFL 10 смесь 10Base2 и 10Base5  
100VG-AnyLAN 100 3, 4, 5 UTP, fibre    
100BaseT4 100 3, 4, 5 UTP RG-45  
100BaseTX 100 5 UTP, STP RG-45  
100BaseFX 100 3, 4, 5 fibre RG-45  


next up previous contents index
Next: TokenRing Up: Сетевые архитектуры Previous: Сетевые архитектуры   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: AppleTalk Up: Сетевые архитектуры Previous: Ethernet   Contents   Index

TokenRing

Версия сети Token Ring была представлена фирмой IBM в 1984 году как часть предложенного ею способа объединить в сеть весь ряд выпускаемых IBM компьютеров и компьютерных систем, в том числе персональных компьютеров и средних ЭВМ (midrange), мэйнфреймов и сред Systems Network Architecture (SNA) (сетевая архитектура IBM).

Разрабатывая версию сети Token Ring, фирма IBM ставила целью обеспечить простоту монтажа кабеля - витой пары, - соединяющего компьютер с сетью через настенную розетку. Основной монтаж проводится централизованно. В 1985 году IBM Token Ring стала стандартом ANSI/IEEE.


Основные характеристики

Сеть Token Ring является реализацией стандарта IEEE 802.5. От других сетей ее отличает не только кабельная система, но и использование доступа с передачей маркера.

Сеть Token Ring имеет следующие характеристики:

топология звезда-кольцо;  
метод доступа с передачей маркера;  
кабельная система экранированная и неэкранированная витая пара (IBM тип 1, 2 или 3);  
скорость передачи данных 4 и 16 Мбит/с;  
тип передачи узкополосная;  
спецификации IEEE 802.5.  


Архитектура

Топология типичной сети Token Ring - ©кольцо©. Однако в версии IBM это топология «звезда-кольцо»: компьютеры в сети соединяются с центральным концентратором, а маркер передается по логическому кольцу. Физическое кольцо реализуется в концентраторе. Пользователи - часть кольца, но соединяются они с ним через концентратор.


Формат кадра

1em Поле кадра Описание  
1.2em1 Преамбула Сигнализирует о начале кадра  
1.2em1 Управление доступом Указывает на приоритет кадра и на то, что передается, кадр маркера или кадр данных  
1.2em1 Управление кадром Содержит информацию Управления доступом к среде - для всех компьютеров или информацию конечной станции©- только для одного компьютера  
1.2em1 Адрес приемника Адрес компьютера-получателя  
1.2em1 Адрес источника Адрес компьютера-отправителя  
1.2em1 Данные Передаваемая информация  
1.2em4 CRC (Циклический избыточный код) - поле информации для проверки ошибок  
1.2em1 Конечный разделитель Сигнализирует о конце кадра  
1.2em1 Статус кадра Сообщает, был ли распознан и скопирован кадр (доступен ли адрес приемника)  


Функционирование

Когда в сети Token Ring начинает работать первый компьютер, сеть генерирует маркер. Маркер проходит по кольцу от компьютера к компьютеру, пока один из них не сообщит о готовности передать данные и не возьмет управление маркером на себя. Маркер - это предопределенная последовательность битов (поток данных), которая позволяет компьютеру отправить данные по кабелю. Когда маркер захвачен каким-либо компьютером, другие компьютеры передавать данные не могут.

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

В сети одномоментно может передаваться только один маркер, причем только в одном направлении. Передача маркера - детерминистический процесс, это значит, что самостоятельно начать работу в сети (как, например, в среде CSMA/CD) компьютер не может. Он будет передавать данные лишь после получения маркера. Каждый компьютер действует как однонаправленный репитер, регенерирует маркер и посылает его дальше.


Мониторинг систем

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


Распознавание компьютера

После появления в сети нового компьютера система Token Ring инициализирует его таким образом, чтобы он стал частью кольца. Этот процесс включает проверку уникальности адреса; уведомление всех узлов сети о появлении нового узла.

В сети Token Ring концентратор, в котором организуется фактическое кольцо, имеет несколько названий, например:

MAU [Multistation Access Unit (модуль множественного доступа)];
MSAU (Multistation Access Unit);
SMAU [Smart Multistation Access Unit (интеллектуальный модуль множественного доступа)].

Кабели соединяют клиенты и серверы с MSAU, который работает по принципу других пассивных концентраторов. При подсоединении компьютера он включается в кольцо.


Встроенная отказоустойчивость

В ©чистой© сети с передачей маркера вышедший из строя компьютер останавливает движение маркера, что, в свою очередь, останавливает работу всей сети. MSAU разработаны таким образом, чтобы обнаруживать вышедшую из строя плату сетевого адаптера и вовремя отключать ее. Эта процедура позволяет ©обойти© отказавший компьютер, поэтому маркер продолжает свое движение по сети.

В MSAU фирмы IBM вышедшие из строя компьютеры (или некачественные соединения) автоматически исключаются из кольца, и маркер их ©обходит. Таким образом, неисправный компьютер (или соединение) не влияет на работу всей сети Token Ring.


Кабельная система

Компьютеры в сети Token Ring соединяются с концентратором кабелем STP или UTP. Сети Token Ring используют кабель IBM Туре 1, 2 и 3, однако большинство сетей - UTP IBM Cabling System Type 3. При использовании кабеля Туре 1 каждый компьютер может отстоять от MSAU максимум на 101 м (330 футов), при использовании STP - на 100 м (около 328 футов) и, наконец, при использовании UTP - на 45 м (около 148 футов). Минимальная длина экранированного или неэкранированного кабеля - 2,5 м (около 8 футов).


next up previous contents index
Next: AppleTalk Up: Сетевые архитектуры Previous: Ethernet   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: ArcNet Up: Сетевые архитектуры Previous: TokenRing   Contents   Index

AppleTalk

Компания Apple Computer, Inc. в 1983 году представила AppleTalk как ©фирменную© сетевую архитектуру для небольших рабочих групп. Сетевые функции были встроены в компьютеры Macintosh, что сделало реализацию сети AppleTalk очень простой по сравнению с другими сетями.

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


AppleTalk

AppleTalk - сетевая архитектура Apple, которая входит в операционную систем; Macintosh. Иначе говоря, сетевые возможности встроены в каждую машину Macintosh. AppleTalk Phase2 - последняя расширенная версия AppleTalk. Архитектура представляет собой набор протоколов, соответствующих модели OSI.

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

  1. Устройство само назначает себе адрес, произвольно выбранный из доступных адресов.
  2. Устройство сообщает свой адрес другим устройствам, чтобы проверить, не используется ли он кем-то еще.
  3. Если адрес никем не используется, устройство запоминает его и применяет в дальнейшем.


LocalTalk

Под сетью AppleTalk обычно подразумевают сеть LocalTalk. LocalTalk имеет следующие характеристики:

метод доступа CSMA/CA;
топология шина или дерево;
кабельная система экранированная витая пара, но можно использовать оптоволоконный кабель или UTP.

LocalTalk - дешевый вариант, поскольку сеть встроена в аппаратные средства Macintosh. Но относительно скромная производительность LocalTalk препятствует ее широкому распространению в крупных сетях. Здесь неоспоримые преимущества у Ethernet и Token Ring. Термин ©LocalTalk© относится также к компонентам физического кабеля. Сюда входят кабели, модули соединителей, удлинители кабеля. Кабель STP чаще всего используется в топологии шина или©дерево. Сеть LocalTalk поддерживает до 32 устройств.


AppleShare

AppleShare -©это файловый сервер в сети AppleTalk. Клиентское программное обеспечение входит в состав операционной системы Apple. Существует также принт-сервер AppleShare, который представляет собой спулер печати на базе сервера.


Зоны

Отдельные сети LocalTalk можно объединить в одну большую сеть. Для этого служат зоны (zones). Каждая присоединенная подсеть идентифицируется именем какой-либо зоны. Пользователи одной подсети LocalTalk могут иметь доступ к услугам другой подсети, просто выбрав нужную зону. Таким образом расширяется размер сети. Сети, построенные на иной архитектуре, например Token Ring, с помощью этого метода также могут присоединяться к AppleTalk.

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


EtherTalk

EtherTalk позволяет сетевым протоколам AppleTalk работать с коаксиальным кабелем Ethernet. Плата EtherTalk NB позволяет подсоединять Macintosh II к сети 802.3 Ethernet, С платой поставляется программное обеспечение EtherTalk, совместимое с AppleTalk Phase2.


TokenTalk

Плата TokenTalk NB является платой расширения, которая позволяет подсоединять Macintosh II к сети 802.3 TokenTalk. С платой поставляется программное обеспечение TokenTalk, совместимое с AppleTalk Phase2.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение в TCP/IP Up: Сетевые архитектуры Previous: AppleTalk   Contents   Index

ArcNet

Среда ArcNet (Attached resource computer Network) была разработана Datapoint Corporation в 1977 году. Это простая, гибкая, недорогая сетевая архитектура для сетей масштаба рабочей группы. Первые платы ArcNet были выпущены в 1983 году.

Технология ArcNet - предшественница стандартов IEEE Project 802, но в целом она соответствует категории IEEE 802.4. В ней определяются стандарты для сетей с топологией «шина» и методом доступа с передачей маркера, построенных на основе широкополосного кабеля. Сеть ArcNet может иметь топологию ©звезда© или шина.


Функционирование

ArcNet использует метод доступа с передачей маркера, топологию «звезда-шина»© и работает на скорости 2,5 Мбит/с. Преемница сети ArcNet - ArcNet Plus - работает на скорости 20 Мбит/с. Поскольку ArcNet использует передачу маркера, компьютер в сети ArcNet, чтобы начать передачу данных, должен получить маркер. Маркер переходит от одного компьютера к другому согласно назначенным им порядковым номерам, независимо от их физического местонахождения. Это значит, что маркер движется от компьютера 1 к компьютеру 2, даже если компьютер 1 находится на одном конце сети, а компьютер 2 - на другом.

Стандартный пакет ArcNet содержит:


Аппаратное обеспечение

Каждый компьютер соединяется с концентратором кабелем. Концентраторы могут быть пассивными, активными и интеллектуальными (smart). Пассивные концентраторы просто осуществляют физический контакт проводов. Активные концентраторы способны восстанавливать и ретранслировать сигналы. Интеллектуальные концентраторы - это активные концентраторы, обладающие диагностическими средствами (например, возможностью обнаружить изменения в конфигурации и удаленно управлять работой сетевых устройств).

Стандартным для ArcNet кабелем является коаксиальный кабель RG-62 A/U с волновым сопротивлением 93 Ом. ArcNet поддерживает также витые пары и оптоволоконный кабель. Расстояние между компьютерами зависит от кабельной системы и топологии.

При использовании коаксиального кабеля с BNC-коннекторами максимальная длина кабеля - 610м (2000 футов), если сеть топологии ©звезда, и 305 м (1000 футов), если сеть топологии ©шина. При использовании неэкранированной витой пары с соединителями RJ-11 или RJ-45 максимальная длина кабеля - 244 м (800 футов) как при топологии ©звезда, так и при топологии ©шина.


Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправить ввод: знак < Up: Командный процессор Previous: Использование кавычек для отмены   Contents   Index

Перенаправление ввода и вывода

В системе Linux некоторые команды ожидают ввод только с клавиатуры (стандартный ввод) и большинство команд отображают свой вывод на экране терминала (стандартный вывод). Однако система Linux позволяет вам перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать shell:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Средства Интернета Up: Введение в сети Previous: ArcNet   Contents   Index

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

Комплект протоколов TCP/IP - это сетевое программное обеспечение низкого уровня, чаще всего используемое с ОС UNIX. В состав комплекта TCP/IP входит несколько компонентов:

TCP/IP предоставляет пользователям однородный интерфейс, обеспечивающий взаимодействие с сетевыми аппаратными средствами различных типов. Этот протокол гарантирует возможность обмена данными (взаимодействия) между системами, невзирая на многочисленные различия, существующие между ними. TCP/IP, кроме того, позволяет соединять на программном уровне отдельные физические сети в более крупную и более гибкую логическую сеть.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: TCP/IP и модель OSI Up: Введение в TCP/IP Previous: Введение в TCP/IP   Contents   Index

Средства Интернета

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

Большая часть описания средств будет посвящена стандартам, называемым протоколами. Протоколы, такие как TCP и IP, дают формулы для передачи сообщений, описывают детали форматов сообщений и указывают, как обрабатывать ошибки. Самое важное то, что они позволяют нам рассматривать стандарты взаимодействия вне зависимости от того, на оборудовании какого производителя, они реализуются. По существу, протоколы являются для коммуникации тем, чем является языки программирования для вычислений. Язык программирования позволяет описать или понять вычисления, не зная системы команд конкретного ЦП. Аналогично, коммуникационный протокол позволяет нам описать или понять процесс передачи данных, не зная на каком оборудовании этот процесс выполняется.

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

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


Средства Интернета прикладного уровня

С точки зрения пользователя, Интернет TCP/IP является набором прикладных программ, использующих сеть для выполнения полезных коммуникационных задач. Мы будем использовать термин взаимная работоспособность(interoperability) для описания способности различных вычислительных систем взаимодействовать при решении вычислительных задач. Мы утверждаем, что прикладные программы Интернета показывают высокую степень взаимной работоспособности. Большинство пользователей, которые пользуются Интернетом, делают это, просто запуская прикладные программы , не понимая при этом технологии TCP/IP, структуры Интернета, и даже не зная пути, который проходят данные до назначения; они полагаются на то, что прикладные программы сами разберутся с этими деталями. Только программисты, пишущие такие прикладные программы, смотрят на Интернет как на сеть и понимают детали этой технологии.

Самые популярные и широко распространенные прикладные средства Интернета включают:

ЭЛЕКТРОННАЯ ПОЧТА

Электронная почта позволяет пользователю создать письмо и послать его человеку или группе людей. Другая часть этого приложения позволяет пользователю читать письма, которые он получил. Электронная почта была так успешна, что многие пользователи Интернета используют ее для обычной коммерческой переписки. Хотя существует много систем электронной почты, важно понимать, что использование TCP/IP делает доставку письма более надежной. Вместо того, чтобы полагаться на промежуточные машины при передаче письма, система предоставления письма в TCP/IP работает, напрямую соединяя машину отправителя с машиной получателя. Поэтому отправитель знает, что как только письмо покинуло его машину, оно успешно достигло места назначения.

ПЕРЕДАЧА ФАЙЛОВ

Хотя пользователи иногда и передают файлы, используя электронную почту, письмо предназначено для коротких, текстовых файлов. Протоколы TCP/IP включают прикладную программу передачи файлов, которая позволяет пользователям передавать или принимать довольно большие файлы программ или данных. Например, используя программу передачи файлов, можно скопировать с одной машины на другую большие обьемы данных, содержащие изображения со спутника, программы, написанные на Фортране или Паскале, или английский словарь. Эта система обеспечивает способ проверки личности пользователя или даже запрещение доступа. Как и письмо, передача файлов по Интернету TCP/IP надежна, так как две взаимодействующие машины делают это напрямую, не полагаясь на промежуточные машины для создания копий файла.

УДАЛЕННЫЙ ДОСТУП

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

Все приложения используют базовые протоколы TCP/IP.


Средства Интернета сетевого уровня.

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

ДЕЙТАГРАММНОЕ СРЕДСТВО ДОСТАВКИ ПАКЕТОВ

Это средство, которое будет впоследствии детально обьяснено, образует основу всех других средств Интернета. Доставка без соединения (дейтаграмная доставка) является абстракцией сервиса, который предоставляет большинство сетей с коммутацией пакетов. Это просто означает, что Интернет TCP/IP определяет маршрут передачи небольшого сообщения от одной машины к другой, основываясь только на адресной информации, находящейся в сообщении. Так как дейтаграмное средство маршрутизирует каждый пакет отдельно, оно не гарантирует надежной доставки пакетов в том порядке, в котором они были посланы. Так как это средство обычно напрямую отображается на лежащее в его основе оборудование, средство без соединения очень эффективно. Более того, использование доставки пакетов без соединения в качестве основы всех средств Интернета делает протоколы TCP/IP адаптируемыми к широкому диапазону сетевого оборудования.

НАДЕЖНОЕ ПОТОКОВОЕ ТРАНСПОРТНОЕ СРЕДСТВО

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

Много сетей обеспечивает базовые средства, аналогичные описанным выше, поэтому кое-кто может удивиться:"Чем же отличаются средства TCP/IP от других?". Основными отличиями являются:

НЕЗАВИСИМОСТЬ ОТ СЕТЕВОЙ ТЕХНОЛОГИИ

Хотя TCP/IP и основывается на удобной пакетной технологии, он независим от оборудования конкретного производителя. Обьединенный Интернет включает большое число сетевых технологий от сетей, предназначенных для работы в одном здании, до сетей, работающих на больших расстояниях. Протоколы TCP/IP определяют элемент передачи данных, называемый дейтаграммой, и описывают, как передавать дейтаграммы по конкретной сети.

ВСЕОБЩАЯ СВЯЗНОСТЬ

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

МЕЖКОНЦЕВЫЕ ПОДТВЕРЖДЕНИЯ

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

СТАНДАРТНЫЕ ПРИКЛАДНЫЕ ПРОТОКОЛЫ

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пакеты и сегментация Up: Введение в TCP/IP Previous: Средства Интернета   Contents   Index

TCP/IP и модель OSI

Сетевая модель OSI/ISO вкючает семь уровней взаимодействия:

Уровень Наименование Функция  
1.4em1 Физический Собственно кабели или другой физический носитель  
1.0em2 Канальный Передача и прием пакетов  
1.0em3 Сетевой Маршрутзация и ведение учета  
1.0em4 Транспортный Обеспечение корректной сквозной пересылки данных  
1.0em5 Сеансовый Аутентификация и проверка полномочий  
1.0em6 Представительный Интерпретация и сжатие данных  
1.0em7 Прикладной Предоставление услуг на уровне конечного пользователя: почта, регистрация и т.д.  

Когла протоколы были реализованы, выявился ряд проблем:

Сетевая модель ТСР/IР включает всего 4 уровня.

Наименование Функция  
1.4emКанальный Сетевые аппаратные средства и драйверы устройств  
1.0emСетевой Базовые коммуникации, адресация и маршрутизация  
1.0emТранспортный Связь между программами в сети  
1.0emПрикладной Прикладные программы конечных пользователей  

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

В структуре TCP/IP отсутствуют (теоретически) некоторые особенности, характерные для модели OSI. Кроме того, здесь некоторые средства соседних уровней OSI объединены, а некоторые уровни, наоборот, разделены. На рис. А показано, как различные компоненты и клиенты TCP/IP вписываются в общую архитектуру.

0.1mm
\begin{picture}(1529,622)
\put(7,560){Прикладной}
\put(7,520){уровень}
\put(2...
...7,200){уровень}
\put(-3,400){Транспортный}
\put(-3,360){уровень}
\end{picture}

Рис. 1 Архитектура семейства протоколов TCP/IP

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

Ниже канального уровня расположен только аппаратный уровень, который определяет электротехнические, механические, процедурные и функциональные характеристики активизации, поддержания и деактивизации физического канала между конечными системами (уровни напряжений, синхронизацию изменения напряжений, скорость передачи физической информации, максимальные расстояния передачи информации, физические соединители и др.)

Протоколы, обеспечивающие функции канального уровня, тесно связаны с физической (аппаратурной) средой, в которой они работают, например, Ethernet, Token Ring, FDDI, PPP, ISDN и др. В семействе TCP/IP нет протоколов, принадлежащих этому уровню, за счет этого и достигается аппаратная независимость семейства TCP/IP. Однако в состав семейства входят протоколы ARP и RARP, обеспечивающие взаимодействие между данным - канальным уровнем и следующим - сетевым уровнем TCP/IP, а именно, обеспечивающие трансляцию сетевых адресов в адреса локальной сети.

К сетевому уровню в TCP/IP относится межсетевой протокол IP, который является базовым в структуре TCP/IP и обеспечивает доставку пакета по месту назначения - маршрутизацию, фрагментацию и сборку поступивших пакетов на хосте получателя Этому уровню принадлежит протокол ICMP, в функции которого входят, в основном, сообщения об ошибках и сбор информации о работе сети.

Оптимальные маршруты через последовательность соединенных между собой подсетей выбирают протоколы маршрутизации К ним относятся такие протоколы как RIP, EGP BGP OSPF и др.

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

Прикладной уровень идентифицирует и устанавливает наличие предполагаемых партнеров для связи, синхронизирует совместно работающие прикладные программы, устанавливает соглашение по процедурам устранения ошибок и управления целостностью информации. Кроме того, протоколы прикладного уровня определяют, имеется ли в наличии достаточно ресурсов для предполагаемой связи. Прикладной уровень отвечает также за то, чтобы информация, посылаемая из прикладного уровня одной системы, была читаемой на прикладном уровне другой системы. При необходимости он осуществляет трансляцию между множеством форматов представления информации путем использования общего формата и структур данных, а также согласует синтаксис передачи данных для прикладного уровня. Прикладной уровень устанавливает и завершает сеансы взаимодействия между прикладными задачами, управляет этими сеансами, синхронизирует диалог между объектами и yпpавляет обменом информации между ними. Кроме того, прикладной уровень предоставляет средства для отправки информации и уведомления об исключительных ситуациях передачи данных.


next up previous contents index
Next: Пакеты и сегментация Up: Введение в TCP/IP Previous: Средства Интернета   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправить вывод: знак > Up: Перенаправление ввода и вывода Previous: Перенаправление ввода и вывода   Contents   Index

Перенаправить ввод: знак <

Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:

      command < имя\_файла



Alex Otwagin 2002-12-16

next up previous contents index
Next: IP протокол и адpесация Up: Введение в TCP/IP Previous: TCP/IP и модель OSI   Contents   Index

Пакеты и сегментация

ОС UNIX может обеспечивать работу целого ряда физических сетей, включая Ethernet, Token Ring и системы на базе модемов. Управление техническими средствами осуществляется в пределах канального уровня архитектуры TCP/IP, а протоколы более высоких уровней не знают и не желают знать о том, как именно используются эти технические средства.

Каждое соединение машины с сетью называется сетевым интерфейсом. Машина, имеющая более одного интерфейса, может принимать данные по одному интерфейсу и передавать их по другому, осуществляя таким образом пересылку данных между сетями. Эта функция называется маршрутизацией, а машина, ыполняющая ее, - маршрутизатором, или шлюзом7.3. Большинство сложностей в низкоуровневом управлении сетями обусловлено именно вопросами маршрутизации.

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

Когда пакет путешествует вниз по стеку протоколов, готовясь к отправке, каждый протокол вводит в него свою собственную информацию заголовка. Законченный пакет одного протокола становится полезной нагрузкой пакета, генерируемого следующим протоколом. Эта операция известна как инкапсуляция, или оформление. На принимающей машине инкапсулированные кадры разворачиваются в обратном порядке.

Например, UDP-пакет, передаваемый по сети Ethernet, содержит три различных "обертки". В среде Ethernet он "заворачивается" в простой заголовок, содержащий сведения об аппаратных адресах источника и получателя, длине кадра и его контрольной сумме. Полезной нагрузкой Ethernet-кадра является IP-пакет. Полезная нагрузка IP-пакета -UDP-пакет, и, наконец, полезная нагрузка UDP-пакета состоит собственно из передаваемых данных.

Существует множество стандартов протоколов коммуникации. Многие из них предшествовали Интернету, поэтому возникает вопрос:"Почему разработчики Интернета придумали новые протоколы, когда уже существует так много международных стандартов?". Ответ сложен, но тем не менее, может быть выражен в виде простого правила:

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: Введение в сети Previous: Пакеты и сегментация   Contents   Index

IP протокол и адpесация в IP-сетях



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Адресация Up: IP протокол и адpесация Previous: IP протокол и адpесация   Contents   Index

Введение


Обоснование

Протокол Internet создан для использования в объединенных системах компьютерных коммуникационных сетей с коммутацией пакетов. Такие системы были названы "catenet". Протокол Internet обеспечивает передачу блоков данных, называемых датаграммами, от отправителя к получателям, где отправители и получатели являются хост-компьютерами, идентифицируемыми адресами фиксированной длины. Протокол Internet обеспечивает при необходимости также фрагментацию и сборку датаграмм для передачи данных через сети с малым размером пакетов.


Цель

Протокол Internet специально ограничен задачами обеспечения функций, необходимых для передачи битового пакета (датаграммы Internet) от отправителя к получателю через объединенную систему компьютерных сетей. Нет механизмов для увеличения достоверности конечных данных, управления протоколом, синхронизации или других услуг, обычно приненяемых в протоколах передачи от хоста к хосту. Протокол Ineternet может обобщить услуги поддерживающих его сетей с целью предоставления услуг различных типов и качеств.


Интерфейсы

Данный протокол получил название в соответствии с протоколами передачи информации между хост-компьютерами в межсетевой среде. Протокол вызывает в локальной сети протоколы для передачи датаграммы Internet на следующий шлюз или хост-получатель.

Например, модуль TCP вызывал бы модуль Internet с тем, чтобы получить сегмент TCP (включая заголовок TCP и данные пользователя) как информационную часть Internet пакета. Модуль TCP обеспечил бы адреса и другие параметры в заголовке модуля Internet в качестве параметров рассматриваемого вызова. Модуль Internet в этом случае создал бы датаграмму Internet и прибегнул бы к услугам локальной сети для передачи датаграммы Internet.

Например, в случае сети ARPANET модуль Ineternet вызывал бы локальный сетевой модуль, который бы добавлял к датаграмме Internet проводник типа 1822 [2], создавая сообщение ARPANET для передачи на IMP. Адрес ARPANET получился бы из адреса Intenet с помощью интерфейса локальной сети и относился бы к некоторому хост-компьютеру в сети ARPANET, который мог бы быть шлюзом в другие сети.


Действие

Протокол Internet выполняет две главные функции: адресацию и фрагментацию.

Модули Internet используют адреса, помещенные в заголовок Internet, для передачи Internet датаграмм их получателям. Выбор пути передачи называется маршрутизацией.

Модули Internet используют поля в заголовке Internet для фрагментации и восстановления датаграмм Internet, когда это необходимо для их передачи через сети с малым размером пакетов.

Сценарий действия состоит в том, что модуль Internet меняет размер на каждом из хостов, задействованных в internet-коммуникации и на каждом из шлюзов, обеспечивающих взаимодействие между сетями. Эти модули придерживаются общих правил для интерпретации полей адресов, для фрагментации и сборки Internet датаграмм. Кроме этого, данные модули (и особенно шлюзы) имеют процедуры для принятия решений о маршрутизации, а также другие функции.

Протокол Internet обрабатывает каждую Internet датаграмму как независимую единицу, не имеющую связи ни с какими другими датаграммами Internet. Протокол не имеет дело ни с соединениями, ни с логическими цепочками (виртуальными или какими-либо другими).

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

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

Механизм времени жизни служит для указания верхнего предела времени жизни Internet датаграммы. Этот параметр устанавливается отправителем датаграммы и уменьшается в каждой точке на проходимом датаграммой маршруте. Если параметр времени жизни станет нулевым до того, как Internet датаграмма достигнет получателя, эта датаграмма будет уничтожена. Время жизни можно рассматривать как часовой механизм самоуничтожения.

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

Контрольная сумма заголовка обеспечивает проверку того, что информация, используемая для обработки датаграмм Internet, передана правильно. Данные могут содержать ошибки. Если контрольная сумма неверна, то Internet датаграмма будет разрушена, как только ошибка будет обнаружена.

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

Обнаруженные ошибки могут быть оглашены посредством протокола ICMP (Internet Control Message Protocol) [3], который поддерживается модулем Internet протокола.


Связь с другими протоколами

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


Сценарий работы

Схему действий для передачи датаграммы от одной прикладной программы к другой можно проиллюстрировать следующим образом:

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

Модуль Internet готовит заголовок датаграммы и стыкует с ним данные. Модуль Internet определяет локальный сетевой адрес, соответствующий данному адресу Internet. В данном случае это адрес шлюза.

Модуль передает данную датаграмму и адрес в локальной сети в распоряжение интерфейса локальной сети.

Интерфейс локальной сети создает соответствующий этой сети заголовок и соединяет с ним датаграмму. Затем он передает по локальной сети полученный таким образом результат.

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

Интерфейс создает заголовок локальной сети и соединяет с ним датаграмму, а затем результат на правляет на хост-получатель.

На хосте-получателе интерфейс локальной сети удалает заголовок локальной сети и передает оставшееся на Internet модуль.

Модуль Internet определяет, что рассматриваемая выше датаграмма предназначена для прикладной программы на этот хосте. Модуль передает данные прикладной программе в ответ на системный вызов. В качестве результата этого вызова передаются адрес получателя и другие параметры.

прикладная программа                               прикладная программа
           \                                            /
      модуль Internet       модуль Internet      модуль Internet
              \                /        \            /
             LNI-1         LNI-1        LNI-2     LNI2
                 \          /              \      /
                локальная сеть 1        локальная сеть 2

Рис. 2 Путь передачи датаграммы


Описание функций

Функция или цель протокола Internet состоит в передаче датаграммы через набор объединенных компьютерных сетей. Это осуществляется посредством передачи датаграмм от одного модуля Internet к другому до тех пор, пока не будет достигнут получатель. Модули Internet находятся на хостах и шлюзах системы Internet. Датаграммы направляются с одного модуля Internet на другой через конкретные компьютерные сети, основанные на интерпретации Internet адресов. Таким образом, одним из важных механизмов протокола Internet является Internet адрес.

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

Адресация. В протоколе сделано разграничение между именами, адресами и маршрутами [4]. Имя показывает искомый нами объект. Адрес показывает его местонахождение. Internet имеет дело с адресами. Перевод имен в адреса является задачей протоколов более высокого уровня (прикладных программ или протоколов передачи синхронизации с хоста на хост). Собственно модуль Internet осуществляет отображение адресов Internet на адреса локальной сети. Создание карты адресов локальной сети для получения маршрутов - задача процедур более низкого уровня (процедур локальной сети или шлюзов).

Адреса имеют фиксированную длину четыре октета (32 бита). Адрес начинается с сетевого номера, за которым следует локальный адрес (называемый полем остатка "rest"). Существуют три формата или класса адресов Internet. В классе a самый старший бит нулевой. Следующие 7 бит определяют сеть. а последние 24 бита - локальный адрес. В классе b самые старшие два бита равны соответственно 1 и 0, следующие 14 бит определяют сеть, а последние 16 бит - локальный адрес. В классе c три самых старших бита равны соответственно 1,1 и 0, следующие 21 бит определяют сеть, а последние 8 бит - локальный адрес.

При отображении карты Internet адресов на адреса локальной сети следует соблюдать осторожность. Единичный хост-компьютер должен уметь работать так, как если бы на его месте существовало несколько отдельных хост-компьютеров для использования нескольких адресов Internet. Некоторые хост-компьютеры будут также иметь несколько физических интерфейсов (multi-homing).

Таким образом, следует обеспечить каждый хост-компьютер несколькими физическими сетевыми интерфейсами, имеющими по несколько логических адресов Internet.

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

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

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

Необходимо, чтобы Internet процедуры фрагментации и сборки могли разбивать датаграмму на почти любое количество частей, которые впоследствии могли бы быть вновь собраны. Получатель фрагмента использует поле идентификации для того, чтобы быть убежденным в том, что фрагменты различных датаграмм не будут перепутаны. Поле смещения фрагмента сообщает получателю положение фрагмента в исходной датаграмме. Смещение фрагмента и длина определяют кусок исходной датаграммы, принесенный этим фрагментом. Флаг "more fragments" показывает (посредством перезагрузки) появление последнего фрагмента. Эти поля дают достаточное количество информации для сборки датаграмм.

Поле идентификации позволяет отличить фрагменты одной датаграммы от фрагментов другой. Модуль Internet, отправляющий Internet датаграмму, устанавливает в поле идентификации значение, которое должно быть уникальным для данной пары отправитель - получатель, а также время, в течении которого датаграмма будет активна в системе Internet. Модуль протокола, отправляющий нерасчлененную датаграмму, устанавливает в нуль флаг "more fragments" и смещение во фрагменте.

Чтобы расчленить большую Internet датаграмму, модуль протокола Internet (например, шлюз), создает две новые Intenet датаграммы и копирует содержимое полей Internet заголовка из большой датаграммы в оба новых Internet заголовка. Данные из старой датаграммы делятся на две части по границе на очередном восьмом октете (64 бита). Полученная таким образом вторая часть может быть кратна 8 октетам, а может и не быть, но первая часть кратна всегда. Заказывается количество блоков первой части NFB (количество блоков фрагмента). Первая часть данных помещается в первую новую Internet датаграмму, в поле общей длины помещается длина первой датаграммы. Флаг "more fragments" устанавливается в единицу. Вторая часть данных помещается во вторую новообразованную Internet датаграмму, в поле общей длины заносится длина второй датаграммы. В поле смещения фрагмента во второй Internet датаграмме устанавливается значение такого же поля в исходной большой датаграмме, увеличенное на NFB.

Эта процедура может быть обобщена на случай многократного расщепления исходной датаграммы.

Чтобы собрать фрагменты Internet датаграммы, модуль протокола Internet (например, модуль на хост-компьютере) объединяет Internet датаграммы, имеющие одинаковые значения в полях идентификатора, отправителя, получателя и протокола. Собственно объединение заключается в помещении данных из каждого фрагмента в позицию, указанную в заголовке Internet пакета в поле "fragment offset". Первый фрагмент будет иметь в поле "fragment offset" нулевое значение, а последний фрагмент будет иметь флаг "more fragments", вновь установленный в нуль.


Шлюзы

С помощью шлюзов протокол Internet осуществляет передачу датаграмм между сетями. Шлюзы также поддерживают протокол шлюз-шлюз (GGR) [[*]] для координации маршрутизации и передачи другой управляющей информации для протокола Internet.

Нет нужды держать на шлюзе протоколы более высокого уровня, а функции GGP добавляются к возможностям IP модуля.

                   +--------------------------------+
                   | Internet протокол & ICMP & GGP |
                   +--------------------------------+
                           |                |
                 +----------------+  +----------------+
                 | локальная сеть |  | локальная сеть |
                 +----------------+  +----------------+

Рис. 3 Протоколы шлюзов


next up previous contents index
Next: Адресация Up: IP протокол и адpесация Previous: IP протокол и адpесация   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Форматы адресации Up: IP протокол и адpесация Previous: Введение   Contents   Index

Адресация

Чтобы обеспечить гибкость в присвоении адресов комптьютерным сетям и позволить применение большого количества малых и средних сетей, поле адреса кодируется таким образом, чтобы определять малое количество сетей с большим количеством хостов, среднее количество сетей со средним количеством хостов и большое количество сетей с малым количеством хостов. Дополнительно имеется escape код для расширенного режима адресации.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Специфиация Up: Адресация Previous: Адресация   Contents   Index

Форматы адресации

Старшие биты Формат Класс
0 7 бит в сети, 24 бита для хостов А
10 14 бит в сети, 16 бит для хостов В
110 21 бит для сети, 8 бит для хостов С
111 переход в расширенный режим адресации  

Нулевое значение в поле сети означает данную сеть. Этот режим используется только в определенных ICMP сообщениях. Расширенный режим адресации неопределен. Обе эти возможности зарезервированы для будущих реализаций. Реальные значения, присваиваемые сетевым адресам, даны в документе "Assigned Numbers" [[*]].

Локальный адрес, присвоенный локальной сети, должен позволять одиночному физическому хосту работать как несколько отдельных Internet хостов. А именно, должен существовать промежуток между адресами Internet хостов и должны присутствовать интерфейсы между сетью и хостом, которые позволили бы нескольким Internet адресам соответствовать одному интерфейсу. Хост должен иметь возможность для поддержки нескольких физических интерфейсов и для обработки датаграмм с любого из них, как если бы они были адресованы к единственному хосту.

Карта соответствия между Internet адресами и адресами таких сетей, как ARPANET, SATNET, PRNET и др. описаны в документе "Address Mapping" [[*]].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Фрагментация и сборка Up: IP протокол и адpесация Previous: Форматы адресации   Contents   Index

Специфиация


Формат заголовка Internet

Ниже приведена полная схема полей заголовка Internet

0 4 8 1em 16 20 24 31  

1emVersion

1emIHL 1emType of Service 1emTotal Length  

1emIdentification

1emFlags 1emFragment Offset  

1emTime to Live

1emProtocol 1emHeader Checksum  

1emSource Address

 

1emDestination Address

 

1emOptions

1emPadding  

               

Рис. 4 Пример заголовка Internet датаграммы

Version (версия)
4 бита

Поле версии показывает формат заголовка Internet. Данный документ описывает версию 4.

IHL (длина Internet заголовка)
4 бита

Длина Internet заголовка измеряется в словах по 32 бита каждый и указывает на начало поля данных. Заметим, что корректный заголовок может иметь минимальный размер 5 слов.

Type of Service (тип сервиса)
8 бит

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

биты 0-2 приоритет
бит 3 0 - нормальная задержка, 1 - малая задержка
бит 4 0 - нормальная пропускная способность,

1 - высокая пропускная способность

бит 5 0 - обычная достоверность, 1 - высокая достоверность
биты 6-7 зарезервированы

      0     1     2     3     4     5     6     7
   +-----+-----+-----+-----+-----+-----+-----+-----+
   |     приоритет   |  D  |  T  |  R  |  0  |  0  |
   +-----+-----+-----+-----+-----+-----+-----+-----+

Приоритет

111 - управление сетью
110 - межсетевое управление
101 - CRITIC/ECP
100 - более, чем мгновенно
011 - мгновенно
010 - немедленно
001 - приоритетно
000 - обычный маршрут

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

Тип обслуживания используется для указания типа обработки датаграммы при ее прохождении через систему Internet. Примеры отображения типа обслуживания в протоколе Internet на реальные услуги, предоставляемые такими сетями, как AUTODIN II, ARPANET, SATNET и PRNET даны в документе "Service Mapping" [[*]]. Значение "управление сетью" следует присваивать приоритету только для использования внутри локальной сети. Управление и реальное использование этого аргумента должно находиться в согласии с каждой применяющей его сетью. Аргумент "межсетевое управление" предназначен только для использования шлюзами, берущими на себя управление. Если вышеописанные аргументы приоритета находят применение в какой-либо сети, то это означает, что данная сеть может управлять приемом и использованием этих аргументов.

Total Length (общая длина)
16 бит

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

Значение 576 выбрано с тем, чтобы соответсвующим образом ограниченный блок данных передавался вместе с требуемой информацией в заголовке. Например, этот размер позволяет заполнять датаграмму полем данных размером в 512 октетов и заголовком в 64 октета. Наибольший Internet заголовок занимает 60 октетов, а его типичный размер составляет всего 20 октетов, что оставляет место под заголовки протоколов более высокого уровня.

Identification (идентификатор)
16 бит

Идентификатор устанавливается отправителеим для сборки фрагментов какой-либо датаграммы.

Flags (различные управляющие флаги)
16 бит

бит 0 зарезервирован, должен быть нуль
бит 1 (DF) 0 - возможно фрагментирование, 1 - запрет фрагментации
бит 2 (MF) 0 - последний фрагмент, 1 - будут еще фрагменты

      0    1    2
   +----+----+----+
   |  0 | DF | MF |
   +----+----+----+

Fragment Offset (смещение фрагмента)
13 бит

Это поле показывает, где в датаграмме находится этот фрагмент. Смещение фрагмента изменяется порциями по 8 октет (64 бита). Первый фрагмент имеет смещение нуль.

Time to Live (Время жизни)
8 бит

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

Protocol (Протокол)
8 бит

Это поле показывает, какой протокол следующего уровня использует данные из Internet датаграммы. Значения для различных протоколов приводятся в документе "Assigned Numbers" [9].

Header Checksum (Контрольная сумма заголовка)
16 бит

Поскольку некоторые поля заголовка меняют свое значение (например, время жизни), это значение проверяется и повторно рассчитывается при каждой обработке Internet заголовка. Алгоритм контрольной суммы следующий: Поле контрольной суммы - это 16 бит, дополняющие биты в сумме всех 16 битовых слов заголовка. Для вычисления контрольной суммы значение этого поля устанавливается в нуль.

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

Source Address (адрес отправителя)
32 бита

Destination Address (адрес получателя)
32 бита

Options (опции)
- поле переменной длины

Опции могут появиться в датаграммах, а могут и не появляться. Они должны поддерживаться всеми Internet модулями (хостами и шлюзами). Не обязательно каждая конкретная датаграмма несет опции, но нести их все же может.

В некоторых приложениях опция секретности должна присутствовать во всех датаграммах.

Поле опций не имеет постояннойц длины. Опций может не быть, а может быть несколько. Существуют два формата опции:

Октет длины поля учитывает октет типа опции, сам себя и октеты с данными для опции.

Считается, что октет типа опции состоит из трех полей:

1 бит флаг копирования
2 бита класс опции
5 бит номер опции

Флаг копирования показывает, что эта опция копируется во все фрагменты при фрагментации.

0 не копируется
1 копируется

Классы опции
0 управление
1 резервировано
2 отладка и измерения
3 резервировано

Определены следующие опции Internet

класс номер длина описание  
0 0 - Конец списка опций. Эта опция занимает лишь один октет, октет длины отсутствует.  
0 1 - Нет операции. Эта опция занимает лишь один октет. Не имеет октета длины.  
0 2 11 Безопасность. Используется для поддержания безопасности, изоляции, разделения на группы пользователей (TCC), обработки кодов ограничения, соответсвующих DOD требованиям.  
0 3 перем Потеря маршрута отправителя. Используется для передачи Internet датаграммы, основанной на имеющейся у отправителя информации  
0 9 перем Определение маршрута отправителя. Используется для передачи Internet датаграммы, основанной на имеющейся у отправителя информации  
0 7 перем Запись маршрута. Используется для отслеживания проходимого Internet датаграммой маршрута.  
0 8 4 Идентификатор маршрута. Используется для поддержки идентификации потока.  
2 4 перем Временной штамп Internet.  

Отдельные описания опций

Тип 0
\fbox{00000000} End of Option List (конец списка опций)

Эта опция обозначает конец списка опций. Он может не совпадать с окончанием Internet заголовка, обозначаемым полем Internet header length. Эта опция используется после всех опций, но не после каждой. Она необходима только в том случае, если конец списка опций не совпал с окончанием Internet заголовка. Может быть скопирован, внесен или удален при фрагментации, или по какой-либо другой причине.

Тип 1
\fbox{00000001} No operation (нет действий)

Эта опция может быть использована между другими опциями. Ее целью может служить, к примеру, выравнивание очередной опции по 32- битной границе. Может быть скопирована, внесена или удалена при фрагментации и по любой другой причине.

Тип 130
Security (безопасность)

Эта опция дает способ хост-компьютерам отправлять параметры, связанные с безопасностью, закрытостью, введением ограничений и параметрами TCC (закрытой группой пользователей). Формат этой опции следующий: (длина 11 октетов)

      +--------+--------+---///---+---///---+---///---+---///----+
      |10000010|00001011|SSS...SSS|CCC...CCC|HHH...HHH|   TCC    |
      +--------+--------+---///---+---///---+---///---+---///----+

Поле S (security) 16 бит

Указывает один из 16 уровней безопасности (восемь из которых зарезервировано).

00000000 00000000 неклассифицировано
11110001 00110101 конфиденциальный
01111000 10011010 EFTO
10111100 01001101 MMMM
01011110 00100110 PROG
10101111 00010011 ограниченный
11010111 10001000 секретный
01101011 11000101 особо секретный
00110101 11100010 резервировано
10011010 11110001 резервировано
01001101 01111000 резервировано
00100100 10111101 резервировано
00010011 01011110 резервировано
10001001 10101111 резервировано
11000100 11010110 резервировано
11100010 01101011 резервировано
Поле C (compartments) 16 бит

Нулевое значение во всех позициях используется когда передача информации не ограничена. Остальные значения для этого поля можно получить от Секретного Оборонного Агенства.

Поле H (введение ограничений) 16 бит

Значения для управления и внесения меток являются буквенно- цифровыми диграммами и опредены в документе DIAM 65-19 "Standard Security Markings".

Поле TCC (поле управления переносом) 24 бита

Дает средства для отслеживания процесса отделения, его значения контролируются группами заинтересованных подписчиков. Значения TCC имеют три поля для записей и могут быть получены из документа HQ DCA Code 530.

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

Тип 131
Loose Source and Record Route (Потеря отправителя и запись маршрута)

      +--------+--------+---------+------- // ------+
      |10000011| длина  |указатель|данные о маршруте|
      +--------+--------+---------+------- // ------+

Опция потери отправителя и записи маршрута (LSRR) обеспечивает средства, позволяющие отправителю Internet датаграммы передавать информацию, используемую шлюзами при передаче датаграмм по назначению, а также записывать информацию о маршруте.

Опция начинается с кода типа. Второй октет - октет длины, которая учитывает код типа опции и сам себя, а также октет указателя. Третий октет является указателем на данные о маршруте, он определяет октет, с которого начинается следующий адрес отправителя, подлежащий обработке. Указатель отсчитывается от начала рассматриваемой опции, а его наименьшее допустимое значение - 4.

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

Если адрес, записанный в поле адреса получателя, был достигнут, а указатель не превысил длину, то следующий адрес в маршруте отправителя замещает адрес в поле с адресом получателя. Записанный адрес маршрута заменяет только что использованный адрес отправителя, а указатель увеличивается на 4.

Записанный адрес маршрута является собственным Internet адресом Internet модуля, известным во внешнем окружении, куда эта датаграмма направляется.

Эта процедура замещения исходного маршрута записанным маршрутом (хотя при обратном порядке он должен использоваться как маршрут отправителя) означает, что данная опция (а также и весь IP заголовок) сохраняет постоянный размер при прохождении датаграммы по Internet системе.

Эта опция называется потерей маршрута отправителя (loose source route), поскольку шлюз или IP хост могут использовать любые маршруты через любое количество других промежуточных шлюзов для достижения следующего адреса в рассматриваемом маршруте. При фрагментации опция должна копироваться. В датаграмме она должна появляться не более одного раза.

Тип 137
Strict Source and Record Route (Уточнить отправитель и записать маршрут)

      +--------+--------+---------+------- // --------+
      |10001001| длина  |указатель| данные о маршруте |
      +--------+--------+---------+------- // --------+

Опция "уточнить отправитель и записать маршрут" (SSRR) дает средства отправителю Internet датаграммы для поддержания информации о маршрутизации, которая должна использоваться шлюзами при передаче датаграммы по назначению, а также для записи этой информации.

Опция начинается с кода типа. Второй октет - длина опции, которая учитывает код типа опции и октет длины, октет указателя (3 октета с данными о маршруте). Третий октет является указателем на данные маршрута, определяющим октет, с которого начинается следующий адрес отправителя, подлежащий обработке. Указатель отсчитывается с начала этой опции, а наименьшее допустимое значение указателя - 4.

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

Если адрес в поле адреса получателя был достигнут, а указатель не превышает длины, то следующий адрес в маршруте отправителя замещает адрес в поле с адресом получателя, а записанный адрес маршрута замещает только что использованный адоес отправителя, указатель увеличивается на 4.

Записанный адрес маршрута - это собственный Internet - адрес Internet - модуля, как он был бы распознан во внешней среде, куда эта датаграмма направляется.

Эта процедура замещения маршрута отправителя записанным маршрутом (хотя в обратном порядке он должен использоваться как маршрут отправителя) означает, что опция (и весь IP заголовок) сохраняет постоянный размер при прохождении датаграммы через Internet систему.

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

Опция должна копироваться при фрагментации. Появляется не более одного раза в датаграмме.

Тип 7
Record Route (Записать маршрут)

      +--------+--------+---------+------- // --------+
      |00000111| длина  |указатель| данные о маршруте |
      +--------+--------+---------+------- // --------+

Опция записи маршрута дает средства для записи маршрута Internet датаграммы.

Опция начинается с кода типа. Второй октет определяет длину опции, которая учитывает код типа опции, сам себя, октет указателя и длину трех октетов с данными о маршруте. Третий октет является указателем на данные маршрута. Указатель определяет октет, с которого начинается следующее поле для размещения адреса маршрута. Указатель отсчитывается от начала рассматриваемой опции, а его наименьшее допустимое значение - 4.

Записываемый маршрут состоит из серии Internet адресов. Каждый Internet адрес - это 32 бита или 4 октета. Если указатель больше, чем длина опции, то поле с записываемым маршрутом заполнено. Хост - компьютер, создающий эту опцию, должен зарезервировать поле с данными о маршруте и достаточным размером, с тем, чтобы оно вместило все ожидаемые адреса. Размер этой опции не изменяется при добавлении адресов. Первоначальное содержимое поля под данные о маршруте должно быть нулевым.

Когда Internet модуль направляет датаграмму, он проверяет ее на присутствие рассматриваемой опции с записываемым маршрутом. Если она присутствует, то он вставляет свой собственный Internet адрес в качестве распознанного во внешней среде, куда эта датаграмма направлена. Вставка осуществляется в опцию записи маршрута, в то место, на которое указывает октет указателя. Указатель затем увеличивается на 4.

Если поле с данными о маршруте уже заполнено (указатель превышает длину), то датаграмма направляется без вставки адреса в опцию заполняемого маршрута. Если имеется некоторое пространство, но недостаточное для вставки полного адреса, то исходная датаграмма считается ошибочной и разрушается. И в том, и в другом случае на хост-отправитель напрвляется сообщение о проблеме с ICMP параметром [3].

При фрагментации не копируется, присутствует лишь в первом фрагменте. В датаграмме присутствует не более одного раза.

Тип 136
(длина 4) Stream Identifier (Идентификатор потока)

      +--------+--------+--------------------+
      |10001000|00000010|идентификатор потока|
      +--------+--------+--------------------+

Эта опция дает средства для поддержания 16-битовой SATNET идентифткации потока в сетях, которые парвоначально не поддерживали потоковую концепцию.

Опция должна копироваться при фрагментации. В датаграмме появляется не более одного раза.

Тип 68
Internet timestamp (Временной штамп Internet)

      +--------+--------+---------+-----+-----+
      |01000100| длина  |указатель|oflw | flg |
      +--------+--------+---------+-----+-----+
      |           Internet адрес              |
      +---------------------------------------+
      |              Timestamp                |
      +---------------------------------------+
      |                                       |

Длина - это количество октетов в опции, которое учитывает октеты типа, длины, указателя и overflow/flag (максимальная длина 40 октетов).

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

Overflow (oflw, переполнение 4 бита) - это количество IP модулей, которые не могут произвести регистрацию временных штампов по причине отсутствия свободного места.

Flag (flg, флаги 4 бита) - это

0 оставлять лишь временные штампы, размещенные в следующих друг за другом 32-битных словах
1 каждому временному штампу предшествует Internet адрес регистрируемого объекта
3 поля Internet адресов определены заранее. IP модуль лишь регистрирует свой временной штамп, если его собственный адрес совпадает со следующим указанным Inernet адресом.

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

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

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

Если имеется место, но оно недостаточно для вставки полного временного штампа, или же счетчик переполнения сам переполнен, то исходная датаграмма рассматривается как ошибочная и уничтожается. И в том, и в другом случае на хост-отправитель должно посылаться сообщение о проблеме с ICMP параметром [3].

Опция временного штампа не копируется при фрагментации, а сохраняется в первом фрагменте. В датаграмме появляется не более одного раза.

Padding (Выравнивание)
1em

Выравнивание Internet заголовка используется для того, чтобы убедиться в том, Internet заголовок заканчивается на 32-битной границе. Варавнивание осуществляется нулями.



Subsections
next up previous contents index
Next: Фрагментация и сборка Up: IP протокол и адpесация Previous: Форматы адресации   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Пример процедуры фрагментации Up: Специфиация Previous: Специфиация   Contents   Index

Фрагментация и сборка

Поле Internet идентификации (ID) используется вместе с адресамиотправителя и получателя, полями протокола для идентификации фрагментов датаграммы при сборке.

Бит флага More Fragments (MF) устанавливается, если датаграмма не является последним фрагментом. Поле Fragment Offset идентифицирует расположение фрагмента относительно начала в первоначальной нефрагментированной датаграмме. Единица измерения - 8 октетов. Стратегия фрагментации разработана так, чтобы нефрагментированная датаграмма имела нули во всех полях с информацией о фрагментации (MF=0, Fragment Offset=0). Если же Internet датаграмма фрагментируется, то выделение информации производится кусками и по границе 8 октет.

Данный формат позволяет использовать 2**32=8192 фрагментов по 8 октетов каждый, а в целом 65536 октетов. Заметим, что это совпадает со значением поля общей длины для датаграммы (конечно, заголовок учитывается в общей длине датаграммы, но не фрагментов).

Когда происходит фрагментация, то некоторые опции копируются, а другие остаются лишь в первом фрагменте.

Каждый Internet модуль должен быть способен передать датаграмму из 68 октетов без дальнейшей фрагментации. Это происходит потому, что Internet заголовок может включать до 60 октетов, а минимальный фрагмент - 8 октетов. Каждый Internet - получатель должен быть в состоянии принять датаграмму из 576 октетов в качестве единого куска, либо в виде фрагментов, подлежащих сборке.

Процесс фрагментации может повлиять на предыдущие поля

(1) поле опций
(2) флаг "more fragments"
(3) смещение фрагмента
(4) поле длины Internet заголовка
(5) поле общей длины
(6) контрольная сумма заголовка

Если бит флага запрета фрагментации (Don't Fragment - DF) установлен, то Internet фрагментация данной датаграммы запрещена, даже если она может быть разрушена. Данное средство может использоваться для предотвращения фрагментации в тех случаях, когда хост-получатель не имеет достаточных ресурсов для сборки Internet фрагментов.

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

Процедуры фрагментации и сборки наиболее просто описываются примерами. Следующие процедуры являются учебными реализациями. В следующих псевдопрограммах принимается следующая нотация:

"=<" означает "меньше или равно", "#" означает "не равно", "=" означает "равно", "<-" означает "устанавливается в". Кроме этого, "с x по y" означает включительно по x, но не включая y. К примеру, выражение "с 4 по 7" означало бы включение 4,5 и 6, но не включало бы 7.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пример процедуры сборки Up: Специфиация Previous: Фрагментация и сборка   Contents   Index

Пример процедуры фрагментации

Датаграмма наибольшего размера, которая еще может быть передана через очередную локальную сеть, называется наибольшей передаваемой единицей (maximum transmission unit - MTU).

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

Обозначения:

FO смещение фрагмента
IHL длина Internet заголовка
DF флаг запрета фрагментации
MF флаг появления дополнительных фрагментов
TL общая длина
OFO старое смещение фрагмента
OIHL старая длина Internet заголовка
OMF старое значение флага появление дополнительных фрагментов
OTL старое значение общей длины
NFB количество блоков фрагментации
MTU максимальная длина переноса

Процедура

   IF TL =< MTU THEN отправить датаграмму на следующие процедуры
                     обработки
   ELSE
       IF DF =1 THEN разрушить датаграмму
       ELSE
           создать первый фрагмент
           (1) скопировать исходный Internet заголовок;
           (2) OIHL <- IHL; OTL <- TL; OMF <- MF;
           (3) NFB <- (MTU - IHL*4)/8;
           (4) взять первые NFB*8 октетов данных;
           (5) скорректировать заголовок:
               MF <- 1; TL <- (IHL*4)+(NFB*8);
               пересчитать контрольную сумму;
           (6) направить данный фрагмент на последующие
               процедуры обработки
           создать второй фрагмент:
           (7) выборочно скопировать Internet заголовок (некоторые
               опции не копируются, см. определение опций)
           (8) добавить оставшиеся данные
           (9) скорректировать заголовок
               IHL <- (((OIHL*4)-(длина нескопированных опций))+3)/4;
               TL <- OTL - NFB*8 - (OIHL-IHL)*4;
               FO <- OFO + NFB;  MF <- OMF;
               пересчитать контрольную сумму;
           (10) Приготовить этот фрагмент к повторному тесту на
                необходимость фрагментации. Выполнить.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Идентификация Up: Специфиация Previous: Пример процедуры фрагментации   Contents   Index

Пример процедуры сборки

Для каждой датаграммы идентификатор буфера определяется как объединение полей адреса отправителя, адреса получателя, протокола и идентификации. Если это целая датаграмма (поля fragment offset и more fragments нулевые), то все ресурсы, связанные с этим идентификатором буфера, освобождаются, а сама датаграмма направляется на следующие процедуры обработки.

Если следующий фрагмент не связан с этим идентификатором буфера, то выделяются ресурсы для сборки. Они включают буфер данных, буфер заголовка, битовую таблицу фрагментации, поле общей длины данных, а также таймер. Данные из фрагмента помещаются в буфер данных в соответствии со значением полей fragment offset и длины, а также устанавливаются биты в битовой таблице фрагментации согласно полученным блокам фрагментов.

Если это первый фрагмент (поле fragment offset нулевое), то его заголовок помещается в буфер заголовка. Если это последний фрагмент (поле more fragments нулевое), то вычисляется общая длина данных. Если этот фрагмент завершает датаграмму (проверяется по установке битов в таблице фрагментации), то датаграмма направляется на следующий этап обработки. В противном случае таймер устанавливается на максимальное из двух: текущее значение таймера и время жизни для данного фрагмента. Выполнение процедуры сборки приостанавливается.

Если таймер отсчитал положенное время, то все ресурсы сборки, связанные с данным идентификатором буфера, освобождаются. Первоначальная установка таймера является нижней границей для времени ожидания при сборке. Это происходит потому, что всемя ожидания будет увеличено, если время жизни приходящего фрагмента окажется больше, но не может быть уменьшено. Установка таймера может достигать максимального времени жизни (примерно 4.25 минуты). В настоящее время рекомендуется первоначально устанавливать таймер на 15 секунд. Это значение можно изменить при получении достаночного практического опыта. Заметим, что выбор значения для этого параметра связи связан с емкостью буфера и скоростью получения данных с коммуникационных сетей. Например, скорость получения данных следует умножать на размер буфера (т.е. 10 кбайт/сек * 15 сек = 150 кбайт).

Обозначения

FO смещение фрагмента
IHL длина Internet заголовка
MF флаг More Fragments
TTL время жизни
NFB количество фрагментов
TL общая длина
TDL общая длина данных
BUFID идентификатор буфера
RCVBT битовая таблица фрагментации
TLB нижняя граница для значения таймера
Процедура

(1) BUFID <- отправитель|получатель|протокол|идентификация;
(2) IF FO = 0 AND MF = 0 THEN
(3)     IF буфер с идентификатором BUFID выделены THEN
(4)         завершить сборку для этого идентификатора BUFID;
(5)         Приготовить датаграмму для дальнейшей обработки.
            Запустить обработку
(6)     ELSE
            IF буфер для идентификатора BUFID не выделен THEN
(7)             выделить ресурсы для сборки с идентификатором BUFID
                TIMER <- TLB; TDL <- 0;
(8)         перенести данные из фрагмента в буфер данных с идентификатором
            BUFID, данные с октета FO*8 по октет (TL-(IHL*4))+FO*8;
(9)         установить биты RCVBT с FO по FO+((TL-(IHL*4)+7)/8);
(10)        IF MF = 0 THEN TDL <- TL-(IHL*4)+(FO*8)
(11)        IF FO = 0 THEN поместить заголовок в буфер заголовка
(12)        IF TDL # 0 AND все биты RCVBT с 0 по (TDL+7)/8 выставлены THEN
(14)            TL <- TDL+(IHL*4)
(15)            Приготовить датаграмму к дальнейшей обработке
(16)            Освободить все ресурсы сборки для этого идентификатора
                BUFID. Запустить обработку.
(17)        TIMER <- MAX(TIMER,TTL);
(18)        приостановить работу до получения следующего фрагмента или
            сигнала от таймера
(19) Сигнал от таймера:
         Освободить все ресурсы, связанные с этим идентификатором BUFID.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Тип обслуживания Up: Специфиация Previous: Пример процедуры сборки   Contents   Index

Идентификация

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

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

Однако, поскольку поле идентификатора позволяет использовать 65536 различных значений, некоторые хост-компьютеры могут использовать просто уникальные идентификаторы независимо от адреса получателя.

Обычно идентификаторы выбирают протоколы более высокого уровня, например модули TCP протокола могут повторно передавать идентичные TCP сегменты. Вероятность правильного приема увеличивалась бы, если повторная передача осуществлялась с тем же самым идентификатором, что и исходная датаграмма, поскольку ее фрагменты могли бы использоваться для сборки правильного TCP сегмента.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Время жизни Up: Специфиация Previous: Идентификация   Contents   Index

Тип обслуживания

Тип обслуживания (TOS) используется для выбора качества Internet сервиса. Тип обслуживания определяется абстрактными параметрами приоритета, задержки, продолжительности и достоверности. Эти параметры должны отображаться на реальные параметры сервиса для конкретных сетей, через которые проходит данная датаграмма.

Приоритет
Независимая единица измерения для важности данной датаграммы.

Задержка
Указание задержки важно для датаграмм с этим знаком.

Пропускная способность
Для датаграмм с этим знаком важна высокая скорость передачи данных.

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

Например, сеть ARPANET имеет бит приоритета, а также выбор между "стандартными" сообщениями (тип 0) и "неконтролируемыми" (тип 3) (также в качестве одного из сервисных параметров может использоваться выбор между единичным пакетом и многопакетными сообщениями). Неконтролируемые сообщения имеют тенденцию иметь меньшую достоверность, но и меньшую задержку. Допустим, Internet датаграмма должна быть передана через сеть ARPANET. Пусть тип Internet сервиса определен как

приоритет: 5
задержка: 0
пропускная способность: 1
достоверность: 1

В рассматриваемом примере отображение описанных параметров на параметры, допустимые в сети ARPANET, привело бы к установке бита приоритета ARPANET (поскольку приоритет Internet находится в верхней половине своего диапазона), выбору стандартного типа сообщений (поскольку указаны требования высокой пропускной способности и достоверности, а параметр задержки сброшен). Дополнительные детали реализации сервиса даны в документе "Service Mappings" [8].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Опции Up: Специфиация Previous: Тип обслуживания   Contents   Index

Время жизни

Время жизни устанавливается отправителем в соответствии с максимальным значением, которое данная датаграмма может иметь в системе Internet. Если датаграмма пребывает в системе Internet дольше, чем указанное время жизни, она подлежит уничтожению.

Значение в поле, где указано время жизни, должно уменьшаться в каждой точке, где обрабатывается Internet заголовок, с тем, чтобы показать время, потраченное на обработку датаграммы. Даже если нет возможности получать информацию о том, сколько реально времени было потрачено, значение этого поля должно быть уменьшено на единицу. Время изменяется в секундах (т.е. указанная единица соответствует одной секунде). Таким образом, максимальное время жизни составляет 255 секунд или 4.25 минуты. Поскольку каждый модуль, обрабатывающий датаграмму, должен уменьшать значение поля TTL по крайней мере на единицу, даже если он обрабатывает ее быстрее, чем за секунду, то поле TTL следует рассматривать лишь как верхнюю границу для времени существования датаграммы. Цель процедуры заключается в разрушении датаграмм, не достигших получателя, а также в ограничении времени жизни датаграммы в сети.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Контрольная сумма Up: Специфиация Previous: Время жизни   Contents   Index

Опции

Опции могут присутствовать в любой датаграмме, но должны всегда быть обработаны. А именно, наличие или отсутствие какой-либо опции дело отправителя, но каждый Internet модуль должен быть в состоянии произвести разбор каждой опции.

Опции могут оканчиваться не на 32-битной границе. В этом случае Interntet заголовок может дополняться нулевыми октетами. Первый из них должен интрепретироваться как заключительная опция, а остальные - как октеты выравнивания Internet заголовка по границе.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Ошибки Up: Специфиация Previous: Опции   Contents   Index

Контрольная сумма

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Интерфейсы Up: Специфиация Previous: Контрольная сумма   Contents   Index

Ошибки

Ошибки Internet заголовка могут быть оглашены посредством ICMP сообщений [[*]].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Порядок передачи данных Up: Специфиация Previous: Ошибки   Contents   Index

Интерфейсы

Функциональное описание взаимодействия между пользователем и Internet протоколом будет, в лучшем случае, умозрительным в силу специфики операционной системы. Следовательно, мы должны предупредить читатетлей, что различные реализации Internet протокола будут иметь различный интерфейс с пользователем. Тем не менее, все реализации должны давать определенный минимальный набор услуг, с тем, чтобы гарантировать , что все они придерживаются единой иерархи протоколов. Данная глава описывает интерфейс с функцией, обызательный для всех реализаций.

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

Пример интерфейса с вышестоящим уровнем

Два примера вызовов, приведенные ниже, удовлетворяют запросы пользователя в общении с Internet протоколом (символ "=>" означает возвращаемое значение).

SEND(src,dst,prot,TOS,TTL,BufPTR,len,Id,DF,opt => result)

где

src адрес отправителя
dst адрес получателя
prot протокол
TOS тип сервиса
TTL время жизни
BufPTR указатель буфера
len длина данных в буфере
Id идентификатор
DF запрет фрагментации
opt опции
result ответ:
  Ok - успешная посылка датаграммы
  Error - ошибка в аргументах функции или в локальной сети

Заметим, что тип сервиса TOS включает приоритет, а требование безопасности передается в качестве опции.

RECV(BufPTR,prot => result,src,dst,TOS,len,opt)

BufPTR указатель буфера
prot протокол
result ответ:
  Ok - успешное получение датаграммы
  Error - ошибка в аргументах
len длина буфера
src адрес отправителя
dst адрес получателя
TOS тип сервиса
opt опции

Когда пользователь отправляет датаграмму, он осуществляет SEND вызов, сопровождаемый всеми аргументами. Модуль Internet протокола по получении этого вызова проверяет аргументы, приготавливает и отправляет сообщение. Если аргументы в порядке, а датаграмма принята локальной сетью, то вызов завершается успешно. Если же агрументы неверны или датаграмма не принята локальной сетью, то вызов завершается с ошибкой. В последнем случае должен быть сделан соответствующий отчет о причине проблемы, однако детали таких отчетов относятся уже к конкретным реализациям.

В момент, когда датаграмма приходит на модуль Internet протокола из локальной сети, может присутствовать ожидающий ее RECV вызов от пользователя - адресата, а может и не присутствовать. В первом случае ожидающий вызов удовлетворяется посылкой информации из датаграммы к пользователю. Во втором случае пользователю - адресату посылается напоминание о ждущей его датаграмме. Если пользователь - адресат не присутствует, отправителю возвращается ICMP сообщение об ошибке, а принятые данные разрушаются.

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

Сделанный пользователем запрос RECV может быть немедленно удовлетворен ждущей этого датаграммой или же он может быть задержан до получения соответствующей датаграммы.

Адрес отправителя включается в запрос на посылку, если отправляющий датаграмму хост-компьютер имеет несколько адресов (несколько физических соединений или же чисто логических адресов). Internet модуль должен следить за тем, чтобы адрес отправителоя был одним из разрешенных адресов для данного хоста.

Реализация протокола может допускать или даже требовать применения запроса к Internet модулю для обозначения заинтересованности, или же, наоборот, использование исключительно какого-либо класса датаграмм (т.е. всех датаграмм, которые имеют в поле протокола определенное занчение).

Данная глава характеризует функции интерфейса между пользователем и Internet протоколом. Используемые обозначения аналогичны большинству процедур функций вызовов на языках высокого уровня, однако данный способ обращения с Internert протоколом не является правилом для запросов на обслуживание типа ловушек (т.е. SVC, UUO, EMT), или для любой другой формы общения между процессами.

Приложение А: Примеры и сценарии

Пример 1

Пример минимальной Internet датаграммы, несущей данные

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver=4 | IHL=5 |Type of Service|          Total Length = 21    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification = 111    |Flg=0|    Fragment Offset = 0  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Time =123   |  Protocol =1  |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     data      |
+-+-+-+-+-+-+-+-+

Рис. 5 Пример Internet датаграммы

Каждая метка означает место для одного бита. Здесь приведена Internet датаграмма версии 4 Internet протокола. Internet заголовок состоит из пяти 32 битных слов, а общая длина датаграммы составляет 21 октет. Данная датаграмма является полноценной датаграммой (а не фрагментом).

Пример 2

В данном примере мы показываем сперва Internet датаграмму промежуточного размера (452 октета данных), а затем два Internet фрагмента, которые могли бы возникнуть при фрагментации исходной датаграммы в случае, когда максимальная допустимая единица пересылки составляла 280 октетов.

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver=4 | IHL=5 |Type of Service|          Total Length = 472   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification = 111    |Flg=0|    Fragment Offset = 0  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Time =123   |  Protocol =6  |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
\                                                               \
\                                                               \
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              data             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рис. 6 Пример Internet датаграммы

Теперь приведем первый фрагмент, который возникает при расщеплении исходной датаграммы по границе после 256 октета данных.

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver=4 | IHL=5 |Type of Service|          Total Length = 276   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification = 111    |Flg=1|    Fragment Offset = 0  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Time =119   |  Protocol =6  |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
\                                                               \
\                                                               \
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рис. 7 Пример Internet фрагмента

и второй фрагмент

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver=4 | IHL=5 |Type of Service|          Total Length = 216   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification = 111    |Flg=0|   Fragment Offset = 32  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Time =119   |  Protocol =6  |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
\                                                               \
\                                                               \
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              data             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рис. 8 Пример Internet заголовка

Пример 3

Здесь мы показываем пример, когда датаграмма имеет опции

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver=4 | IHL=8 |Type of Service|          Total Length = 576   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Identification = 111    |Flg=0|   Fragment Offset = 32  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Time =123   |  Protocol =6  |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opt. Code = x | Opt. len. = 3 | option value  | Opt. Code = x |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opt. len. = 4 |        option value           | Opt. Code = 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opt. Code = y | Opt. len. = 3 | option value  | Opt. Code = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              data                             |
\                                                               \
\                                                               \
|                              data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рис. 9 Пример Internet датаграммы


next up previous contents index
Next: Порядок передачи данных Up: Специфиация Previous: Ошибки   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Отобpажение адpесов Интеpнета в Up: Специфиация Previous: Интерфейсы   Contents   Index

Порядок передачи данных

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

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       1       |       2       |       3       |       4       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       5       |       6       |       7       |       8       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       9       |      10       |      11       |      12       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Рис. 10 Порядок передачи байтов

Октет представляет собой число, для котрого самый левый бит на диаграмме является самым старшим или самым значащим битом. Так бит, отмеченный нулем, является наиболее значащим битом. Например, следующая диаграмма представляет число 170 (десятичное)

                              0 1 2 3 4 5 6 7
                             +-+-+-+-+-+-+-+-+
                             |1 0 1 0 1 0 1 0|
                             +-+-+-+-+-+-+-+-+

Рис. 11 Старшинство битов

Аналогично, если многооктетное поле представляет число, то самый левый бит в этом поле является самым значащим битом. При передаче многооктетного чила самый значащий октет передается первым.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Добавить вывод в существующий Up: Перенаправление ввода и вывода Previous: Перенаправить ввод: знак <   Contents   Index

Перенаправить вывод: знак >

Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:

      command > имя\_файла

Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.

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

Чтобы убедиться, что файл с запланированным именем не существует, воспользуйтесь командой ls с аргументом ``имя_файла''. Если этот файл не существует, то ls выдаст сообщение, что файл не найден в текущем справочнике. Например, проверка существования файлов temp и junk даст следующий результат:

    $ ls temp
    temp
    $ ls junk
    junk: no such file or directiry
    $

Это означает, что вы можете назвать свой файл junk, но не можете использовать в качестве имени temp, если не хотите потерять содержимое существующего файла.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Разрешение с помощью динамического Up: Введение в сети Previous: Порядок передачи данных   Contents   Index

Отобpажение адpесов Интеpнета в физические адpеса(ARP, RARP)

Рассмотрим две машины А и В, которые присоединены к одной физической сети. Каждая из них имеет назначенный IP-адрес Ia и Ib, а также физический адрес Pa и Pb. Нашей целью является построение низкоуровневого программного обеспечения, которое скрывало бы физические адреса и позволяло бы программам более высокого уровня работать только с межсетевыми адресами. Тем не менее, в конечном счете взаимодействие реализуется физическими сетями, использующими какую-либо схему физических адресов. Предположим, что машина А хочет послать пакет машине В по физической сети, к которой они обе присоединены, но А знает только межсетевой адрес Ib. Возникает вопрос: как может А отобразить этот адрес в физический адрес Pb ?

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

Существуют два основных типа физических адресов: характерным представителем первого типа является Ethernet, использующий большие, фиксированные физические адреса, а второго - proNET-10, использующий маленькие легко изменяемые физические адреса.

Для отображения IP-адресов в Ethernet-адреса используется протокол ARP (Address Resolution Protocol, Протокол разрешения адресов) Это отображение выполняется только для отправляемых IP-пакетов, так как только в момент отправки создаются заголовки IP и Etheinet Для отображения Ethernet-адресов в IP-адреса используется протокол RARP (Reverse Addiess Resolution Piotocol, Протокол обратного разрешения адресов)

Основным инструментом работы протокола ARP является таблица разрешения адресов. Прямое преобразование адресов выполняется путем поиска подходящей записи в этой таблице. Эта таблица, называемая ARP-таблицей, хранится в памяти хоста и содержит строки соответствия для каждого узла сети. В двух столбцах таблицы содержатся IP и Etheret-адреса хостов. Если требуется по IP-адресу хоста определить его Ethernet-адрес, ищется запись с соответствующим IP-адресом, по которой и определяется требуемый Ethernet-адрес хоста. Ниже приведен пример такой ARP-таблицы.

220.20 2.1      08:00:39:00:2F:C3
220.20 2 3      08:00:5А:21:АВ:22

ARP-таблица необходима потому, что IP-адреса и Ethernet-адреса выбираются независимо, и нет какого-либо алгоритма для преобразования одного в другой. IP-адрес выбирает менеджер сети с учетом положения машины в сети Intemet. Если машину перемещают в другую часть сети Internet, то ее IP-адрес должен быть изменен.

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Опpеделение межсетевого адpеса пpи Up: Отобpажение адpесов Интеpнета в Previous: Отобpажение адpесов Интеpнета в   Contents   Index

Разрешение с помощью динамического связывания (ARP)

Ethernet имеет 48-битовые физические адреса, назначаемые производителями при изготовлении интерфейсных плат. Как следствие, при выходе оборудования из строя и замене интерфейсной платы физический адрес машины меняется. Более того, так как адрес в Ethernetе имеет длину 48 бит, не стоит и рассчитывать, что его можно закодировать в 32-битном IP-адресе. Разработчики протоколов TCP/IP нашли конструктивное решение проблемы разрешения адресов для сетей, таких как Chaosnet или Ethernet, которые имеют возможность широковещания. Это решение позволяет добавлять машины к сети без перекомпиляции кода и без создания центральной базы данных. Чтобы избежать создания таблиц отображения разработчики решили использовать низкоуровневый протокол для динамической связки адресов. Названный Протокол Разрешения Адресов(ARP), он обеспечивает механизм, который является как эффективным, так и легким для реализации.

Как показывает рисунок, идея, лежащая в основе динамического разрешения в ARP, проста: когда хост А хочет разрешить IP-адрес Ib, он широковещательно распространяет специальный пакет, который просит хост с IP-адресом Ib ответить ему, указав свой физический адрес Pb. Все хосты, включая В, получают этот запрос, но только хост В узнает свой IP-адрес и посылает ответ, содержащий свой физический адрес. Когда А получает ответ, он использует физический адрес для посылки межсетевого пакета прямо к В. Итоги всего вышесказанного можно изложить так:

Протокол Разрешения Адресов,ARP, позволяет хосту установить физический адрес хоста назначения в той же самой физической сети, имея только IP-адрес назначения.

<---|---------------------------------------->
===============|==========|==========|====================
    |          | |       | |        | |
    |          V |       V |        V |
  -----        -----     -----      -----
  | А |        | X |     | B |      | Y |
  -----        -----     -----      -----
                     (а)
      ---------------------
======|===================|===============================
    | |          |       | |          |
    | V          |       | |          |
  -----        -----     -----      -----
  | А |        | X |     | B |      | Y |
  -----        -----     -----      -----
                     (б)

Рисунок 5.1 Протокол ARP. Чтобы определить физический адрес В, Pb, по его IP-адресу, Ib, (а) ГВМ А широковещательно распространяет запрос ARP, содержащий Ib, по всем машинам, и (б) ГВМ В отвечает на него ответом ARP, содержащим пару (Ib,Pb).


Кэш разрешения адресов

Может показаться глупым то, что А, посылая пакет к В, сначала посылает широковещательный пакет, который достигает В. Или может показаться еще глупее, что А широковещательно задает вопрос:"Как я могу связаться с вами?" вместо того, чтобы просто широковещательно послать пакет, который он хочет передать. Но есть важная причина для таких передач. Широковещание слишком дорого, чтобы использовать его всякий раз, когда одной машине требуется передать пакет другой машине, так как оно требует от каждой машины в сети обработки широковещательного пакета. Чтобы уменьшить затраты на взаимодействие, хосты, использующие ARP, создают кэш недавно узнанных связок между физическим адресом и IP-адресом, и поэтому они не должны повторно использовать ARP. Всякий раз, когда хост получает ответ ARP, он сохраняет IP-адрес машины и соответствующий ему аппаратный адрес в своем кэше для последующих обращений. При передаче пакета хост ищет связку в кэше перед тем, как послать запрос ARP. Если хост нашел нужную связку в своем кэше, ему не надо передавать широковещательный пакет в сеть. Опыт показывает, что так как большинство сетевых взаимодействий включает передачу более чем одного пакета, даже небольшой кэш будет полезен.


Уточнение ARP

Можно сделать несколько уточнений ARP. Во-первых, заметим, что если хост А использует ARP, так как ему нужно послать запрос к В, то существует большая вероятность того, что хосту В в ближайшем будущем тоже потребуется послать пакеты к А. Если мы учтем потребности В, мы можем избежать передачи лишнего траффика по сети, заставив А включить связку своего IP-адреса с физическим в пакет при посылке запроса к В. Во-вторых, отметим, что так как А широковещательно передает свой начальный запрос, все машины в сети получают его и могут выделить и сохранить в своих кэшах связку между IP-адресом и физическим адресом для А. В-третьих, когда новая машина появляется в сети(например, когда загружается операционная система), мы можем избежать того, что какая-либо другая машина будет запускать ARP, если широковещательно распространим пару IP-адреса и физического адреса новой машины. Следующее правило обобщает уточнения:

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


Реализация ARP

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

Наконец, рассмотрим случай, когда машина А получила связку для машины В, но оборудование В вышло из строя и было заменено. Хотя адрес В изменился, не изменилась связка в кэше А, поэтому А будет использовать несуществующий аппаратный адрес, делая успешный прием невозможным. Этот случай показывает, почему важно, чтобы программное обеспечение ARP рассматривало свою таблицу связок как кэш и удаляло ее элементы по истечении фиксированного промежутка времени.

Вторая часть кода ARP обрабатывает пакеты ARP, прибывающие из сети. Когда появляется пакет ARP, это программное обеспечение должно выделить пару IP-адреса и аппаратного адреса отправителя, и проверить свой кэш на наличие в нем элемента для этого отправителя. Если в кэше есть элемент для указанного IP-адреса, обработчик обновит этот элемент, заменив физический адрес тем, что получен из пакета. Получатель затем обрабатывает оставшуюся часть пакета ARP.

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

Другой интересный случай возникает, когда приходит ответ ARP. В зависимости от реализации обработчику может понадобиться создание элемента кэша или такой элемент может уже существовать. В любом случае, как только кэш был обновлен, получатель пытается сопоставить ответ ранее выданному запросу. Обычно ответу соответствует запрос, сгенерированный в связи с тем, что машина имеет пакет, который нужно доставить. В промежуток времени между широковещательной передачей ARP-запроса и получением ответа прикладные программы или высокоуровневые протоколы могли сгенерировать дополнительные запросы для этого адреса; программное обеспечение должно помнить, что оно уже послало запрос и не посылать его больше. Обычно, оно помещает дополнительные запросы в очередь. Как только пришел ответ и физический адрес стал известен, программное обеспечение ARP удаляет элементы из очереди и отвечает на каждый из них полученной связкой. Если машина не выдавала запрос для IP-адреса, указанного в ответе, она прекращает обработку этого пакета.

Протоколы верхнего уровня не могут отличить случай повреждения сети Ethernet от случая отсутствия машины с искомым IP-адресом.

Следует отметить, что каждая машина имеет отдельную ARP-таблицу для каждого своего сетевого интерфейса.


Инкапсуляция и идентификация ARP

Когда сообщения ARP пересылаются от одной машины к другой, они должны передаваться в физических кадрах. Рисунок 6 показывает, что сообщение ARP передается как поле данных кадра.

                     -------------------------------------
                     |        сообщение ARP              |
                     -------------------------------------
-----------------------------------------------------------
| заголовок кадра   |      поле данных кадра             |
-----------------------------------------------------------

Рисунок 6. Сообщение ARP, заключенное в кадре физической сети

Чтобы идентифицировать, что кадр содержит запрос или ответ ARP, отправитель присваивает специальное значение полю типа в заголовке кадра и помещает сообщение ARP в поле данных кадра. Когда кадр прибывает на хост, система смотрит тип кадра, чтобы определить его содержимое. Например, в Ethernete, кадры, несущие сообщения ARP, имеют в поле типа значение 0806 в шестнадцатиричном формате. Это стандартное значение, назначенное ведомством, устанавливающим стандарты Ethernetа.


Формат протокола ARP

В отличие от большинства протоколов, данные в пакетах ARP не имеют фиксированного формата заголовка. Вместо этого его сообщения были разработаны так, чтобы их можно было использовать для различных сетевых технологий. Поэтому, первые поля заголовка содержат счетчики, которые указывают длину следующих полей. Фактически, ARP можно использовать с произвольными физическими адресами и произвольными протокольными адресами. Пример на рисунке 7 показывает 28-октетный формат сообщения ARP, используемый для оборудования Ethernetа(у которого физические адреса являются 48-битовыми или 6-октетными) при разрешении протокольных адресов IP(имеющих длину 4 октета).

0 1em 1em 1em 1em 16 1em 1em 24 1em 31  
1emEthernet адрес назначения (31:0)  
1emEthernet адрес назначения (47:32) 1emEthernet исходящий адрес (47:32)  
1emEthernet исходящий адрес (31:0)  
1emКод типа 1emПространство аппаратных адресов  
1emПространство адресов протокола 1emLHA 1emLPA  
1emКод операции 1emАппаратный (Ethernet) и логический (IP)  

адреса отправителя и получателя занимают длину, указанную полями LHA и LPA

 
1emКонтрольная сумма Ethernet  

               

Рисунок 7. Пример формата сообщения ARP/RARP для разрешения адресов IP-Ethernet. Длины полей зависят от длин аппаратных и протокольных адресов, которые имеют значение соответственно 6 октетов для адреса Ethernet и 4 октета для IP-адреса.


next up previous contents index
Next: Опpеделение межсетевого адpеса пpи Up: Отобpажение адpесов Интеpнета в Previous: Отобpажение адpесов Интеpнета в   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол ICMP Up: Отобpажение адpесов Интеpнета в Previous: Разрешение с помощью динамического   Contents   Index

Опpеделение межсетевого адpеса пpи начальной загpузке(RARP)

Физические сетевые адреса являются как низкоуровневыми, так и аппаратно зависимыми. При этом каждой машине, использующей TCP/IP, назначен один или несколько 32-битовых IP-адресов, которые независимы от аппаратных адресов машины. прикладные программы всегда используют IP-адрес при указании назначения. хосты и шлюзы должны использовать физические адреса для передачи дейтаграмм по базовым сетям; они полагаются на схемы разрешения адресов, такие как ARP, при выполнении связывания.

Обычно IP-адрес машины хранится во внешней памяти, откуда операционная система и берет его при начальной загрузке. Возникает вопрос: "Как бездисковая машина, не имея доступа к внешней памяти, определяет свой IP-адрес?" Эта проблема является критической для бездисковых станций, использующих IP-адрес для взаимодействия с файл-сервером. Более того, так как много бездисковых машин используют стандартные протоколы передачи файлов TCP/IP для получения начального образа при загрузке, они должны получать и использовать IP-адреса до начала работы операционной системы. Эта глава изучает вопрос о том, как получить IP-адреса, и описывает протокол, который используют бездисковые машины.

Чтобы одна программа могла использоваться на нескольких машинах, в состав ее исполняемого образа не должен входить IP-адрес машины. В частности, разработчики пытаются не включать конкретные IP-адреса как в код начальной загрузки, так и в операционную систему, чтобы один и тот же код мог работать на нескольких машинах. Когда такая программа начинает выполняться на бездисковой машине, она должна использовать сеть для взаимодействия с сервером, чтобы получить от него свой IP-адрес. Эта процедура кажется парадоксальной: машина взаимодействует с удаленным сервером для получения адреса, необходимого для взаимодействия.

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

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


Протокол обратного разрешения адресов(RARP)

Бездисковая машина использует протокол интернета TCP/IP, называемы RARP(протокол обратного разрешения адресов), для получения своего IP-адреса от сервера. RARP создан на основе протокола ARP из предыдущей главы и использует тот же самый формат сообщений. На практике сообщение RARP, посылаемое при запросе межсетевого адреса, является несколько более общим, чем то, что описано выше: оно позволяет машине запрашивать IP-адрес не только себе, но и другим машинам. Оно также допускает несколько типов физических сетей. Как и сообщение ARP, сообщение RARP пересылается с одной машины на другую в поле данных кадра Ethernet. Кадр Ethernet, несущий запрос RARP, имеет обычную преамбулу, адреса отправителя и получателя Ethernetа, и поле типа пакета в начале себя. Поле типа содержит значение 8035, что идентифицирует содержимое этого кадра как сообщение RARP. Поле данных кадра содержит 28-октетное сообщение RARP.

Рисунок 8 иллюстрирует, как хост использует RARP. Отправитель широковещательно передает запрос RARP, в котором указывает свой адрес в качестве как машины отправителя, так и машины получателя, заполняя поле аппаратного адреса назначения своим физическим сетевым адресом. Все машины в сети принимают запрос, но только те из них, кто отвечает за поддержку RARP, обрабатывают запрос и посылают ответ; такие машины называют серверами RARP. Для успешного использования RARP в сети должен быть по крайней мере один сервер RARP.

  -<==-===============================================>--------
  ^            |            |              |
  |            V            V              V
   +++++++      +++++++      +++++++        +++++++
   +  А  +      +  B +       +  C  +        +  D  +
   +++++++      +++++++      +++++++        +++++++
                  (a)
  -----=========================================---------------
  |            |            ^              ^
  V            |            |              |
   +++++++      +++++++      +++++++        +++++++
   +  А  +      +  B +       +  C  +        +  D  +
   +++++++      +++++++      +++++++        +++++++
                   (b)

Рисунок 8 Пример обмена, используя протокол RARP. (a) Машина А посылает широковещательный запрос RARP, указывая себя как машину получателя, и (b) машины, ответственные за поддержку средства RARP(C и D), отвечают прямо А.

Серверы отвечают на запросы, заполняя поля протокольного адреса назначения, меняя тип сообщения на ответ, и посылая ответ прямо машине, выдавшей запрос. Эта исходная машина принимает ответы от всех серверов RARP, несмотря на то, что ей нужен только первый ответ.

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


Повторение транзакций RARP

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Форматы сообщений Up: Введение в сети Previous: Опpеделение межсетевого адpеса пpи   Contents   Index

Протокол ICMP

Протокол Internet (IP) используется для обработки датаграммы, передаваемой между хост-компьютерами в системе объединенных сетей, называемой Catenet. Устройства, осуществляющие соединение различных сетей, называются шлюзами. Для обеспечения управления шлюзы общаются друг с другом посредством протокола Gateway to Gateway Protocol (GGP). Порой шлюз или хост-компьютер, получающий данные, обменивается информацией с хост-компьютером, отправляющим эти данные. Именно для таких йелей используется данный протокол - протокол контрольных сообщений Internet (ICMP). ICMP использует основные свойства протокола Internet (IP), как если бы ICMP являлся протоколом более высокого уровня. Однако фактически ICMP является составной частью протокола Internet и должен являться составной частью каждого модуля IP.

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

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

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Список типов сообщений Up: Протокол ICMP Previous: Протокол ICMP   Contents   Index

Форматы сообщений

ICMP сообщения посылаются с помощью стандартного IP заголовка. Первый октет в поле данных датаграммы - это поле типа ICMP сообщения. Значение этого пля определяет формат всех остальных данных в датаграмме. Любое поле, которое помечено "unused", зарегистрировано для последующих разработок и должно при отправлении содержать нули. Однако получатель не должен использовать значения этих полей (за исключением процедуры вычисления контрольной суммы). Если обратное особо не оговорено при описании отдельных фрагметов, Internet заголовок должен иметь в своих полях следующие значения:

Версия 4  
IHL Длина Internet заголовка; единица измерения - 32-битное слово.  
Тип сервиса 0  
Общая длина Длина Internet заголовка и поля данных в октетах.  
Идентификация, флаги, смещение фрагмента Используются в случае фрагментации.  
Время жизни Время жизни в секундах. Поскольку значение этого поля уменьшается на единицу в каждой машине, на которой обрабатывается данная датаграмма, то значение этого поля должно, по крайней мере, превышать количество шлюзов, через которые будет проходить данная датаграмма.  
Протокол ICMP=1  
Контрольная сумма заголовка 16-битное дополнение до единицы суммы дополнений до единицы всех 16-битных слов в заголовке. При вычислении данной суммы следует первоначально устанавливать значение этого поля в нуль. В дальнейшем этот алгоритм вычисления контрольной суммы должен быть изменен.  
Адрес отправления Адрес шлюза или хост-компьютера, который составил данное ICMP сообщение. Если не оговорено обратное, в этом поле может находиться любой из адресов шлюза.  
Адрес получателя Адрес шлюза или хост-компьютера, которому следует послать данное сообщение.  



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение о недостижимости порта Up: Форматы сообщений Previous: Форматы сообщений   Contents   Index

Список типов сообщений

0 ответ на запрос эхо
3 адресат недостижим
4 приостановка отправителя
5 переадресация
8 эхо-запрос
11 превышение контрольного времени
12 проблемы с параметрами
13 штамп времени
14 ответ на запрос штампа времени
15 запрос информации
16 ответ на запрос информации



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение о превышении контрольного Up: Форматы сообщений Previous: Список типов сообщений   Contents   Index

Сообщение о недостижимости порта

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      не используется                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet заголовок + 64 бита данных из исходной датаграммы    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля Internet протокола:

Адрес получателя
Локальная сеть и адрес компьютера, отправившего исходную датаграмму


Поля ICMP протокола

Тип
3
Код

0 невозможно передать датаграмму на локальную сеть, где находится адресат
1 невозможно передать датаграмму на хост-компьютер, являющийся адресатом
2 нельзя воспользоваться указанным протоколом
3 нельзя передать данные на указанный порт
4 для передачи датаграммы по сети требуется фрагментация, однако выставлен флаг DF.
5 сбой в маршрутизации при отправлении

Контрольная сумма

Контрольная сумма является 16-битным дополнением до единицы суммы дополнений октетов в полях ICMP сообщения, начиная с поля типа ICMP. Для вычисления контрольной суммы первоначально значение этого поля обнуляется. В будущем процедура вычисления контрольной суммы может быть изменена.

Internet заголовок + 64 бита данных из исходной датаграммы

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


Описание

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

Кроме этого, в некоторых сетях шлюз может иметь возможность определять доступность отдельного хост-компьютера. Шлюз в такой сети может послать данное сообщение, если хост-компьютер, являющийся адресатом, недоступен.

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

Шлюз может послать сообщения с кодами 0, 1, 4 и 5. Хост- компьютер может послать сообщения с кодами 2 и 3.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение о проблемах с Up: Форматы сообщений Previous: Сообщение о недостижимости порта   Contents   Index

Сообщение о превышении контрольного времени

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      не используется                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet заголовок + 64 бита данных из исходной датаграммы    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Заимствованы сеть и адрес отправителя из мсходной датаграммы с данными.


Поля ICMP сообщения

Тип
11
Код
0 при передаче превышено время жизни
1 превышено контрольное время при сборке фрагментов датаграммы
Контрольная сумма

Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислениии суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм контрольной суммы может быть изменен.

Internet заголовок + 64 бита данных из исходной датаграммы
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти биты данных используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных в исходной датаграмме.


Описание

Если фрагмент нулевого размера превысил контрольное время, то сообщение в этом не посылается вовсе.

Шлюз может послать сообщение с кодом 0б а хост - с кодом 1.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение для приостановки отправителя Up: Форматы сообщений Previous: Сообщение о превышении контрольного   Contents   Index

Сообщение о проблемах с параметром

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   указатель   |      не используется                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet заголовок + 64 бита данных из исходной датаграммы    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Заимствованы сеть и адрес отправителя из мсходной датаграммы с данными.


Поля ICMP сообщения

Тип
12
Код
0 - указатель показывает ошибку
Контрольная сумма
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Указатель
Если код = 0, то он указывает на октет, где была обнаружена ошибка.
Internet заголовок + 64 бита данных из исходной датаграммы
Эти биты данных используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в вервые 64 бита данных в исходной датаграмме.


Описание

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

Указатель определяет октет в заголовке исходной датаграммы, где была обнаружена ошибка (этот ошибочный октет может находиться даже посередине опции). Например, 1 указывает на то, что имеется какая-то ошибка в поле типа сервиса, а (если имеются опции) 20 определяет, что имеется ошибка в коде типа для первой опции.

Код 0 сообщения может приходить как от шлюза, так и от хост-компьютера.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение о переадресации Up: Форматы сообщений Previous: Сообщение о проблемах с   Contents   Index

Сообщение для приостановки отправителя

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      не используется                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet заголовок + 64 бита данных из исходной датаграммы    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Заимствованы сеть и адрес отправителя из исходной датаграммы с данными.


Поля ICMP сообщения

Тип
4
Код
0
Контрольная сумма
Контрольная сумма является 16-битным допонением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении контрольной суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Internet заголовок + 64 бита данных из исходной датаграммы

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


Описание

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

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

И шлюз и хост-компьютер могут отправить сообщение с кодом 0.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Некоторые применения перенаправления вывода Up: Перенаправление ввода и вывода Previous: Перенаправить вывод: знак >   Contents   Index

Добавить вывод в существующий файл

Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом »:

     command >> имя_файла

В результате выполнения команды вывод будет добавлен в конец существующего файла. Если файл не существует, то он будет создан. Например, рассмотрим как добавить вывод с помощью команды cat. Команда cat печатает содержимое файлов, имена которых являются ее аргументами, в стандартный вывод. Если нет аргументов, то она печатает стандартный ввод в стандартный вывод. Сначала выполните команду cat без перенаправления вывода. Затем содержимое файла trial2 добавляем после последней строки в файл trial1 при выполнении команды cat над файлом rtial2, перенаправив вывод в файл trial1:

    $ cat trial1
    This is the first line of trial1.
    Hello.
    This is the last line of trial1.
    $
    $ cat trial2
    This is the beginning of trial2.
    Hello.
    This is the end of trial2.
    $ cat trial2 >> trial1
    $ cat trial1<CR>
    This is the first line of trial1.
    Hello.
    This is the last line of trial1.
    This is the beginning of trial2.
    Hello.
    This is the end of trial2.
    $



Alex Otwagin 2002-12-16

next up previous contents index
Next: Эхо-сообщение и сообщение в Up: Форматы сообщений Previous: Сообщение для приостановки отправителя   Contents   Index

Сообщение о переадресации

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Internet адрес шлюза                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet заголовок + 64 бита данных из исходной датаграммы    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Заимствованы сеть и адрес отправителя из исходной датаграммы с данными.


Поля ICMP сообщения

Тип
5
Код
0 переадресация датаграмм для сети
1 переадресация датаграмм для хост-компьютера
2 переадресация датаграмм для типа услуг и сети
3 переадресация датаграмм для типа услуг и хост-компьютера
Контрольная сумма

Контрольная сумма - это 16-битное допонение до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении контрольной суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Internet адрес шлюза

Адрес шлюза, на который должен быть проложен маршрут к сети, указанной в поле адреса в исходной датаграмме с данными.

Internet заголовок + 64 бита данных из исходной датаграммы
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти данные используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных исходной датаграммы.


Описание

Шлюз посылает сообщение на хост-компьютер о переадресации в следующей ситуации: Шлюз G1 получает Internet датаграмму от хост-компьютера в сети, где он расположен. Шлюз G1 проверяет таблицу маршрутизации и находит адрес слеудющего шлюза G2 в качестве маршрута для датаграммы по пути в сеть X, где расположен ее адресат. Если G2 и исходный хост-компьютер идентифицируются Internet адресом как находящиеся в одной и той же сети, то на хост-компьютер следует послать сообщение о переадресации. Сообщение о переадресации заставляет хост-компьютер посылать датаграммы для сети X прямо на шлюз G2, поскольку это более короткий путь, нежели привлекать еще шлюз G1. Шлюз передает данные исходной датаграммы их адресату в системе Internet.

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

Шлюзом могут быть переданы сообщения с кодами 0, 1, 2 и 3.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сообщение со штампом времени Up: Форматы сообщений Previous: Сообщение о переадресации   Contents   Index

Эхо-сообщение и сообщение в ответ на эхо

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Идентификатор       |     Номер очереди             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Данные .....
+-+-+-+-+-+-+-


Поля IP заголовка

Адреса

Адрес отправителя в эхо-сообщении будет адресом получателя в ответном сообщении. Чтобы сформировать сообщение ответа, следует просто переставить местами адреса отправителя и получателя, код типа изменить на 0 и пересчитать контрольную сумму.


Поля ICMP сообщения

Тип
8 эхо-сообщение
0 сообщение в ответ на эхо
Код

0

Контрольная сумма
Контрольная сумма - это 16-битное допонение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP. При вычислении контрольной суммы это поле должно быть сперва обнулено. Если общая длина сообщения нечетная, то для вычисления контрольной суммы поле данных дополняется еще одним нулевым октетом. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Идентификатор
Если код = 0, то идентификатор для соотнесения эхо-сообщений и ответов на них, должен быть обнулен.
Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения эхо-сообщений и ответов на них, должен быть обнулен.


Описание

Данные из эхо-сообщения должны быть переданы в ответе на это сообщение.

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

Как шлюз, так и хост-компьютер могут возвращать сообщение с кодом 0.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Запрос информации и ответное Up: Форматы сообщений Previous: Эхо-сообщение и сообщение в   Contents   Index

Сообщение со штампом времени и сообщение с ответом на штамп времени

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Идентификатор       |     Номер очереди             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Штамп времени отправления                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Штамп времени получения                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Штамп времени передачи                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Адреса

Адрес отправителя в сообщении со штампом времени будет адресом получателя в сообщении с ответом. Чтобы сформировать ответ на сообщение, следует просто поменять местами адреса отправителя и получателя, выбрать код типа 14, а также пересчитать контрольную сумму.


Поля ICMP сообщения

Тип
13 для сообщения со штампом времени
14 для ответа на сообщение со штампом времени
Код

0

Контрольная сумма
Контрольная сумма - это 16-битное допонение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP. При вычислении контрольной суммы это поле должно быть сперва обнулено. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Идентификатор
Если код = 0, то идентификатор, служащий для соотнесения сообщений со штампом времени и ответов на них, должен быть обнулен.
Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения сообщений со штампом времени и ответов на них, должен быть обнулен.


Описание

Данные из сообщения (штамп времени) возвращаются вместе с ответом, при этом в них добавляется еще один штамп времени. Штамп времени - это 32 бита, где записано время в миллисекундах, прошедшее после полуночи по единому времени (UT).

Штамп времени отправления - это время, которое отправитель фиксировал последний раз перед посылкой сообщения. Штамп времени получения - это время, когда исходное сообщение впервые увидел получатель первоначального сообщения. Штамп времени передачи - это время, которое фиксировал в последний раз компьютер, отправляющий ответное сообщение.

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

Идентификатор и номер очереди могут использоваться отправителем для соотнесения сообщений (запросов) и ответов на них. Например, идентификатор может использоваться в качестве порта, аналогично протоколам TCP и UDP, для идентификации сессии. Номер очереди может увеличиваться на единицу при каждой посылке сообщения (запроса). Адресат возвращает для этих параметров те значения, которые были обнаружены в запросе.

И шлюз и хост-компьютер могут возвращать сообщения с кодом 0.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Словарик Up: Форматы сообщений Previous: Сообщение со штампом времени   Contents   Index

Запрос информации и ответное сообщение с информацией

 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Тип       |      Код      |    Контрольная сумма          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Идентификатор       |     Номер очереди             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Поля IP заголовка

Адреса
Адрес отправителя в сообщении с запросом информации окажется адресом получателя в ответном сообщении с информацией. Чтобы сформировать ответное сообщение, следует просто поменять местами адреса отправителя и получателя, код типа сменить на 16, пересчитать контрольную сумму.


Поля ICMP сообщения

Тип
15 сообщение с запросом информации
16 ответное сообщение с информацией
Код

0

Контрольная сумма
Контрольная сумма - это 16-битное допонение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP. При вычислении контрольной суммы следует предварительно обнулить поле самой контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Идентификатор
Если код = 0, то идентификатор, служащий для соотнесения запросов и ответов, может быть обнулен.
Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения запросов и ответов, может быть обнулен.


Описание

Данное сообщение может быть послано, когда в IP заголовке в полях отправителя и получателя записаны нули (это означает "именно эту" локальную сеть). В ответ должен быть послан IP модуль с полностью заданными адресами. Данное сообщение является способом, с помощью которого хост-компьютер сможет определить номер сети, куда он подключен.

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

И хост-компьютер и шлюз могут возвращать сообщения с кодом 0.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Bibliography Up: Введение в сети Previous: Запрос информации и ответное   Contents   Index

Словарик

1822
BBN доклад 1822, "The Specification of the Interconnection of a Host and an IMP". Спецификация взаимодействия между хост-компьютером и сетью ARPANET.

ARPANET проводник
Управляющая информация в ARPANET сообщении для интерфейса между хост-компьютером и IMP процессором.

ARPANET сообщение
Единица передачи между хост-компьютером и IMP процессором в сети ARPANET. Максимальный ее размер примерно 1012 октетов (8096 битов).

ARPANET пакет
Единица передачи внутри сети ARPANET между IMP процессорами. Максимальный размер ее около 126 октетов (1008 бит).

Destination (Получатель)
Адрес получателя, поле в Internet заголовке.

DF
Бит запрета фрагментации в поле флагов.

Flags (Флаги)
Поле Internet заголовка, содержащее различные управляющие биты.

Fragment Offset (Смещение фрагмента)
Это поле Internet заголовка указывает, к какому месту в Internet датаграмме относится фрагмент.

GGP
Gateway to Gateway Protocol - Протокол общения между шлюзами. Данный протокол первоначально использовался шлюзами для управления маршрутизацией и другими функциями шлюзов.

header (заголовок)
Управляющая информация в начале сообщения, сегмента, датаграммы, пакета или блока данных.

ICMP
Internet Control Message Protocol - Протокол контрольных сообщений Internet. Поддерживаемое Internet модулем, ICMP сообщение передается от шлюзов к хост-компьютерам и между хост-компьютерами, используется для отчетов об ошибках а также для создания предположений о маршрутизации.

Identification (Идентификация)
Поле Internet заголовка, содержащее идентифицирующее значение, назначенное отправителем, и служащее для сборки фрагментов какой-либо датаграммы.

IHL
The Internet Header Length - Поле Internet заголовка. Представляет собой длину Internet заголовка, измеренную в 32-битных словах.

IMP
The Interface Message Processor - Процессор сообщений интерфейса. Пакетный переключатель сети ARPANET.

Internet Address (адрес Internet)
Четырехоктетный (32 бита) адрес отправителя или получателя. Состоит из поля сети и поля локального адреса.

Internet фрагмент
Порция данных из Internet датаграммы, снабженная Internet заголовком.

Local Address (локальный адрес)
Адрес хост-компьютера внутри какой-либо сети. Реальное отображение локального адреса Internet на адреса хост-компьютеров в сети довольно произвольное, что позволяет отображать несколько локальных адресов на один хост-компьютер.

MF
Флаг появления дополнительных фрагментов, содержащийся в поле флагов Internet заголовка

module (модуль)
Реализация, обычно программная, протокола или других процедур

more-fragments flag
(флаг дополнительных фрагментов) Флаг, показывающий, содержит ли данная Internet датаграмма заключительную часть исходной Internet датаграммы. Флаг включен в поле флагов Internet заголовка.

NFB
The Number of Fragments Blocks - количество блоков фрагментации с данными в Internet фрагменте. Иными словами, длина поля с данными. Единица измерения - 8 октет.

octet (октет)
байт с восемью битами

Options (опции)
Поле опций Internet заголовка, может содержать несколько опций. Каждая опция может иметь длину в несколько октет.

Padding (Выравнивание)
Поле выравнивания Internet заголовка, используемое для того, чтобы убедиться в том, что данные начинаются по границе 32-битного слова. Выравнивание осуществляется нулями.

Protocol (Протокол)
Для данного документа это идентификатор протокола более высокого уровня, поле в Internet заголовке.

Rest (Остаток)
Часть Internet адреса, указывающая локальный адрес.

Source (Отправитель)
Адрес отправителя, поле Internet заголовка.

TCP
Transmission Control Protocol - Протокол управления передачей. Протокол общения между хост-компьютерами для осуществления коммуникаций в среде Internet.

TCP сегмент
Единица данных, передаваемая между TCP модулями (имеющая TCP заголовок).

TFTP
Trivial File Transfer Protocol: Простой протокол передачи файлов, созданный для UDP.

Time to Live (Время жизни)
Поле Internet заголовка, показывающее верхний предел для времени существования данной Internet датаграммы.

TOS
Тип сервиса

Total length (общая длина)
Поле Internet заголовка Total Length, определяющее длину датаграммы в октетах, включающее Internet заголовок и данные.

TTL
Время жизни

Type of Service (Тип сервиса)
Поле Internet заголовка, определяющее тип сервиса для данной Internet датаграммы.

UDP
User Datagram Protocol. Протокол на уровне пользователя для приложений, ориентированных на транзакции.

User (Пользователь)
Пользователь Internet протокола. Это может быть модуль протокола более высокого уровня, прикладная программа или программа шлюза.

Version (версия)
Поле версии, определяющее формат Internet заголовка.


next up previous contents index
Next: Bibliography Up: Введение в сети Previous: Запрос информации и ответное   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол UDP Up: base Previous: Словарик   Contents   Index

Bibliography

1

Postel, J., "Address Mappings," RFC 796, USC/Институт Информатики, сентябрь 1981.

2

Strazisar, V., "How to Build a Gateway", IEN 109, Bolt Beranek and Newman, август 1979.

3

Shoch, J., "Packet Fragmentation in Inter-Network Protocols," Computer Networks, v.3, n.1, январь 1979.

4

Postel, J., "Service Mappings," RFC 795, USC/Институт Информатики, сентябрь 1981.

5

Postel, J., "Assigned Numbers," RFC 790, USC/Институт Информатики, сентябрь 1981.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Порты Up: Bibliography Previous: Bibliography   Contents   Index

Протокол UDP

Протокол UDP (User Datagram Protocol - протокол пользовательских датаграмм) является одним из двух основных протоколов, расположенных непосредственно над IP. Он предоставляет прикладным процессам транспортные услуги, которые не многим отличаются от услуг, предоставляемых протоколом IP. Протокол UDP обеспечивает ненадежную доставку датаграмм и не поддерживает соединений из конца в конец. К заголовку IP-пакета он добавляет два поля, одно из которых, поле "порт", обеспечивает мультиплексирование информации между разными прикладными процессами, а другое поле - "контрольная сумма" - позволяет поддерживать целостность данных.

Примерами сетевых приложений, использующих UDP, являются NFS (Network File System - сетевая файловая система) и SNMP (Simple Network Management Protocol - простой протокол управления сетью).



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Контрольное суммирование Up: Протокол UDP Previous: Протокол UDP   Contents   Index

Порты

Взаимодействие между прикладными процессами и модулем UDP осуществляется через UDP-порты. Порты нумеруются начиная с нуля. Прикладной процесс, предоставляющий некоторые услуги другим прикладным процессам (сервер), ожидает поступления сообщений в порт, специально выделенный для этих услуг. Сообщения должны содержать запросы на предоставление услуг. Они отправляются процессами-клиентами.

Например, сервер SNMP всегда ожидает поступлений сообщений в порт 161. Если клиент SNMP желает получить услугу, он посылает запрос в UDP-порт 161 на машину, где работает сервер. В каждом узле может быть только один сервер SNMP, так как существует только один UDP-порт 161. Данный номер порта является общеизвестным, то есть фиксированным номером, официально выделенным для услуг SNMP. Общеизвестные номера определяются стандартами Internet.

Данные, отправляемые прикладным процессом через модуль UDP, достигают места назначения как единое целое. Например, если процессотправитель производит 5 записей в UDP-порт, то процесс-получатель должен будет сделать 5 чтений. Размер каждого записанного сообщения будет совпадать с размером каждого прочитанного. Протокол UDP сохраняет границы сообщений, определяемые прикладным процессом. Он никогда не объединяет несколько сообщений в одно и не делит одно сообщение на части.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Резюме Up: Протокол UDP Previous: Порты   Contents   Index

Контрольное суммирование

Когда модуль UDP получает датаграмму от модуля IP, он проверяет контрольную сумму, содержащуюся в ее заголовке. Если контрольная сумма равна нулю, то это означает, что отправитель датаграммы ее не подсчитывал, и, следовательно, ее нужно игнорировать. Если два модуля UDP взаимодействуют только через одну сеть Ethernet, то от контрольного суммирования можно отказаться, так как средства Ethernet обеспечивают достаточную степень надежности обнаружения ошибок передачи. Это снижает накладные расходы, связанные с работой UDP. Однако рекомендуется всегда выполнять контрольное суммирование, так как возможно в какой-то момент изменения в таблице маршрутов приведут к тому, что датаграммы будут посылаться через менее надежную среду.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол TCP Up: Протокол UDP Previous: Контрольное суммирование   Contents   Index

Резюме

Протокол UDP предоставляет прикладным программам возможность отправлять сообщения другим приложениям, используя минимальное количество параметров протокола. Этот протокол не обеспечивает достоверность доставки пакетов, защиты дублирования данных или надежности от сбоев в передаче. За исключением параметров приложения - номеров портов отправителя и получателя пакета, UDP практически ничего не добавляет к IP-дейтаграмме Формат UDP-пакета изображен на рис 1.

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

0 1em 1em 16 1em 31  
1emИсходящий порт 1emПорт назначения  
1emДлина 1emКонтрольная сумма  
1emДанные ...  

       

Рис. 1. Формат UDP пакета

Source Port
(16 бит) Порт отправителя.

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

Length
(16 бит) Поле длины Длина (в байтах) этой дейтаграммы, включая заголовок и данные (Минимальное значение этого поля равно 8)

Checksum
(16 бит) Поле контрольной суммы Контрольная сумма UDP-пакета представляет собой побитное дополнение 16-битной суммы 16-битных слов (аналогично TCP) В вычислении участвуют данные пакета, заголовок UDP-пакета, псевдозаголовок (информация от IP-протокола), поля выравнивания по 16-битной границе (нулевые)

Более подробное описание протокола UDP можно найти в RFC-768



Alex Otwagin 2002-12-16

next up previous contents index
Next: Комбинирование фонового режима и Up: Перенаправление ввода и вывода Previous: Добавить вывод в существующий   Contents   Index

Некоторые применения перенаправления вывода

Перенаправление вывода очень удобно в том случае, если вы не хотите, чтобы вывод появлялся на экране немедленно, или хотите сохранить его. Рассмотрим две команды: spell и sort.

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

     $ spell memo > misspell
Команда sort размещает строки указанного файла в алфавитном или цифровом порядке. Прежде чем перенаправить вывод команды в файл убедитесь, что имя этого файла не существует. Команда sort сначала очищает файл, который будет содержать вывод, затем выполняет сортировку и помещает вывод в пустой файл.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Потоки данных, стек протоколов, Up: Bibliography Previous: Резюме   Contents   Index

Протокол TCP

TCP (Transmission Control Protocol, Протокол управления передачей).

Протокол TCP предоставляет транспортные услуги, отличающиеся от услуг UDP. Вместо ненадежной доставки датаграмм без установления соединений, он обеспечивает гарантированную доставку с установлением соединений в виде байтовых потоков.

Протокол TCP используется в тех случаях, когда требуется надежная доставка сообщений. Он освобождает прикладные процессы от необходимости использовать таймауты и повторные передачи для обеспечения надежности. Наиболее типичными прикладными процессами, использующими TCP, являются FTP (File Transfer Protocol - протокол передачи файлов) и TELNET. Кроме того, TCP используют система X-Window, rcp (remote copy - удаленное копирование) и другие "r-команды". Большие возможности TCP даются не бесплатно. Реализация TCP требует большой производительности процессора и большой пропускной способности сети. Внутренняя структура модуля TCP гораздо сложнее структуры модуля UDP.

Прикладные процессы взаимодействуют с модулем TCP через порты. Для отдельных приложений выделяются общеизвестные номера портов. Например, сервер TELNET использует порт номер 23. Клиент TELNET может получать услуги от сервера, если установит соединение с TCP-портом 23 на его машине.

Когда прикладной процесс начинает использовать TCP, то модуль TCP на машине клиента и модуль TCP на машине сервера начинают общаться. Эти два оконечных модуля TCP поддерживают информацию о состоянии соединения, называемого виртуальным каналом. Этот виртуальный канал потребляет ресурсы обоих оконечных модулей TCP. Канал является дуплексным; данные могут одновременно передаваться в обоих направлениях. Один прикладной процесс пишет данные в TCP-порт, они проходят по сети, и другой прикладной процесс читает их из своего TCP-порта.

Протокол TCP разбивает поток байт на пакеты; он не сохраняет границ между записями. Например, если один прикладной процесс делает 5 записей в TCP-порт, то прикладной процесс на другом конце виртуального канала может выполнить 10 чтений для того, чтобы получить все данные. Но этот же процесс может получить все данные сразу, сделав только одну операцию чтения. Не существует зависимости между числом и размером записываемых сообщений с одной стороны и числом и размером считываемых сообщений с другой стороны.

Протокол TCP требует, чтобы все отправленные данные были подтверждены принявшей их стороной. Он использует таймауты и повторные передачи для обеспечения надежной доставки. Отправителю разрешается передавать некоторое количество данных, недожидаясь подтверждения приема ранее отправленных данных. Таким образом, между отправленными и подтвержденными данными существует окно уже отправленных, но еще неподтвержденных данных. Количество байт, которые можно передавать без подтверждения, называется размером окна. Как правило, размер окна устанавливается в стартовых файлах сетевого программного обеспечения. Так как TCP-канал является дуплексным, то подтверждения для данных, идущих в одном направлении, могут передаваться вместе с данными, идущими в противоположном направлении. Приемники на обеих сторонах виртуального канала выполняют управление потоком передаваемых данных для того, чтобы не допускать переполнения буферов.

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

В операционной системе реализация TCP представляет собой отдельный системный модуль (драйвер), через который, как правило, проходят все вызовы функций протокола. Интерфейс между прикладным процессом и TCP представляет собой библиотеку вызовов, такую же как библиотека системных вызовов, например, для работы с файлами. Соединение открывается и данные могут быть отправлены или приняты по открытому соединению аналогично операциям чтения и записи в файл, затем соединение должно быть закрыто. Вызовы TCP могут работать с приложением в асинхронном режиме. Реализация TCP в каждой системе может предложить много собственных функций, однако любая из этих реализаций должна обеспечивать необходимый минимум функциональности, предусмотренный стандартами TCP.

Схема работы пользовательского приложения с TCP в общих чертах состоит в следующем. Для передачи данных пользовательскому процессу надо вызвать соответствующую функцию TCP, с указанием на буфер передаваемых данных. TCP упаковывает эти данные в сегменты своего стека и вызывает функцию передачи протокола нижнего уровня, например IP.

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

Пользовательсикй интерфейс с TCP может выполнять такие команды как открыть (OPEN) или закрыть соединение (CLOSE), отправить (SEND) или принять (RECEIVE) данные, а также получить состояние соединения (STATUS).

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

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

Логическая структура сетевого программного обеспечения, реализующего протоколы семейства TCP/IP в каждом узле сети Internet, изображена на Рис 1.

0.1mm
\begin{picture}(782,676)
\put(190,471){\framebox (220,80)[]{TCP}}
\put(350,331...
...4){10}}
\put(170,631){\line(1,0){580}}
\put(350,641){Приложения}
\end{picture}

Рис. 1. Структура сетевого программного обеспечения семейства протоколов TCP/IP.

Прямоугольники обозначают обработку данных, а линии, соединяющие прямоугольники, - пути передачи данных. Горизонтальная линия внизу рисунка обозначает кабель сети Ethernet, которая используется в качестве примера физическаой среды. Понимание этой логической структуры является основой для понимания всей технологии TCP/IP.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Установление соединения и передача Up: Протокол TCP Previous: Протокол TCP   Contents   Index

Потоки данных, стек протоколов, механизм гнезд и мультиплексирование соединений

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

Рассмотрим потоки данных, проходящие через протоколы. При использовании протокола TCP данные передаются между прикладным процессом и модулем TCP. Типичным прикладным процессом, использующим протокол TCP является модуль FTP (File Transfer Protocol, Протокол передачи файлов). Стек протоколов в этом случае будет FTP/TCP/IP/ENET. При использовании протокола UDP (User Datagram Piotocol, Протокол дейтаграмм пользователя) данные передаются между прикладным процессом и модулем UDP. Например, SNMP (Simple Network Management Protocol, Простой протокол управления сетью) пользуется транспортными услугами UDP Его стек протоколов выглядит так: SNMP/UDP/IP/ENET.

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

Модули TCP, UDP и драйвер Ethernet являются мультиплексорами типа $ n
\times 1$. Действуя в этом качестве, они переключают несколько входов на один выход. Они же являются демультиплексорами $ 1 \times n$. Как демультиплексоры, они переключают один вход на один из многих выходов в соответствии с содержимым поля типа в заголовке протокольного блока данных. Когда Ethernet кадр попадает в драйвер сетевого интерфейса, он может быть направлен либо в модуль ARP, либо в модуль IP. Для этого используется значение поля типа в заголовке кадра Ethernet.

Если IP-пакет попадает в модуль IP, то содержащиеся в нем данные могут быть переданы либо модулю TCP, либо UDP, что определяется полем «Protocol» в заголовке IP-пакета. Если TCP-сообщение попадает в модуль TCP, то выбор прикладной программы, которой должно быть передано сообщение, осуществляется на основе значения поля «порт» в заголовке TCP-сообщения.

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

Назначение портов приложениям на каждом компьютере происходит независмо друг от друга. TCP может самостоятельно выбирать порт , с которым будет работать приложение, либо приложение укажет, с каким портом на данном компьютере оно будет работать. Как правило, часто используемые сервисы имеют заранее предопределенные номера портов, которые являются общеизвестными. К таким портам относятся http, fpt, smtp и многие другие. Номера портов перечислены в /etc/services.

Кроме того, машина может быть снабжена несколькими сетевыми интерфейсами, тогда она должна осуществлять мультиплексирование типа $ n \times m$, т е. между несколькими прикладными программами и сетевыми интерфейсами.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Механизмы обеспечения достоверности передаваемых Up: Протокол TCP Previous: Потоки данных, стек протоколов,   Contents   Index

Установление соединения и передача данных Процедура установления соединения и передача данных

Соединение определяется вызовом OPEN с аргументами в виде номера локального порта и гнезда (IP-адрес + порта) удаленного процесса. Функция OPEN вызывыается и в том случае, когда данный процесс намерен передавать информацию (активный OPEN), и когда процесс ожидает поступления информации (пассивный OPEN). Функция возвращает идентификатор соединения, по которому пользователь может ссылаться в своих последующих вызовах.Идентификатор соединения указывает на структуру данных, в которой хранятся переменные и информация данного TCP-соединения. Эта тструктура данных называется TCB - Transmission Control Block (Управляющая структура передачи).

ТСВ хранит такие параметры соединения, как адреса локального и удаленного гнезд, указатели на полученные и отправляемые пользовательские данные, указатели на очередь блоков для повторной отправки, номер текущего сегмента и т. д , то есть всю информацию, используемую данным соединением.

Как уже отмечено выше, открытие соединения может быть активным и пассивным. Пассивное открытие обозначает, что процесс ожидает поступления сигнала открытия соединения и не пытается открыть канал самостоятельно. Иными словами, канал, открытый с одного конца как пассивный, ожидает инициирующего сигнала от какого-либо из хостов Этот тип открытия канала используется процессами, которые предоставляют свой сервис через заранее известный номер своего порта (например, HTTP, SMTP и т д) и работают с механизмом общеизвестных гнезд.

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

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

  1. Когда локальное пассивное открытие соединения полностью определяет гнездо на другой стороне.

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

Если на одном гнезде открыто пассивно, с соответствующими записями ТСВ, несколько соединений, то при открытии активного соединения на другом конце будет задействовано ТСВ, соответствующее параметрам, заданным активным гнездом. Если такого не существует, выбирается любое другое открытое гнездо.

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

Инициализация соединения начинается с обмена пакетами, которые отправляются при открытиии канала пользователем, например, командой OPEN, и содержат флаг SYN и свой начальный порядковый номер пакетов данных. После этогго гнезда ожидают пакет, содержащий TCB партнера. Соединение считается установленным, когда в обоих направлениях синхронизируются нумерующие последовательности передаваемых пакетов, т.е и клиент и сервер «знают», пакет с каким номером поступит с противоположного конца соединения.

Соединение закрывается, когда гнезда обмениваются пакетами, содержащими команду FIN. При этом все ресурсы системы, занятые ТСВ-данных соединений, должны быть освобождены.

Вообще говоря, TCP сам определяет, как группировать и когда отправлять очередной блок данных. Однако в некоторых случаях, пользователю необходимо быть уверенным, что все данные, переданные на уровень TCP, отправлены. Для этих целей существует функция «проталкивания пакета» - PUSH-функция. Вызов этой функции позволяет проконтролировать отправку всех буферизированных TCP-протоколом данных.

Пользователь, отправляющий пакет вызовом SEND, указывает, передаются ли в сегменте, или в предшествующих сегментах данные немедленно, или при предече будет использоваться механизм кеширования данных, тогда данные будут отправляться в соответствии с системными установками. Когда же TCP получает пакет с флагом PUSH (устанавливается PUSH-функцией), вся кешированная информация немедленно передается получателю.

Назначение PUSH-функции и PUSH-флага состоит только в «проталкивании» данных к пользователю, минуя механизм кэширования. Команда PUSH не производит никаких дополнительных группировок или других действий над данными.

Следует отметить, что существует взаимосвязь между PUSH-функцией и использованием буферов данных, используемых как TCP, так и пользовательским интерфейсом. Всякий раз, когда с данными, помещенными в пользовательский буфер получателя, ассоциирован PUSH-флаг, буфер немедленно передается пользователю, даже если он не заполнен до конца. Если данные заполнили буфер до получения PUSH-флага, эти данные передадутся пользователю в размере целого буфера.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Механизм контроля потока данных Up: Протокол TCP Previous: Установление соединения и передача   Contents   Index

Механизмы обеспечения достоверности передаваемых данных

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

Когда TCP передает сегмент данных, копия этих данных помещается в очередь повтора передачи и запускается таймер ожидания подтверждения. Когда система получает подтверждение (сегмент TCP, содержащий управляющий флаг АСК), что этот пакет данных получен, она удаляет его из очереди. Сегмент подтверждения получения содержит номер полученного сегмента, на основании которого и происходит контроль доставки данных адресату. Если подтверждение не поступило до истечения срока таймера, пакет отправляется еще раз. Уведомление TCP о получении пакета данных еще не означает, что он был доставлен конечному пользователю. Оно только означает, что TCP выполнил возложенные на него функции.

При передаче информации каждому байту данных присваивается порядковый номер, поэтому, в какой бы последовательности эти пакеты не достигали точки назначения, они всегда будут собраны в изначально заданной последовательности. Порядковый номер первого байта данных в передаваемом сегменте называется порядковым номером сегмента. Нумерация проводится «с головы состава», т.е. от заголовка пакета. TCP пакет также содержит "подтверждающий номер" (acknowledgment number), который представляет собой номер следующего ожидаемого пакета данных передачи в обратном направлении. Иными словами, номер обозначает «до сих пор я все получил». Механизм с использованием «подтверждающего номера» позволяет исключать дублирование пакетов при повторной отправке недоставленных данных.

Кроме определения порядка следоания, порядковый номер играет большую роль в механизме синхронизации соединения и контроля потерянных пакетов при разрывах соединения. Однако, необходимо помнить, что величина счетчика - нумератора ограничена $ 2^{32}-1$ и все операции со счетчиком проводятся по модулю $ 2^{32}$. Поскольку и отправляющая и получающая стороны знают предыдущий и последующий номера, а также длину пакетов (TCB), выполнять операции коректно не представляет труда.

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

При установлени нового соединения генерируется 32-битное число ISN (Initial Sequence Number). Генератор использует 32 младших разряда машинного таймера, который меняется каждые 4 микросекунды (полный цикл 4.55 часа). Это число служит отсчетом нумератора пакетов. Поскольку каждая дейтаграмма в сети имеет ограниченное время жизни MSL (Maximum Life Time), значительно меньшее периода генератора, то это исключает возможность появления в сети пакетов с одинаковыми номерами.

Поврежденные пакеты отсеиваются механизмом проверки величины контрольной суммы данных, которая размещается в каждом передаваемом пакете



Alex Otwagin 2002-12-16

next up previous contents index
Next: Флаг важности пакета, средства Up: Протокол TCP Previous: Механизмы обеспечения достоверности передаваемых   Contents   Index

Механизм контроля потока данных

Протокол TCP позволяет получателю регулировать поток данных, передаваемый отправителем. Механизм основан та том, что при передаче флага подтверждения получения пакета (ACK) в TCP сегменте передается размер буфера данных, который может быть передан отправителем, не дожидаясь от получателя разрешения на отправку очередной порции данных. Иными словами, передается размер свободного места во входной очереди протокола, куда записываются поступившие и ожидающие обработки данные. Из этой очереди данные обрабатываются и передаются соответствующим процессам. Механизм позволяет избегать «заторов» передачи.

Окно" задается количеством байт, отсчитываемых от номера байта, заданного в поле номера пакета "подтвержденного получения" (acknowledgment number) данных. Нулевой размер окна означает для отправителя команду приостановить передачу до готовности принимать данные получателем. В этом случае отправитель посылает однобайтные пакеты и на основании информации пакетов подтверждения возобновляет или нет дальнейшую передачу данных.

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

Механизм контроля потока данных позволяет TCP влиять на изменение размера «окна» передачи. Это, в свою очередь, помогает значительно оптимизировать скорость достоверного обмена данных между процессами в гетерогенных сетях Internet.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Состав и предназначение полей Up: Протокол TCP Previous: Механизм контроля потока данных   Contents   Index

Флаг важности пакета, средства обеспечения безопасности протокола

Протокол TCP наследует все параметры секретности и приоритетности пакета, используемые IP и позволяет работать с ними для обеспечения собственной безопасности. В TCP спецификации термин «секретность и изолированность» обозначает безопасность соединения, изолированность потоков данных и другие ограничения, которые обеспечивает IP.

Кроме того, TCP поддерживает некоторые дополнительные механизмы, которые поддерживаются специальным аппаратным и программным обеспечением TCP.

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

Кроме наследуемых от IP-параметров, TCP имеет в своем распоряжении механизм работы с флагом важности пакетов - URG. Этот механизм позволяет отправителю «настоятельно сообщать» получателю о том, что тот или иной пакет содержит срочную информацию и позволяет получателю сигнализировать, когда вся срочная информация им получена. Такой механизм уведомления, т.е. манипулирование с URG-флагом TCP-пакета используется, например при обработке асинхронных событий.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Псевдозаголовок Up: Протокол TCP Previous: Флаг важности пакета, средства   Contents   Index

Состав и предназначение полей заголовка

0 1em 1em 4 1em 1em 1em 10 1em 1em 1em 16 1em 1em 1em 1em 24 1em 1em 1em 31  
1emИсходящий порт 1emПорт назначения  
1emНомер кадра в последовательности  
1emНомер кадра подтвержденного получения  
1emDataOffset 1emreserved 1em U A P R S F 1emОкно  
1emКонтрольная сумма 1emУказатель срочных данных  
1emНеобязательные параметры 1emВыравнивание  
1emДанные  

                               

Рис. 2 Заголовок TCP-пакета

Source Port
(16 бит) Порт отправителя.

Destination Port
(16 бит) Порт получателя.

Sequence Number
(32 бита) Номер кадра.

Номер кадра первого октета данных в этом сегменте (за исключением пакета, где присутствует флаг SYN). Если в пакете присутствует флаг SYN, то номер данного пакета становится номером начала последовательности (ISN) и номером первого октета данных становится номер ISN+1.

Acknowledgment Number
(32 бита) Поле номера кадра подтвержденного получения. Если пакет содержит установленный контрольный бит АСК, то это поле содержит номер следующего пакета данных отправителя, который ожидает получатель. При установленном соединении пакет подтверждения отправляется всегда.

Reserved
(6 бит) Резервное поле. Поле зарезервировано.

Флаги управления
(слева направо)

U URQ флаг срочности
A ACK флаг пакета подтверждения получения
P PSH флаг форсированной отправки
R RST переустановить соединение
S SYN синхронизация чсел последовательности
F FIN флаг завершения передачи со стороны отправителя

window
(16 бит) Окно. Это поле содержит количество байт данных, которое отправитель данного сегмента может принять, отсчитанное от номера байта, указанного в поле Acknowledgment Number.

Checksum
(16 бит) Поле контрольной суммы. Это поле содержит 16 бит суммы побитных дополнений 16-битных слов заголовка и данных Если сегмент содержит нечетное число байт заголовка и данных, последний байт дополняется справа нулями. При вычислении контрольной суммы поле контрольной суммы полагается равным нулю.

Urgent Pointer
(16 бит) Поле указателя срочных данных. Это поле содержит значение счетчика пакетов, начиная с которого следуют пакеты повышенной срочности. Это поле принимается во внимание только в сегментах с установленным флагом URG.

Options
Поле дополнительных параметров переменной длины.

Padding
Выравнивание заголовка на границу 32-бит.


next up previous contents index
Next: Псевдозаголовок Up: Протокол TCP Previous: Флаг важности пакета, средства   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: ping, traceroute Up: Протокол TCP Previous: Состав и предназначение полей   Contents   Index

Псевдозаголовок

Между TCP-заголовком и IP-заголовком располагается так называемый псевдозаголовок (Рис. 3) Он состоит из IP-адреса отправителя (Source Address), IP-адреса получателя (Destination Address), типа протокола (PTCL) и длины TCP-пакета (TCP Length). Он предназначен для «страховки» неправильной маршрутизации TCP-пакета. Информация, расположенная в этом заголовке передается TCP от IP-протокола как аргумент или результат обработки вызова IP-функции.

0 1em 8 1em 16 1em 31  
1emИсходящий адрес  
1emАдрес назначения  
1emZERO 1emPTCL 1emДлина TCP  

       

Рис. 3 Формат псевдозаголовка.

Более подробное описание протокола TCP можно найти в RFC-793, RFC-1180.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протоколы маршрутизации Up: Протокол TCP Previous: Псевдозаголовок   Contents   Index

ping, traceroute


ping (Packet InterNetwork Groper, Пакетный межсетевой щуп)

Чаще всего утилита ping используется для обнаружения элементарного сетевого соединения в TCP/IP-сетях.

Для проверки активности удаленного хоста ping использует серию ICMP Echo-сообщений, которые определяют период возврата дейтаграмм от указанного хоста и тем самым позволяют «прослушивать» сетевой путь до него.


traceroute

В работе утилиты traceroute используются протоколы UDP и ICMP. Утилита traceroute позволяет просматривать путь маршрутизации пакета от пользователя до удаленного хоста. Она часто используется сетевыми и системными администраторами как средство отладки маршрутизации пакетов из локальной сети организации в Internet. Принцип работы утилиты заключается в следующем:

Утилита traceroute отправляет на несуществующий порт удаленного хоста последовательность UDP-дейтаграмм. По умолчанию, отправляются три дейтаграммы, каждая из которых содержит параметр TTL = 1 Поскольку параметр TTL уменьшается на 1 в каждом из узлов маршрутизации, первый же маршрутизатор уничтожит данные дейтаграммы и отправит отправителю уведомления. Уведомления представляют собой ICMP-сообщения Time Exceeded Message (ТЕМ) и содержат временную метку поступления UDP-сообщения и адрес маршрутизатора.

После этого traceroute отправляет UDP-сообщения с параметром TTL = 2, т.е. эти сообщения должен уничтожить второй маршрутизатор на пути к хосту назначения, затем с параметром TTL =3 и т.д. Этот процесс продолжается до тех пор, пока дейтаграмма не будет доходить до удаленного хоста. После того как очередная дейтаграмма, пройдя все попутные маршрутизаторы, дойдет до хоста назначения, хост не сможет ее обработать, поскольку в ней указан несуществующий порт, и сгенерирует сообщение ICMP Destination Unreachable. Это сообщение служит командой для прекращения работы traceroute.

В процессе обмена UDP- и ICMP-сообщениями формируется таблица задержек маршрутизации пакетов на каждом из узлов и на пути к удаленному хосту в целом. Эта информация и выводится на экран пользователя



Alex Otwagin 2002-12-16

next up previous contents index
Next: Параметры и классы протоколов Up: Bibliography Previous: ping, traceroute   Contents   Index

Протоколы маршрутизации

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

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

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

Алгоритмы маршрутизации заполняют маршрутные таблицы информацией о маршрутах. Ассоциации «пункт назначения - следующая пересылка» сообщают роутеру, что определенный пункт назначения может быть оптимально достигнут путем отправки пакета в определенный роутер, представляющий «следующую пересылку» на пути к конечному пункту назначения. В маршрутных таблицах может содержаться также и другая информация, как правило, это - различные характеристики канала (способа пересылки данных). Значения полей «характеристик» содержит информацию о желательности какого-либо канала или тракта. Роутеры сравнивают эти показатели, чтобы определить оптимальные маршруты. Показатели отличаются друг от друга в зависимости от используемой схемы алгоритма маршрутизации.

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

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Перенаправление вывода команде Up: Перенаправление ввода и вывода Previous: Некоторые применения перенаправления вывода   Contents   Index

Комбинирование фонового режима и перенаправления вывода

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

Предположим, что вы хотите найти все появления слова "test" в файле schedule. Запустите команду grep в фоновом режиме и перенаправьте вывод в файл testfile:

     $ grep test schedule > testfile

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: RIP Up: Протоколы маршрутизации Previous: Протоколы маршрутизации   Contents   Index

Параметры и классы протоколов маршрутизации

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

  2. Низкие непроизводительные затраты. Алгоритмы маршрутизации разрабатываются как можно более простыми. То есть алгоритм маршрутизации должен эффективно обеспечивать свои функциональные возможности с минимальными затратами программного обеспечения.

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

  4. Быстрая сходимость алгоритма. Сходимость - это процесс соглашения между всеми роутерами по оптимальным маршрутам. Когда какое-нибудь событие в сети приводит к тому, что маршруты или отвергаются, или становятся доступными, роутеры рассылают сообщения об обновлении маршрутизации. Сообщения об обновлении маршрутизации пронизывают сети, стимулируя пересчет оптимальных маршрутов и, в конечном итоге, вынуждая все роутеры придти к соглашению по этим маршрутам. Алгоритмы маршрутизации, которые сходятся медленно, могут привести к образованию петель маршрутизации или выходам из строя сети.

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

Все алгоритмы маршрутизации можно классифицировать как:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол состояния связей OSPF Up: Протоколы маршрутизации Previous: Параметры и классы протоколов   Contents   Index

RIP

Алгоритм маршрутизации протокола RIP (Roster Image Processor, Обработчик растровых образов) принадлежит к классу дистанционно-векторных алгоритмов. С 1988 года RIP был повсеместно принят производителями персональных компьютеров для использования в их изделиях передачи данных по сети. Алгоритм построен на обмене небольшими блоками информации из таблиц маршрутизации между соседними маршрутизаторами.

Каждая запись в базе данных маршрутизации состоит из:

RIP работает на основе UDP-протокола и использует порт 520. На каждом хосте, использующем RIP, должно быть установлено программное обеспечение, обрабатывающее RIP-пакеты.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протоколы досягаемости EGP, BGP Up: Протоколы маршрутизации Previous: RIP   Contents   Index

Протокол состояния связей OSPF

OSPF является иерархическим протоколом маршрутизации с объявлением состояния о канале соединения (link-state). Он был спроектирован как протокол работы внутри сетевой области - AS (Autonomous System), которая представляет собой группу маршрутизаторов и сетей, объединенных по иерархическому принципу и находящихся под единым управлением и совместно использующих общую стратегию маршрутизации. В качестве транспортного протокола для маршрутизации внутри AS OSPF использует IP-протокол.

Для различных типов IP-сервиса (видов услуг высшего уровня, которые определяются значением поля TOS IP-пакета), OSPF может рассчитывать свои оптимальные маршруты на основании параметров, наиболее критичных для данного вида сервиса. Например, какая-нибудь прикладная программа может включить требование о том, что определенная информация является срочной. Если OSPF имеет в своем распоряжении каналы с высоким приоритетом, то они могут быть использованы для транспортировки срочных дейтаграмм.


Иерархия OSPF-сетей

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: EGP Up: Протоколы маршрутизации Previous: Протокол состояния связей OSPF   Contents   Index

Протоколы досягаемости EGP, BGP

Архитектура сетей Internet постепенно перестраивается. Сети объединяются в домены или так называемые "автономные системы" (autonomous svstems), которые используют внутри себя единую стратегию маршрутизации и использует свои специфические роутеры. В Internet для междоменной маршрутизации используется протокол EGP - Exterior Gateway Protocol.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: BGP Up: Протоколы досягаемости EGP, BGP Previous: Протоколы досягаемости EGP, BGP   Contents   Index

EGP

EGP не является протоколом маршрутизации пакетов данных. Он предназначен для обеспечения взаимодействия между шлюзами различных AS, для обмена информацией согласования алгоритмов маршрутизации между ними, а не для управления перемещением самой информации. Каждая из AS может работать со своим (RIP или OSPF) a EGP осуществляет управление маршрутизацией между AS. Все из менения обеспечивающие доступ AS к главной магистрали - backbone, должны быть также сделаны самой AS. Кроме того EGP не строит схем и алгоритмов маршрутизации данных.

Любая часть EGP сети Internet должна представлять собой структуру дерева, у которого стержневой роутер является корнем, и в пределах которого отсутствуют петли между другими AS. Это ограничение является основным ограничением EGP. Оно стало причиной его постепенного вытеснения другими, более совершенными протоколами внешних роутеров.

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

EGP выполняет три основные функции:

  1. Маршрутизаторы, работающие с EGP, организуют для себя определенный набор соседей. Соседи - это просто другие маршрутизаторы, с которыми какой-нибудь роутер хочет коллективно пользоваться информацией о досягаемости сетей (какие-либо указания о географическом соседстве не включаются).

  2. Маршрутизаторы EGP опрашивают своих соседей для того, чтобы убедиться в их работоспособности.

  3. Маршрутизаторы EGP отправляют сообщения о корректировках, содержащих информацию о досягаемости сетей в пределах своих AS.

Более подробную информацию о EGP можно найти, например, в RFC-827, RFC-888, RFC-904, RFC-1092.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Бесклассовая стратегия маршрутизации CIDR Up: Протоколы досягаемости EGP, BGP Previous: EGP   Contents   Index

BGP

BGP, в отличие от предшествующих протоколов маршрутизации, которые взаимодействуют напрямую с протоколом IP, работает поверх протокола транспортного уровня. Например, при работе поверх TCP BGP использует порт 179. Это позволяет не нагружать сервисы обработки протокола BGP механизмами фрагментации или обеспечения достоверности доставки пакетов.

Основным предназначением BGP является обеспечение обмена информацией с другими BGP-системами о досягаемости определенных сетей или хостов. Эта информация должна содержать набор маршрутов к данной сети, т е. должны быть указаны все промежуточные AS. Такой информации вполне достаточно для того, чтобы построить граф соединений между AS и контролировать возможность образования петель.

Хосты работающие с ВОР, не принимают участие в процедуре маршрутизации информационных пакетов. Они предназначены только для обмена информацией с роутерами других AS.

Более подробную инфоромацию о протоколе BGP можно найти в RFC 1105, RFС 1163, RFC 1164, RFC 1267, RFC 1364, RFC 1403, RFC-1654, RFC 1771, RFC 1772.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Доменная Система Имен Up: Протоколы маршрутизации Previous: BGP   Contents   Index

Бесклассовая стратегия маршрутизации CIDR

В связи с быстрым ростом Internet за последние несколько лет, стали проявляться серьезные недостатки в организации увеличения адресного пространства:

Поэтому в июне 1992 года IETF (Internet Engineering Task Force) принял решение об использовании технологии бесклассовой внутри доменной маршрутизации CIDR (Classless Inter-Domain Routing) для решения этих проблем. CIDR может применяться в любой группе доменов Internet, работающих как с IPv4, так и с IPv6 и успешно взаимодействовать со старыми технологиями адресации.

В основе CIDR лежит принцип использования маски сети переменной длины (VLSM - variable length subnetwork mask) и отказ от деления на классы. Все организации будут разделяться не по классам своих сетей, а по маске предоставленного им адреса. Напр., провайдер A, которому NIC делегировал адреса с 198.24.0.0 по 198.31.255.255 с маской 255.248.0.0 (FF.F8.00.00) может назначить своему клиенту AA группу адресов с 198.24.8.0 до 198.24.11.255 с маской 255.255.252.0 (FF.FF.FC.00).

Очевидно, что новая структура адресного пространства позволит значительно сэкономить адреса для тех организаций, которым они действительно нужны, и взять лишние у других. Если организация желает получить пул адресов для работы в Internet, она заказывает кортеж <адрес, маска>, исходя из своих потребностей. Если, к примеру, ей нужно подсоединить к Internet 999 хостов, не нужно заказывать четыре сети класса С или одну класса В, достаточно заказать адрес и маску, позволяющие работать такому количеству хостов, например <198.24.8.0, 255.255.252 0> - 1024 хоста.

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

Более подробно о принципах и механизме бесклассовой маршрутизации C1DR можно найти в RFC-1517, RFC-1518, RFC-1519, RFC-1817



Alex Otwagin 2002-12-16

next up previous contents index
Next: Структура региональной системы имен Up: Bibliography Previous: Бесклассовая стратегия маршрутизации CIDR   Contents   Index

Доменная Система Имен

Региональная Система Имен

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

Как мы уже упоминали, для понимания полезно использовать почтовую аналогию. Сетевые численные адреса вполне аналогичны почтовой индексации. Машины, сортирующие корреспонденцию на почтовых узлах, ориентируются именно по индексам, и только если с индексами выходит какая-то несуразность, передают почту на рассмотрение людям, которые по адресу могут определить правильный индекс почтового отделения места назначения. Людям же приятнее и удобнее иметь дело с географическими названиями - это аналоги доменных имен.

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

В начале Internet NIC создал регистратуру. Можно было послать запрос и в ответ высылали список имен и адресов. Этот файл, называется «host file» (файл рабочих ЭВМ), регулярно распространялся по всей сети - рассылался всем машинам. Имена были простыми словами, все были единственными. Если вы использовали имя, ваш компьютер просматривал этот файл и подставлял вместо имени реальный числовой адрес. Так же, как работает телефонный аппарат со встроенным списком абонентов. Все было легко, просто и замечательно. Всем хватало простых имен.

Но по мере развития и расширения Internet возрастало количество пользователей, хостов, а потому увеличивался и упомянутый файл. Возникали значительные задержки при регистрации и получении имени новым компьютером, стало затруднительно изыскивать имена, которые еще никто не использовал, слишком много сетевого времени затрачивалось на рассылку этого огромного файла всем машинам, в нем упомянутым. Стало очевидно, - чтобы справиться с такими темпами изменений и роста сети, нужна распределенная оперативная система, опирающаяся на новый принцип. Таковая была создана, ее назвали «доменной системой имен> - DNS, а способ адресации - способом адресации по доменному принципу. DNS иногда еще называют региональной системой наименований.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск адреса по доменному Up: Доменная Система Имен Previous: Доменная Система Имен   Contents   Index

Структура региональной системы имен

Доменная система имен - это метод назначения имен путем передачи сетевым группам ответственности за их подмножество имен. Каждый уровень этой системы называется доменом. Домены в именах отделяются друг от друга точками: inr.msk.su, nusun.jinr.dubna.su, arty.bashkiria.su, vxcern.cern.ch, nic.ddn.mil. В имени может быть различное количество доменов, но практически их не больше пяти. По мере движения по доменам слева направо в имени, количество имен, входящих в соответствующую группу возрастает.

Первым в имени стоит название рабочей машины - реального компьютера с IP адресом. Это имя создано и поддерживается группой (например, компьютер nusun (это SUN sparc) в группе jinr (ОИЯИ)), к которой он относится. Группа входит в более крупное подразделение (например, городское объединение - сеть города Дубны), которое в свою очередь, является частью национальной сети (например, сети стран бывшего СССР, домен su). Для США наименование страны по традиции опускается, там самыми крупными объединениями являются сети образовательных (edu), коммерческих (com), государственных (gov), военных (mil) учреждений, а также сети других организаций (org) и сетевых ресурсов (net).

Группа может создавать или изменять любые ей подлежащие имена. Если jinr решит поставить другой компьютер, и назвать его mainx, он ни у кого не должен спрашивать разрешения, все, что от него требуется, - это добавить новое имя в соответствующую часть соответствующей всемирной базы данных, и, рано или поздно, каждый, кому потребуется, узнает об этом имени. Аналогично, если в Дубне решат создать новую группу, например, schools, они (домен dubna) могут это сделать также, ни у кого на то не спрашивая никакого соизволения. И тогда, если каждая группа придерживается таких простых правил и всегда убеждается, что имена, которые она присваивает, единственны во множестве ее непосредственных подчиненных, то никакие две системы, где бы те ни были в сети Internet, не смогут заиметь одинаковых имен.

Эта ситуация совершенно аналогична ситуации с присвоением географических названий - организацией почтовых адресов. Названия всех стран различаются. Различаются названия всех областей, республик и штатов, и эти названия утверждаются в государственном масштабе из центра (конечно, обычно сами регионы заботятся об уникальности своих названий, поэтому здесь царит полная демократия: как штат хочет, так он и называется). Аналогично далее с городами и улицами городов. Таким образом, почтовый адрес на основе географических и административных названий однозначно определяет точку назначения.

Поскольку Internet - сеть мировая, требовался также способ передачи ответственности за имена внутри стран им самим. Сейчас принята двухбуквенная кодировка государств. Это оговорено в RFC 822. Так, например, домен Канада называется ca, бывший СССР - su, США - us, Россия - ru, Беларусь - by и т.д. США также включили в эту систему структурирования для всеобщности и порядка. Всего же кодов стран почти 300, из которых около 100 имеет компьютерную сеть того или иного рода. Единый каталог Internet находится у SRI International (Менло-Парк, Калифорния, США) - государственной организации.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Замечания по региональной системе Up: Доменная Система Имен Previous: Структура региональной системы имен   Contents   Index

Поиск адреса по доменному имени

Эта система имен используется автоматически с помощью процедуры разрешения имени сервером доменных имен DNS. Нет необхлодимости самим разыскивать адрес, соответствующий этому имени, или подавать специальную команду для его поиска (в UNIX - команда nslookup). Все компьютеры Internet способны пользоваться доменной системой. И работающий в сети компьютер всегда знает свой собственный сетевой адрес.

Когда используется имя, например, lsi.bas-net.by, компьютер должен преобразовать его в адрес. Для этого он делает запрос к DNS-серверам. Это узлы, рабочие машины, обладающие соответствующей базой данных, в число обязанностей которых входит обслуживание такого рода запросов. DNS-сервер начинает обработку имени с правого его конца и двигается по нему влево, т.е. сначала производится поиск адреса в самой большой группе (домене), потом постепенно сужает поиск. Но для начала опрашивается на предмет наличия у него нужной информации местный узел. Здесь возможны три случая:

  1. Местный сервер знает адрес, потому, что этот адрес содержится в его части всемирной базы данных. Например, если мы подсоединены к сети ИТК, то наш местный сервер должен обладать информацией о всех компьютерах локальной сети института ИТК.

  2. Местный сервер знает адрес, потому, что кто-то недавно уже запрашивал тот же адрес. Когда запрашивается адрес, сервер DNS кеширует его у себя в памяти некоторое время - это повышает эффективность системы;

  3. Местный сервер адрес не знает, но знает как его выяснить.

Как местный сервер может разузнать запрошенный адрес, например os2.spb.ru? В его прикладном или системном программном обеспечении имеется информация о том, как связаться с корневым сервером. Это сервер, который знает адреса серверов имен высшего уровня (самых правых в имени), здесь это уровень государств (ранга домена ru). У него запрашивается адрес компьютера, ответственного за зону ru. Местный DNS-сервер связывается с этим более общим сервером и запрашивает у него адрес сервера, ответственного за домен spb.ru. Теперь уже запрашивается этот сервер и у него запрашивается адрес рабочей машины os2.

На самом деле, для повышения эффективности, поиск начинается не с самого верха, а с наименьшего домена, в который входите и вы, и компьютер, имя которого вы запросили. Например, если ваш компьютер имеет имя lsi.bas-net.by, то опрос начнется (если имя не выяснится сразу) не со всемирного сервера, чтобы узнать адрес сервера группы by, а сразу с группы by, что сразу сокращает поиск и по объему, и по времени.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Подстановка вывода в качестве Up: Перенаправление ввода и вывода Previous: Комбинирование фонового режима и   Contents   Index

Перенаправление вывода команде

Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:

     command1 | command2 | command3 ...
Вывод command1 используется как ввод для command2. Вывод command2 используется как ввод для command3.

Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат:

Например, предположим вы хотите послать сообщение happy birthday с помощью команды banner владельцу david. Выполним сначала по первому методу:
  1. Введите команду banner и перенаправьте ее вывод во временный файл:
         banner happy birhday > message.tmp
    
  2. Введите команду mail и в качестве ввода воспользуйтесь файлом message.tmp:
         mail david < message.tmp
    
  3. Удалите временный файл:
         rm message.tmp
    
Вторым методом это можно сделать быстрее:
     banner happy birthday | mail david



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протоколы прикладного уровня Up: Доменная Система Имен Previous: Поиск адреса по доменному   Contents   Index

Замечания по региональной системе имен

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол TELNET Up: Bibliography Previous: Замечания по региональной системе   Contents   Index

Протоколы прикладного уровня

Почему существуют два транспортных протокола TCP и UDP, а не один из них? Дело в том, что они предоставляют разные услуги прикладным процессам. Большинство прикладных программ пользуются только одним из них. Вы, как программист, выбираете тот протокол, который наилучшим образом соответствует вашим потребностям. Если вам нужна надежная доставка, то лучшим может быть TCP. Если вам нужна доставка датаграмм, то лучше может быть UDP. Если вам нужна эффективная доставка по длинному и ненадежному каналу передачи данных, то лучше может подойти протокол TCP. Если нужна эффективность на быстрых сетях с короткими соединениями, то лучшим может быть протокол UDP. Если ваши потребности не попадают ни в одну из этих категорий, то выбор транспортного протокола не ясен. Однако прикладные программы могут устранять недостатки выбранного протокола. Например, если вы выбрали UDP, а вам необходима надежность, то прикладная программа должна обеспечить надежность. Если вы выбрали TCP, а вам нужно передавать записи, то прикладная программа должна вставлять маркеры в поток байтов так, чтобы можно было различить записи.

Какие же прикладные программы доступны в сетях с TCP/IP?

Общее их количество велико и продолжает постоянно увеличиваться. Некоторые приложения существуют с самого начала развития internet. Например, TELNET и FTP. Другие появились недавно: X-Window, SNMP.

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол FTP Up: Протоколы прикладного уровня Previous: Протоколы прикладного уровня   Contents   Index

Протокол TELNET

Протокол TELNET позволяет обслуживающей машине рассматривать все удаленные терминалы как стандартные "сетевые виртуальные терминалы" строчного типа, работающие в коде ASCII, а также обеспечивает возможность согласования более сложных функций (например, локальный или удаленный эхо-контроль, страничный режим, высота и ширина экрана и т.д.) TELNET работает на базе протокола TCP. На прикладном уровне над TELNET находится либо программа поддержки реального терминала (на стороне пользователя), либо прикладной процесс в обсуживающей машине, к которому осуществляется доступ с терминала.

Работа с TELNET походит на набор телефонного номера. Пользователь набирает на клавиатуре что-то вроде

telnet delta

и получает на экране приглашение на вход в машину delta.

Протокол TELNET существует уже давно. Он хорошо опробован и широко распространен. Создано множество реализаций для самых разных операционных систем. Вполне допустимо, чтобы процесс-клиент работал, скажем, под управлением ОС VAX/VMS, а процесс-сервер под ОС UNIX System V.


Принципы построения

Строится на базе TCP протокола и работает по дуплексному, многопользовательскому протоколу. Это значит, что один сервер может обслуживать одновременно несколько клиентов.

Telnet построен на трех основных принципах:

  1. NVT - Netvork Virtual Terminal - Принцип виртуальных терминалов. После установления соединения предполагается, что каждый участник работает как «Виртуальный сетевой терминал» - мнимое устройство, выполняющее стандартные сетевые промежуточные функции обычного терминала.

  2. Принцип настраиваемых параметров. Если хост предоставляет дополнительный сервис помимо NVT, и клиент в состоянии его использовать, telnet предоставляет возможностьь сделать это.

  3. Принцип симметрии терминалов и процессов. Участники соединения равноправны.


Сервис NVT

NVT - устройство для ввода/вывода 7-и битных ASCII символов. Все преобразования и кодировки выполняются выше NVT и не рассматриваются как часть NVT. NVT имеет устройство ввода «виртуальная клавиатура» и устройство вывода «виртуальный принтер», что выглядит как дисплей.

Выводное устройство не имеет ограничений на ширину и выводит все печатаемые символы из диапазона 32 - 126. Управляющие коды ASCII (0-31, 127) имеют специальное значение. Коды 128-255 имеют также специальное назначение. Некоторые из них:

0 NULL Пусто
10 LF Перенос курсора на след. строку с сохр. позиции.
13 CR Перенос курсора на начало текущей строки.
7 BELL Звонок
8 BS Перенос курсора на одну позицию влево
9 HT Перенос курсора на следующую позицию горизонтальной табуляции
11 VT Перенос курсора на следующую позицию вертикальнойтабуляции
12 FF Перенос курсора на начало след страницы с сохранением позиции в строке

Ввод и передача буферируются. Данные накапливаются в буфере пока не будет завершена сторока или н ебудет выполнено форсирование передачи до завершения строки. Клавиатура должна генерировать все 128 кодов, соответсвующих 128 ASCII символам. Кроме того, она должна генерировать управляющие коды:

244 IP Interrupt Process - прервать процесс. Команда останавливает операции или процесс пользователя. Используется при зависании или ошибках.
245 AO Abort Output - прервать вывод. Вывод прекращается и выводной буфер очищается.
246 AYT Are You There - вы тут?
247 EC Erase Char - Удалить символ из буфера.
248 EL Erase Line - Удалить строку. Очищает текущую строку ввода.
249 GA Go Ahead - Далее. Передача контроля над соединением без отправки каких либо данных.
250 SB SubNegotiation, Параметры расширения. Указывает, что за этим последует передача дополнительных опций
240 SE Subnegotiation End. Конец параметров расширения.
251 WILL квитанция согласования.
252 WON'T квитанция согласования.
253 DO квитанция согласования.
253 DON'T квитанция согласования.
255 IAC Interpret As Command - Код команды. Следующий байт - команда telnet. Третий опциональный байт - код настраиваемой опции.

Механизм SYNC, в основе которого лежит тот факт, что telnet не обрабатывает URGENT сообщения, позволяет посылать сигналы клиенту над telnet, что полезно в случае переполнения или других проблем с входным буфером.

Telnet является универсальным клиентом и позволяет соединиться с большим колическтвом портов и общаться с различными приложениями.


next up previous contents index
Next: Протокол FTP Up: Протоколы прикладного уровня Previous: Протоколы прикладного уровня   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол SMTP Up: Протоколы прикладного уровня Previous: Протокол TELNET   Contents   Index

Протокол FTP

Протокол FTP (File Transfer Protocol - протокол передачи файлов) распространен также широко как TELNET. Он является одним из старейших протоколов семейства TCP/IP. Также как TELNET он пользуется транспортными услугами TCP. Существует множество реализаций для различных операционных систем, которые хорошо взаимодействуют между собой. Пользователь FTP может вызывать несколько команд, которые позволяют ему посмотреть каталог удаленной машины, перейти из одного каталога в другой, а также скопировать один или несколько файлов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: r-команды Up: Протоколы прикладного уровня Previous: Протокол FTP   Contents   Index

Протокол SMTP

Протокол SMTP (Simple Mail Transfer Protocol - простой протокол передачи почты) поддерживает передачу сообщений (электронной почты) между произвольными узлами сети internet. Имея механизмы промежуточного хранения почты и механизмы повышения надежности доставки, протокол SMTP допускает использование различных транспотных служб. Он может работать даже в сетях, не использующих протоколы семейства TCP/IP. Протокол SMTP обеспечивает как группирование сообщений в адрес одного получателя, так и размножение нескольких копий сообщения для передачи в разные адреса. Над модулем SMTP располагается почтовая служба конкретных вычислительных систем.



Alex Otwagin 2002-12-16

next up previous contents index
Next: NFS Up: Протоколы прикладного уровня Previous: Протокол SMTP   Contents   Index

r-команды

Существует целая серия "r-команд" (от remote - удаленный), которые впервые появились в ОС UNIX. Они являются аналогами обычных команд UNIX, но предназначены для работы с удаленными машинами. Например, команда rcp является аналогом команды cp и предназначена для копирования файлов между машинами. Для передачи файла на узел delta достаточно ввести

rcp file.c delta:

Для выполнения команды "cc file.c" на машине delta можно использовать комаду rsh:

rsh delta cc file.c

Для организации входа в удаленную систему предназначена команда rlogin:

rlogin delta

Команды r-серии используются главным образом в системах, работающих под управлением ОС UNIX. Существуют также реализации для MS-DOS. Команды избавляют пользователя от необходимости набирать пароли при входе в удаленную систему и существенно облегчают работу.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Протокол SNMP Up: Протоколы прикладного уровня Previous: r-команды   Contents   Index

NFS

Сетевая файловая система NFS (Network File System) впервые была разработана компанией Sun Microsystems Inc. NFS использует транспортные услуги UDP и позволяет монтировать в единое целое файловые системы нескольких машин с ОС UNIX. Бездисковые рабочие станции получают доступ к дискам файл-сервера так, как-будто это их локальные диски.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: X-Window Up: Протоколы прикладного уровня Previous: NFS   Contents   Index

Протокол SNMP

Протокол SNMP (Simple Network Management Protocol - простой протокол управления сетью) работает на базе UDP и предназначен для использования сетевыми управляющими станциями. Он позволяет управляющим станциям собирать информацию о положении дел в сети internet. Протокол определяет формат данных, их обработка и интерпретация остаются на усмотрение управляющих станций или менеджера сети.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Краткое введение в LATEX Up: Протоколы прикладного уровня Previous: Протокол SNMP   Contents   Index

X-Window

Система X-Window использует протокол X-Window, который работает на базе TCP, для многооконного отображения графики и текста на растровых дисплеях рабочих станций. X-Window - это гораздо больше, чем просто утилита для рисования окон; это целая философия человеко-машинного взаимодействия.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Что такое LATEX, особенности, Up: base Previous: X-Window   Contents   Index

Краткое введение в LATEX



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Выполнение, останов и повторный Up: Перенаправление ввода и вывода Previous: Перенаправление вывода команде   Contents   Index

Подстановка вывода в качестве аргумента

Вывод большинства команд может использоваться как аргумент в командной строке. Для этого команду заключите между знаками "слабое ударение" (`...`) и поместите ее в командной строке в том месте, где вывод будет трактоваться как аргумент.

Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner:

     $ banner `date | cut -c12-19`

Обратите внимание на результат: система печатает banner с текущим временем.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Недостатки: Up: Краткое введение в LATEX Previous: Краткое введение в LATEX   Contents   Index

Что такое LATEX, особенности, достоитнства, недостатки.

TEX (произносится как `тех') -- это компьютерная система типографского набора, созданная Д. Е. Кнутом из Стэнфордского университета, предназначенная для создания красивых книг, особенно книг, содержащих много математических формул. Полиграфическое качество документов, полученных с помощью TEX'а, сравнимо с самыми лучшими образцами печатных работ.

Содержит более 900 команд и примитивов. В настоящее время сам TEX, как процессор, не развивается.

PlainTEX- первая макронадстройка, созданная Кнутом.

LATEX- макронадстройка над TEX, созданная Лесли Лампортом в 1985 г. Содержит около 600 макрокоманд. Эти команды определяют такие параметры текста, как типы и размеры шрифтов основного текста, заголовков, высоту и ширину страниц, промежутки между строками, абзацами, отступы и многое другое.

Допускает использование большинства команд TEX.

Фундаментальнвя концепция LATEX'а - понятие стиля документа. Стиль реализуется выбором базового стиля и группы корректирующих стилей, которые дополняют базовый.

На сегодня используется версия LATEX2e, которая заметно отличается от оригинальной версии лесли Лампорта.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Достоинства: Up: Что такое LATEX, особенности, Previous: Что такое LATEX, особенности,   Contents   Index

Недостатки:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Где найти информацию по Up: Что такое LATEX, особенности, Previous: Недостатки:   Contents   Index

Достоинства:



Alex Otwagin 2002-12-16

next up previous contents index
Next: Как TEX/LATEX работает Up: Краткое введение в LATEX Previous: Достоинства:   Contents   Index

Где найти информацию по LATEX'у.

Сервер CTAN и его зеркала.

ftp://ftp.tex.ac.uk/tex-archive -- основной сервер,
ftp://ftp.vsu.ru/pub/tex        -- главный сервер рунета.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Основы Up: Краткое введение в LATEX Previous: Где найти информацию по   Contents   Index

Как TEX/LATEX работает

0.1mm
\begin{picture}(1039,1402)
% put(14,1400)\{ line(0,-1)\{1400\}\}
% put(9,1395)...
...\put(49,1210){\vector(1,0){220}}
\put(609,1120){\line(0,-1){140}}
\end{picture}

Схема обработки документа LATEX.

.tex исходные файлы, содержащие текст и команды оформления.  
.aux ссылки  
.toc оглавление  
.lof список рисунков  
.lot список таблиц  
.idx термины алфавитного указателя  



Alex Otwagin 2002-12-16

next up previous contents index
Next: Единицы измерения Up: Краткое введение в LATEX Previous: Как TEX/LATEX работает   Contents   Index

Основы



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Быстрый старт Up: Основы Previous: Основы   Contents   Index

Единицы измерения

Аббревиатура Наименование Соотношение  

pt

пункт    
pc пика 1 pc = 12 pt  
in дюйм 1 in = 72.27 pt  
bp большой пункт 72 bp =1 in  
cm сантиметр 1 in = 2.54 cm  
mm миллиметр 10 mm = 1 cm  
dd пункт дидо 1157 dd = 1238 pt  
cc цицеро 1 cc = 12 dd  
sp масштабированный пункт 216 sp = 1 pt  
em ширина `M'    
ex высота `x'    



Alex Otwagin 2002-12-16

next up previous contents index
Next: Простые правила Up: Основы Previous: Единицы измерения   Contents   Index

Быстрый старт

Минимальный шаблон исходного файла (англ.)

\documentclass[a4paper, 12pt]{article}
\begin{document}
...
\end{document}

Подключаем русский

\documentclass[a4paper, 12pt]{article}
\usepackage[koi8-r]{inputenc}
\usepackage[russian]{babel}
\begin{document}

Здесь набираем текст.

\end{document}



Alex Otwagin 2002-12-16

next up previous contents index
Next: Простая обработка текста Up: Основы Previous: Быстрый старт   Contents   Index

Простые правила

Слова разделяются одним или несколькими пробелами. Абзацы разделяются одной или несколькими строками. Добавление лишних пробелов или строк во входном файле не влияет на результат.

Двойные кавычки печатаются как здесь: ``выделенный текст''. Простые кавычки печатаются как здесь: `выделенный текст'. Русские кавычки печатаются как здесь: «выделенный текст».

Длинное тире в предложениях печатается -- как здесь.

Курсив (italic) выглядит так: это курсив. Жирный шрифт (bold) выглядит так: это жирный шрифт.

Если вы получили слишком большой пробел после точки, не заканчивающей предложения -- сокращения типа и т. д. бывают причиной -- напечатайте после точки знак ` $ \backslash$' и пробел, как в этом предложении.

Запомните, нельзя печатать 10 специальных символов (таких как доллар или $ \backslash$) без учета их особого назначения! Семь из них печатаются с помощью знака ` $ \backslash$': $ & # % _ { и }.

Что либо еще игнорируется.

Неразрывный пробел печатается так: И.~О.~Фамилия. В русском языке в отличие от английского принято между инициалами и фамилией вставлять пробел.

Выше напечатанное было выполнено следующим образом:

%-------------------------------------------------------------------
Слова разделяются одним или    несколькими      пробелами. Абзацы
    разделяются одной или несколькими строками. Добавление лишних
пробелов или строк во входном файле не влияет на результат.


Двойные кавычки печатаются как здесь: ``выделенный текст''.
Простые кавычки печатаются как здесь: `выделенный текст'.
Русские кавычки печатаются как здесь: <<выделенный текст>>.

Длинное тире  в предложениях печатается --- как здесь.

Курсив (italic) выглядит так: {\it это курсив}.
Жирный шрифт (bold) выглядит так: {\bf это жирный шрифт}.

Если вы получили слишком большой пробел после точки, не заканчивающей
предложения --- сокращения типа и т.\ д.\ бывают причиной --- напечатайте
после точки знак `$\backslash$' и пробел, как в этом предложении.

Запомните, нельзя печатать 10 специальных символов (таких как доллар
или $\backslash$) без учета их особого назначения!  Семь из них печатаются с
помощью знака `$\backslash$':  \$  \&  \#  \%  \_  \{  и  \}.
Как получить остальные символы, вы прочитаете в руководстве.

Неразрывный пробел печатается так: \verb|И.~О.~Фамилия|.  В русском языке
в отличие от английского принято между инициалами и фамилией вставлять
пробел.

Все остальное игнорируется.

%-------------------------------------------------------------------



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды LATEX'а Up: Основы Previous: Простые правила   Contents   Index

Простая обработка текста

При наборе простого текста не возникает никаких проблем, его следует печатать, как обычно.

Следует отметить несколько правил.

LATEX оставляет несколько редко употребляемых символов на свои нужды. Десять символов

#  $  %  &  ~  _  ^  \  {  }
не могут быть напечатаны в вашем тексте, как обычные символы.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск команд в заданное Up: Командный процессор Previous: Подстановка вывода в качестве   Contents   Index

Выполнение, останов и повторный запуск процессов

В этом разделе описывается:



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Группы, Группы,и еще раз Up: Краткое введение в LATEX Previous: Простая обработка текста   Contents   Index

Команды LATEX'а

Начинаются символом $ \backslash$. Существует два типа команд: командные слова и командные символы.

Командное слово начинается знаком ` $ \backslash$' и состоит далее только из букв (например, $ \backslash$LaTeX).

Прописные и строчные буквы в командных словах LATEX'а имеют разное значение. $ \backslash$BEGIN не то же самое, что и $ \backslash$begin.

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

Мне нравится \LaTeX!           -  правильно
Я не читал \LaTeXbook.         -  ошибка

Все пробелы после командного слова исчезают.

\LaTeX один,   \LaTeX      два,   \LaTeX
три.

LATEXодин, LATEXдва, LATEX три.



Командные слова могут иметь параметры:

\abc[необязательныe параметры]{обязательные параметры}

Обычно, параметры заключается в фигурные скобки `{}' и/или в квадратные скобки `[]'.

Командный символ состоит из знака ` $ \backslash$' и одного символа, не являющегося буквой (например, $ \backslash$$). Поскольку пробел не является буквой, сочетание знака ` $ \backslash$' и пробела является законным командным символом.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Общая структура Up: Команды LATEX'а Previous: Команды LATEX'а   Contents   Index

$ \Bigl\{$Группы, $ \bigl\{$Группы,$ \{$и еще раз Группы $ \}\bigr\}\Bigr\}$

Концепция объединения текста в группы позволяет сильно упростить LATEX'овский входной файл. Каждая новая группа начинается левой фигурной скобкой `{' и заканчивается правой фигурной скобкой `}'. Изменения, сделанные внутри группы, теряют свою силу за пределами группы.

{
\hsize = 3in
будет создавать абзац шириной 3 дюйма ... \par
}

=3in будет создавать абзац шириной 3 дюйма, не смотря на параметры, установленные до начала группы. В этом абзаце действует данное значение параметра. После выхода из этой группы восстанавливаются старые значения параметров.


Скобки `{}', выделяющие параметр команды (например, команды \fbox), тоже образуют группу.

Нет ни одного \fbox{\bf комара} в поле зрения.

Нет ни одного \fbox{\bf комара} в поле зрения.


LATEX'овские командные скобки -- тоже группы.

Текст до скобок.
\begin{center}
\bf Текст внутри скобок.
\end{center}
Текст после скобок.

Текст до скобок.

Текст внутри скобок.
Текст после скобок.

Удобно использовать пустую группу: {}. Она может быть использована для того, чтобы TEX прекратил ``поедать'' последовательные пробелы после командного слова. Например, в предложении ``можно использовать $ \backslash$TeX{} '' пробел после ``TEX'' будет оставлен в конечном документе.

После командного слова \TeX{} удобно использовать
пустую группу.

После командного слова TEX удобно использовать пустую группу.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Десять специальных символов Up: Краткое введение в LATEX Previous: Группы, Группы,и еще раз   Contents   Index

Общая структура

В LATEX'е существует несколько команд, обязательных для каждого документа. Искомый текст в документе всегда должен начинаться с команды $ \backslash$begin{document} и заканчиваться командой $ \backslash$end{document}.

Все, что стоит до команды $ \backslash$begin{document}, называется преамбулой. Преамбула может содержать только LATEX'овские команды, описывающие или модифицирующие стиль документа.

Все, что следует после команды $ \backslash$end{document}, игнорируется.

Одна команда обязательно должна стоять в преамбуле: $ \backslash$documentstyle{article}. Эта команда определяет общий стиль документа.

Следующий пример показывает, как оформляется документ, который нужно напечатать в стиле article(статья) с двумя модификациями: выбран другой базовый размер символов (11pt) и некоторые размеры должны быть модифицированы для использования бумаги формата А4.

  ....                                    % Преамбула
  \documentstyle[a4paper, 11pt]{article}  % Преамбула
  ....                                    % Преамбула
  \begin{document}
  ....
       Искомый текст документа ...
  ....
  \end{document}
       Текст, который игнорируется \LaTeX'ом ...
  ....



Alex Otwagin 2002-12-16

next up previous contents index
Next: Акценты Up: Краткое введение в LATEX Previous: Общая структура   Contents   Index

Десять специальных символов

Существует 10 символов, таких как ` $ \backslash$', которые в LATEX'е имеют особое назначение. Вот их полный список:

Символы, требующие особого ввода

Символ Назначение Ввод
$ \backslash$ Признак команды $\backslash$
$ \{$ Начало группы \{
$ \}$ Конец группы \}
% Комментарий \%
& Табулятор \&
~ Неразрываемый пробел \~{}
$ Начало и конец математики \$
^ Верхний индекс \^{}
_ Нижний индекс \_{}
# Признак подстановки в макросах \#


Конец строки игнорируется  после знака ком%
ментария.

Конец строки игнорируется после знака комментария.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Точки, тире, кавычки, многоточия Up: Краткое введение в LATEX Previous: Десять специальных символов   Contents   Index

Акценты

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

Вот несколько примеров:

Ввод в LATEX LATEX
$ \backslash$`a la mode a la mode
$ \backslash$r´esum $ \backslash$`e resume
soup\c{c}on soupcon
No\"el Noel
na\"\i ve na{\uml {\i\/}}\kern.15emve

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

Существует также командное слово $ \backslash$i. Оно дает строчную букву i без точки над ней -- i; это позволяет поставить другой знак акцента над нижней частью этой буквы.

Аналогичное командное слово $ \backslash$j дает букву j без точки над ней -- j.

Акцентирование с помощью командных символов

Название Ввод в LATEX Результат
grave $ \backslash$`o o
acute $ \backslash$´o o
circumflex \^o o
umlaut/dieresis/tremat \"o o
tilde \~o o
macron \=o o
dot \.o o


Акцентирование с помощью очень коротких командных слов

Название Ввод в LATEX Результат

cedilla
\c{o} o
underdot \d{o} o
underbar \b{o} o
hacek \v{o} o
breve \u{o} o
tie \t{oo} oo
Hungarian umlaut \H{o} o

LATEX позволяет печатать некоторые символы из европейских алфавитов.

Иностранные символы

Пример Ввод в LATEX Результат
gean, sthetics \AE, \ae ,
\OEuvres, hors d'\oeuvre \OE, \oe \OE, \oe
ngstrom \AA, \aa ,
re, Kbenhavn \O, \o ,
\Lodz, \lodka \L, \l \L, \l
Nup1.6cm \ss p1.6cm
¿Si? ¿ ¿
¡Si! ¡ ¡
Senor \~ ~


next up previous contents index
Next: Точки, тире, кавычки, многоточия Up: Краткое введение в LATEX Previous: Десять специальных символов   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Шрифты Up: Краткое введение в LATEX Previous: Акценты   Contents   Index

Точки, тире, кавычки, многоточия

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

Различные типы тире

Название Ввод Результат Пример
hyphen - - 3-мерное пространство.
en-dash - - Читайте страницы 3-4.
em-dash -- -- Я видел их -- все были живы.
minus sign $-$ $ -$ Температура упала до $ -3^\circ$C.

Все остальное

Название Ввод Результат  
левые кавычки << «  
правые кавычки >> »  
левые кавычки ` `  
правые кавычки ´ '  
левые двойные кавычки `` ``  
правые двойные кавычки ´´ ''  
многоточие \ldots ...  
значимый пробел \sp  
междусловный пробел $ \backslash$    

Неразрываемый пробел ~ между двумя словами обозначает, что эти два слова должны быть напечатаны на одной строке. Желательно указывать в именах, например, таких как ``Д. Э. Кнут'', неразрываемый пробел: ``Д.~Э.~Кнут´´.


next up previous contents index
Next: Шрифты Up: Краткое введение в LATEX Previous: Акценты   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Шрифты: изменение размера Up: Краткое введение в LATEX Previous: Точки, тире, кавычки, многоточия   Contents   Index

Шрифты

Шрифт характеризуется определенным видом (семейством), размером (кеглем), начертанием и насыщенностью.

Гарнитурa шрифтов -- комплект типографских шрифтов различных размеров одного вида, но разной насыщенности и начертания. В настоящее время LATEX использует шрифты из гарнитуры Computer Modern.

Я начал шрифтом roman, \it перешел на
italic, \rm потом вернулся к шрифту roman.

Я начал шрифтом roman, {\it перешел на
italic}, потом вернулся к шрифту roman.

Я начал шрифтом roman, перешел на italic, потом вернулся к шрифту roman.

Я начал шрифтом roman, перешел на italic, потом вернулся к шрифту roman.

Образцы шрифтов

Название шрифта команда Образец печати
Прямой \rm roman
Жирный \bf boldface
Курсив \it italic
Наклонный \sl slanted
Без отточий \sf sans serifed
Строчные как \sc SMALL CAPS
$ \quad$прописные    
Равноширинный \tt typewriter
Каллиграфический \cal $ \cal S\cal C\cal R\cal I
\cal P\cal T$.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Форматирование текста Up: Шрифты Previous: Шрифты   Contents   Index

Шрифты: изменение размера

Образцы размеров

Команда Образец
\tiny Sample text.
\scriptsize Sample text.
\footnotesize Sample text.
\small Sample text.
\normalsize Sample text.
\large Sample text.
\Large Sample text.
\huge Sample text.
\Huge Sample text.

Команды, устанавливающие размер шрифта, включают прямой (roman) шрифт, безотносительно к предыдущим установкам.

Вы видите, что {\Huge\bf large bold текст} не то же
самое, что {\bf\Huge bold large текст}.


Вы видите, что large bold текст не то же самое, что bold large текст.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Центрирование и сдвиг текста Up: Краткое введение в LATEX Previous: Шрифты: изменение размера   Contents   Index

Форматирование текста



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перечисления Up: Краткое введение в LATEX Previous: Форматирование текста   Contents   Index

Центрирование и сдвиг текста

Для того, чтобы напечатать текст в центре страницы, необходимо поместить его в командные скобки center. Сдвиг текста к левому или правому полю производится командными скобками flushleft и flushright. Обратите внимание на написание слова center - LATEX не понимает английское написание этого слова ``centre''.

Текст внутри этих командных скобок будет форматироваться обычным способом. Как и всегда, концы строк будут рассматриваться, как пробелы. Чтобы указать начало новой строки, вам нужно напечатать команду \\.

Текст до командных скобок.
\begin{flushleft}
   Этот текст \\
    слева.
\end{flushleft}
Текст после командных скобок.


Текст до командных скобок.

Этот текст
слева.
Текст после командных скобок.



Текст до командных скобок.
\begin{flushright}
 Этот текст \\
 справа.
\end{flushright}
Текст после командных скобок.


Текст до командных скобок.

Этот текст
справа.
Текст после командных скобок.



Текст до командных скобок.
\begin{center}
Этот \\ текст \\ в \\ центре
\end{center}
Текст после командных скобок.


Текст до командных скобок.

Этот
текст
в
центре
Текст после командных скобок.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Консоль. Переключение между графическими Up: Введение в ОС Linux Previous: Введение   Contents   Index

Загрузка ОС Linux

Установленный при инсталляции загрузчик запускает ОС Linux. В ходе загрузки системы создаются несколько консолей - виртуальных устройств ввода-вывода, которыми могут пользоваться различные компоненты и пользовательские программы системы. В одной из консолей может автоматически запускаться графическая среда X Window System.

При запуске консоли появляется приглашение для входа в систему. Введите в поле Login: регистрационное имя обычного пользователя. Если по каким-либо причинам при установке системы не было создано ни одной регистрационной записи обычного пользователя, введите имя суперпользователя root, а в дальнейшем создайте хотя бы одну регистрационную запись обычного пользователя.

Чтобы получить регистрационное имя, обратитесь к администратору системы(root). Существует несколько правил выбора регистрационного имени. Обычно длина имени составляет от 3 до 8 символов. Оно может состоять из больших или маленьких букв, цифр, символа подчеркивания, но не может начинаться с цифры.

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

        startship
        dmitry100
        very_long_user_name

Суперпользователь (root) может удалять, перемещать, переименовывать или изменять существенно важные параметры любых файлов системы, поэтому ошибки, совершенные начинающим пользователем при работе под этим именем, могут привести систему в некорректное состояние. Никогда, кроме исключительных случаев, оговоренных в настоящем Руководстве, не работайте под именем суперпользователя (root)!

После ввода имени пользователя система выполняет аутентификацию, для чего требует ввести пароль, соответствующий данному имени пользователя. При этом название поля изменится: вместе с Login: появится Password:. Введите в это поле пароль пользователя (вводимые символы пароля не отображаются, а заменяются звездочками).

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Получить состояние запущенного процесса Up: Выполнение, останов и повторный Previous: Выполнение, останов и повторный   Contents   Index

Запуск команд в заданное время

Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).

Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:

      batch
      первая команда
      . . .
      последняя команда
      <^d>
Если запускается только одна команда, то ее можно ввести в одной командной строке:
        batch command_line

В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем каталоге и перенаправляет вывод в файл dol.file.

      $ batch
      grep dollar * > dol.file
      <^d>
      job 155223141.b at Sun Dec 11:14:54 1989
      $

После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.

Команда at позволяет вам указывать точное время выполнения команд. Общий формат команды at:

      at time
      первая команда
      . .  .
      последняя команда
      <^d>
Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.

В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:

      $
      at 8:15am Feb 27
      banner happy birthday | mail emily
      <^d>
      $

Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.

Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:

       at -r jobnumber
Если вы забыли номер задания, то команда at -l распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:
      $ at -l
      CW user mylogin 168302040.a at Sat Nov 25 13:00:00 1989
      user mylogin 453400603.a at Fri Feb 24 08:15:00 1989
      $

Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания "am" и "pm", чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Дословная передача Up: Центрирование и сдвиг текста Previous: Центрирование и сдвиг текста   Contents   Index

Перечисления

Перечисления оформляются с помощью командных скобок трех типов. Каждый новый пункт перечисления любого типа начинается командой $ \backslash$item. Простое перечисление (командные скобки itemize) начинает каждый пункт определенным маркером. Упорядоченное перечисление (командные скобки enumerate) нумерует каждый пункт. Эти командные скобки могут быть вложены одни в другие, причем размер втяжки изменяется надлежащим образом.

\begin{itemize}
\item Перечисление по пунктам очень удобно.
\item Однако не забудьте все команды, особенно
      следующие.
  \begin{enumerate}
  \item Команду `item'.
  \item Команду `end'.
  \end{enumerate}
\end{itemize}




Запомните.
\begin{enumerate}
\item С помощью {\bf enumerate} элементы нумеруются
      цифрами.
\item Нумерация происходит автоматически.
\item Необходимо знать следующее.
  \begin{enumerate}
  \item Максимальная глубина
        вложения равна  4.
  \item Втяжка и способ нумерации выбирается
        автоматически.
  \end{enumerate}
\item И т.\ д.
\end{enumerate}


Запомните.

  1. С помощью enumerate элементы нумеруются цифрами.
  2. Нумерация происходит автоматически.
  3. Необходимо знать следующее.
    1. Максимальная глубина вложения равна 4.
    2. Втяжка и способ нумерации выбирается автоматически.
  4. И т. д.

Третий вид перечисления -- описание (командные скобки description). Данный вид перечисления позволяет выделить ключевое слово в начале каждого пункта. Ключевое слово помещается в квадратные скобки после команды $ \backslash$item.

Вы должны знать трех животных:
\begin{description}
  \item[Комар] Маленькое ``животное''...
  \item[Антилопа] Большое животное...
  \item[Броненосец] ...
\end{description}


Вы должны знать трех животных:

Комар
маленькое ``животное'', доставляющее бесконечные неприятности.
Антилопа
большое животное, доставляющее бесконечные неприятности.
Броненосец
животное средних размеров.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Плавающие элементы текста Up: Краткое введение в LATEX Previous: Перечисления   Contents   Index

Дословная передача

Если вам понадобилось включить в документ текст таким образом, чтобы он выглядел точно так, как на экране терминала, вы, конечно, захотите использовать все символы вашей клавиатуры, игнорируя LATEX. Такой эффект дают командные скобки verbatim.

Вопрос возникает в части программы:

\begin{verbatim}
{ this finds %a & %b }

for i := 1 to 27 do
   begin
   table[i] := fn(i);
   process(i)
   end;
\end{verbatim}


Вопрос возникает в части программы:

{ this finds %a & %b }

for i := 1 to 27 do
   begin
   table[i] := fn(i);
   process(i)
   end;


Действие команды $ \backslash$verb аналогично действию командных скобок verbatim, но команда $ \backslash$verb применяется к тексту внутри строк.

Каково толкование символов:
\verb|~!@#$%^&*()_+{}\|  ?!


Каково толкование символов: ~!@#$%^&*()_+{}\ ?!



Alex Otwagin 2002-12-16

next up previous contents index
Next: Рисунки Up: Краткое введение в LATEX Previous: Дословная передача   Contents   Index

Плавающие элементы текста

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

Существует два типа командных скобок, которые обозначают данный элемент, как плавающий: figure и table. LATEX не заботится о том, что именно вы помещаете в эти скобки.

\begin{figure}[htbp]
\vspace{2cm}
\caption{Это рисунок}
\end{figure}


Figure: Это рисунок
\begin{figure}
\vspace{2cm}
\end{figure}


Необязательный параметр [htbp] служит для указания желаемой позиции данного элемента в тексте.

h
Здесь (here): позиция в тексте, где появились командные скобки.
t
Вверху (top): в начале следующей страницы.
b
Внизу (bottom): в конце следующей страницы.
p
Страница (page): на отдельной странице, содержащей только рисунки и таблицы.


Еще один вид плавающего текста - замечания на полях.

Это замечание помещается на полях,
\marginpar{\normalsize\it  Это замечание на полях.}
его первая строка уравнивается со строкой текста,
содержащей команду.


Это замечание помещается на полях, его первая строка уравнивается со строкой текста, содержащей команду.

Для создания сносок используется команда $ \backslash$footnote{...}.

Это текст внутри абзаца.
Это\footnote{первая сноска} текст
внутри абзаца.
Это текст\footnote{вторая сноска}
внутри абзаца.


Это текст внутри абзаца. Это8.1 текст внутри абзаца. Это текст8.2 внутри абзаца.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды, выполняющие рубрикацию Up: Краткое введение в LATEX Previous: Плавающие элементы текста   Contents   Index

Рисунки

Простая графика вставляется средствами LATEX, который имеет несколько команд рисования, впрочем, весьма ограниченных. Рисунок на стр. [*] выполнен именно такими командами.

Пример простого рисунка:

\setlength{\unitlength}{1mm}\thicklines
\begin{picture}(130,70)
\put(0,0){\dashbox(130,10){{\large\bf Любовный треугольник}}}
\multiput(0,15)(5,0){27}{\circle*{1}}
\multiput(0,70)(5,0){27}{\circle*{1}}
\multiput(0,15)(0,5){11}{\circle*{1}}
\multiput(130,15)(0,5){11}{\circle*{1}}
\put(65,25){\oval(60,10)}
\put(65,20){\makebox(0,10){{\normalsize\bf семь гномов}}}
\put(35,35){\line(1,0){60}}
\put(35,35){\line(1,1){30}}
\put(95,35){\line(-1,1){30}}
\put(65,47){\circle{15}}\put(65,42){\vector(0,1){10}}
\put(5,55){\framebox(40,10){{\normalsize\bf Белоснежка}}}
\put(85,55){\framebox(40,10){{\normalsize\bf мачеха}}}
\end{picture}



\begin{picture}(130,70)
\put(0,0){\dashbox(130,10){{\large\bf Любовный треуголь...
...ежка }}}
\put(85,55){\framebox (40,10){{\normalsize\bf мачеха }}}
\end{picture}



Alex Otwagin 2002-12-16

next up previous contents index
Next: Образец документа версия 0.01 Up: Краткое введение в LATEX Previous: Рисунки   Contents   Index

Команды, выполняющие рубрикацию

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

Таким образом, вы можете использовать следующие команды:

\part              (часть)
\chapter           (глава)
\section           (раздел)
\subsection        (подраздел)
\subsubsection     (подраздел второго уровня)

Обычно эти команды используются следующим образом:

\section[короткий-заголовок]{Заголовок}

Включение в ваш документ команды $ \backslash$tableofcontents позволит поместить в документ его оглавление. Вся информация, необходимая для создания списка оглавления, записывается в рабочий файл. Это означает, что документ пропускается через LATEX дважды, чтобы получить правильное оглавление.

Команды $ \backslash$listoffigures и $ \backslash$listoftables создают список рисунков и список таблиц, соответственно. Они работают так же, как команда $ \backslash$tableofcontents, за исключением того, что LATEX при этом использует другие рабочие файлы.

Данные команды могут быть введены со звездочками

\section*{Заголовок}

В этом случае пункты рубрикации в оглавление не попадают. Принудительное помещение их в оглавление выполняется командой \addcontentsline.

\tableofcontents

\chapter*{ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ}
\addcontentsline{toc}{chapter}{ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ}

... текст перечня ...

\chapter*{ВВЕДЕНИЕ}
\addcontentsline{toc}{chapter}{ВВЕДЕНИЕ}

... текст введения ...

\chapter*{ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ}
\addcontentsline{toc}{chapter}{ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ}

...



Alex Otwagin 2002-12-16

next up previous contents index
Next: Перекрестные ссылки Up: Краткое введение в LATEX Previous: Команды, выполняющие рубрикацию   Contents   Index

Титульный лист

\title{Образец документа\\версия 0.01}
\author{Первый автор\and Второй автор}
\date{\today}
...
\maketitle                 % Создает титульный лист


title

.75em
author

date

thanks



Alex Otwagin 2002-12-16

next up previous contents index
Next: Предыдущие результаты Up: Краткое введение в LATEX Previous: Образец документа версия 0.01   Contents   Index

Перекрестные ссылки

Нумерация таких элементов, как рисунки и уравнения, производится хотя бы для того, чтобы читатель мог понять ссылку на них, например: ``Смотри рисунок 3 для большей информативности.'' Команда $ \backslash$label{ID} присваивает метке ID номер текущей рубрики или номер ``пронумерованных'' командных скобок.

Уравнение~\ref{eq:euler} из раздела~\ref{sec-early}
--- знаменитый результат Эйлера.
Но не из раздела~\ref{sec-Early} ...
\subsection{Предыдущие результаты}
\label{sec-early}
Уравнение Эйлера
\begin{equation}
e^{i\pi} + 1 = 0   \label{eq:euler}
\end{equation}
объединяет ...


Уравнение [*] из раздела [*] -- знаменитый результат Эйлера. Но не из раздела [*] ...


Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Библиография Up: Перекрестные ссылки Previous: Перекрестные ссылки   Contents   Index


Предыдущие результаты

Уравнение Эйлера

$\displaystyle e^{i\pi} + 1 = 0$ (8.1)

объединяет пять наиболее важных в математике чисел в одном уравнении.

Команда $ \backslash$pageref аналогична команде $ \backslash$ref, но дает номера страниц.

Смотри страницу~\pageref{meaning} для большей
информативности.
....
Значение жизни \label{meaning} ...


Смотри страницу [*] для большей информативности. ....
Значение жизни ...



Alex Otwagin 2002-12-16

next up previous contents index
Next: Bibliography Up: Краткое введение в LATEX Previous: Предыдущие результаты   Contents   Index

Библиография

Чтобы освоить систему в совершенстве,
прочитайте книги:
\cite{knuth-84} и \cite{lamport-86}.

\begin{thebibliography}{99}
\bibitem{knuth-84}
Donald~E.~Knuth: {\it The \TeX book.} Addison-Wesley,
Reading, Massachusetts, 1984.
\bibitem{lamport-86}
Lesley~Lamport: {\it \LaTeX: A Document Preparation
System} Addison-Wesley, Reading, Massachusetts, 1986.
\end{thebibliography}


Чтобы освоить систему в совершенстве, прочитайте книги: [1] и [2].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Bibliography Up: base Previous: Библиография   Contents   Index

Bibliography

1
Donald E. Knuth: The TEXbook. Addison-Wesley, Reading, Massachusetts, 1984.

2
Lesley Lamport: LATEX: A Document Preparation System Addison-Wesley, Reading, Massachusetts, 1986.



Чтобы освоить систему в совершенстве,
прочитайте книги:
\cite{xknuth-84} и \cite{xlamport-86}.

\begin{thebibliography}{99}
\bibitem[Knuth84]{xknuth-84}
Donald~E.~Knuth: {\it The \TeX{}book.} Addison-Wesley,
Reading, Massachusetts, 1984.
\bibitem[Lamport86]{xlamport-86}
Lesley~Lamport: {\it \LaTeX: A Document Preparation
System} Addison-Wesley, Reading, Massachusetts, 1986.

\end{thebibliography}


Чтобы освоить систему в совершенстве, прочитайте книги: [Knuth84] и [Lamport86].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Завершение активных процессов Up: Выполнение, останов и повторный Previous: Запуск команд в заданное   Contents   Index

Получить состояние запущенного процесса

Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.

В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система Linux назначает каждому активному процессу.

В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):

     $ grep word * > temp
     28223
     $
     $ ps
        PID         TTY       TIME       COMD
        28124       tty10     0:00       bash
        28223       tty10     0:04       grep
        28224       tty10     0:04       ps
     $

Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды bash, которая была запущена во время вашей регистрации.

Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете:

       jobs
то на экране появится следующая информация:
   [JID] - Stopped (signal) <имя задания>
или
   [JID] + Running      <имя задания>



Alex Otwagin 2002-12-16

next up previous contents index
Next: Предметный указатель Up: base Previous: Bibliography   Contents   Index

Bibliography

Knuth84
Donald E. Knuth: The TEXbook. Addison-Wesley, Reading, Massachusetts, 1984.

Lamport86
Lesley Lamport: LATEX: A Document Preparation System Addison-Wesley, Reading, Massachusetts, 1986.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Index Up: Bibliography Previous: Bibliography   Contents   Index

Предметный указатель

  1. Поставьте команду $ \backslash$makeindex в преамбулу.
  2. Команда $ \backslash$index{gnu} запишет в файле .idx строку:
    \indexentry{gnu}{42}
    
  3. Программой MAKEINDEX обработайте файл .idx. Отсортированный результат в файле .ind будет выглядеть примерно так:
    \begin{theindex}
    \item gnats 13, 97
    \item gnus 24, 37, 233
      \subitem bad, 39, 236
          \subsubitem very, 235
    \indexspace
    \item harmadillo, 99, 144
    \end{theindex}
    
  4. Вставьте файл .ind в ваш текст.

Предментный указатель выглядит примерно так:



Alex Otwagin 2002-12-16

next up previous contents
Next: Математика в LATEX'e Up: base Previous: Предметный указатель   Contents


Index



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Верхние и нижние индексы Up: Index Previous: Index   Contents   Index

Математика в LATEX'e

Существует два варианта расположения математических формул в обычном тексте: внутри строки (in-line), когда математический текст является частью текстовой строки, и в явном виде (display), когда математический текст печатается в красную строку. Иногда одни и те же математические формулы выглядят по-разному в этих двух случаях.

Легко заметить, что уравнение в строке $ \sum_{k=1}^{\infty} {1\over k^2} = {\pi^2\over6}$ отличается от того же самого уравнения, напечатанного в красную строку:

$\displaystyle \sum_{k=1}^{\infty} {1\over k^2} = {\pi^2\over6}.$

in-line
$ ... $ или \(...\) или
\begin{math}...\end{math}.
display
$$ ... $$ или \[...\] или
\begin{displaymath}...\end{displaymath} или
\begin{equation}...\end{equation}

Командные скобки \begin{equation}...\end{equation} дают расположение математического текста в красную строку, кроме того, автоматически производят нумерацию формул (если не указано иначе, то номер формулы помещается справа).



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Математические формулы Up: Математика в LATEX'e Previous: Математика в LATEX'e   Contents   Index

Верхние и нижние индексы

Символы _ и ^ обозначают, что следующий за ними символ является соответственно верхним или нижним индексом.

$x^{2y}$ $ x^{2y}$
$x_{2y}$ $ x_{2y}$
$x^y_1$ $ x^y_1$
$x_y^1$ $ x_y^1$
$x_y_1$ ошибка
$x_{y_1}$ $ x_{y_1}$
${x_y}_1$ $ {x_y}_1$
$x^y^1$ ошибка
$x^{y^2}$ $ x^{y^2}$
${x^y}^2$ $ {x^y}^2$
x$^2$ x$ ^2$



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пробелы в математических формулах Up: Математика в LATEX'e Previous: Верхние и нижние индексы   Contents   Index

Математические формулы

Корни:

\sqrt{x^2+\sqrt[3]{y}}

$\displaystyle \sqrt{x^2+\sqrt[3]{y}}
$

Дроби:

\frac{1}{\frac{x^2+y^2+z^2}{x+y}}

$\displaystyle \frac{1}{\frac{x^2+y^2+z^2}{x+y}}
$

Биноминальные коэффициенты:

{n\choose {n-k}}

$\displaystyle {n\choose {n-k}}
$

Интегралы:

\int \limits_{-\infty}^{\infty}x^3

$\displaystyle \int \limits_{-\infty}^{\infty}x^3
$

\int_{-\infty}^{\infty}x^3

$\displaystyle \int_{-\infty}^{\infty}x^3
$

Суммы:

\sum_{i=1}^{n}a_i

$\displaystyle \sum_{i=1}^{n}a_i
$

\sum\nolimits_{i=1}^{n}a_i

$\displaystyle \sum\nolimits_{i=1}^{n}a_i
$



Alex Otwagin 2002-12-16

next up previous contents index
Next: Много новых символов Up: Математика в LATEX'e Previous: Математические формулы   Contents   Index

Пробелы в математических формулах

В математических текстах, как в тех, которые располагаются в текстовой строке, так и в тех, которые печатаются в красную строку, межсимвольные пробелы устанавливаются только LATEX'ом. Добавление лишних пробелов во входном файле никак не влияет на расположение символов в математических формулах.

Для того, чтобы простой текст внутри математической формулы выглядел нормально, необходимо использовать команду $ \backslash$mbox{$ \ldots$}, например:

$x=y+1 \mbox{ при всех } y=x-1$

$x=y+1        при всех   y=x-1$


$ x=y+1$    при всех $ y=x-1$

$ x=y+1 при всех y=x-1$.


Обратите внимание на пробелы с обеих сторон слова внутри скобок. Обычно нет необходимости вставлять пробелы в математический текст.

Название Команда $ \gets$Размер$ \to$

Двойной матем. пробел
$ \backslash$qquad



Alex Otwagin 2002-12-16

next up previous contents index
Next: Печать в Linux Up: Математика в LATEX'e Previous: Пробелы в математических формулах   Contents   Index

Много новых символов

В следующих таблицах вы найдете все символы, известные обычно в математическом режиме.

Акценты математического режима

^a a
`a .a
¯a a

Строчные греческие буквы


\begin{symbols}{*4{cl}}
\X{\alpha} & \X{\theta} & \X{o} & \X{\upsilon} \\
\...
...& \X{\nu} & \X{\varsigma} & & \\
\X{\eta} & \X{\xi} & \X{\tau}
\end{symbols}

Прописные греческие буквы


\begin{symbols}{*4{cl}}
\X{\Gamma} & \X{\Lambda} & \X{\Sigma} & \X{\Psi} \\
...
...& \X{\Upsilon} & \X{\Omega} \\
\X{\Theta} & \X{\Pi} & \X{\Phi}
\end{symbols}

Бинарные отношения

Вы можете получить соответствующие отрицания добавлением перед следующими символами команды \not.


\begin{symbols}{*3{cl}}
\X{<} & \X{>} & \X{=} \\
\X{\leq}или \verb\vert\le\...
...\asymp} \\
\X{:} & \X{\notin} & \X{\neq}или \verb\vert\ne\vert
\end{symbols}
$ ^1$Для доступа к этому символу пользуйтесь пакетом latexsym.

Бинарные операторы


\begin{symbols}{*3{cl}}
\X{+} & \X{-} & & \\
\X{\pm} & \X{\mp} & \X{\triang...
... & \X{\ddagger} \\
\X{\unlhd}$^1$ & \X{\unrhd}$^1$ & \X{\wr}
\end{symbols}

Большие операторы


\begin{symbols}{*4{cl}}
\X{\sum} & \X{\bigcup} & \X{\bigvee} & \X{\bigoplus}\\...
...& & & \X{\bigodot} \\
\X{\int} & \X{\oint} & & & \X{\biguplus}
\end{symbols}

Стрелки


\begin{symbols}{*3{cl}}
\X{\leftarrow}или \verb\vert\gets\vert& \X{\longleftar...
...tleftharpoons} & \X{\iff}(б\'ольший пробел)& \X{\leadsto}$^1$
\par
\end{symbols}
$ ^1$Для доступа к этому символу пользуйтесь пакетом latexsym.

Ограничители


\begin{symbols}{*4{cl}}
\X{(} & \X{)} & \X{\uparrow} & \X{\Uparrow} \\
\X{[...
...& \X{\rceil} \\
\X{/} & \X{\backslash} & &% (dual. empty)
\par
\end{symbols}

Большие ограничители


\begin{symbols}{*4{cl}}
\Y{\lgroup} & \Y{\rgroup} & \Y{\lmoustache} & \Y{\rmoustache} \\
\Y{\arrowvert} & \Y{\Arrowvert} & \Y{\bracevert}
\end{symbols}

Прочие символы


\begin{symbols}{*4{cl}}
\X{\dots} & \X{\cdots} & \X{\vdots} & \X{\ddots} \\
...
... \verb\vert\lnot\vert & \X{\flat} & \X{\natural} & \X{\sharp}
\par
\end{symbols}
$ ^1$Для доступа к этому символу пользуйтесь пакетом latexsym.

Не-математические символы


Эти символы можно использовать и в текстовом режиме.
\begin{symbols}{*3{cl}}
\SC{\dag } & \SC{\S} & \SC{\copyright} \\
\SC{\ddag } & \SC{\P} & \SC{\pounds} \\
\end{symbols}

Ограничители AMS



\begin{symbols}{*4{cl}}
\X{\ulcorner}&\X{\urcorner}&\X{\llcorner}&\X{\lrcorner}
\end{symbols}

Буквы греческого и иврита AMS


\begin{symbols}{*5{cl}}
\X{\digamma} &\X{\varkappa} & \X{\beth}& \X{\daleth} &\X{\gimel}
\end{symbols}

Бинарные отношения AMS


\begin{symbols}
% latex2html id marker 13950
{*3{cl}}
\X{\lessdot} & \X{\gtrdo...
...{\trianglelefteq} & \X{\trianglerighteq} &\X{\blacktriangleright}
\end{symbols}

Стрелки AMS


\begin{symbols}{*3{cl}}
\X{\dashleftarrow} & \X{\dashrightarrow} & \X{\multima...
...right} & & \\
\X{\circlearrowleft} & \X{\circlearrowright} & &
\end{symbols}

Отрицательные бинарные отношения и стрелки AMS


\begin{symbols}{*3{cl}}
\X{\nless} & \X{\ngtr} & \X{\varsubsetneqq} \\
\X{\...
...
\X{\nLeftarrow} & \X{\nRightarrow} & \X{\nLeftrightarrow}
\par
\end{symbols}

Бинарные операторы AMS


\begin{symbols}{*3{cl}}
\X{\dotplus} & \X{\centerdot} & \X{\intercal} \\
\X...
...hreetimes}& \X{\circledast} \\
\X{\curlyvee} & \X{\curlywedge}
\end{symbols}

Прочие символы AMS


\begin{symbols}{*3{cl}}
\X{\hbar} & \X{\hslash} & \X{\Bbbk} \\
\X{\square} ...
...\nexists} & \X{\Finv} & \X{\varnothing} \\
\X{\eth} & \X{\mho}
\end{symbols}

Математические алфавиты


\begin{symbols}{@{}*3l@{}}
Пример & Команда & Требуемый пакет\\
\hline
\rule...
...bb{ABC}\vert
&\verb\vert amsfonts\vert или \textsf{amssymb} \\
\end{symbols}


next up previous contents index
Next: Печать в Linux Up: Математика в LATEX'e Previous: Пробелы в математических формулах   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Печать в Linux Up: base Previous: Много новых символов   Contents   Index

Печать в Linux



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Простейший способ печати Up: Печать в Linux Previous: Печать в Linux   Contents   Index

Печать в Linux



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск остановленного задания Up: Выполнение, останов и повторный Previous: Получить состояние запущенного процесса   Contents   Index

Завершение активных процессов

Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:

    kill PID
или
    stop JID
Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.
    $ kill 28223<CR>
    28223 Terminated
    $
После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:
    kill:28223:No such process
Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите ^Z. На экране появится следующее сообщение:
    <JID> Stopped(user)  <имя задания>



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пакет PDQ Up: Печать в Linux Previous: Печать в Linux   Contents   Index

Простейший способ печати

Наиболее простой путь для печати в операционной системе Linux - это посыл файла для печати прямо на устройство печати. Для того чтобы сделать это используется команда cat. Как пользователь root, наберите что-то подобное этому
# cat thesis.txt > /dev/lp
В этом случае, /dev/lp это символическая ссылка на устройство печати - это может быть матричный или лазерный принтер, typesetter, или плоттер.

До недавнего времени выбор для пользователей Linux был очень прост - каждый запускал тот же самый старый lpd, который был почти дословно перенесен из кода BSD Net-2. Даже сегодня в большинство дистрибутивов входит это программное обеспечение. Но ситуация начинает меняться. Системы подобные SVR4, включая Sun Solaris, идут с полностью отличающимся пакетом печати, сконцентрированным вокруг lpsched.

Рассмотрим несколько наиболее распространенных пакетов печати под Linux.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Пакет LPRng Up: Печать в Linux Previous: Простейший способ печати   Contents   Index

Пакет PDQ

PDQ - это система печати без центрального демона, которая имеет встроенный, разумный синтаксис настройки драйвера. Она включает возможность объявления настроек печати, а также графическую и командно-строковые утилиты для того, чтобы пользователи могли использовать эти настройки; пользователям предоставляется великолепное диалоговое окно, в котором указывается плотность печати, тип бумаги, и т.п.

Запуск всех этих фильтров пользователем имеет несколько преимуществ: нет большинства проблем безопасности при использовании Postscript, большинство заданий формата LaTeX могут печататься очень эффективно в виде dvi-файлов и т.п.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Система PPR Up: Печать в Linux Previous: Пакет PDQ   Contents   Index

Пакет LPRng

Если у вас много пользователей, много принтеров или какая-нибудь сложная система, то вам рекомендуется использовать PDQ как надстройку над сетевой печатью на базе протокола LPD (вы можете печатать через протокол на локальную машину). Во многих таких ситуациях вместо использования BSD lpd как базы рекомендуется использовать LPRng.

LPRng более легка для администрирования больших организаций и менее страшна , чем lpd. Она даже претендует на то, что система является безопасной - нет исполняемых файлов с битом SUID, и она поддерживает аутентификацию через PGP или Kerberos.

LPRng также включает некоторые примеры настроек для типовых сетевых принтеров - в основном HP LaserJets, которые имеют некоторые возможности учета ресурсов. Если вы хотите получить больше информации о LPRng, то посмотрите страницу LPRng.

LPRng распространяется либо под GPL либо под Artistic license.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Система CUPS Up: Печать в Linux Previous: Пакет LPRng   Contents   Index

Система PPR

PPR - это система буферизации печати, ориентированная на Postscript, которая включает возможность разбора Postscript (еще в зачаточном состоянии) из-за чего она имеет несколько хороших возможностей. Она включает в себя хорошие возможности учета, поддержку клиентов Appletalk, SMB и LPD, и более лучшую обработку чем lpd обработку ошибок. PPR, как и другие перечисленные системы буферизации, может вызывать Ghostscript для работы с принтерами не понимающими Postscript.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование LPD Up: Печать в Linux Previous: Система PPR   Contents   Index

Система CUPS

Одним из интересных новичков на сцене является "CUPS", реализация протокола печати Internet, определенный в RFC сходный с HTTP протокол заменяющий древний протокол lpd. Основная часть реализации этого пакета является продуктом с открытым исходным кодом от коммерческого продукта "Easy Print", который состоит из системы буферизации и набора коммерческих драйверов печати, созданных на основе Ghostscript (ESP Print Pro).

CUPS, сама система буферизации распространяется под действием лицензии GPL. ESP Print Pro распространяется только в двоичном виде как коммерческий продукт (за исключением системы буферизации, которая также доступна под действием GPL и называется CUPS).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Настройка LPD Up: Печать в Linux Previous: Система CUPS   Contents   Index

Использование LPD

Lpd обозначает Line Printer Daemon (демон линейной печати), и ссылается в разных контекстах и на программу-демона и на весь набор программ которые работают с системой печати. Это:

Теперь о том, как это работает вместе? Когда система загружается, стартует процесс под названием lpd. Он сканирует файл /etc/printcap чтобы узнать какие принтера он будет обслуживать. Каждый раз при запуске lpr, lpr контактирует с lpd через именованный сокет /dev/printer, и передает lpd и файл для печати и некоторую информацию о том кто печатает и как печатать файл. Затем lpd печатает файл на соответствующем принтере в порядке очереди.

Система lp была спроектирована когда большинство принтеров было линейными принтерами - так что люди в большинстве печатали чистый ascii. Как показало время, только небольшое добавление было необходимо чтобы заставить lpd работать с заданиями сегодняшнего дня, которые часто идут в формате PostScript, или текст, или dvi, или...



Alex Otwagin 2002-12-16

next up previous contents index
Next: Традиционная настройка lpd Up: Печать в Linux Previous: Использование LPD   Contents   Index

Настройка LPD



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Учет ресурсов Up: Настройка LPD Previous: Настройка LPD   Contents   Index

Традиционная настройка lpd

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

Для добавления очереди печати к lpd, вы должны добавить запись в файл /etc/printcap, и создать новую буферную директорию в каталоге/var/spool/lpd.

Запись в файле /etc/printcap выглядит примерно так:

# ЛОКАЛЬНЫЙ djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:
Это определяет принтер, с именами lp, dj, или deskjet, его спул размещается в директории /var/spool/lpd/dj, без ограничения максимального размера задания, который печатает на устройство /dev/lp0, и который не имеет страницу с заголовком (с именем человека, который печатает и т.п. информацией) добавленную в начало задания печати.

Вышеприведенный пример выглядит очень простым, но он имеет ловушку - хотя вы посылаете файлы, которые DeskJet 500 может понимать, этот DeskJet будет печатать странные вещи. Например посыл обычного текстового файла Unix приведет к тому, что deskjet будет интерпретировать символы новой строки как символы, и выдаст:

This is line one.
                 This is line two.
                                  This is line three.

Печать файла PostScript на этот принтер выдаст великолепный листинг команд PostScript, напечатанных с этим "лестничным эффектом", а не полезный вывод.

Очевидно требуется что-то сделать, и это является назначением фильтрации. Более наблюдательные из тех кто читал справочную страницу printcap должны были заметить атрибуты принтера if и of. if, или входной фильтр - это все что нам нужно, чтобы заставить принтер печатать то, что нам нужно.

Если мы напишем маленький скрипт, названный filter, который добавляет возврат каретки до символа новой строки, то лестничный эффект будет ликвидирован. Так что мы добавим строку if в нашу, вышеприведенную запись в printcap:

lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:

Простой скрипт может выглядеть так:

#!perl
# Предыдущая строка должна содержать полный путь к perl
# Скрипт должен быть исполнимым: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# Вы можете также добавить в конец прогон страницы: print "\f";

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

Проблема в том, что печать простого текста не является злободневной. Чаще всего нам нужна печать PostScript и других типов форматированого и графического вывода. Впрочем это легко сделать. Метод является просто расширением вышеприведенного фильтра для исправления перевода строки. Если вы напишите фильтр, который может воспринимать произвольные типы файлов как ввод и производить вывод для DeskJet для каждого случая, тогда мы безусловно получим "умный" спулер принтера.

Такой фильтр называется magic-фильтр. Не утруждайте себя написанием фильтра, до тех пор, пока они не будут печатать странные вещи - в сети уже существует много хорошо написанных фильтров.

Есть правда ловушка для таких фильтров: некоторые старые версии lpd не запускают фильтр if для удаленных принтеров, а некоторые запускают. Версии lpd используемые в современных дистрибутивах Linux и FreeBSD запускают указанный фильтр; большинство коммерческих юниксов до сих пор поставляются с lpd, которые не запускают фильтр для удаленных принтеров.

Возможно ваш дистрибутив Linux имеет утилиту для настройки принтера, которая сделает всю настройку очень простой. И в самом деле, во всех основных дистрибутивах существуют утилиты для настройки принтера. А если вы используете оконный менеджер - то вполне вероятно, что в нем имеется графическая утилита для

настройки (например в KDE). А разработчики CUPS пошли еще дальше - в качестве менеджера они предоставляют пользователю WEB-интерфейс, что дает возможность конфигурировать устройство печати как угодно и откуда угодно.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Большие системы Up: Настройка LPD Previous: Традиционная настройка lpd   Contents   Index

Учет ресурсов

Для некоторых систем необходимо хранить информацию о том, кто и как много печатал; этот раздел описывает разные методы выполнения данной работы.

Обычный LPD предоставляет очень небольшую помощь в выполнение учета ресурсов. Вы можете указать имя файла для учета ресурсов используя атрибут af= в printcap, но он только передается как параметр вашему фильтру, указанному в if=. Возможно сделать так, что ваш if= фильтр будет писать данные в файл учета ресурсов, и вы будете обрабатывать этот файл позже (традиционный формат в основном полезен для строчных принтеров, и не тривиален для разбора с помощью Perl, так что нет причин использовать его).

Ghostscript предоставляет оператор PageCount, который вы можете использовать для подсчета страниц в каждом из заданий; обычно вам необходимо добавить несколько строк на postscript в конец задания для того, чтобы дописать запись в файл учета; лучшим примером этого является файл unix-lpr.sh в поставке исходного кода Ghostscript.

Заметьте, что реализация учета ресурсов использованная в unix-lpr пишет в файл из Ghostscript и таким образом несовместима с рекомендованным ключом -dSAFER. Лучшим решением мог бы быть опрос принтера с помощью команды PJL после каждого из заданий, или написать программу на postscript, которая будет выдавать число страниц на стандартный вывод, где данные могут быть захвачены другой программой.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Печать на сетевой принтер Up: Настройка LPD Previous: Учет ресурсов   Contents   Index

Большие системы

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

Каждый принтер должен иметь одну точку контроля, откуда администратор может приостановить, переупорядочить или переназначить задания в очереди. Для реализации этого каждый должен печатать на локальный сервер, который будет выполнять буферизацию заданий и направлять их на соответствующий принтер. Используйте LPRng, по крайней мере на серверах; BSD LPD является имеет слишком много недостатков для "нормального" использования.

Клиентские системы не должны иметь уникальные настройки печати. Для реализации этого используйте расширенный синтаксис printcap в LPRng, так что вы сможете везде использовать один и тот же файл printcap.

Очереди печати не должны называться по названию производителя или модели; очереди печати лучше именовать лучше по расположению (floor2_nw) или по возможностям (color_transparency). Три года спустя, если сломается принтер, то вы сможете сменить его другой моделью без введения в заблуждение. Разработайте страницу web, которая показывает детальную информацию о каждом из принтеров, включая расположение, возможности и т.п. Рассмотрите возможность показа очереди. Сложные сетевые среды неуправляемы без соответствующей документации.

На машинах с Unix, используйте PDQ для того, чтобы предоставить выбор параметров печати, таких как двухстороннюю печать или размер бумаги, и заставить пользователей запускать все задания Ghostscript под правильным идентификатором пользователя.

На машинах с Windows и Apple, либо используйте везде поставляемые драйвера (Samba поддерживает механизм автоматической загрузки драйверов) или везде используйте драйвера Postscript. Не смешивайте разные драйвера; примитивные текстовые процессора часто производят разный код при изменении драйвера принтера; пользователи не могут связать изменения в виде с отдельной парой клиент/принтер.

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

Не думайте, что принтера обязательно должны быть подключены к рабочим станциям; сейчас Ethernet "сервера печати" стоят в районе $100. Возможность размещать принтера где есть сеть является большим удобством по сравнению с расположением принтеров около машин; располагайте принтера в разумных, центральных точках.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Использование команды nohup Up: Выполнение, останов и повторный Previous: Завершение активных процессов   Contents   Index

Запуск остановленного задания

Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами:

fg <JID>
- возобновляет приостановленное задание или переводит задание из фонового режима в оперативный;
bg <JID>
- вновь запускает приостановленное задание в фоновом режиме.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Машина с Unix/lpd Up: Печать в Linux Previous: Большие системы   Contents   Index

Печать на сетевой принтер

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



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: На принтер Win95, WinNT, Up: Печать на сетевой принтер Previous: Печать на сетевой принтер   Contents   Index

Машина с Unix/lpd

Для того чтобы разрешить удаленным машинам печатать на ваш принтер используя протокол LPD, вы должны перечислить эти машины в файле /etc/hosts.equiv или /etc/hosts.lpd. (Заметим, что hosts.equiv имеет список машин c несколько другим эффектом; будьте уверены что вы знаете, что вы делаете, если перечисляете машины в этом файле). Вы можете разрешить только определенным пользователям на других машинах печатать на ваш принтер используя атрибут rs; читайте справочную страницу lpd для более детальной информации об этом.

Для того чтобы печатать на другую машину вы должны сделать примерно такую запись в /etc/printcap:

# Удаленный djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :lp=/dev/null:\
        :sh:
Заметим что все равно есть директория очереди на локальной машине обслуживаемая lpd. Если удаленная машина занята или отключена, то задание с локальной машины будет находиться в очереди до тех пор пока оно не сможет быть послано.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Windows Up: Печать на сетевой принтер Previous: Машина с Unix/lpd   Contents   Index

На принтер Win95, WinNT, LanManager, или Samba

Возможно перенаправить очередь lpd через программу smbclient (часть набора Samba) на основанный на TCP/IP сервис печати SMB. Samba включает скрипт называемый smbprint. Вкратце, вы помещаете конфигурационный файл для нужного принтера в его директорию спула, и устанавливаете для него скрипт smbprint как if-фильтр.

Запись в /etc/printcap выглядит примерно так:

lp|remote-smbprinter:\
    :lp=/dev/null:sh:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:
Вы должны прочитать документацию внутри скрипта smbprint для более детальной информации о настройке.

Вы также можете использовать программу smbclient для посылки файла прямо на сервис печати SMB без вовлечения в этот процесс lpd. Смотрите справочные страницы.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Система Ghostscript Up: Печать на сетевой принтер Previous: На принтер Win95, WinNT,   Contents   Index

Windows

Печать из под клиента Windows (или OS/2) на сервер Linux прямо поддерживается через SMB используя пакет SAMBA, который также поддерживает разделение вашей файловой системы Linux с клиентами Windows.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Обращение к Ghostscript Up: Печать в Linux Previous: Windows   Contents   Index

Система Ghostscript

Ghostscript - это невероятно важная программа для печати в Linux. Большинство печатающего программного обеспечения под Unix генерирует PostScript, поддержка которого принтером обходится примерно в $100 на каждый принтер. Тем не менее, Ghostscript является свободным и генерирует вывод на языке вашего принтера из PostScript. Когда он связан c описанием драйвера принтера PDQ или с входным фильтром вашего lpd, это позволяет вам использовать виртуальный PostScript-принтер и значительно упрощает жизнь.

Ghostscript доступен в двух формах. Коммерческая версия Ghostscript, называемая Aladdin Ghostscript, может быть использована свободно для персонального использования, но не может распространяться с коммерческими дистрибутивами Linux. В общем она примерно на год впереди свободной версии Ghostscript; в настоящее время, например, она поддерживает много цветных струйных принтеров, в то время как старый Ghostscripts не делает этого.

Свободная версия Ghostscript называется GNU Ghostscript, и это просто устаревшая версия Aladdin Ghostscript любезно предоставленная для GNU.

Что бы вы не делали с gs, будьте уверены что запускаете его с опцией запрещающей доступ к файлам (-dSAFER). PostScript это полнофункциональный язык, и плохая программа на PostScript может доставить вам достаточно неприятностей.

Честно говоря PDF, (Формате Переносимого Документа Adobe) это в действительности чуть больше чем организованный PostScript в сжатом файле. Ghostscript может обрабатывать ввод в PDF также как это делает с PostScript.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Настройка вывода Ghostscript Up: Система Ghostscript Previous: Система Ghostscript   Contents   Index

Обращение к Ghostscript

Обычно ghostscript будет запускаться magic-фильтром, которым вы пользуетесь (Я рекомендую пакет apsfilter, если ваш поставщик не поставил вам этот пакет), но для целей отладки очень часто удобно запускать его прямо.

gs -help даст вам короткий, информативный список опций и доступных драйверов (заметим, что этот список является списком вкомпилированных драйверов, не основным списком доступных драйверов).

Вы можете запустить gs для тестирования примерно так:

gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps.



Alex Otwagin 2002-12-16

next up previous contents index
Next: About this document ... Up: Система Ghostscript Previous: Обращение к Ghostscript   Contents   Index

Настройка вывода Ghostscript

Существует набор вещей которые вы можете сделать если вывод gs не удовлетворителен (пожалуйста вы можете делать что угодно, поскольку вы имеете исходные тексты).

Некоторые из этих опций, и другие описанные в руководстве пользователя Ghostscript (файл Use.htm в дистрибутиве Ghostscript; в вашей системе эта документация может быть установлена в каталоги /usr/doc или /usr/share/doc) являются великолепными кандидатами для настроек драйвера в вашем объявлении драйвера PDQ.

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

Большинство не лазерных принтеров страдают от факта, что их точки немного больше. В результате картинки получаются слишком темными. Если вы страдаете от этой проблемы, то вы должны использовать свою собственную функцию переноса. Просто создайте следующий файл в директории lib ghostscript и добавьте его имя в вызов gs перед именем нужного файла. Вам может быть необходимо поиграть со значениями для настройки на ваш принтер. Более низкие значения дают более яркую печать. Особенно если ваш драйвер использует алгоритм Floyd-Steinberg для растеризации цветов, то более низкие значения (0.2 - 0.15) вероятно будут хорошим выбором.

---8<---- gamma.ps ----8<---
%!
%transfer functions for cyan magenta yellow black
{0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer
---8<------------------8<---

Также возможно корректно настроить принтеры, которые имеют проблемы с цветом, с помощью подбора значений указанных выше. Если у вас есть такая проблема, я рекомендую вам использовать файл colorcir.ps, который идет вместе с ghostscript (в поддиректории examples/), как тестовую страницу.

Для многих драйверов современных струйных принтеров существуют опции командной строки, или отдельные файлы upp для драйверов, которые реализуют изменения гаммы и других параметров и адаптируют принтер для разных типов бумаги. Вы должны заглянуть в них, до экспериментирования с Postscript, для того чтобы исправить проблемы.

Смешение по умолчанию в Ghostscript оптимизирован для устройств с маленьким разрешением. Будет производится смешение с предпочтением огрубления при попытке создания вывода с качеством 60ppi (не путайте с dpi, ppi - это "видимые" цветные пикселы на дюйм, которые вы получите после смешения).

Для выравнивания этого используйте ключ Ghostscript -dDITHERPPI=x, где x это используемое значение. Таким способом вы можете или не можете добиться успеха со всеми драйверами; многие из новых драйверов реализуют свое собственное смешение и не обращают внимания на настройки. Некоторые драйвера могут использовать либо обычное смешение Ghostscript, либо реализованное в драйвере.



Alex Otwagin 2002-12-16

next up previous contents index
Up: base Previous: Настройка вывода Ghostscript   Contents   Index

About this document ...

Образец документа
версия 0.01

This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.70)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html base.tex

The translation was initiated by Alex Otwagin on 2002-12-16


Alex Otwagin 2002-12-16

next up previous contents index
Next: Обзор наиболее употребительных команд Up: Выполнение, останов и повторный Previous: Запуск остановленного задания   Contents   Index

Использование команды nohup

Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:

    nohup command &

Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем каталоге строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:

    nohup grep word * > word.list &

Вы можете завершить команду nohup с помощью команды kill.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды управления файлами Up: Командный процессор Previous: Использование команды nohup   Contents   Index

Обзор наиболее употребительных команд

Синтаксис многих команд предусматривает использование параметров довольно сложного формата, указываемых в командной строке после имени команды. Ниже приводятся лишь наиболее употребительные команды. Полное описание команд и их параметров Вы можете получить, если введете в командной строке запрос на получение Страниц руководства для данной команды:
   man имя_команды
а для некоторых команд можно получить еще и дополнительную информацию:
   info имя_команды.



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Управление выводом на экран Up: Обзор наиболее употребительных команд Previous: Обзор наиболее употребительных команд   Contents   Index

Команды управления файлами

Команда pwd (print working directory - печать pабочего каталога) позволяет узнать имя текущего каталога:

   $ pwd
   /
Т.е. в настоящее вpемя вы находитесь в коpневом каталоге.

Если вы в пpоцессе путешествия по файловой системе вы ``потеpялись'' и не знаете, где находитесь, пpосто набеpите эту команду, котоpая выведет на экpан полное имя текущего каталога, начиная от коpневого.

Если вместо имени текущего каталога на экpан будет выдано диагностическое сообщение типа: ``Cannot open..'' (``Невозможно открыть..'') и ``Read error in..'' (``Ошибка считывания в..'') то значит пpоизошло наpушение файловой системы. В этом случае немедленно обpатитесь к системному администpатоpу или попытайтесь выяснить пpичину этого наpушения.

Команда cd используется для смены текущего каталога, т.е. для пеpехода в дpугой каталог и является встpоенной командой интеpпpетатоpа ``shell'' (аналог команды CD для DOS-систем). В качестве аpгумента этой команды укажите имя каталога, в котоpый вы хотите пеpейти. Напpимеp:

    $ cd /stand
означает пеpейти в каталог ``/stand'', т.е. сделать его текущим. Если вы хотите пеpейти в подкаталог, то ``/'' не указывается. Допустим вы находитесь в каталоге /usr и вам надо пеpейти в каталог local, котоpый является подкаталогом этого каталога. В этом случае вы можете выполнить следующие действия:
     $ pwd
     /usr
     $ cd local
     $ pwd
     /usr/local
Таким обpазом каталог /usr/local стал текущим.

Если ввести команду cd без аpгументов, то вы веpнетесь в свой личный (начальный) каталог. Пpи этом используется системная пеpеменная $HOME.

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

Создать каталог довольно легко. Для этого существует команда mkdir (аналог ее есть и в DOS системах). В качестве паpаметpа необхо- димо указать имя создаваемого каталога:

     mkdir имя_каталога
Стандартные подкаталоги (.) для самого каталога и (..) для его родительского каталога создаются автоматически.

Команда mkdir может быть использована и для создания нижележащих подкаталогов непосpедственно из текущего каталога с указанием полного пути к ним. В этом случае все указанные в пути каталоги должны существовать и быть доступны.

При попытке создать уже существующий каталог будет выдано соответствующее предупреждение:

     $ mkdir etc
     $ mkdir etc
     mkdir: etc: File exists

После создания pазнообpазнейших каталогов, чеpез некотоpое вpемя у вас возникнет естественное желание удалить некотоpые из них. В этом вам может помочь команда rmdir. Ее фоpмат также пpост, как и фоpмат пpеды- дущей команды mkdir:

     rmdir имя_каталога ...

Команда rmdir удаляет каталог, имя котоpого указано в качестве параметра. Удаляемый каталог должен быть пустым, то есть пеpед его уничтожением вы должны удалить все находящиеся в нем файлы. Пpактически это пpиходится делать очень pедко, так как с двумя этими пpоблемами успешно спpавляется команда rm, котоpая будет pассмотpена позже.

Указанные имена каталогов обрабатываются по поpядку. Пpи одновpеменном удалении каталога и его подкаталога, подкаталог должен быть удален pаньше.

Удалить каталог и подкаталоги можно также с помощью команды rm.

ПРЕДУПРЕЖДЕНИЕ: В связи с тем, что в UNIX-системах нет пpивычных пpогpамм восстановления удаленных каталогов, хоpошо подумайте пеpед их удалением.

Команда rm имеет следующий фоpмат:

     rm [-f | -i ] [-dRr ] имя_каталога
Наиболее часто используются следующие опции:
-d
Удалить каталог.
-r
Удалить все файлы и подкаталоги данного каталога, а после этого удалить и сам каталог.

Если вы попытаетесь удалить элементы каталога . или .. , то будет выдано сообщение об ошибке:

     $ rm . ..
     rm: ``.'' and ``..'' may not be removed

После беглого изучения стpуктуpы файловой системы, самое вpемя посмотpеть, какие каталоги и файлы имеются в вашем pаспоpяжении. Сделать это можно с помощью команды ls. Она выдает pазличную инфоpмацию о файлах и каталогах (аналог команды DIR для DOS-систем).

Как и большинство команд, ls имеет возможные аpгументы или опции, котоpые позволяют изменить ее действие. Эти опции следуют за именем команды в командной стpоке (чеpез пpобел) и состоят из знака ``минус'' (-) и одной буквы, котоpая опpеделяет тpебуемые действия. Эти опции могут еще называться ``флагами''.

Пеpейдите с помощью команды cd / в коpневой каталог и посмотpите его содеpжимое. Если опции не указаны команда выводит отсоpтиpованные по алфавиту имена файлов и каталогов.

     $ ls

     bin     boot     dev          etc     home
     initrd  lib      lost+found   misc    mnt
     opt     proc     root         sbin    tftpboot
     tmp     usr      var

К сожалению пока не очень понятно, что является каталогом, а что файлом. Помочь в этом может следующая команда, котоpая выдает инфоpмацию в pасшиpенном фоpмате, котоpый содеpжит больший объем инфоpмации о каждом файле (пpава доступа, pазмеp, дата последней модификации и т.д.):

     $ ls -l
     drwxr-xr-x    2 root     root         4096 Дек 18 15:00 bin
     drwxr-xr-x    3 root     root         4096 Дек 19 12:37 boot
     drwxr-xr-x   17 root     root        77824 Дек 19 12:37 dev
     drwxr-xr-x   68 root     root         8192 Дек 19 13:08 etc
     drwxr-xr-x    6 root     root         4096 Дек 18 15:00 home
     drwxr-xr-x    2 root     root         4096 Июн 21 21:32 initrd
     drwxr-xr-x    7 root     root         4096 Дек 18 14:56 lib
     drwxr-xr-x    2 root     root        16384 Дек 18 14:33 lost+found
     drwxr-xr-x    2 root     root         4096 Авг 29 19:10 misc
     drwxr-xr-x    7 root     root         4096 Дек 18 16:34 mnt
     drwxr-xr-x    2 root     root         4096 Авг 23  1999 opt
     dr-xr-xr-x   80 root     root            0 Дек 19 14:35 proc
     drwxr-x---   10 root     root         4096 Дек 18 20:26 root
     drwxr-xr-x    2 root     root         8192 Дек 18 14:57 sbin
     drwxr-xr-x    3 root     root         4096 Дек 18 14:56 tftpboot
     drwxrwxrwt   20 root     root         4096 Дек 19 18:10 tmp
     drwxr-xr-x   17 root     root         4096 Дек 18 15:00 usr
     drwxr-xr-x   25 root     root         4096 Дек 18 14:55 var
Если в качестве опеpанда указать имя файла, то ls выдаст информацию только об этом файле:
     $ ls -l userguide.tex
     -rw-rw-r--    1 user    user       41589 Дек 19 18:17 userguide.tex

Если качестве опеpанда указать имя каталога, то будет выдано содеpжимое этого каталога, т.е. имена файлов в этом каталоге:

     $ ls -l etc
     total 18
     -rw-r--r--  1 0  0   200 Jan 17 12:09 fstab
     -rw-r--r--  1 0  0  1091 Jan 17 12:19 protocols
     -rw-r--r--  1 0  0  5513 Jan 17 12:19 services
Если не указаны какие-либо опеpанды, будет выдано содеpжимое текущего каталога. В случае, если указано несколько опеpандов, сначала выводится инфоpмация о файлах, а потом о каталогах. Вывод пpоисходит в алфавитном поpядке.

Можно использовать следующие опции:

-C
Вывод содеpжимого каталога в несколько столбцов. Пpинимается по умолчанию пpи выводе на теpминал.
      $ ls -C
      dev       dos     etc     kernel     mnt
      stand     tmp     tools   usr
-F
Добавить ``слэш'' (/) к имени каталога, звездочку (*) к имени исполнимого файла, знак (@) к каждой символической связи.
      $ ls -F
      dev/     dos/     etc/     kernel*     mnt/
      stand/   tmp/     tools/   usr/
-R
Рекуpсивный обход встpетившихся подкаталогов. Может быть полезна для создания списка всех файлов системы.
-T
Вывести полную информацию о времени и дате создания файла, включая месяц, день, часы, минуты, секунды и год.
      $ ls -lT
      total 1882
      drwxr-xr-x  2 0  0    6656 Jan 17 12:09:55 1995 dev
      drwxr-xr-x  1 0  0   16384 Feb 16 13:58:23 1995 dos
      -rwxr-xr-x  1 0  0  913277 Jan 17 12:09:42 1995 kernel
-c
Вывод соpтиpуется по вpемени последней модификации файла.
-d
Вывод только имени каталога (но не содеpжимого).
      $ ls -ld stand
      drwxr-xr-x  3 0  0  1536 Jan 17 13:16 stand
-f
Вывод не сортируется, т.е. поpядок вывода соответствует поpядку файлов в каталоге.
      $ ls -lf
      total 1890
      drwxr-xr-x  5 0  0     512 Jan 17 12:46 usr
      drwxr-xr-x  2 0  0     512 Jan 17 12:19 etc
      drwxr-xr-x  2 0  0    6656 Jan 17 12:09 dev
-i
Для каждого файла выводится число индексных дескpиптоpов (последовательный номеp файла).
      $ ls -li
      total 1892
      1920 drwxr-xr-x  2 0  0    6656 Jan 17 12:09 dev
      1 drwxr-xr-x  1 0  0   16384 Feb 16 14:03 dos
      1280 drwxr-xr-x  2 0  0     512 Jan 17 12:19 etc
      3 -rwxr-xr-x  1 0  0  913277 Jan 17 12:09 kernel
-r
Изменение поpядка соpтиpовки на обpатный (по алфавиту или по вpемени последнего использования).
-s
Вывести количество блоков файловой системы фактически используемых каждым файлом, в блоках по 512 байтов или 1Кб, в соответствии с установленным значением системной пеpеменной BLOCKSIZE.
      $ ls -ls
      total 1904  - общее
      14 drwxr-xr-x  2 0  0    6656 Jan 17 12:09 dev
      32 drwxr-xr-x  1 0  0   16384 Feb 16 14:05 dos
      2 drwxr-xr-x  2 0  0     512 Jan 17 12:19 etc
      1808 -rwxr-xr-x  1 0  0  913277 Jan 17 12:09 kernel
-t
Сортиpовать по вpемени последней модификации файла (последний модифициpованный выводится пеpвым).
-u
Соpтиpовка по времени последнего доступа к файлам.
-1
Вывод одного имени на каждой стpоке. Пpинимается по умолчанию пpи выводе не на терминал.

Рассмотpим еще одну команду, котоpая может быть полезна пpи pаботе с файлами. Это команда cat (аналог команды TYPE для DOS-систем).

Команда cat имеет следующий фоpмат:

       cat [-benstuv] [-] [file ...]
Она по очеpеди читает указанные, как аpгументы файлы и выводит их содеpжимое на стандаpтное устpойство вывода.

Поименованный файл или файлы выводятся последовательно один за дpугим без пpомежутков. Если файл достаточно длинный, то можно пpиостановить вывод с помощью комбинации клавиш ``Ctrl+S''. Для пpодолжения вывода нажмите любую клавишу (кpоме RESET).

Операнды обрабатываются в порядке их pазмещения в командной строке. Если не указан ни один файл или указана опция (-), команда читает данные со стандаpтного устpойства ввода.

Вы можете использовать следующие опции:

-n
Нумеpовать стpоки начиная с 1.
-b
Подразумевает опцию ``-n'', но не нумеpует пустые стpоки.
-e
Подразумевает опцию ``-v'' и отображает знак доллара ($) в конце каждой строки (визуализация символа пеpевода стpоки).
-s
Пpи наличии идущих подpяд пустых стpок выводить только одну.
-t
Подразумевает опцию ``-v''. Выводить cимволы табуляции как ^I.
-u
Вывод не буферизуется, то есть символы из входного файла записываются в стандаpтный вывод без задеpжки, как только они были пpочитаны. По умолчанию вывод буфеpизуется, то есть символы могут накапливаться в пpомежуточном буфеpе.
-v
Отображение непечатных символов. Упpавляющие символы выводятся в виде ^X (CTRL+X), символ DEL (восьмеричное 0177) как ^?. Символы не входящие в стандаpтный ASCII- набоp (напpимеp, символы киppилицы с набоpом стаpших pазpядов) выводятся как ``M-x'', где x - опpеделяемый младшими семи битами символ.
ПРИМЕРЫ:
  1. Файл file выводится на устройство стандартного вывода:
         cat file
    
  2. Сцепление (слияние) файлов file1 и file2, после чего они помещаются в файл file3:
         cat file1 file2 > file3
    
  3. Пpисоединение файла file1 к концу файла file2:
         cat file1 >> file2
    
  4. Вывод содеpжимого файла с нумеpацией стpок, но без нумеpации пустых стpок:
         cat -b file1
         --------------
         1  Number 1
         2  Number 2
         3  Number 3
         4  Number 4
    
         5  Number 5
    
  5. Печать знака $ в конце каждой стpоки:
         cat -e file1
         Number 1$
         Number 2$
         Number 3$
    
  6. Нумеpация всех стpок:
         cat -n file1
    
         1  Number 1
         2  Number 2
         3  Number 3
         4  Number 4
         5
         6
         7  Number 5
    


next up previous contents index
Next: Управление выводом на экран Up: Обзор наиболее употребительных команд Previous: Обзор наиболее употребительных команд   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Поиск файлов Up: Обзор наиболее употребительных команд Previous: Команды управления файлами   Contents   Index

Управление выводом на экран

more -- выводит стандартный входной поток на экран порциями по 24 строки, ожидая нажатия на клавишу [Пробел] для вывода очередной порции. Досрочно завершает работу при нажатии на клавишу [Q].

less -- аналогичная программа, однако она поддерживает возможности прокрутки вверх и поиска.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Генерация отчетов и обработка Up: Обзор наиболее употребительных команд Previous: Управление выводом на экран   Contents   Index

Поиск файлов

find -- команда со сложной структурой параметров, позволяющая найти и вывести в выходной поток названия файлов, удовлетворяющих сколь угодно сложным условиям.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Мониторинг системы Up: Обзор наиболее употребительных команд Previous: Поиск файлов   Contents   Index

Генерация отчетов и обработка результатов других команд

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Файловая система Up: Введение в ОС Linux Previous: Загрузка ОС Linux   Contents   Index

Консоль. Переключение между графическими и текстовыми консолями

Консолью называется совокупность основных устройств ввода информации в компьютер (клавиатура и мышь) и вывода информации (монитор). Linux работает с несколькими так называемыми виртуальными консолями, из которых в каждый момент времени только одна может быть связана с реальной (физической) консолью (то есть, является активной). В дальнейшем слово ``консоль'' будет обозначать именно виртуальную консоль.

Некоторые из консолей представляют информацию только в текстовом виде с использованием экранных шрифтов в форматах видеосистемы компьютера. Такие консоли называются текстовыми. Сама ОС Linux и основные автоматически запускаемые приложения (такие как командный процессор) используют в таких консолях интерфейс командной строки. Другие приложения (например, менеджер файлов Midnight Commander) могут использовать оконный интерфейс, выделение объектов и выбор в меню и списках при помощи мыши или клавиатуры и т.п.

Другие консоли (графические) представляют информацию в графическом виде, используя Графический пользовательский интерфейс (GUI). Как правило, работа в таких консолях происходит при помощи развитых графических сред, таких как GNOME или KDE.

Для нужд ОС консоли перенумерованы целыми положительными числами. Их общее количество может изменяться в зависимости от настроек ОС и достигать нескольких десятков, хотя в стандартной настройке оно не превышает десяти. Несколько первых консолей - текстовые, далее идут графические (в стандартной настройке - одна).

Если Вы работаете в графической консоли, Для того чтобы сделать активной другую консоль с номером n (где n находится в интервале от 1 до 12), нажмите на клавиши [Ctrl]-[Alt]-[Fn], то есть, например клавишу [Ctrl]-[Alt]-[F2], если хотите перейти в консоль с номером 2. Для того чтобы сделать активной другую консоль вместо текущей текстовой консоли, нажмите на клавиши [Alt]-[Fn].

Если в результате запуска корректно настроенной системы или при переходе из другой консоли активной становится текстовая консоль, в которой Вы хотите работать, Вам следует ввести имя пользователя. Имя пользователя вводится в позицию текстового курсора после приглашения localhost login: (слово localhost является именем по умолчанию компьютера в локальной сети; если при установке системы или позднее Вы настраивали локальную сеть, это имя может быть другим).

После того как Вы введете имя пользователя, в следующей строке будет выведено приглашение Password: Наберите на клавиатуре пароль пользователя и нажмите на клавишу Enter (при этом никакие символы на экране не появляются, и курсор перемещаться не будет).

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

    [user\_name@localhost dir\_name]$
(вместо user\_name будет стоять имя пользователя, под регистрационной записью которого Вы работаете, а вместо dir\_name - название текущего каталога). Дальнейшая работа состоит в запуске различных программ в режиме командной строки.

Если Вы вошли под именем root, приглашение будет иметь вид

    [root@localhost dir\_name]#
Обратите внимание на изменение символа приглашения!

Для завершения работы ОС и всех приложений и перезагрузки компьютера нажмите на клавиши [Ctrl]-[Alt]-[Del] или введите команду reboot. В последнем случае на экран будет выведено приглашение Password: и Вы должны будете ввести пароль пользователя, под именем которого Вы работаете. Для того чтобы прекратить работу и выключить компьютер, введите команду halt.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Организация справочной системы Up: Обзор наиболее употребительных команд Previous: Генерация отчетов и обработка   Contents   Index

Мониторинг системы

df -- команда выдает сведения о наличии свободного места на всех смонтированных дисках.

top -- команда выдает непрерывно обновляемую таблицу всех задач, выполняющихся на компьютере, включая системные, с указанием объема используемых ресурсов. Если какая-то программа или особенно системная задача потребляет большую часть ресурсов, возникает подозрение в том, что эта программа зациклилась. Для завершения работы команды нажмите на клавишу [Q].



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: Введение в ОС Linux Previous: Мониторинг системы   Contents   Index

Организация справочной системы



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Страницы интерактивного руководства man Up: Организация справочной системы Previous: Организация справочной системы   Contents   Index

Введение

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

Необходимо сразу оговориться, что большаю часть информации из этих источников представлена на английском языке. Только для русифицированных дистрибутивов часть страниц интерактивного руководства man или информации из других источников выдается на русском языке. Существует возможность пополнить и модифицировать указанные выше источники, например, дополнить ``английский'' дистрибутив ``русскими'' страницами, которые доступны из сети Интернет, поместив их в соответствующие каталоги. Но в любом случае, на русский переведено далеко не все. Ниже приводится информация о перечисленных источниках более подробно.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команды whatis и apropos Up: Организация справочной системы Previous: Введение   Contents   Index

Страницы интерактивного руководства man

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

Секция Содержание  
1.2em1 Команды пользователя  
8 Системные команды  
2 Системные вызовы  
3 Библиотечные вызовы  
4 Устройства  
5 Форматы файлов  
6 Игры  
7 Разное  
9 Ядро  
n Tcl или Tk-команды  

Порядок перечисления секций в этой таблице не случаен. Дело в том, что файлы с информацией расположены в подкаталогах каталога /usr/man и команда man ищет нужную информацию, просматривая эти подкаталоги именно в указанном в приведенной таблице порядке. Если, например, введена команда:

man swapon

то будет выдана справка о команде swapon из секции 2. Поэтому, если необходимо получить справку по системному вызову swapon, нужно ввести команду:

man 2 swapon

указывая номер секции для поиска справки.

Разрабатываемое и уже наработанное и программное обеспечение может дополнять существующую иерархию, помещая новые файлы в соответствующие каталоги. Страницы man выводятся с помощью команды less, что дает возможность просматривать информацию поэкранно и перемещаться по этим ``экранам'' вверх и вниз. Таким образом, для управления процессом вывода информации можно использовать клавиши, согласно возможностям команды less. Наиболее используемые из них:

Если предпочтительно читать текст не с экрана, а с отпечатанной копии, то можно напечатать соответствующую страницу, введя:

man имя_команды | lpr

или, если испотльзуется postscript-принтер:

man -t имя_команды | lpr

В заключение отметим, что страницы руководства man, вообще говоря, создавались не для первоначального изучения системы. Они скорее предназначены для опытных пользователей, которым в процессе работы нужно иметь под рукой справку по формату вызова команды - чтобы не приходилось держать весь материал в голове.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команда locate Up: Организация справочной системы Previous: Страницы интерактивного руководства man   Contents   Index

Команды whatis и apropos

Для того, чтобы получить искомую информацию, всегда нужно знать, что искать. В таких случаях могут помочь команды whatis (``Что есть'') и apropos (``???''). Команда whatis производит контекстный поиск заданного ключевого слова (шаблона) в базе данных, содержащей перечень системных команд с кратким их описанием. Выводятся только точные совпадения с ключевым словом. Команда apropos производит поиск по фрагментам слов. Аналогично команде apropos работает команда man с флагом -k:

man -k net

Для того, чтобы команды man -k, whatis и apropos работали, необходимо предварительно создать базу данных о системных командах, для чего ввести:

makewhatis

В противном случае в ответ на любой запрос будет выдано сообщение ``nothing appropriate''. Правом запустить команду makewhatis обладает только суперпользователь root. В случае непрерывной работы компьютера лучше всего запускать эту команду как задание для процесса cron.



Alex Otwagin 2002-12-16

next up previous contents index
Next: гипертекстовое руководство info Up: Организация справочной системы Previous: Команды whatis и apropos   Contents   Index

Команда locate

Иногда в поиске нужного файла документации может помочь команда locate (``локализовать???''). Команда locate в некотором смысле аналогична командам whatis и apropos. По этой команде производится поиск всех файлов, имена которых содержат заданный шаблон. Например, по команде:

locate net

будет найдена масса имен файлов, в названиях которых встречается подстрока net. В шаблоне могут применяться метасимволы *, ?, [ ]. Однако, команда locate производит поиск не по каталогам файловой системы, а в специально созданной базе имен файлов, которую надо вначале создать (и иногда обновлять) командой:

updatedb



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команда help оболочки bash Up: Организация справочной системы Previous: Команда locate   Contents   Index

гипертекстовое руководство info

Команда info (``информация'') является некоторой альтернативой команде man. Анологичным образом, для получения информации по отдельной команде надо задать в командной строке для info параметр, являющийся именем интересующей команды, например:

info man

Информация, которая будет выведена, в большинстве случаев несколько отличается от той, которую вывела бы команда man. Но самое существенное отличие заключается в том, что выдаваемые info подсказки представлены в гипертекстовом виде. В силу этого пользователь получает возможность просматривать различные разделы помощи, не выходя из оболочки, предоставляемой командой info. Работая в тестовом режиме, можно запустить info в одной из альтернативных консолей (Ctrl-Alt-F2, Ctrl-Alt-F3 и т.д.) и переключаться за помощью по мере необходимости. В тех случаях, когда точно не известно, где именно найти нужную информацию, открывается полезная возможность перемещения по разным разделам документов с помощью гипертекстовых ссылок, предоставляемая командой info. Эти ссылки обозначены символом *, что несколько отличается от способа обозначения гипертекстовых ссылок в широко распространенных браузерах Internet Explorer или Netscape Navigator, но от этого они не становится менее удобными. Перемещаться по ссылкам в пределах страницы можно с помощью клавиши Tab и подтверждать свой выбор с помощью клавиши Enter. Нажатие клавиши p вернет к предыдущей странице. Нажатие клавиши n вызовет переход на следующую страницу. А нажатие клавиши u переведет на один уровень вверх по иерархической структуре страниц документации. Кроме того, можно вызвать переход по ссылке другим способом, согласно правилам работы с меню. Для этого требуется нажать клавишу m и набрать в появившейся внизу экрана строке ввода некоторое число начальных символов названия нужного раздела помощи (из числа названий, представленных на отображаемой в данный момент на экране странице, причем даже если не вся страница помещается на экране). Число символов должно быть достаточным для однозначного определения раздела помощи (если недостаточно, то программа попросит дополнить название). Выход из программы - по клавише q.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команда графической оболочки Xman Up: Организация справочной системы Previous: гипертекстовое руководство info   Contents   Index

Команда help оболочки bash

Для получения помощи по встроенным командам оболочки bash испотльзуется команда help (``помощь''). Если ввести help без позиционных параметров в командной строке, то будет дан доступ к списку всех встроенных команд оболочки. Опять же, обычно команда help используется с аргументом, в качестве которого выступает имя одной из встроенных команд bash:

help ????

В ответ будет дана краткая справка о применении этой команды.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Команда helptool Up: Организация справочной системы Previous: Команда help оболочки bash   Contents   Index

Команда графической оболочки Xman

Начиная с шестой версии в дистрибутив Red Hat Linux включена программа, которая позволяет просмотреть страницы руководства man при работе в графическом режиме. Поиск и вывод на экран страниц руководства вызывается посредством щелчков по кнопкам и меню. В остальном (содержание выдаваемой информации) команда Xman аналогична команде man.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Документация, поставляемая с дистрибутивом Up: Организация справочной системы Previous: Команда графической оболочки Xman   Contents   Index

Команда helptool

По команде helptool (``инстумент помощи'') появляется графическое окно, имеющее строку ввода, в которой можно указать интересующий термин. Команда просматривает все файлы документов (можно сконфигурировать, какие документы следует просматривать при поиске). По завершении поиска будет выдан список файлов, в которых встречается данный термин. Если кликнуть на элементе списка, то появится дополнительное окно, в котором будет отображаться выбранный вами файл. При этом файл будет отображаться в том формате, в котором он хранится на компьютере: info, man, html и т.д.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Общая структура файловой системы Up: Введение в ОС Linux Previous: Консоль. Переключение между графическими   Contents   Index

Файловая система



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Документация, поставляемая с пакетами Up: Организация справочной системы Previous: Команда helptool   Contents   Index

Документация, поставляемая с дистрибутивом

Если в процессе установки системы не было отказа от установки документации, то после завершения процедур инсталляции в каталоге /usr/doc будут располагаться подкаталоги HOWTO (``как сделать что- либо''), FAQ (``часто задаваемые вопросы''), HTML (``гипертекст'') и LDP (``проект документации по Linux''), содержащие обширнейшую документацию по системе Linux в целом и отдельных аспектах ее применения. Большая часть этой документации представляет собой обычные текстовые ASCII-файлы, которые можно просматривать с помощью команды:

more filename

или команды:

less filename

А также с помощью встроенного редактора оболочки Midnight Commander. Эта документация являтся основным источником получения информации при освоении Linux. Можно начать процесс освоения с Red Hat Reference Guide, расположенного в каталоге /doc/ref-guide на компакт-диске. Особенно стоит обратить внимание на главы Package Management with RPM и System Administration. Изначально большая часть этой документации написана на английском языке, но со временем в русифицированных дистрибутивах она будет поставляться и на русском языке.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Книги и Internet Up: Организация справочной системы Previous: Документация, поставляемая с дистрибутивом   Contents   Index

Документация, поставляемая с пакетами

Большинство пакетов программного обеспечения поставляются разработчиками с обширной документацией по установке и использованию этих пакетов. Если пакет представлен в формате rpm (в дистрибутиве Red Hat Linux и его клонах используется именно этот формат), то эта документация будет развернута в соответствующих подкаталогах каталога /usr/doc. Имена этих подкаталогов соответствуют названию пакета и версии ПО. Например, для графической оболочки KDE версии 1.1.1 создается подкаталог KDE- 1.1.1.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Файловая система Up: Организация справочной системы Previous: Документация, поставляемая с пакетами   Contents   Index

Книги и Internet

Естественно, что осваивать Linux проще и легче, если под рукой имеется хорошая книга. Прежде всего, следут обратиться к руководство к установленному дистрибутиву (если таковое есть). Кроме того, на данный момент уже издано достаточное количество книг, из которых можно подобрать наиболее подходящие. И, конечно, если пользователь имеет выход в сеть Internet, то в ней он может найти ответ практически на любой из возникающих у него вопросов. Если проблемы возникают еще на этапе установки, то можно обратиться в службу поддержки производителя дистрибутива (если дистрибутив не пиратский, то на нем, как правило, указываются координаты этой службы), на которую можно выйти через сайт производителя. Пиратский дистрибутив может быть ``криво'' записан на компакт-диск. Можно использовать возможности электронной посты. Очень полезно подписаться на некоторые списки рассылки (или эхо- конференции, как их еще называют). Например, чтобы подписаться на список рассылки по дистрибутиву Black Cat Linux надо отправить письмо, содержащее ``subscribe blackcat-list'', по адресу majordomo@geon.donetsk.ua. Некоторые вопросы очень часто повторяются, поэтому можно просто просматривать с помощью браузера архив списка рассылки - может быть кто-то уже задавал тот вопрос, ответ на который нужен. Наконец, самый эффективный способ - это, не стесняясь своего незнания, задать вопрос в конференции в режиме диалога. Если вопрос, связанный с конкретной системой или конкретной проблемой, то требуется дополнительная детализация (какой дистрибутив, какая версия дистрибутива, какое оборудование).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: base Previous: Книги и Internet   Contents   Index

Файловая система



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Типы поддерживаемых файловых систем Up: Файловая система Previous: Файловая система   Contents   Index

Введение

Как уже было сказано, файловая система - одна из основных составных частей любой операционной системы, так как она обеспечивает хранение информации на физических носителях и доступ приложений к этой информации. В этом разделе мы рассмотрим внутренние механизмы работы файловых систем, то есть обратную (невидимую для пользователя) сторону файловой системы. Эта сторона обращена к физическим устройствам и определяет способ хранения информации на носителях и механизмы записи и извлечения этой информации по запросам приложений. Здесь в основе всего лежит способ адресации отдельных участков носителя и механизмы размещения отрезков файла по этим участкам.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Структура дискового раздела ext2 Up: Файловая система Previous: Введение   Contents   Index

Типы поддерживаемых файловых систем

Но, прежде чем перейти к описанию конкретных механизмов, стоит отметить, что Linux умеет работать с несколькими типами файловых систем. Основной файловой системой для Linux является ``вторая расширенная файловая система'' (second extended filesystem), которую кратко обозначают как ext2fs. Именно ее механизмы будут подробно рассматриваться в настоящем разделе. Но прежде, чем перейти к ее рассмотрению, ненадолго отвлечемся для того, чтобы перечислить некоторые типы файловых систем, которые поддерживаются в Linux. Эту табличку нельзя считать полной по той простой причине, что работа по созданию новых типов файловых систем для Linux продолжается постоянно. Примером вновь разрабатываемых файловых систем являются журналируемая файловая система JFS фирмы IBM, файловая система ReiserFS.

Типы файловых систем, поддерживаемых в Linux перечислены ниже

1.2emminix

Файловая система minix - это первая файловая система, которая использовалась в Linux. Она имела массу недостатков: ограничения размера раздела жесткого диска 64 мегабайтами; длина имени файла была ограничена 30 символами и т.д. Она продолжает использоваться для дискет и RAM-дисков.

 
1.0emextfs

Еще одна из ранних версий файловой системы для Linux, расширение файловой системы minix. В настоящее время заменена файловой системой ext2fs и уже не используются.

 
1.0emext2fs

Вторая расширенная файловая система (second extended filesystem) была создана как расширение расширенной файловой системы (extfs). ext2fs обеспечивает более высокую производительность (в части скорости и использования центрального процессора), поддерживаются длинные имена и большие размеры файлов.

 
1.0emxiaf

Файловая система xiaf была создана на основе minix с целью обеспечения большей устойчивости и безопасности. Она обеспечивает выполнение основных функций файловой системы без излишней сложности.

 

1.2emmsdos

Файловая система, используемая для разделов, сформатированных в MS-DOS и Windows. Имена файлов в msdos должны удовлетворять стандарту 8.3.

 
1.0emumsdos

Файловая система UMS-DOS является расширением файловой системы DOS, используемым под Linux. В ней добавлено использование длинных имен файлов, идентификаторы пользователя и группы (UID/GID), разрешения в стиле POSIX и специальные файлы (устройства, именованные каналы и т.д.) при этом совместимость с DOS не потеряна.

 
1.0emhpfs

Файловая система для разделов OS/2.

 
1.0emproc

Это файловая система, которая используется для обращения к структурам данных ядра. Файлы этой системы не занимают дискового пространства. Подробнее см. man proc(5).

 
1.0emnfs

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

 
1.0emswap

Раздел или файл свопинга OC Linux.

 
1.0emsysv

Файловая система Unix Systen V. Она поддерживает файловые системы Xenix FS, SystemV/386 FS и Coherent FS.

 
1.0emiso9660

Файловая система для монтирования CD-ROM, соответствующая стандарту ISO 9660.

 
1.0emvfat

Файловая система FAT-32. Поддерживаются длинные имена файлов.

 
1.0emsmb

Это сетевая файловая система, которая поддерживает протокол SMB, используемый Windows, Windows NT и Lan Manager. Для того, чтобы использовать эту файловую систему, надо иметь специальную программу монтирования smbmount.

 
1.0emncpfs

Это сетевая файловая система, обеспечивающая поддержку протокола NCP, применяемого в Novell NetWare. Для того, чтобы использовать эту файловую систему, надо тоже иметь специальную программу, которую можно найти на сайте ftp://linux01.gwdg.de/pub/ncpfs.

 


next up previous contents index
Next: Структура дискового раздела ext2 Up: Файловая система Previous: Введение   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Суперблок Up: Файловая система Previous: Типы поддерживаемых файловых систем   Contents   Index

Структура дискового раздела ext2

Производители жестких дисков обычно поставляют свои изделия отформатированными на низком уровне. Насколько я знаю, это означает, что все дисковое пространство с помощью специальных меток разбито на ``сектора'', размером 512 байт. Такой диск (или дисковый раздел) должен быть подготовлен для использования в определенной операционной системе. В MS-DOS или Windows процедура подготовки называется форматированием, а в Linux - созданием файловой системы. Создание файловой системы ext2fs заключается в создании в разделе диска определенной логической структуры. Эта структура строится следующим образом. Во-первых, на диске выделяется загрузочная область. Загрузочная область создается в любой файловой системе. На первичном разделе она содержит загрузочную запись - фрагмент кода, который инициирует процесс загрузки операционной системы при запуске. На других разделах эта область не используется. Все остальное пространство на диске делится на блоки. Блок может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой единицей дискового пространства. Выделение места файлам осуществляется целыми блоками, поэтому при выборе размера блока приходится идти на компромисс. Большой размер блока, как правило, сокращает число обращений к диску при чтении или записи файла, но зато увеличивает долю нерационально используемого пространства, особенно, при наличии большого числа файлов маленького размера.

Блоки, в свою область объединяются в группы блоков. Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ((номер группы - 1)* (число блоков в группе)).

Каждая группа блоков имеет одинаковое строение.

Суперблок
Group Descriptors
Block Bitmap
INode Bitmap
Таблица индексных дескрипторов (INode Table)
Область блоков данных



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Group Descriptors Up: Структура дискового раздела ext2 Previous: Структура дискового раздела ext2   Contents   Index

Суперблок

Первый элемент этой структуры (суперблок) - одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков (за исключением группы 1, в которой в первом блоке расположена загрузочная запись). Суперблок является начальной точкой файловой системы. Он имеет размер 1024 байта и всегда располагается по смещению 1024 байта от начала файловой системы. Наличие нескольких копий суперблока объясняется чрезвычайной важностью этого элемента файловой системы. Дубликаты суперблока используются при восстановлении файловой системы после сбоев.

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

Суперблок имеет следующую структуру.

Название поля Тип Комментарий  
1.2ems_inodes_count ULONG Число индексных дескрипторов в файловой системе  
s_blocks_count ULONG Число блоков в файловой системе  
s_r_blocks_count ULONG Число блоков, зарезервированных для суперпользователя  
s_free_blocks_count ULONG Счетчик числа свободных блоков  
s_free_inodes_count ULONG Счетчик числа свободных индексных дескрипторов  
s_first_data_block ULONG Первый блок, который содержит данные. В зависимости от размера блока, это поле может быть равно 0 или 1  
s_log_block_size ULONG Индикатор размера логического блока: 0 = 1 Кб; 1 = 2 Кб; 2 = 4 Кб  
s_log_frag_size LONG Индикатор размера фрагментов (кажется, понятие фрагмента в настоящее время не используется)  
s_blocks_per_group ULONG Число блоков в каждой группе блоков  
s_frags_per_group ULONG Число фрагментов в каждой группе блоков  
s_inodes_per_group ULONG Число индексных дескрипторов (inodes) в каждой группе блоков  
s_mtime ULONG Время, когда в последний раз была смонтирована файловая система  
s_wtime ULONG Время, когда в последний раз производилась запись в файловую систему s_mnt_count USHORT Счетчик числа монтирований файловой системы. Если этот счетчик достигает значения, указанного в следующем поле (s_max_mnt_count), файловая система должна быть проверена (это делается при перезапуске), а счетчик обнуляется  
s_max_mnt_count SHORT Число, определяющее, сколько раз может быть смонтирована файловая система  
s_magic USHORT ``Магическое число'' (0xEF53), указывающее, что файловая система принадлежит к типу ex2fs  
s_state USHORT Флаги, указывающее текущее состояние файловой системы (является ли она чистой (clean) и т.п.)  
s_errors USHORT Флаги, задающие процедуры обработки сообщений об ошибках (что делать, если найдены ошибки)  
s_pad USHORT Заполнение s_lastcheck ULONG Время последней проверки файловой системы  
s_checkinterval ULONG Максимальный период времени между проверками файловой системы  

s_creator_os ULONG Указание на тип ОС, в которой создана файловая система  
s_rev_level ULONG Версия (revision level) файловой системы  
s_reserved ULONG[235] Заполнение до 1024 байт  


next up previous contents index
Next: Group Descriptors Up: Структура дискового раздела ext2 Previous: Структура дискового раздела ext2   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Block Bitmap Up: Структура дискового раздела ext2 Previous: Суперблок   Contents   Index

Group Descriptors

Вслед за суперблоком расположено описание группы блоков (Group Descriptors). Это описание представляет собой массив, имеющий следующую структуру.

Название поля Тип Назначение  
bg_block_bitmap ULONG Адрес блока, содержащего битовую карту блоков (block bitmap) данной группы  
bg_inode_bitmap ULONG Адрес блока, содержащего битовую карту индексных дескрипторов (inode bitmap) данной группы  
bg_inode_table ULONG Адрес блока, содержащего таблицу индексных дескрипторов (inode table) данной группы  
bg_free_blocks_count USHORT Счетчик числа свободных блоков в данной группе  
bg_free_inodes_count USHORT Число свободных индексных дескрипторов в данной группе  
bg_used_dirs_count USHORT Число индексных дескрипторов в данной группе, которые являются каталогами  
bg_pad USHORT Заполнение  
bg_reserved ULONG[3] Заполнение  

Размер описания группы блоков можно вычислить как

   (размер_группы_блоков_в_ext2 * число_групп) / размер_блока
(при необходимости округляем).

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: INode Bitmap Up: Структура дискового раздела ext2 Previous: Group Descriptors   Contents   Index

Block Bitmap

Битовая карта блоков (block bitmap) - это структура, каждый бит которой показывает, отведен ли соответствующий ему блок какому- либо файлу. Если бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков в тех случаях, когда надо выделить место под файл, Битовая карта блоков занимает число блоков, равное

   (число_блоков_в_группе / 8) / размер_блока
(при необходимости округляем).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Присоединение других файловых систем Up: Файловая система Previous: Файловая система   Contents   Index

Общая структура файловой системы

Файловая система Linux основана на модели иерархического дерева каталогов и с этой точки зрения аналогична файловой системе Windows и MS-DOS. Однако в отличие от названных систем в Linux отсутствует понятие логического устройства (диска), все каталоги являются подкаталогами единого дерева и начинаются с так называемого корневого каталога. Корневой каталог системы обозначается символом /, подкаталог корневого каталога с именем каталог1 обозначается /каталог1, подкаталог этого каталога /каталог1/каталог2, а файл, находящийся в каталоге /каталог1 обозначается /каталог1/файл1 (то есть, с точки зрения обозначения, никакой разницы между файлами и каталогами нет).

В именах файлов и каталогов могут встречаться практически любые символы (причем прописные и строчные буквы различаются), однако далеко не все программы могут работать с именами, в которых используется, например, символ звездочка (*). Необходимо проявлять особую осторожность и при работе с файлами, содержащими в именах символы с кодами, превышающими 127 (например, буквы национальных алфавитов).

Имена физических устройств компьютера выглядят как имена файлов в подкаталоге первого уровня /dev (и действительно являются файлами особого вида). Разделы жесткого диска с интерфейсом IDE (EIDE) имеют имена вида /dev/hdXY, где X это одна из букв a, b, c, d, обозначающие соответственно с 1 по 4 физический диск (от Primary Master до Secondary Slave), а Y число, обозначающее номер раздела на диске (разделы нумеруются в том порядке, в котором они перечислены в таблице разделов диска). Например, единственный раздел второго (Slave) диска, присоединенного к первичному (Primary) контроллеру, обозначается /dev/hdb1.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Таблица индексных дескрипторов (INode Up: Структура дискового раздела ext2 Previous: Block Bitmap   Contents   Index

INode Bitmap

Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает какие именно дескрипторы заняты.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Область блоков данных Up: Структура дискового раздела ext2 Previous: INode Bitmap   Contents   Index

Таблица индексных дескрипторов (INode Table)

Следующая область в структуре группы блоков служит для хранения таблицы индексных дескрипторов файлов. Структура самого индексного дескриптора подробнее рассматривается в следующем подразделе.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Индексные дескрипторы файлов Up: Структура дискового раздела ext2 Previous: Таблица индексных дескрипторов (INode   Contents   Index

Область блоков данных

Ну, и наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Система адресации данных Up: Файловая система Previous: Область блоков данных   Contents   Index

Индексные дескрипторы файлов

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

Индексный дескриптор файла имеет следующее строение.

Название поля Тип Описание  
1.2emi_mode USHORT Тип и права доступа к данному файлу  
i_uid USHORT Идентификатор владельца файла (Owner UID)  
i_size ULONG Размер файла в байтах  
i_atime ULONG Время последнего обращения к файлу (Access time)  
i_ctime ULONG Время создания файла  
i_mtime ULONG Время последней модификации файла  
i_dtime ULONG Время удаления файла  
i_gid USHORT Идентификатор группы (GID)  
i_links_count USHORT Счетчик числа связей (Links count)  
i_blocks ULONG Число блоков, занимаемых файлом  
i_flags ULONG Флаги файла (File flags)  
i_reserved1 ULONG Зарезервировано для ОС  
i_block ULONG[15] Указатели на блоки, в которых записаны данные файла  

i_version ULONG Версия файла (для NFS)  
i_file_acl ULONG ACL файла  
i_dir_acl ULONG ACL каталога  
i_faddr ULONG Адрес фрагмента (Fragment address)  
i_frag UCHAR Номер фрагмента (Fragment number)  
i_fsize UCHAR Размер фрагмента (Fragment size)  
i_pad1 USHORT Заполнение  
i_reserved2 ULONG[2] Зарезервировано  

Поле типа и прав доступа к файлу представляет собой двух- байтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.

Идентификатор Значение Назначение флага (поля)  
1.2emS_IFMT F000 Маска для типа файла  
S_IFSOCK A000 Доменное гнездо (socket)  
S_IFLNK C000 Символическая ссылка  
S_IFREG 8000 Обычный (regular) файл  
S_IFBLK 6000 Блок-ориентированное устройство  
S_IFDIR 4000 Каталог  
S_IFCHR 2000 Байт-ориентированное (символьное) устройство  
S_IFIFO 1000 Именованный канал (fifo)  
       
S_ISUID 0800 SUID - бит смены владельца S_ISGID 0400 SGID - бит смены группы  
S_ISVTX 0200 Бит сохранения задачи (sticky bit)  
       
S_IRWXU 01C0 Маска прав владельца файла  
S_IRUSR 0100 Право на чтение  
S_IWUSR 0080 Право на запись  
S_IXUSR 0040 Право на выполнение  
       
S_IRWXG 0038 Маска прав группы  
S_IRGRP 0020 Право на чтение  
S_IWGRP 0010 Право на запись  
S_IXGRP 0008 Право на выполнение  
       
S_IRWXO 0007 Маска прав остальных пользователей  
S_IROTH 0004 Право на чтение  
S_IWOTH 0002 Право на запись  
S_IXOTH 0001 Право на выполнение  

Среди индексных дескрипторов имеется несколько дескрипторов, которые зарезервированы для специальных целей и играют особую роль в файловой системе. Это следующие дескрипторы

Идентификатор Значение Описание  
1.2emEXT2_BAD_INO 1 Индексный дескриптор, в котором перечислены адреса дефектных блоков на диске (Bad blocks inode)  
EXT2_ROOT_INO 2 Индексный дескриптор корневого каталога файловой системы (Root inode)  
EXT2_ACL_IDX_INO 3 ACL inode  
EXT2_ACL_DATA_INO 4 ACL inode  
EXT2_BOOT_LOADER_INO 5 Индексный дескриптор загрузчика (Boot loader inode)  
EXT2_UNDEL_DIR_INO 6 Undelete directory inode  
EXT2_FIRST_INO 11 Первый незарезервированный индексный дескриптор  

Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, состоит из записей следущей структуры:

Название поля Тип Описание  
1.2eminode ULONG номер индексного дескриптора (индекс) файла  
rec_len USHORT Длина этой записи  
name_len USHORT Длина имени файла  
name CHAR[0] Имя файла  

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


next up previous contents index
Next: Система адресации данных Up: Файловая система Previous: Область блоков данных   Contents   Index
Alex Otwagin 2002-12-16

next up previous contents index
Next: Виртуальная файловая система VFS Up: Файловая система Previous: Индексные дескрипторы файлов   Contents   Index

Система адресации данных

Система адресации данных - это одна из самых существенных составных частей файловой системы. Именно система адресации позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске. В ext2 система адресации реализуется полем i_block индексного дескриптора файла.

Поле i_block в индексном дескрипторе файла представляет собой массив из 15 адресов блоков. Первые 12 адресов в этом массиве (EXT2_NDIR_BLOCKS[12]) представляют собой прямые ссылки (адреса) на номера блоков, в которых хранятся данные из файла. Следующий адрес в этом массиве (EXT2_IND_BLOCK) является косвенной ссылкой, то есть адресом блока, в котором хранится список адресов следующих блоков с данными из этого файла. В этом блоке могут быть записаны адреса (размер_блока / размер_ULONG) блоков с данными файла.

Следующий адрес в поле i_block индексного дескриптора (EXT2_DIND_BLOCK) указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые в свою очередь содержат списки адресов следующих блоков данных того файла, который задается данным индексным дескриптором.

И, наконец, последний адрес (EXT2_TIND_BLOCK) в поле i_block индексного дескриптора задает адрес блока тройной косвенной адресации, то есть блока со списком адресов блоков, которые являются блоками двойной косвенной адресации.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Новые файловые системы Up: Файловая система Previous: Система адресации данных   Contents   Index

Виртуальная файловая система VFS

До сих пор наш рассказ о файловой системе касался только ``статических'', если можно так выразиться, составных частей файловой системы. Но, я думаю, Вы понимаете, что все это хозяйство обслуживается какими-то программными модулями. Эти программные части можно разделить на две составных части. Одна часть входит в состав ядра и образует так называемую виртуальную файловую систему (VFS). VFS обеспечивает унифицированный программный интерфейс к услугам файловой системы, причем безотносительно к тому, какой тип файловой системы (vfat, ext2fs, nfs и т.д.) имеется на конкретном физическом носителе. Поэтому каждая файловая система должна предоставлять еще какие-то конкретные процедуры доступа к своим файлам, для того, чтобы использоваться под Linux. Виртуальная файловая система VFS, расположенная как бы между приложениями и конкретными файловыми системами, позволяет пользовательским приложениям получать доступ к множеству файловых систем разных типов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Журналируемые файловые системы Up: Файловая система Previous: Виртуальная файловая система VFS   Contents   Index

Новые файловые системы

Файловая система ext2fs была создана по образу и подобию файловой системы UNIX (UNIX File System - UFS). Обе они (особенно UFS) создавались еще в те времена, когда диски и другие физические носители данных имели довольно маленький (по современным меркам) объем. Увеличение объема дисков вело к возрастанию объема разделов диска, увеличению размеров отдельных файлов и каталогов. Это породило ряд проблем, связанных с ограниченностью внутренних структур данных файловой системы.

Существуют две основных проблемы этого рода:

  1. Эти структуры не способны работать с носителями информации увеличенного объема. В них отведено строго фиксированное число бит для хранения данных о размере дисковых разделов и размерах файлов, фиксированное число бит для хранения логических номеров блоков и так далее. Как следствие, число файлов и каталогов и их размер ограничены.

  2. Вторая проблема связана с производительностью. В силу заложенных в старые файловые системы алгоритмов решение некоторых задач на носителях увеличенного объема стало требовать слишком большого времени. Одним из самых характерных примеров такого рода проблем является трудоемкость восстановления файловой системы после сбоев (например, после неожиданного отключения питания). Это восстановление выполняется с помощью программы fsck и для очень больших дисков стало требовать нескольких часов.

Естественно, что появление этих проблем породило и попытки их решения. Были разработаны новые типы файловых систем, при создании которых учитывались требования масштабируемости. Наиболее известными разработками файловых систем новых типов являются:

В следующей таблице приведены данные по увеличению основных параметров, обеспечиваемых новыми файловыми системами.

  Размер блока Максим. размер файловой системы Максим. размер файла  
1.2emExt3FS 1KB-4KB 4Tb 2GB  
XFS от 512 байт до 64 KB 18 тысяч петабайт 9 тысяч петабайт  
JFS 512, 1024, 2048, 4096 байт от 4 петабайт (при 512-байтных блоках) до 32 петабайт (при 4-килобайтовых блоках) от 512 терабайт (при 512-байтовых блоках) до 4 петабайт (при 4-килобайтовых блоках)  
ReiserFS До 64KB. Пока что фиксирован, 4KB 4G of blocks, 16 Tb 4G, $ 2^10$ petabytes in ReiserFS (3.6.xx)  



Alex Otwagin 2002-12-16

next up previous contents index
Next: Системные операции для работы Up: Файловая система Previous: Новые файловые системы   Contents   Index

Журналируемые файловые системы

Основная цель, которая преследуется при создании журналируемых файловых систем, насколько я понял, состоит в том, чтобы обеспечить быстрое восстановление системы после сбоев (например, после потери питания). Дело в том, что если произойдет такой сбой, то часть информации о расположении файлов теряется, поскольку не все изменения сразу записываются на диск. После этого программа fsck вынуждена просматривать весь диск блок за блоком (пользуясь битовыми матрицами занятых блоков и индексных дескрипторов) с целью восстановления потерянных связей. При увеличении размера дисков вдвое, вдвое увеличивается и время, необходимое для просмотра всего диска. А при тех объемах, которых достигают современные диски, особенно на серверах, время, необходимое для того, чтобы просмотреть весь диск, стало недопустимо велико: оно стало достигать часов и даже суток. А сервер в это время не отзывается! Кроме того, нет гарантии, что все связи удастся восстановить.

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

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

Файловые системы ext3fs и JFS являются журналируемыми. Надо отметить, что ext3fs не является совершенно новой разработкой, а является просто надстройкой над ext2fs, обеспечивающей ведение журнала и организацию транзакций. Файловые системы XFS и JFS являются открытыми версиями коммерческих файловых систем.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Каналы Up: Файловая система Previous: Журналируемые файловые системы   Contents   Index

Системные операции для работы с файловой системой

Здесь рассматриваются системные функции, обеспечивающие обращение к существующим файлам, такие как open, read, write, lseek и close, затем функции создания новых файлов, а именно, creat и mknod, и, наконец, функции для работы с индексом или для передвижения по файловой системе: chdir, chroot, chown, stat и fstat. Исследуются более сложные системные функции: pipe и dup - имеют важное значение для реализации каналов в SHELL; mount и umount расширяют видимое для пользователя дерево файловых систем; link и unlink изменяют иерархическую структуру файловой системы. Затем дается представление об абстракциях, связанных с файловой системой, в отношении поддержки различных файловых систем, подчиняющихся стандартным интерфейсам. Ниже приводятся три структуры данных ядра: таблица файлов, в которой каждая запись связана с одним из открытых в системе файлов, таблица пользовательских дескрипторов файлов, в которой каждая запись связана с файловым дескриптором, известным процессу, и таблица монтирования, в которой содержится информация по каждой активной файловой системе.

Функции для работы с файловой системой и их связь с другими алгоритмами.

+------+--------------+--------+-------+-------+---------+-------+
| Воз- | Используют   | Назна- | Рабо- | Ввод- | Работа- | Управ-|
| вра- | алгоритм     | чают   | тают  | вывод | ют со   | ление |
| щают | namei        | индек- | с ат- | из    | структу-| де-   |
| деск-|              | сы     | рибу- | файла | рой фай-| ревь- |
| рип- |              |        | тами  |       | ловых   | ями   |
| торы |              |        | файла |       | систем  |       |
| файла|              |        |       |       |         |       |
+------+--------------+--------+-------+-------+---------+-------+
| open | open   stat  |        |       |       |         |       |
| creat| creat  link  | creat  | chown | read  |         |       |
| dup  | chdir  unlink| mknod  | chmod | write | mount   | chdir |
| pipe | chroot mknod | link   | stat  | lseek | umount  | chown |
| close| chown  mount | unlink |       |       |         |       |
|      | chmod  umount|        |       |       |         |       |
+------+--------------+--------+-------+-------+---------+-------+
+---+--+--------------+--------+-------+-------+---------+----+--+
    |  Алгоритмы работы с файловой системой на нижнем уровне  |
    +-------------+------------------+------------------------+
    |    namei    |                  |                        |
    +-------------+ ialloc    ifree  |   alloc   free   bmap  |
    | iget   iput |                  |                        |
    +-------------+------------------+------------------------+
    +---------------------------------------------------------+
    |             алгоритмы работы с буферами                 |
    +---------------------------------------------------------+
    |    getblk     brelse     bread     breada     bwrite    |
    +---------------------------------------------------------+

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

  1. Cистемные функции, возвращающие дескрипторы файлов для использования другими системными функциями.

  2. Cистемные функции, использующие алгоритм namei для анализа имени пути поиска.

  3. Cистемные функции, назначающие и освобождающие индекс с использованием алгоритмов ialloc и ifree.

  4. Cистемные функции, устанавливающие или изменяющие атрибуты файла.

  5. Cистемные функции, позволяющие процессу производить ввод-вывод с использованием алгоритмов alloc, free и алгоритмов выделения буфера.

  6. Cистемные функции, изменяющие структуру файловой системы.

  7. Cистемные функции, позволяющие процессу изменять собственное представление о структуре дерева файловой системы.

Вызов системной функции open (открыть файл) - это первый шаг, который должен сделать процесс, чтобы обратиться к данным в файле.

Для чтения из файла используется функция read (читать), а для записи в файл write (писать).

В первой версии системы, разработанной Томпсоном и Ричи, отсутствовал внутренний механизм, с помощью которого процессу мог бы быть обеспечен исключительный доступ к файлу. Механизм захвата был признан излишним, поскольку ``мы не имеем дела с большими базами данных, состоящими из одного файла, которые поддерживаются независимыми процессами''. Для того, чтобы повысить привлекательность системы UNIX для коммерческих пользователей, работающих с базами данных, в версию V системы ныне включены механизмы захвата файла и записи. Захват файла - это средство, позволяющее запретить другим процессам производить чтение или запись любой части файла, а захват записи - это средство, позволяющее запретить другим процессам производить ввод-вывод указанных записей (частей файла между указанными смещениями).

Обычное использование системных функций read и write обеспечивает последовательный доступ к файлу, однако процессы могут использовать вызов системной функции lseek для указания места в файле, где будет производиться ввод-вывод, и осуществления произвольного доступа к файлу.

Процесс закрывает открытый файл, когда процессу больше не нужно обращаться к нему с помощью функции close.

Системная функция open дает процессу доступ к существующему файлу, а системная функция creat создает в системе новый файл.

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

Смена владельца или режима (прав) доступа к файлу является операцией, производимой над индексом, а не над файлом. Это делается операциями chown и chmod, соответственно.

Системные функции stat и fstat позволяют процессам запрашивать информацию о статусе файла: типе файла, владельце файла, правах доступа, размере файла, числе связей, номере индекса и времени доступа к файлу.

Системная функция dup копирует дескриптор файла в первое свободное место в таблице пользовательских дескрипторов файла, возвращая новый дескриптор пользователю. Она действует для всех типов файла.

Системная функция mount (монтировать) связывает файловую систему из указанного раздела на диске с существующей иерархией файловых систем, а функция umount (демонтировать) выключает файловую систему из иерархии. Функция mount, таким образом, дает возможность обращаться к данным в дисковом разделе как к файловой системе, а не как к последовательности дисковых блоков.

Системная функция link связывает файл с новым именем в структуре каталогов файловой системы, создавая для существующего индекса новую запись в каталоге.

Системная функция unlink удаляет из каталога точку входа для файла.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сокеты Up: Файловая система Previous: Системные операции для работы   Contents   Index

Каналы

Каналы позволяют передавать данные между процессами в порядке поступления (``первым пришел - первым вышел''), а также синхронизировать выполнение процессов. Их использование дает процессам возможность взаимодействовать между собой, пусть даже не известно, какие процессы находятся на другом конце канала. Традиционная реализация каналов использует файловую систему для хранения данных. Различают два вида каналов: поименованные каналы и, за отсутствием лучшего термина, непоименованные каналы, которые идентичны между собой во всем, кроме способа первоначального обращения к ним процессов. Для поименованных каналов процессы используют системную функцию open, а системную функцию pipe - для создания непоименованного канала. Впоследствии, при работе с каналами процессы пользуются обычными системными функциями для файлов, такими как read, write и close. Только связанные между собой процессы, являющиеся потомками того процесса, который вызвал функцию pipe, могут разделять доступ к непоименованным каналам.

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Домашний каталог Up: Файловая система Previous: Общая структура файловой системы   Contents   Index

Присоединение других файловых систем

Для того чтобы сделать доступными файловые системы, размещенные на физических устройствах, требуется совместить корневые каталоги этих устройств с некоторыми подкаталогами файловой системы. Эта операция называется монтированием устройства. Жесткие диски обычно монтируются при запуске системы (например, основной раздел, куда Вы установили Linux, монтируется в корневой каталог /), однако их можно монтировать и отдельно.

Другие устройства, например, дисководы для гибких дисков A: (устройство /dev/fd0) и B: (/dev/fd1) и дисковод CD-ROM (/dev/cdrom), монтируются по мере необходимости.

По окончании работы с устройствами они размонтируются, и размещенные на них файлы становятся недоступными. Для жестких дисков это действие обычно выполняется автоматически при отключении системы. Иначе обстоит дело с гибкими дисками и CD-ROM: соответствующие устройства необходимо размонтировать перед тем как удалять из компьютера носители.

Нельзя удалить компакт-диск из неразмонтированного привода (устройство не реагирует на кнопку извлечения); вынуть дискету из неразмотированного дисковода физически возможно, однако это приводит к полному уничтожению информации на ней.

Команда монтирования устройства имеет следующий вид:

   mount -t тип_файловой_системы устройство каталог
Параметр устройство задает физическое устройство в вышеописанном формате, параметр каталог точку монтирования (каталог общего дерева каталогов, с которым будет совмещен корневой каталог устройства, каталог должен существовать и быть пуст), параметр тип_файловой_системы ключевое слово, обозначающее стандарт, в котором записываются на устройстве файлы и каталоги. Чаще всего Вам могут встретиться следующие типы файловых систем:
ext2
файловая система, используемая в разделах жесткого диска GNU/Linux;
iso9660
файловая система, используемая на большинстве CD-ROM;
vfat
файловая система, используемая (с вариациями) в MS-DOS и Windows 9x для жестких дисков и дискет (включает в себя системы, в терминологии Windows называющиеся FAT и FAT32).
Таким образом, чтобы смонтировать привод CD-ROM в каталог /MyCD, введите команду
    mount -t iso9660 /dev/cdrom /MyCD
Для того чтобы смонтировать дисковод B: для чтения и записи дискет в формате MS-DOS, на каталог /diskB, введите команду
   mount -t vfat /dev/fd1 /diskB

Для двух наиболее стандартных ситуаций можно применять упрощенные форматы команд монтирования.

Для того чтобы смонтировать дисковод A: на каталог /mnt/floppy с автоматическим определением типа файловой системы дискете, введите

   mount /dev/fd0
Для того чтобы смонтировать дисковод CD-ROM на каталог /mnt/cdrom с автоматическим определением типа файловой системы на диске, введите
   mount /dev/cdrom
Для того чтобы размонтировать устройство, введите команду
   umount устройство
например
   umount /dev/cdrom

Если Вы смонтировали дисковод для гибких дисков со вставленной дискетой, ошибочно защищенной от записи, снять защиту недостаточно, необходимо размонтировать и снова смонтировать устройство.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Буфер сверхоперативной памяти (кеш) Up: Файловая система Previous: Каналы   Contents   Index

Сокеты

Ранее было показано, каким образом взаимодействуют между собой процессы, протекающие на разных машинах, при этом обращалось внимание на то, что способы реализации взаимодействия могут быть различаться в зависимости от используемых протоколов и сетевых средств. Более того, эти способы не всегда применимы для обслуживания взаимодействия процессов, выполняющихся на одной и той же машине, поскольку в них предполагается существование обслуживающего (серверного) процесса, который при выполнении функций open или read будет приостанавливаться драйвером. В целях создания более универсальных методов взаимодействия процессов на основе использования многоуровневых сетевых протоколов для системы BSD был разработан механизм, получивший название ``sockets'' (гнезда). Рассмотрим некоторые аспекты применения гнезд (на пользовательском уровне представления).

Модель с использованием гнезд.

               Процесс-клиент       Процесс-сервер
                       |                 |
                       +--+           +--+
+-------------------------+--+     +--+--------------------------+
| Уровень гнезд              |     |          Уровень гнезд      |
+-------------------------+--+     +--+--------------------------+
|                        TCP |     | TCP                         |
| Уровень протоколов      |  |     |  |       Уровень протоколов |
|                        IP  |     | IP                          |
+-------------------------+--+     +--+--------------------------+
|                     Драйвер|     | Драйвер                     |
| Уровень устройств  Ethernet|     |Ethernet  Уровень устройств  |
+-------------------------+--+     +--+--------------------------+
                          +---+   +---+
                              |   |
                             С е т ь

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Файловая система proc Up: Файловая система Previous: Сокеты   Contents   Index

Буфер сверхоперативной памяти (кеш)

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

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

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



Alex Otwagin 2002-12-16

next up previous contents index
Next: Сетевые файловые системы Up: Файловая система Previous: Буфер сверхоперативной памяти (кеш)   Contents   Index

Файловая система proc

Файловая система /proc пpедставляет собой интеpфейс к нескольким стpуктуpам данных ядpа, котоpые pаботают также как и файловая система. Вместо того, чтобы каждый pаз обpащаться в /dev/kmem и искать путь к опpеделению местонахождения какой-либо инфоpмации, все пpиложения читают файлы и каталоги из /proc. Таким обpазом все адpеса стpуктуp данных ядpа заносятся в /proc во вpемя компиляции ядpа, и пpогpаммы спользующие /proc не могут пеpекомпилиpоваться после этого.

Существует возможность поддеpживать файловую систему /proc вне /proc, но пpи этом она теpяет эффективность, поэтому здесь эта возможность не ассматpивается.

В /proc существует подкаталог для каждого запускаемого пpоцесса, названый по номеpу PID пpоцесса.



Alex Otwagin 2002-12-16

next up previous contents index
Next: NFS Up: base Previous: Файловая система proc   Contents   Index

Сетевые файловые системы



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: Сетевые файловые системы Previous: Сетевые файловые системы   Contents   Index

NFS



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Установка сервера NFS Up: NFS Previous: NFS   Contents   Index

Введение

NFS (Network File System)- это протокол, разработанный Sun Microsystems для разделения ресурсов (файлов и каталогов) локальной сети. NFS-клиент ``монтирует'' файловую систему, ``экспортируемую'' NFS-сервером. Смонтированная таким образом файловая система представляется на клиентском компьютере как часть локальной файловой системы. Протокол NFS предоставляет, в частности, возможность смонтировать корневую файловую систему в процессе загрузки. Таким образом, можно обеспечить работу бездисковых рабочих станций.

Для того, чтобы воспользоваться файловой системой NFS, должны быть выполнены два условия:

  1. Поддержка файловой системы NFS должна быть встроена в ядро Linux или быть доступна в виде модуля (если Вы используете Red Hat 6.0, то поддержка NFS скорее всего встроена в ядро).
  2. В сети должен иметься компьютер, на котором работает NFS- сервер. При этом в файлах настройки этого NFS-сервера должно быть указано, что Вашему компьютеру разрешен доступ по NFS (о том, как это сделать, будет рассказано в подразделе о настройке NFS- сервера).



Alex Otwagin 2002-12-16

next up previous contents index
Next: Настройка клиента NFS Up: NFS Previous: Введение   Contents   Index

Установка сервера NFS

До того, как мы сможем что-нибудь сделать с помощью NFS, необходимо настроить сервер NFS.

Первой из необходимых программ является portmapper - это преобразователь номеров портов DARPA в вызовы соответствующих программ RPC.

Запустите portmapper. Он называется либо portmap, либо rpc.portmap и должен находиться в директории /usr/sbin (на некоторых машинах он называется rpcbind). Вы можете запустить его вручную, но он должен запускаться при каждом старте машины. Поэтому необходимо создать/отредактировать rc-скрипты. Содержание rc-скриптов объясняется более подробно в справочной странице init. Они обычно находятся в директориях /etc/rc.d, /etc/init.d или /etc/rc.d/init.d. Если там есть скрипт, названный inet, то его и нужно редактировать. Запустив portmap, убедитесь, что он действительно запущен с помощью команд ps aux и затем rpcinfo -p. Удаленный доступ к программе portmapper определяется содержимым файлов /etc/hosts.allow и /etc/hosts.deny. Если rpcinfo -p не работает, но portmapper запущен, то проверьте указанные файлы.

Следующие программы, которые Вам нужно запустить - это mountd и nfsd. Но предварительно нужно отредактировать другой файл. Это файл /etc/exports. Допустим требуется, чтобы файловая система /mn/eris/local, которая находится на машине eris была доступна для машины названной apollon. Тогда нужно поместить в файл /etc/exports на машине eris следующие строки:

/mn/eris/local apollon(rw)

Вышеприведенные строки дают машине apollon право на чтение/запись в каталог /mn/eris/local. Вместо rw мы можем указать ro, что предоставит доступ только для чтения (если Вы ничего не поместите, то по умолчанию будет доступ только для чтения.) Существуют другие опции, которые Вы можете задать. Они все перечислены в справочной странице по exports, которую Вы должны прочитать. Существуют также лучшие способы, чем перечисление всех машин в файле exports. Вы, например, можете использовать сетевые группы, если у Вас используется система NIS (или NYS) (NIS также известен как YP), и всегда использовать шаблоны (wild cards) доменов и подсетей IP как списки машин, которым разрешено что-то монтировать. Но Вы должны учитывать, кто может получить доступ к серверу неавторизованным способом, если Вы используете такой подход.

Файл exports имеет синтаксис, отличный от синтаксиса, который используют другие системы UNIX.

Сейчас Вы готовы к запуску программ mountd (она также может называться rpc.mountd) и nfsd (который может быть назван rpc.nfsd). Обе эти программы читают данные из файла exports.

Если Вы отредактировали файл /etc/exports, то Вы должны быть уверены, что nfsd и mountd знают о том, что файл изменен. Традиционный способ получить уверенность - запустить программу exportfs. Во многих дистрибутивах Linux программа exportfs отсутствует. Если это так, то Вы можете создать такой скрипт:

#!/bin/sh
killall -HUP /usr/sbin/rpc.mountd
killall -HUP /usr/sbin/rpc.nfsd
echo re-exported file systems
\begin{verbatim}

Сохраните его в файле, скажем \verb|/usr/sbin/exportfs|, и не забудьте
выполнить для файла команду \verb|chmod Цa +rx|. Сейчас, после того как
получен файл \verb|exports|, Вы должны запустить программу \verb|exportfs|, имея
права администратора.

Затем Вы должны проверить, запущены ли правильно \verb|mountd| и \verb|nfsd|.
Сначала это делается с помощью команды \verb|rpcinfo -p|. Программа
должна показать что-то похожее на следующее:

\begin{verbatim}
    program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100005    1   udp    745  mountd
    100005    1   tcp    747  mountd
    100003    2   udp   2049  nfs
    100003    2   tcp   2049  nfs

Как видите, portmapper предоставил свои сервисы и mountd и nfsd запущены. Если Вы получили сообщение

rpcinfo: can't contact portmapper:
RPC:Remote system error - Connection refused, RPC_PROG_NOT_REGISTERED

или нечто подобное вместо приведенного выше, то portmapper не запустился или что-то записано неверно в файле /etc/hosts(allow,deny) - что запрещает программе portmapper отвечать. Если Вы получили сообщение No remote programs registered., то либо portmapper не может ``общаться'' с вами, либо не в порядке что-то еще. Завершите выполнение nfsd, mountd и portmapper и попытайтесь выполнить заново стартовую последовательность.

После проверки запуска portmapper, Вы также можете выполнить проверку его работы с помощью команды ps. portmapper будет продолжать объявлять свои сервисы открытыми даже после того, как программы расширяющие его возможности завершили работу. Так что проверка с помощью ps может быть необходимой, если Вам кажется, что что-то не работает. Конечно, дополнительно нужно исправить системные rc-файлы для запуска mountd и nfsd при загрузке. Очень вероятно, что эти скрипты уже существуют на машине, и понадобится только раскомментировать нужные разделы или активизировать их на нужном уровне запуска.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Обобщение Up: NFS Previous: Установка сервера NFS   Contents   Index

Настройка клиента NFS

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

Теперь Вы можете, в командной строке администратора, ввести соответствующую команду монтирования и требуемая файловая система появится. Продолжая пример из предыдущего раздела мы можем смонтировать /mn/eris/local с машины eris. Это делается с помощью команды:

mount -o rsize=1024,wsize=1024 eris:/mn/eris/local /mnt

Файловая система теперь доступна в /mnt и Вы можете перейти туда и выполнить команду ls, просмотреть отдельно взятые файлы. Вы заметите, что операция выполняется не так быстро, как в случае с локальной файловой системой, но более удобно чем при использовании ftp. Если вместо монтирования файловой системы команда mount выдаст сообщение об ошибке

mount: eris:/mn/eris/local failed, reason given by server: Permission denied

то файл exports является неправильным или Вы забыли запустить exportfs после редактирования файла exports. Если команда сообщит

mount clntudp_create: RPC: Program not registered

- это означает, что nfsd или mountd не запущены на сервере или у Вас проблема с hosts(allow,deny), о которой упомянуто выше.

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

umount /mnt

Чтобы выполнялось автоматическое монтирование файловой системы nfs при загрузке, Вам необходимо отредактировать файл /etc/fstab, как это обычно делается. Для нашего примера требуется строка:

# device            mountpoint fs-type options               dump fsckorder
...
eris:/mn/eris/local /mnt       nfs     rsize=1024,wsize=1024 0    0
...

Это почти все, что необходимо сделать.

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

  1. ``soft''. NFS клиент будет сообщать об ошибке программе, которая пытается получить доступ к файлу расположенному на файловой системе, смонтированной через NFS. Некоторые программы довольно хорошо обрабатывают такого рода ошибки, но большинство программ не делают этого. Не рекомендуется использование этой опции, так как она может привести к появлению испорченных файлов и потерянных данных. Особенно осторожно нужно использовать эту опцию для дисков при работе с почтовыми протоколами.
  2. ``hard''. Программа, осуществляющая доступ к файлу на смонтированной по NFS файловой системе просто приостановит выполнение при разрыве связи с сервером. Процесс не может быть прерван или ``убит'' до тех пор, пока Вы явно не укажите опцию intr. Когда сервер NFS будет запущен заново, то программа будет ``безмятежно'' продолжать работу с прерванного места. Этот вариант - скорее всего тот, который понадобится. Рекомендуется использовать опции intrhard,intr для всех файловых систем смонтированных через NFS.

Для предыдущего примера теперь в файле fstab запись будет выглядеть так:

# device            mountpoint fs-type options                         dump fsckorder
...
eris:/mn/eris/local /mnt       nfs     rsize=1024,wsize=1024,hard,intr 0    0
...

Обычно, если не заданы опции rsize и wsize, то NFS будет читать и писать блоками по 4096 или по 8192 байтов. Некоторые комбинации ядер Linux и сетевых карт не могут эффективно обрабатывать такие большие блоки. Так что нужно поэкспериментировать и найти оптимальные значения rsize и wsize, которые бы позволили работать настолько быстро, насколько это возможно. Вы можете протестировать скорость передачи при заданных опциях при помощи нескольких простых команд. Выполнив вышеприведенную команду монтирования и получив доступ с правом записи на диск, Вы можете выполнить тестирование производительности следующим образом:

time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096

Эта команда создает 64Mb файл, заполненный нулевыми значениями (файл должен быть достаточно большим - настолько большим, чтобы кэширование не сыграло значительную роль в увеличении производительности; используйте больший размер файла, если у вас достаточно много памяти). Проделайте эту операцию несколько раз (5- 10?) и усредните полученные результаты. Полученное значение - это время ``прохода'' - величина, наиболее интересующая нас в эксперименте. Затем можно измерить производительность чтения, считав файл обратно на исходную машину:

time dd if=/mnt/testfile of=/dev/null bs=16k

Выполните и эту операцию несколько раз и усредните результат. Затем размонтируйте файловую систему и смонтируйте ее заново, с увеличенными значениями rsize и wsize. Вероятно, значения должны быть кратными 1024, и не больше чем 16384 байтов, поскольку это максимальный размер блока данных в NFS версии 2. Прямо после монтирования с увеличенными значениями, перейдите к смонтированной файловой системе и выполните пробную команду ls, исследуйте файловую систему, чтобы убедиться в том, что все в порядке. Если значения rsize/wsize слишком большие, то симптомы этого очень необычны и не на все 100 процентов очевидны. Типичный симптом выражается в неполном списке файлов при выполнении команды ls и отсутствии сообщений об ошибках. Или чтение файлов внезапно срывается без вывода сообщения об ошибке. После того, как Вы установите, что заданные значения rsize/wsize оптимальны, можете продолжить тестировать производительность другими способами. Различные серверные платформы вероятно имеют различные оптимальные размеры блоков. SunOS и Solaris, по общему мнению, работают намного быстрее при размере блока равном 4096 байт, чем при других значениях.

Новые ядра Linux (с версии 1.3) ``предваряющее'' чтение при значениях rsize, больших или равных размеру страницы машины. Для процессоров Intel размер страницы равен 4096 байтам. Предваряющее чтение значительно увеличивает производительность NFS при чтении. Так что на машинах с процессором Intel Вы можете смело использовать значение rsize, равное 4096 байтам. Помните, что нужно отредактировать /etc/fstab для использования найденных значений rsize/wsize. Прием, позволяющий увеличить производительность NFS при записи, заключается в запрещении синхронной записи на сервер. Спецификация NFS требует, чтобы запросы NFS на запись не считались законченными до осуществления реальной записи данных на носитель (обычно диск). Это ограничивает производительность при записи в то время, как асинхронная запись значительно увеличивает скорость NFS. Демон nfsd никогда не выполняет синхронную запись, поскольку реализация файловой системы Linux сама не дает сделать это на серверах, работающих под управлением отличных от Linux систем. Вы можете увеличить производительность таким способом, поместив в файл exports:

/dir  -async,access=linuxbox

или что-то подобное. Посмотрите справочную страницу exports, но помните, что это увеличивает риск потери данных.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Samba Up: NFS Previous: Настройка клиента NFS   Contents   Index

Обобщение

Для настройки NFS сервера (Linux) необходимо выполнить следующие шаги:

  1. Запустить portmap (или rpcbind)
  2. Создать файл /etc/exports:

    /home         .lan (rw)
    

  3. Послать команду NFS-серверу перечитать список экспортируемых файловых систем., для этого выполнить:

    exportfs
    

    или создать и выполнить скрипт:

    #!/bin/sh
    killall ЦHUP /usr/sbin/rpc.mountd
    killall ЦHUP /usr/sbin/rpc.nfsd
    echo "Re-exported filesystems"
    

    предварительно сохранив его в файле /usr/sbin/exportfs и выполнив для этого файла команду chmod Цa +rx.

  4. Проверить правильность запуска:

    rpcinfo Цp
    

    В списке должны быть сервисы nfsd, mountd.

По умолчанию для всех экспортируеых Ф.С. устанавливается опция root_squash, т.е. при попытке пользователя root на NFS-клиенте получить доступ к NFS-разделу, он получит права пользователя nobody. Для разрешения прав до возможности полного доступа к NFS- разделу необходимо использовать опцию no_root_squash.

В /etc/hosts.allow необходимо поместить строку для разрешения доступа к NFS-серверу из компьютеров в локальной сети:

portmap 192.168.64.0/255.255.255.0

Для настройки NFS клиента (Linux) необходимо выполнить:

mount Цo rsize=1024,wsize=1024 NFSserver:/home /mnt/nfs

Для обеспечения возможности автоматического монтирования необходимо добавить в /etc/fstab строку:

NFSserver:/home /mnt/nfs nfs rsize=1024,wsize=1024,hard,intr 0 0

Для процессоров Intel более эффективно использовать rsize=4096.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Введение Up: Сетевые файловые системы Previous: Обобщение   Contents   Index

Samba



Subsections

Alex Otwagin 2002-12-16

next up previous contents index
Next: Ссылки Up: Файловая система Previous: Присоединение других файловых систем   Contents   Index

Домашний каталог

Каждый пользователь системы имеет свой личный каталог, котоpый называется начальным каталогом или домашним. Пpи входе в систему после ввода имени и паpоля вы окажетесь в вашем личном каталоге. Имя начального каталога пользователя хpанится в системной пеpеменной ``$HOME''.

Каталог, в котоpом вы pаботаете в настоящее вpемя называется текущим или pабочим (current working directory). Именно с текущего каталога начинается поиск файла. Пpи создании нового файла, он также будет pазмещен в текущем каталоге. После входа в систему ваш личный каталог является текущим.

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

Каталог является специальным файлом, котоpый содеpжит имена файлов, pазмещенных в этом каталоге, а также имена подкаталогов и ссылки на них. По отношению к подкаталогам, текущий каталог является pодительским (parent directory). Для обозначения каталогов используются следующие системные имена:
. (точка) - текущий каталог
.. (две точки) - pодительский каталог, pасположенный на один уpовень ближе к коpню.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Установка Up: Samba Previous: Samba   Contents   Index

Введение

Samba - это набор приложений, позволяющих ОС Linux взаимодействовать с сетью, построенной на основе MS Windows, причем как в роли клиента сетей MS Windows, так и в роли сервера. Пакет Samba реализует протокол Server Message Block (SMB), который иногда называют также Session Message Block (SMB), протоколом NetBIOS или протоколом LanManager. Ниже мы рассмотрим работу программ этого пакета, таких как smbclient, smbmount и smbumount. Если Вы не найдете этих программ на своем компьютере, то установите пакет Samba (например, samba-client-2.0.5a-2bc.i386.rpm, но возможно у Вас окажется другая версия).

Протокол SMB используется Microsoft Windows 3.11, NT, 95/98 и т.д. для организации доступа к дискам и принтерам. Таким образом, четыре основные вещи, которые можно делать с помощью Samba:

  1. Давать доступ к дискам Linux Windows-машинам.
  2. Получать доступ к SMB-ресурсам с машин под Linux.
  3. Давать доступ к принтерам Linux для Windows-машин.
  4. Получать доступ к принтерам Windows из Linux-систем.

Заметим, что для доступа к SMB-ресурсам с машин с Windows 3.x, на них должен быть установлен стек TCP/IP и библиотеки Win32s. Оба этих компонента доступны с сервера фирмы Microsoft.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Запуск демонов Up: Samba Previous: Введение   Contents   Index

Установка

Прежде всего, для того чтобы использовать Samba ваша машина должна находится в одиночном ethernet-сегменте локальной сети и использовать протокол TCP/IP. Samba не будет работать при использовании других сетевых протоколов. Это требование в общем легко осуществимо, поскольку Linux и Windows 95/98/NT поставляются с поддержкой TCP/IP.

Для того, чтобы установить TCP/IP на машине с Windows 95/98 , выберите Control Panel - Network , затем добавьте и настройте Microsoft TCP/IP. В Windows NT, выберите Control Panel - Network - Protocols.

Для того, чтобы получить исходные тексты последней версии Samba, свяжитесь с ftp://ftp.samba.org/ и выберите ближайший к Вам сервер- зеркало. В большинстве случаев дистрибутив Linux поставляется с пакетом, который содержит свежую версию Samba.

Следующие два демона необходимы для работы пакета Samba. Они обычно устанавливаются в /usr/sbin и запускаются либо при загрузке из системных скриптов, либо из inetd. Примеры скриптов даны ниже.

  1. smbd - Демон SMB.
  2. nmbd - Обеспечивает поддержку сервера имен NetBIOS для клиентов.

Заметим, что сервис имен, предоставляемый демоном nmbd, является отличным от сервиса имен, предоставляемого Domain Name Service (DNS). Сервис имен NetBIOS является сервисом имен в стиле Windows, используемым SMB. Другими словами, имеющийся сервис имен DNS никак не используется Samba для нахождения имен машин.

Обычно следующие двоичные файлы Samba устанавливаются в директорию /usr/bin, хотя их расположение опционально.

  1. smbclient - Клиент SMB для UNIX-машин.
  2. smbprint - скрипт для печати на принтер на SMB-машине.
  3. smbprint.sysv - такое как выше, но для машин с SVR4 UNIX.
  4. smbstatus - Перечисляет текущие SMB-соединения для локальной машины.
  5. smbrun - glue скрипт для запуска приложений на SMB- машине.

Двоичные файлы относящиеся к поддержке файловой системы smbfs обсуждаются далее.

Дополнительно предоставляется скрипт, названный print, который служит как полезная надстройка над скриптом smbprint.

Пакет Samba очень прост в установке. Просто получите исходные тексты по адресу, указанному выше, и прочитайте файл README в дистрибутиве. Также в дистрибутиве есть файл docs/INSTALL.txt, который дает набор пошаговых инструкций. Последующая установка, поместит демоны в /usr/sbin и двоичные файлы в /usr/bin. Установите справочные страницы в /usr/local/man.

При установке пакета Samba, нужно указать в Makefile расположение файла конфигурации, smb.conf. Обычно это /etc, но Вы можете поместить его куда угодно. Далее будем предполагать, что вы указали расположение файла конфигурации как /etc/smb.conf, расположение файла протокола как log file = /var/log/samba-log.%m и блокировочной директории как lock directory = /var/lock/samba.

Установите файл конфигурации smb.conf. Перейдите в директорий, где была скомпилирована Samba. Посмотрите в поддиректорий examples/simple и прочтите файл README. Скопируйте файл smb.conf найденный в этом директории в орию /etc. Если у Вас дистрибутив Linux с установленной Samba, то файл конфигурации Samba может уже быть в /etc. Вы можете начать работать с каким-либо из них. Если Вы не хотите устанавливать файл конфигурации в директорий /etc, то поместите его в другое место, но затем дополнительно поместите символическую ссылку на него в директорию /etc:

ln -s /path/to/smb.conf /etc/smb.conf



Alex Otwagin 2002-12-16

next up previous contents index
Next: Основная настройка (/etc/smb.conf) Up: Samba Previous: Установка   Contents   Index

Запуск демонов

Есть два демона SMB - /usr/sbin/smbd и /usr/sbin/nmbd. В большинстве дистрибутивов Linux, они запускаются, останавливаются и перезапускаются через стартовый скрипт, расположенный в /etc/rc.d/init.d/smb, на который созданы символьные ссылки с соответствующих уровней запуска.

Если Вы не будете использовать стандартные стартовые скрипты, то можете запустить демоны Samba из inetd или как автономные процессы. Samba будет ``отвечать'' чуть быстрее когда она запущена как автономный процесс, чем в случае, когда она запусчена из inetd. В некоторых случаях нужно проверить наличие в файле /etc/services примерно таких строк:

netbios-ns      137/tcp         nbns
netbios-ns      137/udp         nbns
netbios-dgm     138/tcp         nbdgm
netbios-dgm     138/udp         nbdgm
netbios-ssn     139/tcp         nbssn

Убедитесь, что все они не закомментированы. В зависимости от дистрибутива, может понадобиться вообще добавить их в этот файл. Samba не сможет привязаться к соответствующим портам пока этих строк не будет в файле /etc/services.

Для запуска демонов из inetd, поместите следующие строки в конфигурационный файл inetd, /etc/inetd.conf:

# SAMBA NetBIOS services (for PC file and print sharing)
netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd

Затем перезапустите демон inetd выполнив команду:

kill -HUP 1 `cat /var/run/inetd.pid`

Для запуска демонов из системных стартовых скриптов, поместите следующий скрипт в файл /etc/rc.d/init.d/smb (для большинства дистрибутивов) и создайте на него символические ссылки с именами, указанными в комментариях:

    #!/bin/sh
    #
    # /etc/rc.d/init.d/smb - запускает и останавливает сервисы SMB
    #
    # Следующие файлы должны быть символическими ссылками на этот файл:
    # symlinks:
    #           /etc/rc.d/rc1.d/K35smb  (Убивает сервисы SMB при выключении
    #           /etc/rc.d/rc3.d/S91smb  (Запускает сервисы SMB в многопользовательском режиме)
    #           /etc/rc.d/rc6.d/K35smb  (Убивает сервисы SMB при перезагрузке)
    #
    # Source function library.
    . /etc/rc.d/init.d/functions
    # Source networking configuration.
    . /etc/sysconfig/network
    # Check that networking is up.
    [ ${NETWORKING} = "no" ] && exit 0
    # See how we were called.
    case "$1" in
      start)
        echo -n "Starting SMB services: "
        daemon smbd -D
        daemon nmbd -D
        echo
        touch /var/lock/subsys/smb
        ;;
      stop)
        echo -n "Shutting down SMB services: "
        killproc smbd
        killproc nmbd
        rm -f /var/lock/subsys/smb
        echo ""
        ;;
      *)
        echo "Usage: smb {start|stop}"
        exit 1
    esac

Если при старте Samba Вы получаете сообщение в котором говорится, что демон не может подключится к порту 139, то вероятно уже есть запущенные процессы Samba, которые не были завершены. Посмотрите список процессов (используя команду ps auxww | grep mbd) для того, чтобы определить есть ли еще запущенные сервисы Samba.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Организация доступа к дискам Up: Samba Previous: Запуск демонов   Contents   Index

Основная настройка (/etc/smb.conf)

Настройка Samba в Linux (или других UNIX-машинах) контролируется единственным файлом, /etc/smb.conf. Этот файл определяет, к каким системным ресурсам Вы хотите дать доступ ``из внешнего мира'' и какие ограничения Вы хотите дать на использование этих ресурсов.

Так как следующие абзацы посвящены организации доступа к дискам и принтерам Linux для Windows-машин, то файл smb.conf, показанный в этом разделе является примером, исключительно в целях ознакомления.

Каждый раздел файла начинается с заголовка раздела, такого как [global], [homes], [printers], и т.п.

Секция [global] определяет некоторые переменные, которые Samba будет использовать для определения доступа ко всем ресурсам.

Раздел [homes] позволяет удаленным пользователям иметь доступ к своим (и только своим) домашним директориям на локальной Linux- машине. Так что, если пользователи Windows попытаются подключиться к этому разделу из Windows-машин, то они будут подключены к своим персональным домашним директориям. Заметим, что для достижения этой цели, они должны быть зарегистрированы на Linux-машине.

Простой файл smb.conf, приведенный ниже, позволяет удаленным пользователям иметь доступ к их домашним директориям на локальной машине и писать во временный директорий. Для того, чтобы пользователи Windows могли увидеть эти ресурсы машина с Linux должна быть в локальной сети. Затем пользователи просто подключают сетевые диски с помощью Windows File Manager или Windows Explorer.

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

; /etc/smb.conf
;
; Убедитесь и перезапустите сервер после внесения изменений в этот
; файл, например:
; /etc/rc.d/init.d/smb stop
; /etc/rc.d/init.d/smb start
[global]
; Раскомментируйте эту строку, если Вы хотите дать доступ пользователю "гость"
; guest account = nobody
   log file = /var/log/samba-log.%m
   lock directory = /var/lock/samba
   share modes = yes
[homes]
   comment = Home Directories
   browseable = no
   read only = no
   create mode = 0750
[tmp]
   comment = Temporary file space
   path = /tmp
   read only = no
   public = yes

Написав новый файл smb.conf, полезно проверить его правильность. Вы можете проверить правильность написания файла smb.conf, используя утилиту testparm (справочная страница: testparm); если testparm сообщает об отсутствии ``проблем'', то smbd правильно загрузил файл настроек.

Если сервер Samba имеет больше одного Ethernet-интерфейса, то smbd может подключится к неправильному. Если это так, то Вы можете принудительно подключаться к нужному интерфейсу, добавив строку в раздел [global] файла /etc/smb.conf:

interfaces = 192.168.1.1/24

Здесь замените приведенный адрес на адрес нужного интерфейса Ethernet. Значение 24 является правильным для сети класса C, но Вам может понадобиться пересчитать это значение, если существует разбиение на подсети. Это число относится к сетевой маске. Числа для других классов сетей приведены в описании IP-Masquerade.

Также существует GUI-утилита для настройки Samba: GtkSamba. Смотрите страницу по адресу http://www.open-systems.com/gtksamba.html.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Доступ к SMB-ресурсам из Up: Samba Previous: Основная настройка (/etc/smb.conf)   Contents   Index

Организация доступа к дискам Linux для машин под Windows

Как показано выше в файле smb.conf, организация доступа к дискам Linux для пользователей Windows является довольно простым делом. Однако, с помощью Samba Вы можете контролировать доступ расширенными возможностями. Ниже приводится несколько примеров:

Чтобы организовать доступ для всех пользователей, создайте копию раздела [tmp], приведенного выше, добавив в smb.conf что-то подобное:

[public]
   comment = Public Stuff
   path = /home/public
   public = yes
   writable = yes
   printable = no

Теперь у Вас будет возможность запустить Samba и просмотреть доступные ресурсы из Windows PC. Однако, с недавнего времени Microsoft ``усложнила жизнь'' тем, кто использует Samba. Windows 98, Windows NT (service pack 3 или выше) и поздние версии Windows 95 по умолчанию используют шифрованные пароли, а Samba по умолчанию использует нешифрованные пароли. Вы не сможете просматривать содержимое сервера, когда либо клиент либо сам сервер использует шифрованные пароли, потому что соединение не может быть создано без регистрации.

Если существует несоответствие типов паролей между клиентом и сервером и Вы пытаетесь подключится к ресурсу, то можете увидеть окно диалога в котором будет сказано примерно следующее: You are not authorized to access that account from this machine. Вам нужно настроить Samba-сервер для использования шифрованных паролей, либо настроить машины с Windows таким образом, чтобы они использовали нешифрованные пароли. Для того, чтобы заставить Windows работать с нешифрованными паролями SMB сделайте следующее:

Windows 95/98
=============
Используя редактор registry (regedit), создайте ключ registry
HKEY_LOCAL_MACHINE - System - CurrentControlSet - Services - VxD - VNETSUP
Добавьте значение типа DWORD:
Имя значения:  EnablePlainTextPassword
Данные:        0x01.

Windows NT
==========
Используя редактор registry (regedit), создайте ключ registry
HKEY_LOCAL_MACHINE - System - CurrentControlSet - Services - Rdr - Parameters
Добавьте значение типа DWORD:
Имя значения:  EnablePlainTextPassword
Значение:        0x01

Windows 2000
============
Using the registry editor (regedit), create the registry setting
HKEY_LOCAL_MACHINE - SYSTEM - CurrentControlSet - Services - LanmanWorkStation - Parameters
Add a new DWORD value:
Value Name: EnablePlainTextPassword
Data: 0x01

После того, как Вы сделали эти изменения, перезагрузите машину с Windows и попытайтесь подключить сетевой диск к серверу Samba.

Для того, чтобы настроить Samba для использования шифрованных паролей в раздел [global] файла /etc/smb.conf, добавьте следующие строки:

encrypt passwords = yes
smb passwd file = /etc/smbpasswd
\begin{verbatim}

Настоятельно рекомендуется прочитать файлы \verb|ENCRYPTION.txt|,
\verb|Win95.txt| и \verb|WinNT.txt| в документации по Samba до того как Вы
будете делать это.

Если и клиенты и сервер используют шифрованные пароли, то Вы не
сможете просмотреть списки доступных ресурсов до тех пор, пока
начальное соединение не будет сделано с указанием правильных
параметров входа. Для того чтобы сделать первоначальное
соединение, введите вручную имя ресурса в диалоговом окне Windows
File Manager или Explorer, имя должно быть в форме
\verb!\\<hostname>\<sharename>!. Подключитесь к серверу с достоверными
для данного сервера именем и паролем.

Если Вы видите, что сервис имен NetBIOS неправильно настроен
(например, Вы получаете сообщение об ошибке \verb|host not found|
(машина не найдена) при попытке подключения), то попытайтесь
использовать IP-адрес сервера: \verb!\\<host ip address>\<sharename>!.

Для того, чтобы имена отображались правильно, может понадобиться
указать некоторые настройки в соответствующем разделе для ресурса.
Настройки достоверно работают для клиентов под управлением
95/98/NT, но может быть необходимо изменить их, если вы
используете в качестве клиентов машины с Windows 3.X.

\begin{verbatim}
    ; Mangle case = yes seems to give the correct filenames
    ; for Win95/98/NT.
    mangle case = yes
    ; If samba is case sensitive when looking for files
    case sensitive = no
    ; Default case of files that are created
    default case = lower
    ; Preserve case for all filenames
    preserve case = yes
    ; Preserve case for dos (8.3) filenames
    short preserve case = no

Значение после знака / - это ссылка на сетевую маску. Для сети класса С этим значением будет 24. Для получения дополнительной информации о том, как вычислять значения для подсетей, Вы можете посмотреть информацию по адресу http://www.ralphb.net/IPSubnet/.

Конечно, настройка Samba более объемна, чем приведено здесь. Если Вы хотите сделать что-то более сложное, то рекомендуется посетить сервер Samba, упомянутый выше.

Чтобы сделать директорий доступным для чтения всеми, но разрешить писать в нее только пользователям из группы staff, измените запись как показано в следующем примере:

[public]
   comment = Public Stuff
   path = /home/public
   public = yes
   writable = yes
   printable = no
   write list = @staff

Для изучения других приемов изменения прав доступа к дискам, смотрите документацию на Samba и справочные страницы.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Доступ к принтеру Linux Up: Samba Previous: Организация доступа к дискам   Contents   Index

Доступ к SMB-ресурсам из Linux

Машины с Linux (UNIX) могут также просматривать и монтировать SMB- ресурсы. Заметим, что это может быть сделано в двух случаях: когда сервером является машина с Windows либо машина с сервером Samba.

Программа клиента SMB для UNIX-машин включена в дистрибутив Samba. Она обеспечивает ftp-подобный интерфейс командной строки. Можете использовать эту утилиту для переноса файлов между сервером под управлением Windows и клиентом под Linux. Большинство дистрибутивов Linux также включают поддержку smbfs, которая позволяет монтировать и размонтировать SMB-ресурсы.

Для того, чтобы увидеть какие ресурсы доступны на сервере, выполните команду:

/usr/bin/smbclient -L host

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

smbclient -L zimmerman

Вывод результата работы этой команды должен выглядеть примерно так:

Server time is Sat Aug 10 15:58:27 1996
Timezone is UTC+10.0
Password:
Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]
        Sharename      Type      Comment
        ---------      ----      -------
        ADMIN$         Disk      Remote Admin
        public         Disk      Public
        C$             Disk      Default share
        IPC$           IPC       Remote IPC
        OReilly        Printer   OReilly
        print$         Disk      Printer Drivers
This machine has a browse list:
        Server               Comment
        ---------            -------
        HOPPER               Samba 1.9.15p8
        KERNIGAN             Samba 1.9.15p8
        LOVELACE             Samba 1.9.15p8
        RITCHIE              Samba 1.9.15p8
        ZIMMERMAN

Browse list показывает другие SMB сервера в сети с доступными ресурсами.

Для подключения клиента, выполните следующую команду:

usr/bin/smbclient service <password>

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

/usr/bin/smbclient \\\\zimmerman\\public mypasswd

где mypasswd - символьная строка пароля.

Далее Вы получите приглашение smbclient:

Server time is Sat Aug 10 15:58:44 1996
Timezone is UTC+10.0
Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
smb: \>

Введите h чтобы получить помощь об использовании smbclient:

smb: \> h
ls             dir            lcd            cd             pwd
get            mget           put            mput           rename
more           mask           del            rm             mkdir
md             rmdir          rd             prompt
recurse
translate      lowercase      print          printmode      queue
cancel         stat           quit           q              exit
newer          archive        tar            blocksize
tarmode
setmode        help           ?              !
smb: \>

Если Вы умеете использовать ftp, то нет нужны изучать справочные страницы по smbclient.

Для практической работы с Samba, Вам скорее всего понадобится пакет smbfs. smbfs поставляется с двумя простыми утилитами, smbmount и smbumount. Они работают подобно mount и umount применительно к SMB-ресурсам.

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

Следующий пример показывает типичное использование smbmount для монтирования SMB-ресурса, названного customers на машины с именем samba1:

[root@postel]# smbmount "\\\\samba1\\customers" -U rtg2t -c 'mount /customers -u 500 -g 100'
Added interface ip=192.168.35.84 bcast=192.168.255.255
nmask=255.255.0.0
Got a positive name query response from 192.168.168.158 (192.168.168.158 )
Server time is Tue Oct  5 10:27:36 1999
Timezone is UTC-4.0
Password:
Domain=[IPM] OS=[Unix] Server=[Samba 2.0.3]
security=user

Результат работы команды mount покажет вам, что ресурс смонтирован точно также, как и в случае с NFS:

[root@postel]# mount
/dev/hda2 on / type ext2 (rw)
none on /proc type proc (rw)
none on /dev/pts type devpts (rw,mode=622)
//SAMBA1/CUSTOMERS on /customers type smbfs (0)

Прочитайте справочные страницы smbmount и smbumount для получения дополнительной информации об описанных выше операциях.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Доступ к принтеру Windows Up: Samba Previous: Доступ к SMB-ресурсам из   Contents   Index

Доступ к принтеру Linux для Windows-машин

Для организации доступа к Linux-принтеру из Windows-машин, вам необходимо убедиться, что принтер работает и под Linux. Если вы можете печатать из под Linux, то организация доступа к принтеру будет очень простой.

Заметьте, что для печати пользователи Windows должны быть зарегистрированы на сервере Linux/Samba. Windows 95/98 будет пытаться аутентифицироваться на сервере печати с теми именем и паролем, которые использовались при ``входе'' на машину Windows Это значит, что если Вы нажали на Cancel (Отмена) при ``входе'' в Windows, то не сможете ни печатать, ни подключаться к SMB сервисам. Windows NT позволяет более эффективно задавать имя и пароль при подключении к принтеру.

Смотрите соответствующие разделы помощи для изучения настроек печати.

Добавьте настройку принтера в файл smb.conf:

[global]
   printing = bsd
   printcap name = /etc/printcap
   load printers = yes
   log file = /var/log/samba-log.%m
   lock directory = /var/lock/samba
[printers]
   comment = All Printers
   security = server
   path = /var/spool/lpd/lp
   browseable = no
   printable = yes
   public = yes
   writable = no
   create mode = 0700
[ljet]
   security = server
   path = /var/spool/lpd/lp
   printer name = lp
   writable = yes
   public = yes
   printable = yes
   print command = lpr -r -h -P %p %s

Убедитесь, что путь к принтеру (в этом случае для [ljet]) соответствует буферному директорию, указанному в файле /etc/printcap.

Строки:

   printcap name = /etc/printcap
   load printers = yes

контролируют, должны ли все принтеры, перечисленные в /etc/printcap по умолчанию быть загружены. Если Вы введете указанные строки, то нет необходимости в настройке каждого принтера по отдельности. Раздел [printers] содержит настройки для принтеров, которые Вы хотите определить явно. Если используемая подсистема печати не работает подобным образом (BSD), то необходимо настроить ``фальшивый'' файл printcap (или используйте print command, смотрите ниже). Дополнительная информация о системе printcap содержится в фалах помощи.

Полезным приемом при проверке сетевых соединений является модификация команды печати:

   print command = cp %S /tmp/print.%P.%S
\emd{verbatim}

Итоговый файл может быть проанализирован.

Существуют некоторые проблемы с доступом к принтерам UNIX-машин из
машин Windows NT с использованием Samba. Одна из проблем состоит в
том, что NT может неправильно видеть сетевой принтер. Для решения
этой проблемы, смотрите замечание в файле \verb|docs/WinNT.txt|
дистрибутива Samba. Другая проблема связана с паролями. Смотрите
комментарий в том же самом файле.

Более удобная для использования команда печати, чем в
вышеприведенном примере:

\begin{verbatim}
print command = smb2ps %s | lpr -r -h -P %p

где smb2ps является скриптом, который преобразует буферный файл, переданный из Windows, в обычно используемый файл Postscript. Он также должен удалять первые три и последние две строки, потому что эти строки содержат некоторые коды PJL или PCL (если печатается PCL, а не настоящий Postscript). Windows 95/98/NT не имеют общего драйвера Postscript, но драйвер принтера Digital turbo Printserver 20 может работать как хороший драйвер Postscript в большинстве случаев. Аналогично может работать и драйвер Apple LaserWriter II NTX.

Если Вы создали буферный каталог для печати, то будьте внимательны с правами доступа. Можно права доступа к буферному каталогу (в нашем случае это, /var/spool/lpd/lpr) сделать равными 4755 (заметьте, что установлен SUID-бит). Это решение пригодно для локальных системных администраторов; если безопасность печати является предметом споров, то можно остановиться на других решениях.

Поблемы с правами доступа на запись в директорий /var/spool/lpd/ могут быть избегнуты при использованиии чего-то подобного path=/tmp и print command = lpr -r -P%p %s.

Иногда возникает ошибка разбора Postscript при печати из машины под Windows, которая вызывает печать лишних страниц в конце каждого задания. Последняя страница всегда будет содержать сообщение %%[ Lastpage ]%% в заголовке. Один из способов обработки этой ошибки - использование скрипта для удаления куска плохого Postscript из задания печати. Другим вариантом является нахождение лучшего драйвера Postscript для Windows. Вероятно, лучший способ состоит в использовании LPRng вместо Postscript для печати на сервер Samba. На сервере Samba, запись в /etc/printcap запись будет выглядеть примерно так:

raw:\
        :rw:sh:
        :lp=/dev/lp1
        :sd=/var/spool/lpd/raw
        :fx=flp

LPRng не требует :\ в конце каждой строки. Запись о принтере все равно необходимо сделать в файле /etc/smb.conf - для физического принтера. Строка команды печати нужна для использования записи raw из файла /etc/printcap, данные должны посылаться в двоичной форме. Попробуйте ввести командную строку:

   print command = lpr -b -Praw %s

Вам также может понадобиться установить буферизацию печати в Windows - для вывода прямо на принтер, вместо использования буфера на сервере.

Если при печати постоянно выводятся лишние страницы в конце заданий Windows-клиентов, то попробуйте добавить директиву sf в файл /etc/printcap, что запретит прогон страниц, разделяющих задание, но не будет влиять на прогон страниц внутри документов.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Подключение к серверу Novell Up: Samba Previous: Доступ к принтеру Linux   Contents   Index

Доступ к принтеру Windows с машин работающих под Linux

Для доступа к принтеру на Windows машине:

  1. Вы должны иметь правильные записи в файле /etc/printcap и они должны соответствовать локальной структуре директориев (для буферизации и т.п.)
  2. У Вас должен быть скрипт /usr/bin/smbprint. Он поставляется вместе с исходными текстами Samba, но не со всеми двоичными дистрибутивами Samba.
  3. Если Вы хотите преобразовывать ASCII файлы в Postscript, вы должны иметь программу nenscript, или ее эквивалент nenscript - конвертер Postscript. Она обычно устанавливается в директорию /usr/bin.
  4. Вы можете сделать печать через Samba более легкой, используя программы-надстройки. Простой скрипт на Perl, который обрабатывает ASCII, Postscript или преобразованный Postscript приведен ниже.
  5. Вы также можете использовать MagicFilter. MagicFilter имеет преимущества потому, что он ``знает'' как автоматически преобразовывать достаточно большое количество форматов файлов.

Запись в файле /etc/printcap, приведенном ниже, сделана для принтера HP 5MP на сервере Windows NT. Используются следующие поля файла /etc/printcap:

Для более детальной информации о печати смотрите справочные страницы по printcap.

# /etc/printcap
#
# //zimmerman/oreilly via smbprint
#
lp:\
        :cm=HP 5MP Postscript OReilly on zimmerman:\
        :lp=/dev/lp1:\
        :sd=/var/spool/lpd/lp:\
        :af=/var/spool/lpd/lp/acct:\
        :mx#0:\
        :if=/usr/bin/smbprint:

Убедитесь, что буферный директорий и директорий, используемый для учета использования, существуют и для них имеется право на запись.

Убедитесь, что строка if содержит правильный путь к скрипту smbprint и убедитесь, что записи указывают на правильное устройство вывода (специальный файл /dev).

Далее приведен сам скрипт smbprint. Он обычно находится в директории /usr/bin и написан человеком, который создал пакет Samba. Этот скрипт поставляется вместе с дистрибутивом исходного кода Samba, но отсутствует в некоторых бинарных дистрибутивах.

#!/bin/sh -x
# Этот скрипт является входным фильтром для основанной на printcap
# печати на unix-машинах. Он использует программу smbclient для
# печати файла на указанный smb-сервер и сервис.
# Например Вы можете быть запись в printcap, подобная этой
#
smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
#
# которая создает unix-принтер названный "smb", который будет
# печатать с помощью этого скрипта. Вам необходимо создать директорий
# спула /usr/spool/smb с соответствующими правами и владельцем
# Установите здесь сервер и сервис на который Вы хотите печатать. В
# этом примере предполагается наличиеWfWg PC, названного "lapland", который
# имеет экспортируемый принтер, называемый "printer" без пароля
#
# Далее скрипт был изменен hamiltom@ecnz.co.nz (Michael Hamilton)
# так:  сервер, сервис и пароль могут быть считаны из файла
# /usr/var/spool/lpd/PRINTNAME/.config
#
# Для того чтобы это работало запись в /etc/printcap должна
# включать файл учета использования (af=...):
#
#   cdcolour:\
#       :cm=CD IBM Colorjet on 6th:\
#       :sd=/var/spool/lpd/cdcolour:\
#       :af=/var/spool/lpd/cdcolour/acct:\
#       :if=/usr/local/etc/smbprint:\
#       :mx=0:\
#       :lp=/dev/null:
#
# Файл /usr/var/spool/lpd/PRINTNAME/.config должен содержать
#   server=PC_SERVER
#   service=PR_SHARENAME
#   password="password"
#
# Например,
#   server=PAULS_PC
#   service=CJET_371
#   password=""
#
# Файл логов. Замените на /dev/null, если хотите.
#
logfile=/tmp/smb-print.log
# logfile=/dev/null
#
# Последним параметром для фильтра является имя файла.
#
spool_dir=/var/spool/lpd/lp
config_file=$spool_dir/.config
# Должны читаться следующие переменные, заданные в
конфигурационном файле:
#   server
#   service
#   password
#   user
eval `cat $config_file`
#
# Некоторая помощь при отладке. Замените >> на > для экономии места.
#
echo "server $server, service $service" >> $logfile
(
# Вы можете добавить строку 'echo translate' для автоматизации.
# CR/LF translation when printing.
        echo translate
        echo "print -"
        cat
) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile

Большинство дистрибутивов Linux поставляется с программой nenscript для преобразования ASCII документов в Postscript. Следующий скрипт на Perl облегчает работу, обеспечивая простой интерфейс для печати с использованием smbprint.

Использование: print [-a|c|p] <filename>
       -a печатает <filename> как ASCII
       -c печатает <filename> отформатированный как исходный код
       -p печатает <filename> как Postscript
        Если опции не заданы, программа попробует определить
        тип файла и соответственно печатать

Используя smbprint для печати ASCII файлов, скрипт отслеживает длинные строки. Если возможно, скрипт разрывает длинную строку на пробеле (вместо разрыва в середине слова).

Форматирование исходного кода таже выполняется с помощью программы nenscript. Она берет ASCII-файл и форматирует его в 2 колонки с заголовком (дата, имя файла и т.п.). Эта программа дополнительно нумерует строки. Используя скрипт как пример, можно ввести другие типы форматирования. Postscript-документы являются уже отформатированными, так что они печатаются сразу.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа в ОС Linux Up: Samba Previous: Доступ к принтеру Windows   Contents   Index

Подключение к серверу Novell Netware

Для того, чтобы подключаться к новеловскому серверу, необходимо установить пакет ncpfs. NCPFS - это файловая система, которая понимает протокол NCP фирмы Novell. Другими словами, это - Netware client для Linux.



Alex Otwagin 2002-12-16

next up previous contents index
Next: Работа в ОС Linux Up: base Previous: Подключение к серверу Novell   Contents   Index

Работа в ОС Linux



Subsections

Alex Otwagin 2002-12-16