. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
В 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Отметьте, что каталоги также могут быть доступны по ссылке, поскольку являются частным случаем файлов.
При запуске консоли появляется приглашение для входа в систему. Введите в поле
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]#Обратите внимание на изменение символа приглашения!
[Ctrl]-[Alt]-[Del]
или введите команду reboot
. В последнем
случае на экран будет выведено приглашение Password:
и Вы должны будете
ввести пароль пользователя, под именем которого Вы работаете. Для того чтобы
прекратить работу и выключить компьютер, введите команду halt
.
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:ввести текущий пароль. Дальнейшая работа программы аналогична описанной выше, однако в этом случае задание простого пароля не допускается.
Консоль - это средство ввода команды в систему и вывода информации о результатах ее работы. Когда Вы работаете с системой через клавиатуру и монитор, непосредственно соединенные с ней, Вы используете консольный терминал. (Система может быть доступна и с помощью других средств, например, через сетевое соединение или другой терминал, соединенный посредством последовательного соединения).
Система Linux поддерживает так называемые ``виртуальные'' консоли, работающие в качестве отдельной консоли, и позволяющие поддержку различных пользовательских сессий, но использующие для взаимодействия с системой единый физический терминал. По умолчанию система Linux конфигурируется с поддержкой 7(семи) ``виртуальных'' консолей. Находясь у консольного терминала, Вы можете свободно переключать ``виртуальные'' консоли, а также регистрироваться в системе с разных консолей одновременно.
Для того, чтобы переключиться в нужную консоль, нажмите одновременно клавиши [ALT]-[Fn], где n означает номер нужной консоли. Например, чтобы переключиться в четвертую консоль, нажмите [ALT]-[F4]. Вы можете использовать для переключения консолей клавиши управления курсором (влево и вправо). Так, чтобы переключиться на консоль с меньшим номером (или на последнюю консоль, если Вы находитесь в первой), нажмите [ALT]-[<-]. Для переключения на консоль с большим номером, нажмите [ALT]-[->].
Седьмая консоль зарезервирована для графического интерфейса X Window. Если X Window установлена, этот виртуальный терминал никогда не выводит приглашение регистрации. Вместо этого, если Вы используете X Window, на этом терминале отображается сессия X Window. Если Ваша система настроена на немедленный запуск X, эта виртуальная консоль покажет экран регистрации X Window.
Из системы X Window переключение в другие виртуальные консоли происходит с помощью комбинации клавиш [CTRL]-[ALT]-[Fn].
Объем текста, который Вы можете пролистать назад, определяется объемом памяти системы.
Примечание: Этот способ прокрутки текста применяется только в командной оболочке shell, в которой Вы окажетесь после регистрации. Он может не работать в консольном приложении или при выполнении определенных команд ОС. Для прокрутки текста в приложениях используйте их собственные возможности прокрутки текста, если таковые имеются.
В Linux файл имеет ``права доступа'' и ``владельца'', который относится к ``группе''. Посмотрите пример:
$ ls -l /bin/ls -rwxr-xr-x 1 root bin 27281 Aug 15 1995 /bin/ls*Первое поле содержит права доступа к файлу
/bin/ls
, который принадлежит
пользователю root
, группы bin
. Опуская другую информацию,
запомните, что означает -rwxr-xr-x
, слева направо:
rwx
являются правами доступа для владельца файла (чтение, запись,
выполнение);
r-x
являются правами доступа для группы, к которой относится
владелец файла (чтение, выполнение);
r-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
, будучи администратором,
может изменять права доступа на файлы любого пользователя.
Большинство операционных систем строится на концепции файлов, и снабжается набором программ для предварительной обработки этих файлов и передачи их более сложным приложениям для дальнейшей обработки: текстовому процессору, электронной таблице, броузеру Web.
Каждое из этих монолитных приложений наверняка содержит операцию ``открытия'' файла, то есть чтения его с диска в специально выделенные структуры памяти; большинство из них содержат команды поиска и замены текста, проверки грамматики, печати документа и т.д. Исходный код приложений для выполнения перечисленных задач хранится отделно внутри каждого приложения, занимая лишнее место в памяти и на диске. Это противоречит идеологии Linux.
К тому же, при использовании платного ПО, настоящий исходный код программ скрыт от пользователей - то есть, другие программисты не могут использовать его в полной мере для целей разработки или обучения. Если Вы приобретаете копию программы, Вы можете пользоваться ею, но никогда не узнаете, как же она действительно работает.
ОС, подобные Linux, не придают приложениям столь значимой роли. Вместо этого, они поставляются со множеством небольших программ, называемых ``инструментами''. Каждый инструмент способен выполнять лишь очень простую, определенную для него задачу - перенаправлять вывод из файлов, посылать вводимую информацию на принтер, сортировать строки в потоке ввода. Отличие состоит в том, что инструмент выполняет свою работу максимально эффективно.
Важным моментом при разработке Unix было введение ``конвейеров'', позволяющих передать результаты работы одного инструмента в качестве исходных данных другому. Зная, что по отдельности делает каждый инструмент и умея их комбинировать, пользователь может создавать достаточно мощные ``цепочки'' команд.
hostname
выводит сетевое имя, присвоенное данной машине, а инструмент who
выводит список пользователей, зарегистрированных в системе в текущий момент.
Более объемная программа, выполняющая широкий круг задач, например, обработку
изображений или редактирование текста, называется приложением.
И инструмент, и приложение могут принимать ряд параметров (называемых также ``флагами'' или ``опциями''), которые определяют специфику их поведения. Они также могут принимать аргументы, определяющие файл для обработки. Аргументы обычно указываются после всех требуемых параметров.
Командой называется наименование инструмента или приложения вместе с используемыми опциями и аргументами. Поскольку для выполнения задачи часто достаточно лишь указания названия инструмента самого по себе, инструменты часто также называют командами.
Большие и малые буквы в командах различаются; названия инструментов и приложений обычно записываются строчными буквами.
Чтобы выполнить программу или приложение без указания ему каких-либо параметров
или аргументов, наберите его имя после приглашения shell и нажмите [Enter].
Например, для запуска инструмента hostname
, введите:
$ hostname [Enter] student_1 $Сетевое имя данной системы `student_1'.
Опции всегда начинаются со знака тире `-', за которым следует цифра или буква. Чтобы включить опцию в команду, ее указывают за именем инструмента или приложения. Необходимо всегда разделять название инструмента, опции и каждый из аргументов пробелами.
Иногда опция сама по себе может принимать аргументы. Например, hostname
содержит опцию `-F', позволяющую указать имя файла, из которого будет прочитано
сетевое имя ; в качестве аргумента она принимает имя файла. Например, для
запуска hostname
с входным файлом `host.info' введите:
$ hostname -F host.info [Enter]
Символ `$'
перед курсором называется приглашением (prompt); он сообщает
Вам, что система ожидает ввода команды. Перед ним может находиться строка,
указывающая имя пользователя, работающего с этой оболочкой и название текущего
каталога. Например:
[student@student_1 student]$ _
Если в приглашении вместо символа `$'
Вы увидите `#'
, это
значит, что Вы зарегистрировались в качестве суперпользователя. Будьте
внимательны и осторожны: сейчас система полностью находится под Вашим
контролем; любая ошибка в команде может стать непоправимой. Для каждого
пользователя полезно иметь отдельный пользовательский бюджет и пользоваться
только им.
В каждой системе Linux есть как минимум одна оболочка, хотя их может быть и несколько. Однако, в большинстве систем Linux стандартной является bash. Все дальнейшие сведения относятся к оболочке bash.
Примечание: Чтобы получить подробную информацию о bash, Вы можете воспользоваться файлом справки `bashref.info'.
Клавиши | Описание | |
текст |
Вставить текст о позиции курсора; если справа от курсора уже есть текст, он сдвигается вправо. | |
[BKSP] |
Удалить символ слева от курсора. | |
[DEL] |
Удалить символ, под которым находится курсор | |
[Enter] |
Выполнить команду, набранную после приглашения bash. Курсор может находиться в любом месте командной строки | |
Ctrl-a |
Переместить курсор в начало строки. | |
Ctrl-d |
Эквивалент [DEL] | |
Ctrl-e |
Переместить курсор в конец строки. | |
Ctrl-k |
Удалить весь текст в строке, начиная с позиции курсора до конца строки. | |
Ctrl-l |
Очистить экран терминала | |
Ctrl-u |
Удалить всю введенную строку | |
Ctrl-y |
Вернуть последний удаленный текст, вставив его от позиции курсора. | |
![]() |
Сдвинуть курсор на один символ влево. | |
![]() |
Сдвинуть курсор на один символ вправо. | |
![]() ![]() |
Вызвать строку из файла истории команд |
Если аргумент содержит одинарные кавычки внутри себя (например, слово с апострофом), его можно заключать в двойные кавычки (""). Здесь приведена таблица наиболее употребительных специальных символов.
Символ | Описание | |
\a |
Сигнал (звуковой) | |
\b |
Backspace | |
\e |
Escape | |
\f |
Пропуск страницы | |
\n |
Новая строка | |
\r |
Возврат каретки | |
\t |
Горизонтальная табуляция | |
\v |
Вертикальная табуляция | |
\\ |
Обратная наклонная черта | |
\NNN |
ASCII-символ с восьмеричным кодом NNN |
[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/
$ clear; logout [Enter]
Чтобы выполнить команду hostname
три раза, введите:
$ hostname; hostname; hostname [Enter] student_1 student_1 student_1 $
Оболочка оперирует с вводимой и выводимой информацией посредством файлов специального вида - ``потоков (streams)''. Стандартный вывод - это файл, в который оболочка выводит результаты работы команд - по умолчанию, на экран Вашего терминала. Стандартный ввод (обычно это клавиатура) является источником данных для команд. Если команда считывает данные из стандартного ввода, она делает это до тех пор, пока Вы не введете Ctrl-d в новой строке.
Если команда завершает выполнение с ошибкой, на экран обычно выводится сообщение об ошибке. Это сообщение принадлежит отдельному стандартному потоку для ошибок.
Вы можете перенаправить вывод вместо этих потоков в другие - например, в файл или команду. Ниже приведены операции перенаправления, которые использует оболочка при работе со стандартным вводом или выводом.
programma
, а файл данных
datafile
. Введите следующую команду:
$ programma < datafile [Enter]
programma
в файл results
, введите:
$ programma > result [Enter]
Если Вы перенаправите стандартный вывод в уже существующий файл, он будет
перезаписан с начала. Чтобы добавить стандартный вывод к содержимому
существующего файла, необходимо использовать оператор `»'. Например, для
добавления результатов работы при повторном запуске программы programma
в
файл results
, введите:
$ programma >> result [Enter]
programma
в файл programma.errors
,
введите:
$ programma 2> programma.errors [Enter]
Чтобы добавить стандартный поток ошибок в уже существующий файл, используйте оператор `»' вместо `>'.
$ programma 2>> programma.errors [Enter]
Чтобы перенаправить в один и тот же файл поток вывода и поток ошибок, используйте оператор `SPMamp;>'.
$ programma &> result_with_errors [Enter]
Например, Вы хотите посмотреть длинный список файлов в каталоге '/usr/bin', используя средство форматирования текста less. Введите:
$ ls -la /usr/bin | less [Enter]
Оболочка присваивает каждому заданию уникальный номер. Вы можете использовать его в качестве аргумента, ссылаясь на это задание в командах управления заданиями. При этом необходимо указывать перед номером задания символ `%'.
После остановки оболочка выведет строку, в которой будет указан номер задания (в квадратных скобках), слово `Stopped', указывающее, что задание остановлено и командная строка, запустившая это задание. Пример:
[1]+ Stopped /usr/bin/mc -P "$@" > "$MC"
В этом примере номер нашего задания - 1, а команда, запустившая приостановленное
задание - /usr/bin/mc -P "$@" > "$MC"
. Символ `+' после номера задания
указывает, что этио задание было остановлено последним.
Если Вы попытаетесь завершить работу в системе при наличии остановленных заданий, оболочка предупредит Вас об этом:
$ logout [Enter] There are stopped jobs. $
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]
$ fg %3 [Enter]
$ jobs [Enter] [1]- Stopped programma1 [2]+ Stopped programma2 $
Этот пример показывает наличие двух запущенных заданий - programma1 и programma2. Символ `+' указывает на самое последнее запущенное задание, а символ `-' указывает все ранее запущенные заадния. Если в оболочке нет запущенных заданий, jobs ничего не возвращает.
$ kill %2 [Enter]
Команды 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", чтобы указать
время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание
должно быть выполнено сегодня, то дату вводить не надо.
Здесь описаны наиболее общие способы настройки оболочки для пользовательских нужд, включая смену текста приглашения и создание псевдонимов команд. Эти изменения вступают в силу до конца Вашей текущей рабочей сессии, или до момента их очередной смены. Однако, Вы можете сохранить их таким образом, чтобы они вступали в силу сразу после регистрации в системе.
Переменная оболочки - это некоторая строка символов, доступная по уникальному имени. Оболочка 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)>
Используйте команду alias (псевдоним) для создания псевдонимов, представляющих собой команду или группу команд. Псевдонимы удобно использовать для определения часто употребляемых коротких имен, используемых вместо длинных имен команд. Например, для определения псевдонима bye для команды exit, введите:
$ alias bye="exit" [Enter]
Вы можете также включить в псевдоним опции и аргументы.Например, для того, чтобы сделать псевдоним команды ls -l, введите следующее:
$ alias lsl="ls -l" [Enter]
Чтобы добавить каталог в системный путь поиска, используйте текстовый редактор и измените значение переменной оболочки `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"
В Вашем домашнем каталоге существует ряд файлов начальной конфигурации, редактируя которые, Вы можете сохранить требуемую конфигурацию. Вы можете также определить в них команды, которые будут выполнены при регистрации, завершении работы или запуске новой копии оболочки. Все эти файлы текстовые и могут быть отредактированы любым текстовым редактором.
Когда Вы впервые регистрируететсь в системе, 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' в Вашем домашнем каталоге, если этот файл существует. Чтобы выполнить команды при выходе из системы, поместите их в данный файл.
В этом разделе изложены основные принципы работы с файлами в системе Linux. Имена файлов состоят из прописных и строчных букв, цифр, точек (`.'), тире (`-'), и символов подчеркивания (`_'). Имена различаются по способу записи - например, `foo', `Foo' и `FOO' являются разными именами. Как правило, имена файлов обычно записывают строчными буквами.
Linux не требует обязательного использования расширений для имен файлов, но добавление расширений очень удобно и полезно, поскольку позволяет Вам легко определить тип файла с первого взгляда. Файлы могут иметь несколько расширений, например `long.file.with.many.extensions', либо не иметь их вовсе - например, `myfile'. Исполняемые файлы различаются системой не по расширению, а по атрибутам файла. Имя файла перед всеми расширениями называется базовым именем файла.
Для того, чтобы создать пустой новый файл, укажите его желаемое имя в качестве аргумента команды touch. Например, для создания файла `a_fresh_start' в текущем каталоге, наберите:
$ touch a_fresh_start [Enter]
Для создания файла `another_empty_file' в подкаталоге `work/completed' текущего каталога, наберите:
$ touch work/completed/another_empty_file [Enter]
Если файл с таким именем не существует, команда touch создаст его; если же он существует, она изменит время модификации этого файла на текущий момент, как если бы файл использовался.
Примечание: Обычно файлы создаются при редактировании в каком-либо редакторе, в этом случае Вам не нужно создавать их самостоятельно.
Чтобы создать новый каталог, используйте команду mkdir, указав в качестве аргумента имя нового каталога. Имена каталогов следуют тем же правилам, что и имена файлов - то есть, отсутствие пробелов, наклонных черт, и других неиспользуемых символов.
Чтобы создать в текущем каталоге новый подкаталог `work', наберите:
$ mkdir work [Enter]
Чтобы создать новый подкаталог `work' в каталоге `/tmp', наберите:
$ mkdir /tmp/work [Enter]
Многопользовательские возможности системы Linux имеют принципиальное значение: любые действия пользователя возможны только после идентификации пользователя с какой-либо из регистрационных записей. Linux предоставляет пользователю возможности, определяемые его правами на работу с файлами и каталогами. Считается, что каждый файл принадлежит определенному пользователю и определенной группе пользователей. С каждым файлом также связана таблица прав, указывающая, какие действия (чтение, запись, исполнение программы, открытие каталога и некоторые другие) может предпринимать владелец файла, член группы, владеющей файлом, и произвольный пользователь.
Кроме регистрационных записей обычных пользователей существует также
регистрационная запись суперпользователя с зарезервированным именем root
.
Суперпользователь может выполнять любые допустимые действия с любым файлом,
независимо от того, кто является его владельцем и какова таблица прав этого
файла. Кроме того, суперпользователь может изменять информацию о владельце
любого файла и его таблицу прав. А также суперпользователь обладает значительно
более широкими правами, не связанными с файловыми операциями.
Даже если Вы являетесь единственным пользователем компьютера, на котором установлена ОС Linux, Вам следует обязательно создать регистрационную запись обычного пользователя и работать с правами этого обычного пользователя, а с правами суперпользователя входить в систему только для операций, требующих таких полномочий. Это связано с тем, что обычный пользователь не в состоянии повредить или удалить никакие файлы, имеющие критически важное значение для работоспособности системы в целом, а суперпользователь - может. Стоит отметить, что операции удаления и перемещения файлов выполняются в Linux значительно менее ``формально'', без многочисленных предупреждений, привычных для пользователей Windows.
Чтобы создать подкаталог вместе со всеми каталогами, расположенными выше, которые еще не существуют, используйте команду mkdir с опцией `-p'. Это очень удобно при создании сложных деревьев каталогов, чтобы не создавать каждый каталог отдельной командой.
Чтобы создать подкаталог `work/completed/2001' - вместе с его корнем `completed', который в свою очередь, является подкаталогом каталога `work' в текущем каталоге, наберите:
$ mkdir -p work/completed/2001 [Enter]
Чтобы изменить текущий рабочий каталог на другой, используйте команду 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 $
$ 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'.
Для копирования файлов используйте команду 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]
Чтобы переместить файл в другое место или изменить его имя, используйте команду 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]
Чтобы полностью удалить файл, используйте команду rm ("remove"). Укажите имя удаляемого файла в качестве аргумента.
Чтобы удалить файл `notes' в текущем рабочем каталоге, используйте:
$ rm notes [Enter]
Чтобы удалить каталог со всеми подкаталогами и файлами в нем, используйте опцию `-R' (``recursive''). Например, для удаления каталога `waste' вместе с его содержимым, наберите:
$ rm -R waste [Enter]
Чтобы удалить пустой каталог, используйте команду rmdir; она удаляет каталог, указанный в качестве аргумента. Если Вы укажете каталог, в котором есть файлы или подкаталоги, rmdir сообщит об ошибке.
Чтобы удалить каталог `empty', введите:
$ rmdir empty [Enter]
Ссылки - это специальный вид файлов, являющихся указателями на другие файлы; когда Вы манипулируете ссылкой, Вы одновременно производите действия над файлом, на который она указывает. Существует две разновидности ссылок: ``жесткие'' ссылки и ``символические'' ссылки.
Жесткая ссылка - это еще одно имя для существующего файла; между ссылкой и оригинальным файлом нет никаких различий. Таким образом, если Вы создаете жесткую ссылку от файла `foo' к файлу `bar', а затем удаляете `bar', файл `foo' также удаляется. Каждый файл имеет как минимум одну жесткую ссылку, которой является само имя данного файла. Каталоги всегда имеют как минимум две жестких ссылки - само имя каталога (которое указано в его родительском каталоге) и специальный файл `.' внутри самого каталога. Точно также при создании нового подкаталога родительский каталог получает новую жесткую ссылку на себя - файл `..' внутри нового подкаталога.
Символическая ссылка (называемая также ``symlink/'' или ``soft link'') передает большинство операций над ней - например, чтение или запись - файлу, на который она указывает, также, как и жесткая ссылка. Однако, ее удаление не приводит к удалению оригинального файла.
Используйте команду ln (``link'') для создания ссылок на файлы. В качестве аргумента следует указать имя исходного файла, на который создается ссылка и новое имя самой ссылки. По умолчанию создаются жесткие ссылки.
Чтобы создать жесткую ссылку от `seattle' к `emerald-city', введите:
$ ln seattle emerald-city [Enter]
Чтобы создать вместо жесткой ссылки символическую, используйте опцию `-s'. Пример:
$ ln -s seattle emerald-city [Enter]
Простейший способ найти нужные файлы - использование утилиты GNU locate. Используйте ее, если Вы хотите увидеть список всех файлов в системе, полное имя которых с указанием пути совпадает с определенным образцом - например, все файлы со словом `audio' в любом месте их полного имени, или все файлы, оканчивающиеся на `.cpp'. При определении образца Вы можете использовать любые метасимволы в имени файла.
Чтобы обнаружить все файлы в системе, имя которых содержит слово `audio', введите:
$ locate audio [Enter]
Чтобы найти все файлы, имя которых оканчивается на `.cpp', введите:
$ locate *.cpp [Enter]
Чтобы вывести список скрытых файлов системы, введите:
$ locate /. [Enter]
Примечание: locate НЕ различает прописные и строчные символы
Чтобы увидеть список в удобной форме, перенаправьте вывод locate в утилиту less.
Используйте утилиту 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
Создание групп, состоящих из пользователей, совместно работающих над определенными проектами, и присвоение каталогам, содержащим файлы этих проектов, соответствующего атрибута группы-владельца, в сочетании с настройкой таблицы прав, определяющих, какие именно операции могут выполнять члены этой группы, дает Вам мощный инструмент для совместной работы над защищенными от постороннего вмешательства данными.
Команда 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 различных форматов данных, включая тексты на нескольких языках, множество графических и звуковых форматов, а также исполняемые файлы для различных операционных систем.
Чтобы сменить время модификации файла `pizzicato' на текущий момент, введите:
$ touch pizzicato [Enter]
Если Вы хотите установить иное время модификации, укажите опцию `-d' и требуемые дату и время в апострофах. Вы можете указать либо дату, либо время, либо и то и другое.
Для установки времени модификации файла `pizzicato' на `17 мая 1999 14:16', введите:
$ touch -d '17 May 1999 14:16' pizzicato [Enter]
Примечание: Если указать только дату, время устанавливается в `0:00'; если не указывать год, будет использован текущий.
Иногда бывает необходимо разделить большой файл на несколько меньших частей. Например, у Вас есть длинный звуковой файл в формате 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.
Существует несколько утилит для сравнения содержимого файлов различными способами. Эти инструменты особенно полезны для сравнения текста в файлах.
Используйте 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]
Для внесения изменений из отчета о различиях в оригинальном и сравниваемом файлах используйте утилиту patch. В качестве аргументов она принимает имя исправляемого файла и имя файла с отчетом о различиях (или файла исправлений). Затем она вносит изменения, указанные в файле исправлений в оригинальный файл. Это особенно удобно для распространения различных версий файла - небольшие файлы исправлений рассылаются по сети гораздо быстрее огромных исходных файлов.
Для обновления файла `manuscript.new' с учетом исправлений `manuscript.diff', введите:
$ patch manuscript.new manuscript.diff [Enter]
Упаковка файлов очень удобна для хранения или передачи больших файлов. Когда Вы упаковываете файл, Вы укорачиваете его и сохраняете пространство на диске. Алогритм упаковки изменяет данные в файле; чтобы использовать их, Вам нужно сначала распаковать и восстановить их.
Для упаковки файлов используйте команду 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.
Архивом называется отдельный файл, содержащий набор нескольких файлов и, возможно, каталогов. Архивы обычно используются для пересылки или создания резервных копий наборов файлов и каталогов - в этом случае Вы будете работать только с одним файлом. Этот единственный файл можно легко упаковать и распаковать, при этом файлы в архиве сохранят свою структуру и права доступа к ним.
Для создания, просмотра и извлечения файлов из архива используйте команду 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]
Работа с текстовым материалом является основным занятием пользователя. Существует множество способов просмотра или вывода текста. Если Вам нужно редактировать текст, простейшим способом является работа с текстовым редактором.
Некоторые типы файлов - такие, например, как PostScript, DVI или PDF - часто содержат внутри текст, но технически не являются текстовыми файлами. Такие файлы просматриваются с помощью специальных программ.
Для удобного просмотра текста по страницам можно использовать less. less работает либо с файлами, либо со стандартным выводом - обычно его используют в качестве последней команды в конвейере, чтобы легко читать вывод от команды.
zless идентичен less, но используется для просмотра упакованных текстовых файлов; он позволяет читать содержимое упакованных текстовых файлов без их распаковки. Практически вся документация в системе в каталогах `/usr/doc' и `/usr/share/doc' состоит из упакованных текстовых файлов.
Для просмотра текстового файла постранично укажите его имя в качестве аргумента команды less. Например, для просмотра файла `README' введите:
$ less README [Enter]
Вы можете перемещаться по документу построчно с помощью клавиши [
],
или поэкранно с помощью [PgDn]. Чтобы переместиться назад на одну строку,
нажмите [
], а для перемещения назад на экран - [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.
Команда | Назначение | |
![]() |
Прокрутка текста на строку назад. | |
![]() |
Прокрутка текста на строку вперед. | |
![]() ![]() |
Прокрутка текста влево или вправо на позицию табуляции. | |
PgUp или SPC | Прокрутка текста вперед на страницу. | |
PgDn | Прокрутка текста назад на страницу. | |
Ctrl-l | Перерисовка экрана. | |
/pattern |
Поиск строк, содержащих образец, вперед по тексту. | |
?pattern |
Поиск строк, содержащих образец, назад по тексту. | |
< |
Перемещение к началу файла. | |
> |
Перемещение к концу файла. | |
h | Экран справки. | |
q | Прекращение просмотра и выход из less. |
Перейдите в текстовую консоль или режим эмуляции терминала и войдите в систему как суперпользователь. Введите в командной строке команду
adduser имя_пользователягде имя_пользователя должно состоять из латинских букв и цифр и начинаться с буквы. В системе не должно существовать регистрационной записи с таким же именем. В случае успешного завершения операции создания новой регистрационной записи никаких сообщений не выдается. Создание регистрационный записи происходит в режиме, когда вход пользователя невозможен, поэтому для вновь созданного пользователя необходимо установить пароль.
Команда adduser
создает регистрационную запись для нового пользователя
(для чего вносит изменения в ряд конфигурационных файлов системы) и создает для
него так называемый домашний каталог
/home/имя_пользователясодержащий некоторые необходимые файлы и подкаталоги. Этот каталог и файлы в нем принадлежат пользователю, и он имеет полный набор прав для работы с этими файлами и подкаталогами, а также для всех вновь создаваемых им в этом каталоге объектов.
Простейший способ вывести текст - использование стандартного вывода. Это удобно для быстрого просмотра части текста, или для передачи ее другим инструментам командной строки.
Многие еще используют для вывода текстовых файлов утилиту 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]
Этот раздел посвящен экранному редактору vi
. Редактор vi
является
мощным средством для создания и редактирования файлов. Он предназначен для
работы на видеотерминале и использует окна, посредством которых вы можете
просматривать текст файла. Несколько простых команд позволяют вам сделать
изменения в тексте, которые очень быстро отображаются на экране. Редактор может
отобразить одну или несколько строк текста. Он позволяет вам передвигать курсор
в любую точку на экране или в файле, создавать, изменять или удалять текст. Вы
можете также использовать некоторые команды построчного редактора, такие как
глобальные команды, которые позволяют вам изменять множество появлений некоторой
строки символов, используя одну команду. Чтобы двигаться по файлу, вы можете
прокручивать текст вперед или назад.
Примечание: Не все терминалы обладают способностью прокрутки текста и
поэтому средство прокрутки текста редактором vi
зависит от типа
используемого терминала.
Редактор vi
имеет более 100 команд. В этом разделе описаны основные
команды, которые позволят вам использовать 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
также можете использовать и для создания или изменения опции
циклического режима.
vi filenameКогда вы введете команду
vi
с именем файла, vi
очистит экран и
отобразит окно, в которое вы можете вводить и редактировать текст.
vi
функционирует в двух режимах: режим ввода и командный режим.
В
режиме ввода вы можете добавлять и модифицировать текст; в командном режиме вы
можете:
Если вы успешно вошли в редактор vi
, то сразу же попадаете в командный
режим и vi
ожидает ввода ваших команд. Чтобы создать текст необходимо:
Если вы указали циклический режим в файле .exrc
, то вы будете переходить
на новую строку всякий раз, когда достигнете точки автоматического возврата
каретки.
После того как вы закончили создавать текст, нажмите клавишу ESCAPE
,
чтобы из режима ввода перейти к командному режиму. Теперь вы можете
редактировать текст, который вы создали или записали
<a> Create some text in the screen editor and return to command mode.<ESC>Если вы нажмете клавишу
ESCAPE
и услышите звуковой сигнал, то это значит,
что вы уже перешли в командный режим. Нажатие клавиши ESCAPE
в то время,
когда вы находитесь в командном режиме, никак не влияет на текст в файле, даже
если вы нажмете ее несколько раз.
В общем случае редактирование файла - это добавление, изменение, удаление текста. Чтобы выполнить эти задачи вы должны научиться переходить от одной страницы текста к другой странице, от одной строки к другой и между определенными точками на строке. В этом подразделе описаны команды добавления и удаления текста и способы премещения курсора.
Клавиши перемещения курсора позволяют вам перемещать курсор по файлу. Курсор можно переместить с помощью следующих клавиш:
Команды j
и k
сохраняют позицию курсора на строке. Например, если
курсор находился на 17-м символе слева, то когда вы введете команду j
или
k
, то он переместится на новую строку, но будет находиться на 17-м
символе. Если символов в новой строке меньше, то курсор переместитcя на
последний символ строки.
Примечание. Некоторые терминалы имеют специальные символы управления курсором, помеченные стрелками. Эти стрелки можно использовать вместо клавиш h, j, k, l.
Если перед h, j, k, l поставить число, то курсор передвинется на
количество строк/символов, равных числу. Например, если надо передвинуть курсор
на 4 строки вверх, введите 4k
. Если вы не можете продвинуться дальше в
этом направлении, то vi
подаст звуковой сигнал и курсор останется на
прежнем месте.
Чтобы переместить курсор на 35 строк вниз, введите 35j
Дополнительно к клавишам h
и l
можно использовать клавиши
SPACEBAR
и BACKSPACE
для перемещения курсора вправо или влево.
Если вы хотите удалить символ, переместите курсор к этому символу и нажмите
x
. Перед x
может стоять число, которое говорит о том, сколько
символов подряд нужно удалить. Редактор vi
так корректирует строку, что
на месте удаленного символа не остается пустого промежутка или на месте
удаленной строки - пустой строки.
В редакторе vi
существует две команды для добавления текста:
insert(i)
и append(a)
. Чтобы добавить текст с помощью команды
i
, переместите курсор в нужное место с помощью клавишей h, j, k,
l. Затем нажмите i
и введите текст. Введенный вами текст появится на
экране слева от символа, на который указывает курсор. Этот символ и все
остальные справа от курсора будут передвинуты вправо, чтобы освободить место для
вашего нового текста. Редактор vi
будет хранить символы, вводимые вами,
до тех пор, пока вы не нажмете клавишу ESCAPE
. Если необходимо,
передвинутые символы будут перенесены на следующую строку.
Таким же образом вы можете использовать команду a
. Отличие состоит в том,
что новый текст появится справа от символа, к которому подведен курсор.
Ранее вы познакомились с тем, как перемещать курсор с помощью клавишей h,
j, k, l, а также BACKSPACE
и SPACEBAR
. В этом подразделе
приводятся еще несколько команд, которые помогут вам быстро перемещать курсор по
экрану. Эти команды выполняются в командном режиме.
Для позиционирования курсора на символ в строке существуют три способа:
Переместить курсор на первый или последний символ в строке можно следующим образом:
Третий способ позиционирования курсора в строке - это поиск указанного символа
на текущей строке. Если символ не найден на текущей строке, то появляется
звуковой сигнал и курсор остается на прежнем месте. Существуют команды, которые
проводят поиск по шаблону. Они будут описаны далее. Здесь приведем 6 команд для
поиска внутри строки: f, F, t, T, :(двоеточие) и ,
(запятая). После
f, F, t и T
вы можете указать символ:
x
справа от текущей
позиции курсора;
x
слева от текущей
позиции курсора;
x
;
x
;
;
запоминает символ
и ищет следующее появление символа в текущей строке;
,
запоминает символ и ищет следующее появление символа в текущей строке;
Команда -
(минус) перемещает курсор на одну строку вверх, позиционируя
его на первом ненулевом символе. Чтобы переместить курсор более чем на один
символ, укажите пред знаком минус количество строк. Например, чтобы переместить
курсор вверх на 13 строк, введите:
13-Если эти строки находятся выше отраженного экрана, то окно переместится так, чтобы открыть их. Этот способ помогает быстро перемещаться по файлу. Если выше окажется меньше 13-ти строк, то звуковой сигнал подскажет вам, что вы сделали ошибку и курсор останется в своем прежнем положении.
Команда +
(плюс) перемещает курсор вниз на одну строку и
позиционирует на первый непустой символ. Перед командой +
можно указать
количество строк, на которое вы хотите переместить курсор. Например, чтобы
переместить курсор на 9 строк вниз, введите:
9+
Если некоторые строки расположены ниже текущего экрана, то окно переместится вниз, чтобы открыть их.
Редактор vi
предполагает, что слово - это строка символов, которая может
включать в себя буквы, цифры и символы подчеркивания. В редакторе vi
существует 6 команд позиционирования: w, b, e, W, B и E
. Команды
w, b, e рассматривают любой символ, отличный от буквы, цифры или
подчеркивания, как разделитель, означающий начало или конец слова. Пунктуация до
или после пустого пространства является разделителем слов. Символ начала или
конца строки также является разделителем.
Команды W, B, E рассматривают пунктуатию как часть слова. Слова разделяются пустым пространством, которое состоит из символов пробел, табуляция и новая строка.
Команды позиционирования:
b
не останавливается в начале строки и продолжает движение к началу
строки;
b
, за исключением того, что слова
разделяются только символами пробел и новая строка. Она рассматривает все другие
символы пунктуации как буквы.
Редактор vi
также распознает предложения. В редакторе vi
предложение заканчивается знаками !, . или ?. Если эти разделители появляются в
середине строки, то за ними должны стоять два пробела, чтобы vi
их мог
распознать.
Вы можете перемещать курсор от предложения к предложению в файле с помощью
команд (
- открывающая скобка и )
- закрывающая скобка.
Параграфы распознаются редактором vi
, если они начинаются после пустой
строки. Если вы хотите перемещать курсор по параграфам, то при создании текста
не забудьте в конце каждого параграфа поставить пустую строку.
Редактор vi
предоставляет вам 3 команды, которые позволяют вам
позиционировать курсор в окне. Эти команды должны быть введены на верхнем
регистре:
В этом подразделе описывается, как переместить курсор на текст, который не отображен на текущем экране. Вы можете сделать это следующим образом:
Четыре команды редактора 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
В нижней части экрана команда ^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
:
Команды /
и ?
не дают вам возможности указать конкретное появление
шаблона с помощью числа. То есть, вы не можете, например, запросить поиск 3-го
появления шаблона, начиная с текущей позиции.
Три основные команды позволяют в редакторе vi
создавать текст:
После того, как вы создали текст с помощью одной из этих команд, можете
возвратиться в командный режим редактора vi
нажав клавишу ESCAPE
.
Чтобы в файл добавить текст, воспользуйтесь следующими командами:
Чтобы в файл вставить текст, воспользуйтесь следующими командами:
Для возврата в командный режим, нажмите клавишу ESCAPE
.
Для открытия строки для текста воспользуйтесь следующими командами:
Вы можете удалить текст с помощью нескольких команд в командном режиме и небольшой объем в режиме ввода.
Если вы находитесь в режиме ввода текста редактора vi
и хотите удалить
символ, воспользуйтесь клавишей BACKSPACE
:
Клавиша BACKSPACE
перемещает курсор назад в режиме ввода текста и удаляет
каждый символ, который курсор переходит. Однако удаленный символ не стирается с
экрана пока вы не нажмете клавишу ESCAPE
для возврата в командный режим.
Удалить текст вы можете и с помощью следующих ключей:
Когда вы вводите ^w
, курсор возвращается на последнее введенное слово и
ожидает на первом символе этого слова. Он не стирает слово с экрана до тех пор,
пока вы не нажмете клавишу ESCAPE
или не введете новые символы на месте
этого слова.
Отменить последнюю введенную команду можно с помощью следующих команд:
Если вы случайно удалили строки, то для отмены команды удаления введите команду
u
. Удаленные строки вновь появятся на экране. Если вы ввели неправильно
команду, то введите команду u
и неверная команда будет отменена. Команда
U
будет аннулировать все изменения в текущей строке до тех пор, пока
курсор будет находиться на этой строке.
Если вы введете команду u
дважды, то вторая команда отменит первую.
Например, если вы удалили по ошибке строку и восстановили ее с помощью команды
u
, то нажав второй раз u
, вы вновь удалите строку. Знание этих
команд может спасти вас от многих неприятностей.
Многие команды редактора vi
, такие как команды удаления и изменения,
предоставляют вам возможность использовать в командной строке команды
перемещения курсора. Команды перемещения курсора могут указывать на объект
текста: слово, строка, предложение, параграф. В этом случае общий формат команды
будет такой:
[number][command]text_objectКвадратные скобки указывают, что данные компоненты не являются обязательными.
Все команды удаления, выдаваемые в командном режиме сразу же удаляют указанный текст с экрана и оставшуюся часть отображают на экране в обновленном виде.
Команда удаления имеет следующий формат:
[number]dtext_objectгде
d
- команда удаления; text_object
- объект удаления.
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:ввести текущий пароль. Дальнейшая работа программы аналогична описанной выше, однако в этом случае задание простого пароля не допускается.
Вы можете удалить слово или часть слова с помощью команды d
. Переместите
курсор к первому удаляемому символу и введите команду dw
. Символ,
расположенный над курсором и последующие за нми будут стерты. Команда dw
удаляет одно слово или знак пунктуации и пробелы, которые следуют за ним. Вы
можете удалить несколько слов или знаков пунктуации за один раз, если укажете
перед командой соответствующее число. Например, чтобы удалить 3 слова и две
запятые, введите команду 5dw
.
Чтобы удалить параграф, воспользуйтесь командой d{
или d}
Помните,
что вы можете восстановить удаленный текст с помощью команды u
.
dd
. Для удаления нескольких строк укажите
перед командой количество удаляемых строк. Например, команда 10dd
сотрет
10 строк.
Если вы удаляете несколько строк, то vi
отображает в нижней части экрана
сообщение типа:
10 lines deletedЕсли ниже текущей строки осталось меньше 10 строк, то прозвучит сигнал и строки не удалятся.
Для удаления всего текста на строке, расположенного после курсора, поместите
курсор на первый удаляемый символ и введите D
или d$
. Эта команда
удаляет текст только на текущей строке.
Один из способов модификации текста представляют команды удаления и команды
ввода текста. Другой способ, с помощью которого вы можете изменить текст, это
задать команду, позволяющую одновременно удалять и создавать текст. В редакторе
vi
существуют 3 основные команды изменения текста: r, s и c
.
x
. Эта команда не устанавливает режим ввода текста и, следовательно, нет
необходимости нажимать после нее клавишу ESCAPE
.
x
. После этой команды также не надо
нажимать клавишу ESCAPE
.
ESCAPE
.
Если будет достигнут конец строки, то эта команда добавит ввод как новый текст.
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
.
ESCAPE
;
ESCAPE
;
Когда вы вводите команду s
, последний символ в строке символов, который
будет заменен, переписывается со знаком $
. Символ не стирается с экрана,
пока вы не введете на его место новый символ, или не нажмете клавишу
ESCAPE
.
Команда подстановки заменяет символы. Команда изменения заменяет объект текста
и затем продолжает добавлять текст с этого места до тех пор, пока вы не нажмете
клавишу ESCAPE
.
Команда изменения может содержать аргумент text_object
. Вы можете
заменить символ, слово и так далее на новый текст:
x
(предложение, параграф);
vi
печатает знак $
, чтобы показать последний символ,
который будет заменен;
c
использует знак $
, чтобы отметить последний символ,
который должен быть замещен. После того как выполнилась команда изменения, вы
находитесь в режиме ввода текста и можете вводить любой текст. Тескт будет
храниться в буфере, пока вы не нажмете клавишу ESCAPE
.
Редактор 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
не
удаляет их с прежнего места в файле, т.е. вы можете поместить один и тот же
кусок текста в нескольких местах.
Перемещение и копирование нескольких разделов текста в различные части файла
является утомительной работой. Редактор vi
предлагает вам использовать так
называемые регистры, в которых вы можете хранить текст до тех пор, пока он вам
не понадобится. Сохранить текст вы можете либо с помощью команды y
, либо
с помощью команды удаления. Использование регистров особенно полезно, если часть
текста должна появиться во многих местах в файле. Извлекаемый текст остается в
указанном регистре пока вы не завершите работу с ним, либо закончите работу с
редактором, либо поместите в этот регистр другой текст.
Общий формат команды:
[number]["X]command[text_object]где X - имя регистра, состоящее из одной буквы верхнего регистра. Имени регистра должны предшествовать двойные кавычки.
В этом подразделе приведены специальные команды, которые будут вам весьма полезны:
Команда .
(точка) повторяет последнюю введенную команду. Очень часто она
используется с командой поиска.
Команда j
объединяет строки. Чтобы ввести эту команду, поместите курсор
на текущей строке и нажмите клавиши SHIFT
и j
одновременно.
Текущая строка объединяется со следующей строкой.
Например, вы имеете две строки текста:
Dear Mr. Smith:Объединим эти две строки в одну. Поместите курсор под любым символом в первой строке и введите команду
j
. На экране появится строка:
Dear Mr. Smith:Обратите внимание, что редактор
vi
автоматически
ставит пробел между последним словом в первой строке и первым словом второй
строки.
Если другой пользователь системы Linux посылает вам собщение с использованием
команды write
, а вы в это время редактируете с помощью vi
, то
посланное сообщение появится в вашем текущем окне поверх текста, который вы
редактируете. Чтобы восстановить редактируемый текст после того, как вы прочтете
посланное сообщение, нужно перейти в командный режим. Если вы находитесь в
режиме ввода текста, то нажмите ^l
. Редактор vi
сотрет сообщение
и восстановит окно в том виде, в котором оно было до прихода сообщения.
Чтобы быстро заменить букву нижнего регистра на букву верхнего регистра, надо
поместить курсор под этой буквой и нажать клавишу ~
(тильда). Вы можете
заменить несколько букв, нажав столько же раз клавишу ~
, либо поставив
перед тильдой число требуемых замен.
Редактор 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
pattern
выполнить команду command редактора ex
. Построчный редактор напечатает
све строки, содержащие pattern
;
pattern
в текущей строке и заменяет
его на new_words
;
ex
заменяет
каждое появление pattern
в текущей строке;
helix
. Каждое найденное слово helix
заменяется на double
helix
. Ограничители после команды s
позволяют не вводить слово
helix
каждый раз. Команда запоминает слово между ограничителями после
команды g
.
Когда вы закончите работу с текстом, необходимо записать содержимое буфера в
файл и возвратить управление 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
. Команды, которым предшествует :
, являются командами
построчного редактора:
vi
в файл, который в данный
момент редактируется и завершить работу с vi
;
vi
;
vi
без записи содержимого
буфера в файл; не учитываются все изменения, проведенные в буфере;
vi
без записи содержимого
буфера в файл. Эта команда работает в том случае, если вы не производили
изменений в буфере. В противном случае vi
выдаст предупреждающее
сообщение о том, что вы должны сохранить буфер или воспользоваться для
завершения работы с vi
командой :q!
.
junk
.
Введите команду:
:w junkЗатем завершите работу с
vi
с помощью :q
.
Если вы попытаетесь записать в уже существующий файл, то получите предупреждающее сообщение. Например, если вы попытаетесь записать в файл johnson, система выдаст сообщение:
"johnson" File exists - use "w!johnson" to overwrite
Если вы хотите заменить содержимое существующего файла на содержимое буфера, то
воспользуйтесь командой :w!
:
:w! johnson
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
имя\_пользователя
, необходимо работать в текстовой консоли с
правами суперпользователя. Введите в командной строке команду
userdel имя_пользователяДля того чтобы удалить регистрационную запись, а также принадлежащие пользователю файлы, введите в командной строке команду
userdel -r имя_пользователяЭта команда удаляет каталог
/home/имя_пользователя
и все его содержимое.
Файлы данного пользователя, расположенные в других местах, не удаляются
автоматически, их необходимо находить и удалять вручную.
Удаление файлов, принадлежавших ранее удаленному пользователю, а также любой другой доступ к ним (например, просмотр) возможен только с правами суперпользователя.
Удаление пользователя невозможно, если он в данный момент зарегистрирован в системе или работает какой-либо процесс, запущенный от его имени.
Наиболее простой путь для печати в операционной системе Linux - это посылка файла для печати прямо на устройство печати. Для того чтобы сделать это, используется команда cat. Зарегистрируйтесь как пользователь root и наберите:
# cat thesis.txt > /dev/lp
В этом случае файл /dev/lp представляет собой символическую ссылку на устройство печати - это может быть матричный или лазерный принтер, или же плоттер.
В целях обеспечения безопасности, только пользователь root и пользователи из той же группы, что и демон принтера (управляющая программа) могут записывать файл прямо на устройство-принтер. Поэтому для доступа к принтеру обычно используют специальные утилиты, такие как lpr, lprm, и lpq.
Пользователи обычно используют для печати файлов утилиту lpr. Команда lpr берет на себя заботы о всей предварительной обработке, необходимой для печати файла, и затем передает управление другой программе, lpd, демону линейной печати. Демон линейной печати непосредственно взаимодействует с принтером и указывает ему, как печатать переданный файл.
Когда выполняется команда lpr, она первым делом копирует заданный файл в определенную директорию (spool directory), где файл остается, пока lpd печатает его. Когда lpd получает сообщение о том, что есть файл для печати, он запускает свою копию процесса. Эта копия процесса будет печатать наш файл, в то время как оригинальный процесс будет ждать других запросов. Это позволяет обслуживать много заданий печати одновременно.
Синтаксис lpr очень прост,
$ lpr [ опции ] [ имя_файла ... ]
Если имя_файла не задано, lpr ожидает ввод данных со стандартного ввода (обычно клавиатура, или вывод другой программы). Это позволяет пользователям перенаправлять вывод команд в очередь печати, например, вот так,
$ cat thesis.txt
lpr|
или,
$ pr -l60 thesis.txt
lpr|
Команда lpr принимает несколько аргументов командной строки, что позволяет пользователям контролировать ее работу. Вот некоторые из часто используемых аргументов:
$ lpr -#2 -sP dj thesis.txt
Эта команда создает символическую ссылку на файл thesis.txt в директории спулинга для принтера названного dj, где он будет обработан демоном печати lpd. Затем будет напечатана вторая копия файла thesis.txt.
Для просмотра содержимого очереди печати используется команда lpq. Команда, запущенная без аргументов, возвращает содержимое очереди печати принтера по умолчанию.
Вывод, возвращаемый lpq, может быть полезен для многих целей.
$ lpq lp is ready and printing Rank Owner Job Files Total Size active mwf 31 thesis.txt 682048 bytes
Другое полезное свойство любой системы печати - это возможность отмены задания, которое было перед этим помещено в очередь. Чтобы сделать это, используйте команду lprm.
$ lprm -
Показанная выше команда отменяет все задания печати, владельцем котрых является пользователь, выполнивший эту команду. Для того, чтобы отменить одиночное задание печати, надо сначала получить номер задания с помощью команды lpq и затем сообщить полученный номер команде lprm. Например,
$ lprm 31
отменит задание номер 31 (thesis.txt) на принтере по умолчанию.
Программа lpc используется для контроля принтеров, которые обслуживает демон lpd. Вы можете разрешать или запрещать использование принтера или их очередей, перераспределять задания внутри очереди, и получать информацию о состоянии принтеров и их очередей. Lpc наиболее часто используется в системах, где несколько принтеров установлено на одну машину.
$ lpc
Команда показанная выше запускает программу lpc. По умолчанию, она входит в интерактивный режим и вы можете начинать вводить команды. Другие опции используются для запуска команды lpc в командной строке.
$ lpc status all
Список всех возможных команд перечислен на странице руководства команды lpd, но здесь перечислено несколько главных команд, которые вы должны знать. Любые команды, обозначенные как option, могут быть либо именем принтера (lp, print, etc) или ключевым словом all, которое обозначает все принтера.
Все команды в системе печати Linux принимают опцию -P. Эта опция позволяет пользователю указать, какой принтер использовать для вывода. Если пользователь не указал, какой принтер использовать, тогда будет использоваться устройство по умолчанию.
Вместо указания какой принтер использовать когда вы печатаете, вы можете установить переменную среды PRINTER со значением имени принтера, который вы хотите использовать. Это делается по разному для каждого из командных процессоров. Например для bash вы можете сделать это следующим образом
$ PRINTER="printer_name"; export PRINTER
Эти команды могут быть помещены в ваш сценарий входа (.profile для bash), или выполнены из командной строки.
Под жизненным циклом программной системы обычно понимают весь период времени существования программной системы, начинающийся с момента выработки первоначальной концепции системы и кончающийся тогда, когда система морально устаревает. Понятие ``жизненного цикла'' используется, когда предполагается, что программная система будет иметь достаточно большой срок действия, в отличие от экспериментального программирования, при котором программы прогоняются несколько раз и больше не используются.
Жизненный цикл традиционно моделируется в виде некоторого числа последовательных этапов (или стадий, фаз). В настоящее время не выработано общепринятого разбиения жизненного цикла программной системы на этапы. Иногда этап выделяется как отдельный пункт, иногда - входит в качестве составной части в более крупный этап. Могут варьироваться действия, производимые на том или ином этапе. Нет единообразия и в названиях этих этапов. Поэтому попытаемся вначале описать некоторый обобщенный жизненный цикл программной системы, а затем продемонстрируем несколько примеров различных жизненных циклов с указанием аналогий из этого обобщенного цикла.
Можно заметить, что в данном жизненном цикле основное внимание уделялось именно программному обеспечению, входящему в состав программной системы, но нельзя забывать, что и остальные компоненты тоже должны проектироваться и реализовываться.
Следует обратить внимание, что разбиение жизненного цикла на этапы иногда способствует затушевыванию некоторых важных аспектов создания программного обеспечения; особенно это проявляется по отношению к такому необходимому процессу, как итерационная реализация различных этапов жизненного цикла с целью исправления ошибок, изменения решений, которые оказались неправильными, или учета изменений в общих требованиях, предъявляемых к системе.
При работе пользователя в текстовой консоли или терминале первичный диалог осуществляет системная программа, называемая командным процессором. В простейшем случае эта программа выдает приглашение и ожидает ввода команды. Команда представляет собой имя исполняемого файла (двоичного или текстового, так называемого скрипта, написанного на одном из специальных командных языков) или имя внутренней команды самого процессора. По окончании работы эти программы, как правило, возвращают управление командному процессору, однако могут также возвращать управление, не завершая работы (при этом командный процессор выдает приглашение, а ранее запущенная программа продолжает работу в фоновом режиме).
Linux может использовать разные командные процессоры, в том числе
несколько одновременно, однако Вам, вероятнее всего, встретится наиболее
распространенный из них Bash
.
В отечественных нормативных документах (например, ГОСТ ЕСПД) принято следующее разграничение на этапы, которое приводится с указанием аналогий из списка, данного в начале раздела:
Подобное описание имеет своим прообразом технологию разработки аппаратных средств и поэтому не вполне учитывает все отличительные особенности проектирования программ. Более подходящим выглядит описание жизненного цикла программного обеспечения, состоящее из 12 этапов, которые очень близки этапам обобщенного жизненного цикла (см. рис. 1.1). В скобках после имени фазы указывается аналог из обобщенного цикла. Практически все этапы заканчиваются проверкой результатов, полученных на соответствующем этапе.
В качестве следующего примера рассмотрим неполный жизненный цикл программного обеспечения, без этапов эксплуатации и сопровождения (см. рис. 1.2). В этом варианте не фиксируется последовательность фаз или этапов, а предлагается перечень действий, которые должны быть выполнены на протяжении жизненного цикла программного обеспечения. Эти действия могут быть разбиты или, наоборот, сгруппированы в различные этапы, в зависимости от конкретных условий. Можно выделить следующие этапы жизненного цикла программных систем (в скобках, как и ранее, - аналоги из модели обобщенного цикла):
Отсутствие интегрированного этапа в обобщенном жизненном цикле не означает, что проверка производится только там, где это явно указано в названии этапа (например 4.2.1 и 4.2). Каждый этап может считаться завершенным только тогда, когда результаты, полученные на данном этапе, были признаны удовлетворительными, а для этого необходимо производить проверку результатов на каждом этапе. В обобщенном жизненном цикле некоторые проверки были вынесены отдельными пунктами для демонстрации повышенных объемов, сложности и важности этих проверок.
Последовательность этапов жизненного цикла для разных программных систем определяется такими характеристиками как функциональные возможности, сложность, размер, устойчивость, использование ранее полученных результатов, разрабатываемая стратегия и аппаратное обеспечение.
На рис. 1.3. показана последовательность этапов разработки программного обеспечения для отдельных компонентов единой программной системы с различными жизненными циклами.
Для компонента W из множества системных требований к единому продукту формируется подмножество требований, относящихся к данному компоненту, используются эти требования при формировании проекта программного компонента, реализовывают этот проект в исходном коде и тогда интегрирует компонент с аппаратурой. Компонент X показывает использование ранее разработанного программного обеспечения. Компонент Y показывает использование простой отдельной функции, которая может быть закодирована прямо на основе требований к программному обеспечению. Компонент Z показывает использование прототипной стратегии. Обычно, целями прототипирования является лучшее понимание требований к программному обеспечению и уменьшение технических рисков и рисков разработки при создании конечного продукта. Исходные требования используются как базис для получения прототипа. Этот прототип преобразуется в окружение, типичное для конкретного использования системы при разработке. Результатом преобразований является уточненные данные, которые используются для создания конечного программного продукта.
Практически все этапы жизненного цикла объединяются с верификацией.
Целями этапа планирования является определение средств для создания программного продукта, которые будут удовлетворять требованиям, предъявляемым к системе, и обеспечивать достаточный уровень надежности. На этом этапе производится:
Верификация программных продуктов представляет собой комбинацию обзора, анализа, разработки тестов и процедур, и выполнение этих процедур. Обзор и анализ обеспечивают оценку точности, полноты и тестопригодности стратегического планирования, архитектуры и исходного кода. Разработка тестов может обеспечить дополнительную оценку внутренней согласованности и полноты постановки задачи. Выполнение тестовых процедур обеспечивает демонстрацию того, что система удовлетворяет требованиям.
Цель верификации программных систем - это определение и выдача отчетов об ошибках, которые могут быть допущены на этапах жизненного цикла. Основные задачи верификации:
В большей степени программные продукты не являются монолитом и имеют конструкцию (архитектуру) построения - состав и взаимосвязь программных модулей.
Модуль - это самостоятельная часть программы, имеющая определенное назначение и обеспечивающая заданные функции обработки автономно от других программных модулей.
Таким образом, программный продукт обладает внутренней организацией, или же внутренней структурой, образованной взаимосвязанными программными модулями. Это справедливо для сложных и многофункциональных программных продуктов, которые часто называются программными системами.
Структуризация программ выполняется в первую очередь для удобства разработки, программирования, отладки и внесения изменений в программный продукт. Как правило, программные комплексы большой алгоритмической сложности разрабатываются коллективом разработчиков (2 - 15 и более человек). Управлять разработкой программ в условиях применения промышленных технологий изготовления программ можно лишь на научной основе.
Таким образом, структуризация программных продуктов преследует основные цели:
Структурное ``разбиение'' программ на отдельные составляющие служит основой и для выбора инструментальных средств их создания, хотя имеет место и обратное влияние - выбор инструментальных средств разработчика программного обеспечения определяет типы программных модулей. При создании программных продуктов выделяются многократно используемые модули, проводится их типизация и унификация, за счет чего сокращаются сроки и трудозатраты на разработку программного продукта в целом.
Некоторые программные продукты используют модули из готовых библиотек стандартных подпрограмм, процедур, функций, объектов, методов обработки данных.
На рис. 1.4 приведена типовая структура программного продукта, состоящего из отдельных программных модулей и библиотек процедур, встроенных функций, объектов и т.п.
Среди множества модулей различают:
В работе программного продукта активизируются необходимые программные модули. Управляющие модули задают последовательность вызова на выполнение очередною модуля. Информационная связь модулей обеспечивается за счет использования общей базы данных либо межмодульной передачи данных через переменные обмена.
Каждый модуль может оформляться как самостоятельно хранимый файл; для функционирования программного продукта необходимо наличие программных модулей в полном составе.
Структурно-сложные программные продукты разрабатываются как пакеты программ, и чаще всего они имеют прикладной характер - пакеты прикладных программ, или ППП.
ППП (application program package) - это система программ, предназначенных для решения задач определенного класса.
Компоненты ППП объединены общими данными (базой данных), информационно и функционально связаны между собой и обладают свойством системности, т.е. объединению программ присуще новое качество, которое отсутствует для отдельного компонента ППП. Структура ППП, как правило, многомодульная.
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' опции с номерами или без номеров уровня, действительной является последняя такая опция.
Библиотека GNU C определяет все библиотечные функции, определенные стандартом ISO C и дополнительные возможности, указанные в стандарте POSIX и иных предписаниях для операционных систем Unix, а также расширения, специфичные для систем GNU. Она является наиболее фундаментальной системной библиотекой и обязательно присутствует в любой системе Linux.
В составе библиотеки можно выделить следующие основные группы функций:
Основная причина, по которой используется ассемблер в Linux - это написание очень небольших по размеру программ, которые не зависят от системных библиотек. Такие программы особенно нужны для встраиваемых систем, где объемы запоминающих устройств обычно невелики.
GAS - это сокращение от GNU Assembler. Поскольку GAS был разработан для поддержки 32-битных компиляторов Unix, он использует стандартный синтаксис AT&T, который несколько отличается от обычного ассемблера DOS. Основные отличия синтаксиса GAS от синтаксиса Intel:
mov eax,edx
(передать содержимое регистра edx в регистр eax) будет выглядеть в GAS как
mov %edx,%eax
.
movl %edx,%eax
. Однако, gas не требует соблюдения строгого синтаксиса
AT&T, так что суффикс необязателен, если размер может быть определен для
регистрового операнда, либо по умолчанию принимается 32-bit.
addl $5,%eax
(добавить константу 5 к регистру %eax).
movl $foo,%eax
помещает адрес переменной foo в регистр %eax, а
movl foo,%eax
помещает в %eax содержимое переменной foo.
Индексация выполняется с помощью заключения индексного регистра в скобки,
например, 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
Рассматривать предупреждения как ошибки.
-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
Добавить каталог в путь поиска включаемых файлов.
Отладчиком называется программа, которая выполняет внутри себя другую программу. Основное назначение отладчика - дать возможность пользователю в определенной степени осуществлять контроль за выполняемой программой, то есть определять, что происходит в процессе ее выполнения. Наиболее известным отладчиком для Linux является программа GNU GDB. GDB содержит множество полезных возможностей, но для простой отладки достаточно использовать лишь некоторые из них.
Когда Вы запускаете программу, содержащую ошибки, обнаруживаемые лишь на стадии выполнения, есть несколько вопросов, на которые Вам нужно найти ответ.
Эти действия требуют, чтобы пользователь отладчика был в состоянии
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 без остановки, пока не достигнет конца текущей функции.
В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:
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.
Утилита UNIX make является простым и наиболее общим решением данной проблемы. В качестве ввода она принимает описание взаимных зависимостей над множеством исходных файлов, а также команды, необходимые для их компиляции. Это описание называется make-файлом. Утилита проверяет ``возраст'' соответствующих файлов, и выполняет все необходимые команды в соответствии с описанием. Для большего удобства она поддерживает несколько стандартных действий и зависимостей по умолчанию, чтобы не описывать их лишний раз.
Существует несколько диалектов make, как среди версий UNIX/Linux, так и в других операционных системх для ПК. Здесь будет описана версия gmake (GNU make).
# Makefile for simple editor
edit : edit.o kbd.o commands.o display.o
![]()
insert.o search.o files.o utils.o
gcc -g -o edit edit.o kbd.o commands.o display.o![]()
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).
Главная цель может быть прямо указана в командной строке при запуске 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.ccedit.o kbd.o commands.o display.o
![]()
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
Порядок, в котором записаны эти правила, не имеет значения. Скорее он зависит от Вашего вкуса и выбора порядка группировки файлов.
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 ='' определяет переменную OBJS, на которую можно в дальнейшем сослаться через ``$(OBJS)'' или ``$OBJS''. Эти более поздние ссылки приводят к тому, что обозначение OBJ будет дословно заменяться, прежде чем правило будет обработано. Иногда неудобно, что и gmake и shell используют `$' как префикс для ссылок на переменные; gmake определяет `$$', такое же, как `$', позволяя Вам передавать `$' в shell, если это необходимо.OBJS = edit.o kbd.o commands.o display.o
![]()
insert.o search.o files.o utils.o
edit : $(OBJS)
gcc -g -o edit $(OBJS)
Иногда Вам может понадобиться величина, выглядящая как обычная переменная, но с некоторыми уточнениями. Например, задавая переменную со списком имен всех исходных файлов, Вы можете захотеть задать имена всех получающихся объектных файлов. Можно переопределить OBJS следующим образом.
SRCS = edit.cc kbd.cc commands.cc display.ccСуффикс уточнения `:.cc=.o' определяет необходимые уточнения. Теперь у нас есть переменные для имен всех исходных и объектных файлов, при этом не пришлось повторять в определениях множество имен.![]()
insert.cc search.cc files.cc utils.cc
OBJS = $(SRCS:.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 во время компиляции.
Традиционные реализации 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которое вызывается, чтобы создать F.o, если существует файл C++ с именем F.cc, но не определяет точные действия для создания F.o. Использование префикса ``CXX'' является следствия соглашения об именах для переменных, связанных с C++. Также создается команда
$(CXX) -c -Wall $(CXXFLAGS) F.cc
F : F.oчтобы сообщить о том, как создать исполняемый файл F из F.o.
$(CC) $(LDFLAGS) F.o $(LOADLIBES) -o F
В результате предыдущий пример можно переписать следующим образом.
# Makefile for simple editorSRCS = edit.cc kbd.cc commands.cc display.cc
![]()
insert.cc search.cc files.cc utils.ccOBJS = $(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
clean:
rm -f *.o
Каждый раз, при выполнении команды gmake clean
, это действие будет
удалять все файлы .o.
Программа gmake обычно выводит инофрмацию о выполнении каждого действия, но иногда это не желательно. Поэтому символ `@' в начале действия может запретить вывод по умолчанию. Вот пример его обычного использования:
edit : $(OBJS)|Результатом этих действий будет то, что в начале компиляции Вы увидите строку ``Linking edit...'', а в конце компиляции - строку ``Done''.
@echo Linking edit ...
@gcc -g -o edit $(OBJS)
@echo Done
Когда gmake встречает действие, возвращающее ненулевой код выхода, т.е. сообщение об ошибке по соглашениям UNIX, его стандартной реакцией является прекращение обработки. Коды ошибок от строк действий, начинающихся с символа `-' (возможно с предшествующим `@') игнорируются. Ключ -k для gmake приводит в случае ошибки к прекращению обработки только текущего правила (и всех, зависящих от него целей), позволяя продолжить обработку всех последующих.
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>
PROGRAM = edit
LOADLIBES = -lg++
CXX.SRCS = edit.cc kbd.cc commands.cc display.cc![]()
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
ОС UNIX поддерживает три типа средств межпроцессной связи:
В данной главе описываются системные вызовы, предназначенные для работы с каждым из них.
В главу включено несколько примеров программ, демонстрирующих использование этих системных вызовов. При написании программ главное внимание уделялось их ясности, а не эффективности.
Средства межпроцессной связи ОС UNIX имеют много общих черт, подробно описанных на примере очередей сообщений. В разделах, посвященных семафорам и разделяемым сегментам памяти, основное внимание сосредоточено на специфике именно этих механизмов.
Очереди сообщений как средство межпроцессной связи дают возможность процессам взаимодействовать, обмениваясь данными. Данные передаются между процессами дискретными порциями, называемыми сообщениями. Процессы, использующие этот тип межпроцессной связи, могут выполнять две операции:
Процессы, имеющие права на операции и пытающиеся послать или принять сообщение, могут приостанавливаться, если выполнение операции не было успешным. В частности это означает, что процесс, пытающийся послать сообщение, может ожидать, пока процесс-получатель не будет готов; наоборот, получатель может ждать отправителя. Если указано, что процесс в таких ситуациях должен приостанавливаться, говорят о выполнении над сообщением ``операции с блокировкой''. Если приостанавливать процесс нельзя, говорят, что над сообщением выполняется ``операция без блокировки''.
Процесс, выполняющий операцию с блокировкой, может быть приостановлен до тех пор, пока не будет удовлетворено одно из условий:
Системные вызовы позволяют процессам пользоваться этими возможностями обмена сообщениями. Вызывающий процесс передает системному вызову аргументы, а системный вызов выполняет (успешно или нет) свою функцию. Если системный вызов завершается успешно, он выполняет то, что от него требуется, и возвращает некоторую содержательную информацию. В противном случае процессу возвращается значение -1, известное как признак ошибки, а внешней переменной errno присваивается код ошибки.
Перед тем, как посылать или принимать сообщения, должны быть созданы очередь сообщений с уникальным идентификатором и ассоциированная с ней структура данных. Порожденный уникальный идентификатор называется идентификатором очереди сообщений (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 со значением IPC_PRIVATE. Если указан такой ``личный'' ключ, для него обязательно выделяется новый уникальный идентификатор и создаются ассоциированные с ним очередь сообщений и структура данных (при условии, что это не приведет к превышению системного лимита). При выполнении утилиты ipcs поле KEY для подобного идентификатора msqid из соображений секретности содержит нули.
Если идентификатор msqid со специфицированным значением ключа key уже существует, выполняется второе действие, то есть возвращается ассоциированный идентификатор. Если Вы желаете трактовать возвращение существующего идентификатора как ошибку, в передаваемом системному вызову аргументе msgflg нужно установить флаг IPC_EXCL.
При выполнении первого действия процесс, вызвавший msgget, становится владельцем / создателем очереди сообщений; соответственно этому инициализируется ассоциированная структура данных. Напомним, что владелец очереди может быть изменен, однако процесс-создатель всегда остается создателем. При создании очереди сообщений определяются также начальные права на выполнение операций над ней.
После того, как созданы очередь сообщений с уникальным идентификатором и ассоциированная с ней структура данных, можно использовать системные вызовы семейства msgop (операции над очередями сообщений) и msgctl (управление очередями сообщений).
Операции, как упоминалось выше, заключаются в посылке и приеме сообщений. Для каждой из этих операций предусмотрен системный вызов, msgsnd() и msgrcv() соответственно.
Для управления очередями сообщений используется системный вызов msgctl. Он позволяет выполнять следующие управляющие действия:
В данном пункте детально описывается системный вызов 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, очередь сообщений и ассоциированная с ней структура данных выделяются в каждом из двух случаев:
Права на выполнение операций есть права на чтение из очереди и запись в нее (то есть на прием / посылку сообщений) для владельца, членов группы и прочих пользователей. В следующей таблице сведены возможные элементарные права и соответствующие им восьмеричные значения:
Права на операции | Восьмеричное значение |
Чтение для владельца | 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.
В данном пункте приводится программа-пример, управляемая посредством меню. Она позволяет поупражняться со всевозможными комбинациями в использовании системного вызова 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 }
В данном пункте детально описывается использование системного вызова 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, ликвидировать чередь сообщений и ассоциированную с ней структуру данных.
Назначение переменных, описанных в программе:
command
Код управляющего действия.
choice
Используется для выбора поля ассоциированной структуры данных, которое нужно изменить.
msqid_ds
Структура для хранения информации об очереди.
Затем нужно ввести код выбранного управляющего действия (строки 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 }
В данном пункте детально описывается использование системных вызовов msgsnd() и msgrcv() и приводится программа-пример, позволяющая поупражняться со всеми их возможностями.
Метасимвол *
осуществляет поиск любой строки символов, включая нулевую
(пустую) строку. Вы можете использовать *
для обозначения полного или
частичного имени файла. Просто символ *
ищет все имена файлов и
справочников в текущем каталоге, за исключением тех, которые начинаются с
точки. Чтобы посмотреть метасимвол *
в действии, введите его как аргумент
в команде echo: echo *
. В ответ система распечатает перечень всех имен
файлов в вашем текущем каталоге.
Символ *
может представлять символы в любой части имени файла. Например,
если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы,
то вы можете выдать запрос, основываясь на этом факте. Если в вашем каталоге
находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то
для отображения всех этих файлов на экране введите команду:
ls F*E
Вы можете, например, с помощью метасимвола *
найти все файлы с именами
memo в системном каталоге:
ls */memo
В справочной статье 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;
При успешном завершении системного вызова 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.
При успешном завершении системного вызова 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.
Назначение переменных, описанных в программе:
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).
Прежде всего программа запрашивает, какую операцию нужно выполнить - послать или принять сообщение. Должно быть введено число, соответствующее требуемой операции; это число заносится в переменную 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 года (по Гринвичу).
Если указано, что требуется принять сообщение, начальное значение указателя 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 }
Рассматриваемые в данном разделе средства позволяют процессам взаимодействовать, изменяя значения объектов, называемых семафорами. Значение семафора - это целое число в диапазоне от 0 до 32767. Поскольку во многих приложениях требуется более одного семафора, ОС UNIX предоставляет возможность создавать множества семафоров. Их максимальный размер ограничен системным парамет- ром SEMMSL. Множества семафоров создаются при помощи системного вызова semget.
Процесс, выполнивший системный вызов semget, становится владельцем / создателем множества семафоров. Он определяет, сколько будет семафоров в множестве; кроме того, он специфицирует первоначальные права на выполнение операций над множеством для всех процессов, включая себя. Впоследствии данный процесс может уступить право собственности или изменить права на операции при помощи системного вызова semctl, предназначенного для управления семафорами, однако на протяжении всего времени существования множества семафоров создатель остается создателем. Другие процессы, обладающие соответствующими правами, для выполнения прочих управляющих действий также могут использовать системный вызов semctl.
Над каждым семафором, принадлежащим множеству, при помощи системного вызова semop можно выполнить любую из трех операций:
Операции могут снабжаться флагами. Флаг SEM_UNDO означает, что операция выполняется в проверочном режиме, то есть требуется только узнать, можно ли успешно выполнить данную операцию.
При отсутствии флага IPC_NOWAIT системный вызов semop может быть приостановлен до тех пор, пока значение семафора, благодаря действиям другого процесса, не позволит успешно завершить операцию (ликвидация множества семафоров также приведет к завершению системного вызова). Подобные операции называются ``операциями с блокировкой''. С другой стороны, если обработка завершается неудачей и не указано, что выполнение процесса должно быть приостановлено, операция над семафором называется ``операцией без блокировки''.
Системный вызов semop оперирует не с отдельным семафором, а с множеством семафоров, применяя к нему ``массив операций''. Массив содержит информацию о том, с какими семафорами нужно оперировать и каким образом. Выполнение массива операций с точки зрения пользовательского процесса является неделимым действием. Это значит, во-первых, что если операции выполняются, то только все вместе и, во-вторых, что другой процесс не может получить доступ к промежуточному состоянию множества семафоров, когда часть операций из массива уже выполнилась, а другая часть еще не успела.
Операционная система, разумеется, выполняет операции из массива по очереди, причем порядок не оговаривается. Если очередная операция не может быть выполнена, то эффект предыдущих операций аннулируется. Если таковой оказалась операция с блокировкой, выполнение системного вызова приостанавливается. Если неудачу потерпела операция без блокировки, системный вызов немедленно завершается, возвращая значение -1 как признак ошибки, а внешней переменной errno присваивается код ошибки.
Перед тем как использовать семафоры (выполнять операции или управляющие действия), нужно создать множество семафоров с уникальным идентификатором и ассоциированной структурой данных. Уникальный идентификатор называется идентификатором множества семафоров (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 для выполнения управляющих действий.
Для создания множества семафоров служит системный вызов 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 описывается начальное значение ассоциированной структуры данных, формируемое в случае успешного завершения системного вызова.
В данном пункте детально описывается использование системного вызова 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, ликвидировать множество семафоров и ассоциированную с ним структуру данных.
/* Программа иллюстрирует возможности системного вызова 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); }
Метасимвол ?
осуществляет поиск любого одного символа в имени файла за
исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и
хотите получить список глав до 9-ой главы. Если ваш каталог содержит следующие
файлы:
Chapter1 Chapter2 Chapter5 Chapter9 Chapter11то введите команду
ls
с метасимволом ?
для получения всех глав,
которые начинаются со строки "Chapter" и заканчиваются одним символом:
$ ls Chapter? Chapter1 Chapter2 Chapter5 Chapter9 $Хотя метасимвол осуществляет поиск одного символа, вы можете использовать его для поиска более одного символа в имени файла. Например, вы получите перечень всех остальных глав в текущем каталоге, если введете следующую команду:
ls Chapter??И, конечно, чтобы получить список всех глав в текущем каталоге, используйте метасимвол
*
:
ls Chapter*
В данном пункте детально описывается использование системного вызова 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>
).
Номер семафора задает конкретный семафор в множестве, над которым должна быть выполнена операция.
Выполняемая операция определяется следующим образом:
IPC_NOWAIT
Если какая-либо операция, для которой задан флаг IPC_NOWAIT, не может быть успешно выполнена, системный вызов завершается неудачей, причем ни у одного из семафоров не будет изменено значение
SEM\_UNDO
Данный флаг задает проверочный режим выполнения операции; он предписывает аннулировать ее результат даже в случае успешного завершения системного вызова semop. Иными словами, блокировка всех операций (в том числе и тех, для которых задан флаг SEM_UNDO) выполняется обычным образом, но когда наконец все операции могут быть успешно выполнены, операции с флагом SEM_UNDO игнорируются.
/* Программа иллюстрирует возможности системного вызова 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); }
Разделяемые сегменты памяти как средство межпроцессной связи позволяют процессам иметь общие области виртуальной памяти и, как следствие, разделять содержащуюся в них информацию. Единицей разделяемой памяти являются сегменты, свойства которых зависят от аппаратных особенностей управления памятью.
Разделение памяти обеспечивает наиболее быстрый обмен данными между процессами.
Работа с разделяемой памятью начинается с того, что процесс при помощи системного вызова shmget создает разделяемый сегмент, специфицируя первоначальные права доступа к сегменту (чтение и / или запись) и его размер в байтах. Чтобы затем получить доступ к разделяемому сегменту, его нужно присоединить посредством системного вызова shmat(), который разместит сегмент в виртуальном пространстве процесса. После присоединения, в соответствии с правами доступа, процессы могут читать данные из сегмента и записывать их (быть может, синхронизируя свои действия с помощью семафоров).
Когда разделяемый сегмент становится ненужным, его следует отсоединить, воспользовавшись системным вызовом shmdt().
Для выполнения управляющих действий над разделяемыми сегментами памяти служит системный вызов shmctl(). В число управляющих действий входит предписание удерживать сегмент в оперативной памяти и обратное предписание о снятии удержания. После того, как последний процесс отсоединил разделяемый сегмент, следует выполнить управляющее действие по удалению сегмента из системы.
Прежде чем воспользоваться разделением памяти, нужно создать разделяемый сегмент с уникальным идентификатором и ассоциированную с ним структуру данных. Уникальный идентификатор называется идентификатором разделяемого сегмента памяти (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 | Не используется |
Состояния, упомянутые в таблице, таковы:
После того, как создан уникальный идентификатор разделяемого сегмента памяти и ассоциированная с ним структура данных, можно использовать системные вызовы семейства shmop (операции над разделяемыми сегментами) и shmctl (управление разделяемыми сегментами).
Для создания разделяемого сегмента памяти служит системный вы- зов 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 описывается начальное значение ассоциированной структуры данных, формируемое в случае успешного завершения системного вызова.
В данном пункте детально описывается использование системного вызова 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.
/* Программа иллюстрирует возможности системного вызова 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 и приводится программа-пример, позволяющая поупражняться со всеми их возможностями.
Если вы хотите, чтобы 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]
- то малые буквы.
В справочной статье 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;
При успешном завершении системного вызова shmat() результат равен адресу, который получил присоединенный сегмент; в случае неудачи возвращается -1. Разумеется, чтобы использовать результат shmat() как указатель, его нужно преобразовать к требуемому типу.
В качестве аргумента shmid должен выступать идентификатор разделяемого сегмента, предварительно полученный при помощи системного вызова shmget.
Аргумент shmaddr задает адрес, по которому сегмент должен быть присоединен, то есть тот адрес в виртуальном пространстве пользователя, который получит начало сегмента. Не всякий адрес является приемлемым. Можно порекомендовать адреса вида
0x80000000 0x80040000 0x80080000 . . .Если значение shmaddr равно нулю, система выбирает адрес присоединения по своему усмотрению.
Аргумент shmflg используется для передачи системному вызову shmat() флагов SHM_RND и SHM_RDONLY. Наличие первого из них означает, что адрес shmaddr следует округлить до некоторй системно-зависимой величины. Второй флаг предписывает присоединить сегмент только для чтения; если он не установлен, присоединенный сегмент будет доступен и на чтение, и на запись (если процесс обладает соответствующими правами).
При успешном завершении системного вызова shmdt() результат равен нулю; в случае неудачи возвращается -1.
Аргумент shmaddr задает начальный адрес отсоединяемого сегмента.
Напомним, что после того, как последний процесс отсоединил разделяемый сегмент памяти, этот сегмент вместе с идентификатором и ассоциированной структурой данных следует удалить с помощью системного вызова shmctl.
/* Программа иллюстрирует возможности системных вызовов 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); }
Эта функция используется для создания сокета. Прототип:
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.
Эта функция используется сервером для присваивания сокету имени. До выполнения функции 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, в противном случае другие программы, которые попытаются использовать данное имя, получат сообщение об ошибке.
Функция listen используется сервером, чтобы информировать ОС, что он ожидает ("слушает") запросы связи на данном сокете. Без такой функции всякое требование связи с этим сокетом будет отвергнуто.
Прототип:
int listen(int s, int backlog);
Первый аргумент - сокет для прослушивания, второй аргумент (backlog) - целое положительное число, определяющее, как много запросов связи может быть принято на сокет одновременно. В большинстве систем это значение должно быть не больше пяти. Заметим, что это число не имеет отношения к числу соединений, которое может поддерживаться сервером. Аргумент backlog имеет отношение только к числу запросов на соединение, которые приходят одновременно. Число установленных соединений может превышать это число.
Эта функция используется сервером для принятия связи на сокет. Сокет должен быть уже слушающим в момент вызова функции. Если сервер устанавливает связь с клиентом, то функция accept возвращает новый сокет-дескриптор, через который и происходит общение клиента с сервером. Пока устанавливается связь клиента с сервером, функция accept блокирует другие запросы связи с данным сервером, а после установления связи "прослушивание" запросов возобновляется.
Прототип:
int accept(int s, char * name, int* anamelen);
Первый аргумент функции - сокет-дескриптор для принятия связей от клиентов. Второй аргумент - указатель на адрес клиента (структура sockaddr ) для соответствующего домена. Третий аргумент - указатель на целое число - длину структуры адреса. Второй и третий аргументы заполняются соответствующими значениями в момент установления связи клиента с сервером и позволяют серверу точно определить, с каким именно клиентом он общается. Если сервер не интересуется адресом клиента, в качестве второго и третьего аргументов можно задать NULL-указатели.
Функция connect используется процессом-клиентом для установления связи с сервером.
Прототип:
int connect(int s, char * name, int namelen);
Первый аргумент - сокет-дескриптор клиента. Второй аргумент - указатель на адрес сервера (структура sockaddr) для соответствующего домена. Третий аргумент - целое число - длина структуры адреса.
Функция возвращает 0, если вызов успешный, и -1 иначе.
shell
имеет также и другие символы, которые выполняют различные полезные
функции.
Функция служит для записи данных в сокет.
Прототип:
int send(int s, char * buf, int len, int flags);
Первый аргумент - сокет-дескриптор, в который записываются данные. Второй и третий аргументы - соответственно, адрес и длина буфера с записываемыми данными. Четвертый параметр - это комбинация битовых флагов, управляющих режимами записи. Если аргумент flags равен нулю, то запись в сокет (и, соответственно, считывание ) происходит в порядке поступления байтов. Если значение flags есть MSG_OOB, то записываемые данные передаются потребителю вне очереди.
Функция возвращает число записанных в сокет байтов ( в нормальном случае должно быть равно значению параметра len ) или -1 в случае ошибки. Отметим, что запись в сокет не означает, что данные приняты на другом конце соединения процессом-потребителем. Для этого процесс-потребитель должен выполнить функцию recv ( см. ниже ). Таким образом, функции чтения и записи в сокет выполняются асинхронно.
Функция служит для чтения данных из сокета.
Прототип:
int recv(int s, char * buf, int len, int flags);
Первый аргумент - сокет-дескриптор, из которого читаются данные. Второй и третий аргументы - соответственно, адрес и длина буфера для записи читаемых данных. Четвертый параметр - это комбинация битовых флагов, управляющих режимами чтения. Если аргумент flags равен нулю, то считанные данные удаляются из сокета. Если значение flags есть MSG_PEEK, то данные не удаляются и могут быть считаны последущим вызовом ( или вызовами ) recv.
Функция возвращает число считанных байтов или -1 в случае ошибки. Следует отметить, что нулевое значение не является ошибкой. Оно сигнализирует об отсутствии записанных в сокет процессом-поставщиком данных.
Эта функция используется для немедленного закрытия всех или части связей на сокет.
Прототип:
int shutdown(int s, int how);
Первый аргумент функции - сокет-дескриптор, который должен быть закрыт. Второй аргумент - целое значение, указывающее, каким образом закрывается сокет, а именно:
Эта функция закрывает сокет и разрывает все соединения с этим сокетом. В отличие от функции 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); }
/* Программа иллюстрирует возможности системного вызова 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); }
/* Программа иллюстрирует возможности системного вызова 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); }
/* Программа иллюстрирует возможности системного вызова 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); }
Пример-оболочка программы "Клиент"
#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); }
Некоторые команды shell
занимают много времени при выполнении. Эти
команды можно запустить в фоновом режиме с использованием &
, освобождая
тем самым терминал для других задач. Общий формат для запуска команд в фоновом
режиме следующий:
command &
Примечание. Интерактивные команды shell
(например, read
) нельзя
запускать в фоновом режиме.
Когда вы запускаете команду в фоновом режиме, то система Linux выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду.
Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность.
Основное назначение компьютерных сетей - совместное использование ресурсов и осуществление интерактивной связи как внутри одной фирмы, так и за ее пределами. Ресурсы (resources) - это данные, приложения и периферийные устройства, такие, как внешний дисковод, принтер, мышь, модем или джойстик. Понятие интерактивной связи компьютеров подразумевает обмен сообщениями в реальном режиме времени.
До появления компьютерных сетей каждый пользователь должен был иметь свой принтер, плоттер и другие периферийные устройства. Чтобы совместно использовать принтер, существовал единственный способ - пересесть за компьютер, подключенный к этому принтеру. Сети позволяют целому ряду пользователей одновременно ``владеть'' данными на носителях прямого доступа и периферийными устройствами. Если нескольким пользователям надо распечатать документ, все они могут обратиться к сетевому принтеру.
Самая простая сеть (network) состоит как минимум из двух компьютеров, соединенных друг с другом кабелем. Это позволяет им использовать данные совместно. Все сети (независимо от сложности) основываются именно на этом простом принципе. Рождение компьютерных сетей было вызвано практической потребностью - иметь возможность для совместного использования данных. Персональный компьютер - прекрасный инструмент для создания документа, подготовки таблиц, графических данных и других видов информации, но при этом Вы не можете быстро поделиться своей информацией с другими. Когда не было сетей, приходилось распечатывать каждый документ, чтобы другие пользователи могли работать с ним, или в лучшем случае - копировать информацию на дискеты. Одновременная обработка документа несколькими пользователями исключалась. Подобная схема работы называется работой в автономной среде.
Сетью называется группа соединенных компьютеров и других устройств. А концепция соединенных и совместно использующих ресурсы компьютеров носит название сетевого взаимодействия. Компьютеры, входящие в сеть, могут совместно использовать:
Данный список постоянно пополняется, так как возникают новые способы совместного использования ресурсов.
Первоначально компьютерные сети были небольшими и объединяли до десяти компьютеров и один принтер. Технология передачи данных ограничивала размеры сети, в том числе количество компьютеров в сети и ее физическую длину. Например, в начале 1980-х годов наиболее популярный тип сетей состоял не более чем из 30 компьютеров, а длина кабеля не превышала 185 м (600 футов). Такие сети легко располагались в пределах одного этажа здания или небольшой организации. Для маленьких фирм подобная конфигурация подходит и сегодня. Эти сети называются локальными вычислительными сетями [ЛВС (LAN)].
Локальные сети не совсем соответствуют потребностям крупных предприятий, офисы которых обычно территориально расположены в различных местах. Этот факт поставил задачу расширения сетей. Так на основе небольших локальных сетей возникли более крупные системы. В настоящее время миллионы ЛВС объединенны в глобальную вычислительную сеть ГВС (WAN), а количество компьютеров в сети достигшает нескольких тысяч.
В настоящее вермя большинство организаций хранит и совместно использует в сетевой среде огромные объемы жизненно важных данных. Вот почему сети сейчас так же необходимы, как еще совсем недавно были необходимы пишущие машинки и картотеки.
Все сети имеют некоторые общие компоненты, функции и характеристики. В их числе
Несмотря на определенные сходства, сети разделяются на два типа:
Различия между одноранговыми сетями и сетями на основе сервера имеют принципиальное значение, поскольку определяют разные возможности этих сетей. Выбор типа сети зависит от многих факторов:
В одноранговой сети все компьютеры равноправны: нет иерархии среди компьютеров и нет выделенного (dedicated) сервера. Как правило, каждый компьютер функционирует и как клиент, и как сервер; иначе говоря, нет отдельного компьютера, ответственного за администрирование всей сети. Все пользователи самостоятельно решают, что на своем компьютере можно сделать общедоступным по сети и кому.
Размеры.
Одноранговые сети называют также рабочими группами. Рабочая группа - это небольшой коллектив, поэтому в одноранговых сетях чаще всего не более 10 компьютеров.
Стоимость.
Одноранговые сети относительно просты. Поскольку каждый компьютер является одновременно и клиентом, и сервером, нет необходимости в мощном центральном сервере или в других компонентах, обязательных для более сложных сетей. Одноранговые сети обычно дешевле сетей на основе сервера, но требуют более мощных (и более дорогих) компьютеров.
Операционные системы.
В одноранговой сети требования к производительности и к уровню зашиты для сетевого программного обеспечения, как правило, ниже, чем в сетях с выделенным сервером. Выделенные серверы функционируют исключительно в качестве серверов. UNIX/Linux поддерживают одноранговые сети используя сетевую файловую систему NFS, а также сервис сети LAN server (smb).
Одноранговая сеть характеризуется рядом стандартных решений:
Целесообразность применения.
Одноранговая сеть вполне подходит там, где:
Если эти условия выполняются, то, скорее всего, выбор одноранговой сети будет правильным (чем сети на основе сервера).
Некоторые соображения.
Несмотря на то что одноранговые сети вполне удовлетворяют потребностям небольших фирм, иногда возникают ситуации, когда их использование может оказаться неуместным. Выскажем некоторые замечания относительно одноранговых сетей, которые Вы должны иметь в виду, выбирая тип сети.
Администрирование.
Сетевое администрирование (administration) решает ряд задач, в том числе:
В типичной одноранговой сети системный администратор, контролирующий всю сеть, не выделяется. Каждый пользователь сам администрирует свой компьютер.
Разделяемые ресурсы.
Все пользователи могут ``поделиться'' своими ресурсами с другими. К совместно используемым ресурсам относятся файлы, принтеры, факс-модемы и т.п.
Требования к серверу.
В одноранговой сети каждый компьютер должен:
Сеть на основе сервера требует более мощных серверов, поскольку они должны обрабатывать запросы всех клиентов сети.
Защита.
Элементарная защита подразумевает установку пароля на разделяемый ресурс, например на каталог. Централизованно управлять защитой в одноранговой сети очень сложно, так как каждый пользователь устанавливает ее самостоятельно, да и ``общие'' ресурсы могут находиться на всех компьютерах, а не только на центральном сервере. Такая ситуация представляет серьезную угрозу для всей сети, кроме того, некоторые пользователи могут вообще не установить защиту. Если для Вас вопросы конфиденциальности являются принципиальными, рекомендуем выбрать сеть на основе сервера.
Подготовка пользователя.
Поскольку в одноранговой сети каждый компьютер функционирует и как клиент, и как сервер, пользователи должны обладать достаточным уровнем знаний, чтобы работать и как пользователи, и как администраторы своего компьютера.
Если к сети подключено более 10 пользователей, то одноранговая сеть, где компьютеры выступают в роли и клиентов, и серверов, может оказаться недостаточно производительной. Поэтому большинство сетей использует выделенные серверы. Выделенным называется такой компьютер, который функционирует только как сервер. Они специально оптимизированы для быстрой обработки запросов от сетевых клиентов и для управления файлами и каталогами. Сети на основе серверов в настоящее время являются промышленным стандартом.
С увеличением размеров сети и объема сетевого трафика необходимо увеличивать количество серверов. Распределение задач среди нескольких серверов гарантирует, что каждая задача будет выполняться самым эффективным способом из всех возможных.
Специализированные серверы.
Круг задач, которые должны выполнять серверы, многообразен и сложен. Чтобы приспособиться к возрастающим потребностям пользователей, серверы в больших сетях специализируются.
Файл-серверы и принт-серверы управляют доступом пользователей соответственно к файлам и принтерам. Файл-сервер предназначен для хранения файлов и данных, а также предоставления доступа пользователям к ним.
На серверах приложений выполняются прикладные части клиент-серверных приложений, а также находятся данные, доступные клиентам. Например, чтобы упростить извлечение данных, серверы хранят большие объемы информации в структурированном виде. Эти серверы отличаются от файл- и принт-серверов. В последних файл или данные целиком копируются на запрашивающий компьютер. А в сервере приложений) на запрашивающий компьютер пересылаются только результаты запроса. Приложение-клиент на удаленном компьютере получает доступ к данным, хранимым на сервере приложений. Однако вместо всей базы данных на Ваш компьютер с сервера загружаются только результаты запроса.
Почтовые серверы управляют передачей электронных сообщений между пользователями сети.
Факс-серверы управляют потоком входящих и исходящих факсимильных сообшений через один или несколько факс-модемов.
Коммуникационные серверы управляют потоком данных и почтовых сообщений между этой сетью и другими сетями, мэйнфреймами или удаленными пользователями через сетевые соединения.
В современной корпоративной сети использование серверов разных типов приобретает особую актуальность. Необходимо поэтому учитывать все возможные нюансы, которые могут проявиться при разрастании сети, с тем чтобы изменение роли определенного сервера в дальнейшем не отразилось на работе всей сети.
Значение программного обеспечения.
Сетевой сервер - это прежде всего программное обеспечение, а не компьютерное железо. В среде современных операционных систем UNIX/Linux и OS/2 сервер представляет собой программу, выполняющуюся от имени некоторого пользователя, и не являющуюся частью оперционной системы. Это стало возможным вследствие хорошо продуманного модульного дизайна как самой ОС, так и интерфейсов OC-приложение. В принципе любой пользователь, владеющий необходимыми знаниями в области сетей и прикладного программирования, может написать полноценный сервер без того, чтобы вникать в недра ядра, драйверов и остальных дебрей ОС.
Разделение ресурсов.
Сервер спроектирован так, чтобы предоставлять доступ большому числу клиентов к ресурсам, обеспечивая при этом высокую производительность и защиту. Администрирование и управление доступом к данным осуществляется централизованно. Ресурсы, как правило, расположены также централизованно, что повышает их безопасность и облегчает их обслуживание и поддержку.
Защита.
Одним из основных аргументов выбора сети на основе сервера является, как правило, безопасность данных.
Резервное копирование данных.
Поскольку жизненно важная информация расположена централизованно, т.е. сосредоточена на одном или нескольких серверах, несложно обеспечить ее регулярное резервное копирование (backup).
Избыточность.
Данные дублируются в реальном времени аппаратно-программными средствами сервера. Это гарантирует, что в случае повреждения основной области хранения данных информация не будет потеряна.
Количество пользователей.
Вычислительная мощность специализированного сервера может достигать такой величины, что сеть на основе серверов оказывается в состоянии эффективно обслуживать десятки тысяч пользователей, в то время как одноранговые сети строятся на основе рабочих станций и персональных компьютеров, ориентированных более на локальное взаимодействие с одним пользователем, нежели на обслуживание внешних запросов.
Аппаратное обеспечение.
Поскольку компьютеры пользователей не выполняют сервисных функций для других пользователей сети, требования к аппаратно-программному обеспечению могут быть снижены. В сети, объединяющей сотни и тысячи пользователей, разделение ресурсов пользователями потребовало бы огромных затрат на управление ими.
Комбинированные сети.
Существуют и комбинированные типы сетей, совмещающие лучшие качества одноранговых сетей и сетей на основе сервера. Как правило, в сетях на основе выделенных серверов пользователи могут и самостоятельно предоставлять друг другу доступ к своим локальным ресурсам время от времени.
Многие администраторы считают, что комбинированная сеть наиболее полно удовлетворяет их пользователей, однако с точки зрения безопасности наличие однорангового сервиса является недопустимым, и может быть оправдано в некоторых исключительных случаях для серверов вывода.
Тем не менее, комбинированные сети - наиболее распространенный тип сетей, но для их правильной реализации и надежной защиты необходимы определенные знания и навыки планирования.
Термин ``топология'', или ``топология сети'', характеризует физическое расположение компьютеров, кабелей и других компонентов сети. Кроме термина ``топология'', иногда для описания физической компоновки употребляют также термины «физическое расположение», «компоновка», «диаграмма», «карта». Топология сети обуславливает ее характеристики. В частности, выбор той или иной топологии влияет на состав необходимого сетевого оборудования, на характеристики сетевого оборудования, на возможности расширения сети и способ управления сетью.
Чтобы совместно использовать ресурсы или выполнять другие сетевые задачи компьютеры должны быть подключены друг к другу. Для этой цели в большинстве сетей применяется кабель. Топология определяет способ взаимодействия компьютеров в сети. Различным видам топологий соответствуют различные методы взаимодействия, и эти методы оказывают большое влияние на сеть.
Базовые топологии
0.1mm
Рис. 1. Сетевые топологии. a - звезда, b - кольцо, c - шина.
Существуют три основные сетевые топологии:
Хотя сами по себе базовые топологии несложны, в реальности часто встречаются довольно сложные комбинации, объединяющие свойства нескольких топологий.
Помимо трех вышеперечисленных при небольшом числе узлов сети используюся несколько других топологий. В их числе встречаются полносвязная, куб, гиперкуб, гипертетраэдр. Данные топологии обеспечивают наиболее эффективный с точки зрения быстродействия обмен данными между узлами и чаще всего используются для реализации тесносвязанных конфигураций из для высокопроизводительных вычислительных комплексов и коммутационных устройств.
0.1mm
Рис. 2. Топологии: тетраэдр, куб, полносвязная.
Топологию ``шина'' часто называют ``линейной шиной'' (linear bus). Данная топология относится к наиболее простым и широко распространенным топологиям. В ней используется один кабель, именуемый магистралью или сегментом, вдоль которого под ключены все компьютеры сети. В сети с топологией ``шина'' компьютеры адресуют данные конкретному компьютеру, передавая их по кабелю в виде электрических сигналов. Чтобы понять процесс взаимодействия компьютеров по шине, Вы должны уяснить следующие понятия:
Передача сигнала
Данные в виде электрических сигналов передаются всем компьютерам сети; однако информацию принимает только тот, адрес которого соответствует адресу получателя, зашифрованному в этих сигналах. Причем в каждый момент времени только один компьютер может вести передачу.
Так как данные в сеть передаются лишь одним компьютером, ее производительность зависит от количества компьютеров, подключенных к шине. Чем их больше, т.е. чем больше компьютеров, ожидающих передачи данных, тем медленнее сеть. Однако вывести прямую зависимость между пропускной способностью сети и количеством компьютеров в ней нельзя. Ибо, кроме числа компьютеров, на быстродействие сети влияет множество факторов, в том числе:
Шина - пассивная топология. Это значит, что компьютеры только слушают передаваемые по сети данные, но не участвуют в их перемещении от отправителя к получателю. Поэтому, если один из компьютеров выйдет из строя, это не скажется на работе остальных. В активных топологиях компьютеры регенерируют сигналы и передают их по сети.
Отражение сигнала
Данные, или электрические сигналы, распространяются по всей сети - от одного конца кабеля к другому. Если не предпринимать никаких специальных действий, сигнал достигая конца кабеля, будет отражаться и не позволит другим компьютерам осуществлять передачу. Поэтому, после того как данные достигнут адресата, электрические сигналы необходимо погасить.
Терминатор
Чтобы предотвратить отражение электрических сигналов, на каждом конце кабеля устанавливают терминаторы (terminators), поглощающие эти сигналы. Все концы сетевого кабеля должны быть к чему-нибудь подключены, например, к компьютеру или к баррел-коннектору - для увеличения длины кабеля. К любому свободному - неподключенному - концу кабеля должен быть подсоединен терминатор, чтобы предотвратить отражение электрических сигналов.
Нарушение целостности сети
Разрыв сетевого кабеля происходит при его физическом разрыве или отсоединен одного из его концов. Возможна также ситуация, когда на одном или нескольких концах кабеля отсутствуют терминаторы, что приводит к отражению электрических сигналов в кабеле и прекращению функционирования сети. Сеть «падает». Сами по себе компьютеры в сети остаются полностью работоспособными, но до тех пор, пока сегмент разорван, они не могут взаимодействовать друг с другом.
Расширение ЛВС
Увеличение участка, охватываемого сетью, вызывает необходимость ее расширения. В сети с топологией ``шина'' кабель обычно удлиняется двумя способами.
Это самая старая топология сетевых вычислений. При топологии ``звезда'' все компьютеры с помощью сегментов кабеля подключаются к одному центральному компьютеру или кластеру.
В настоящее время часто говорят о топологии «Звезда» имея в виду звездообразное географическое расположение компьютеров, при том, что реальная топология не имеет с географией ничего общего. В этом случае в качестве центрального компьютера выступает пассивное с точки зрения обработки данных, устройство, именуемому концентратором (hub). Топология определяет не географическое расположение компьютеров, а пути и порядок прохождения данных. Звезда отличается тем, что не предоставляет возможности двум компьютерам в сети обмениваться данными иначе, чем с помощью посредника - центрального компьютера. Подмена терминологии возникла в связи с появлением ПК и агрессивным продвижением вычислительных технологий, отрицающих центральный элемент вычислительной сети, и основанных на одноранговых моделях вычислений.
В сетях с топологией «звезда» подключение кабеля и управление конфигурацией сети централизованы. Но есть и недостаток: так как все компьютеры подключены к центральному компьютеру (хост-компьютер), для больших сетей значительно увеличивается расход кабеля. К тому же, если центральный компьютер выйдет из строя, нарушится работа всей сети. В обмене данными между двумя компьютерами всегда участвует центральный - хост-компьютер. Данные компьютера-отправителя сначала достигают хост-компьютера, затем транслируются последним компьютеру-получателю. На первый взгляд данная топология кажется не слишком удобной, однако в данном случае несколько компьютеров в сети могут вести передачу данных одновременно, в то время как шинная топология и топология маркерного кольца в каждый момент времени выделяют только один компьютер, которому позволено передавать данные.
А если выйдет из строя только один компьютер (или кабель, соединяющий его с концентратором), то лишь этот компьютер не сможет передавать или принимать данные по сети. На остальные компьютеры в сети это не повлияет.
В одной командной строке вы можете указать несколько команд. Эти команды должны
быть разделены символом ;
(точка с запятой) или символом &
(амперсанд):
command1; command2; command3
Система Linux выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.
Например, введите:
cd; pwd; ls
shell
выполнит эти команды последовательно:
cd
изменит ваше местоположение, переместив вас в регистрационный
каталог;
pwd
распечатает полное имя пути вашего текущего каталога;
ls
перечислит файлы в вашем текущем каталоге.
При топологии ``кольцо'' компьютеры подключаются к кабелю, замкнутому в кольцо. Поэтому у кабеля просто не может быть свободного конца, к которому надо подключать терминатор. Сигналы передаются по кольцу в одном направлении и проходят через каждый компьютер. В отличие от пассивной топологии «шина», здесь каждый компьютер выступает в роли репитера, усиливая сигналы и передавая их следующему компьютеру. Поэтому, если выйдет из строя один компьютер, функционирование сети может нарушиться. В реальной ситуации этого не случается, поскольку подсоединение узла к кольцу выполняется специальным образом.
Передача маркера
Один из принципов передачи данных в кольцевой сети носит название передачи маркера (token). Суть его такова. Маркер последовательно, от одного компьютера к другому, передается до тех пор, пока его не получит тот, который ``хочет'' передать данные. Передающий компьютер изменяет маркер, помещает электронный адрес в данные и посылает их по кольцу.
Данные проходят через несколько компьютеров, пока не достигнут того, чей адрес совпадает с адресом получателя, указанном в данных. После этого принимающий компьютер посылает передающему сообщение, в котором подтверждает прием данных. Получив подтверждение, передающий компьютер создает новый маркер и возвращает его в сеть. Передача маркера не отнимает много времени и практически не влияет на пропускную способность сети.
В реальной жизни кольцо, в котором циркулирует маркер, может иметь размер от сантиметров до нескольких километров. В первом случае аппаратура кольца сосредоточена в пределах одной платы в небольшом корпусе, к портам которого с помощью кабелей подключаются узлы сети.
Концентраторы (hub)
В настоящее время одним из стандартных компонентов сетей становится концентратор. Концентратор
Активные концентраторы
Среди концентрпторов выделяются активные (active hub) и пассивные (passive hub). Активные концентраторы регенерируют и передают сигналы так же, как это делают повторители сигнала - репитеры (repeater). Иногда их называют многопортовыми репитерами. С помощью активного хаба можно подключить дополнительные узлы в сеть или увеличить расстояние между узлами.
Пассивные концентраторы
Некоторые типы концентраторов являются пассивными, например монтажные или коммутационные панели и устройства. Они просто пропускают через себя сигнал как узлы коммутации, не усиливая и не восстанавливая его. В связи с этим, пассивные концентраторы не нуждаются в источниках питания, но требуют непосредственного подключения к рабочей станци или активному хабу. Обычно используются в качестве разветвителей.
Гибридные концентраторы
Гибридные концентраторы (hybrid) позволяют подключать кабели различных типов. Сети на основе концентраторов легко расширяются за счет подключения дополнительных концентраторов.
Некоторые соображения
Использование концентраторов дает ряд преимуществ. Разрыв кабеля в сети с обычной топологией «линейная шина» приведет к падению всей сетинию. Между тем разрыв кабеля, подключеного к концентратору нарушит работу только данного сегмента. Остальные сегменты останутся работоспособными.
К числу других преимуществ использования концентраторов относятся:
Коммутаторы (Switches)
В отличие от концентраторов коммутаторы не объединяют среду передачи, а на небольшое время предоставляют взаимодействующим компьютерам физический канал передачи данных в полное распоряжение.
В настоящее время чаще всего используются топологии, которые комбинируют топологию сети по принципу шины, звезды и кольца.
Звезда-шина
Звезда-шина (star-bus) - это комбинация топологий «шина» и «звезда». Чаще всего это выглядит так: несколько сетей с топологией ``звезда'' объединяются при помощи магистральной линейной шины. В этом случае выход из строя одного компьютера не оказывает никакого влияния на сеть - остальные компьютеры по-прежнему взаимодействуют друг с другом. А выход из строя концентратора повлечет за собой остановку подключенных к нему компьютеров и концентраторов.
Звезда-кольцо
Звезда-кольцо (star-ring) кажется несколько похожей на звезду-шину. И в той, и в другой топологии компьютеры подключены к концентратору, который фактически и формирует кольцо или шину. Отличие в том, что концентраторы в звезде-шине соединены магистральной линейной шиной, а в звезде-кольце на основе главного концентратора они образуют звезду.
Выбор топологии
Существует множество факторов, которые необходимо учитывать при выборе наиболее подходящей к данной ситуации топологии. Возможно нижеприведенная таблица поможет сделать правильный выбор.
Топология | Преимущества | Недостатки |
1emШина | Экономный расход кабеля. Сравнительно недорогая и несложная в использовании среда передачи. Простота, надежность. Легко расширяется. |
При значительных объемах трафика уменьшается пропускная способноси сети. Трудно локализовать проблемы. Выход из строя кабеля останавливает работу многих пользователей. |
1emКольцо | Все компьютеры имеют равный доступ. Количество пользователей не оказывает сколько-нибудь значительного влияния нa производительность. |
Выход из строя одного компьютерам может вывести из строя всю сеть. Трудно локализовать проблемы. Изменение конфигурации сети требует остановки работы всей сети |
1emЗвезда | Легко модифицировать сеть, добавляя новые компьютеры. Централизованный контроль и управление. Выход из строя одного компьютера не влияет на работоспособность сети. |
Выход из строя центрального узла выводит из строя всю сеть. |
Основные группы кабелей
На сегодня подавляющая часть компьютерных сетей использует для соединения провода или кабели. Они выступают в качестве среды передачи сигналов между компьютерами. Существуют различные типы кабелей, которые удовлетворяют потребности всевозможных сетей, от малых до больших. В большинстве сетей применяются только три основные группы кабелей:
Коаксиальный кабель бывает двух видов: тонкий и толстый.
Тонкий (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 несколько основных компонентов:
BNC-коннектор либо припаивается, либо обжимается на конце кабеля.
Т-коннектор соединяет сетевой кабель с сетевой платой компьтютера
Баррел-коннектор применяется для сращивания двух отрезков тонкого коаксиального кабеля.
В сети с топологией ``шина'' для поглощения ``свободных'' сигналов терминаторы устанавливаются на каждом конце кабеля. Иначе сеть не будет работать.
В сети с тополдогией «шина» для поглощения сигналов на концах устанавливаются терминаторы. Иначе сеть не будет работать. Терминаторы могут иметь заземление. Всегда заземляется только один терминатор из двух.
Классы коаксиальных кабелей и требования пожарной безопасности
Выбор того или иного класса коаксиальных кабелей зависит от того, где этот кабель будет прокладываться. Существует два класса коаксиальных кабелей:
Поливинилхлорид (PVC) - это пластик, который применяется в качестве изолятора или внешней оболочки у большинства коаксиальных кабелей. Кабель PVC достаточно гибок, его можно прокладывать на открытых участках помещений. Однако при горении он выделяет ядовитые газы.
Пленум (plenum) - это небольшое пространство между фальшь-потолком и перекрытием, обычно его используют для вентиляции. Требования пожарной безопасности строго ограничивают типы кабелей, которые могут быть здесь проложены, поскольку в случае пожара выделяемые ими дым или газы распространятся по всему зданию.
Слой изоляции и внешняя оболочка пленумного кабеля выполнены из специальных огнеупорных материалов, которые при горении выделяют минимальное количество дыма и газов. Это уменьшает риск химического отравления. Кроме того, эти кабели можно прокладывать открыто, не заключая в трубу. Однако они дороже и жестче, чем поливинилхлоридные.
При прокладке сетевого кабеля следует следовать строительным ГОСТ'ам и СНИП'ам, в которых учтены требования пожарной и электрической безопасности.
Некоторые соображения
Коаксиальный кабель часто используют если необходима одновременная передача речи, видео и двоичных данных, передача данных на большие расстояния (по сравнению с менее дорогими кабелями).
Самая простая витая пара (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, меньше подвержена воздействию электрических помех и может передавать сигналы с более высокой скоростью и на большие расстояния.
Компоненты кабельной системы
Для построения развитой кабельной системы и упрощения работы с ней используется ряд компонентов:
Для подключения витой пары к компьютеру используются телефонные коннекторы RJ-45. На первый взгляд, они похожи на RJ-11, используемые в телефонии, но в действительности между ними есть существенные отличия. Во-первых, вилка RJ-45 чуть больше по размерам и не подходит для гнезда RJ-11. Во-вторых, коннектор RJ-45 имеет восемь контактов, a RJ-11 только четыре.
Существуют разные типы панелей расширения. Они поддерживают до сотни портов и более, а также скорость передачи до 100 Мбит/с.
Одинарные или двойные вилки RJ-45 подключаются к панелям расширения или стенным розеткам. Они обеспечивают скорость передачи до 100 Мбит/с.
К настенным розеткам можно подключить два (и более) соединителя.
Оптоволоконный кабель
В оптоволоконном кабеле цифровые данные распространяются по оптическим волокнам в виде модулированных световых импульсов. Это относительно надежный (зашищенный) способ передачи, поскольку электрические сигналы при этом не передаются Следовательно, оптоволоконный кабель нельзя вскрыть и перехватить данные, от чего не застрахован любой кабель, проводящий электрические сигналы. Оптоволоконные линии предназначены для перемещения больших объемо данных на очень высоких скоростях, так как сигнал в них практически не затухает и не искажается.
Оптическое волокно - чрезвычайно тонкий стеклянный цилиндр, называемый жилой (core), покрытый слоем стекла, называемого оболочкой, с иным, чем у жилы, коэффицентом преломления. Иногда оптоволокно производят из пластика. Пластик проще в использовании, но он передает световые импульсы на меньшие расстояния по сравнению со стеклянным оптоволокном. Каждое стеклянное оптоволокно передает сигналы только в одном направлении, поэтому кабель состоит из двух волокон с отдельными коннекторами. Одно из них служит для передачи, а другое - для приема. Жесткость волокон увеличивается покрытием из пластика, а прочность - волокнами из кевлара.
Передача по оптоволоконному кабелю не подвержена электрическим помехам и ведется на чрезвычайно высокой скорости (в настоящее время до нескольких Гбит/с, теоретически возможная скорость - 200000 Мбит/с). По нему можно передавать световой импульс на многие километры. Более всего оптоволоконный кабель подходит для передачи данных с очень высокой скоростью и по надежной (защищенной) среде передачи.
Для передачи по кабелю кодированных сигналов используют две технологии: узкополосную передачу и широкополосную передачу.
Узкополосная передача (baseband)
Узкоополосные системы передают данные в виде цифрового сигнала частоты. Сигналы представляют собой дискретные электрические или световые импульсы. При таком способе вся емкость коммуникационного канала используется для передачи одного импульса, или, другими словами, цифровой сигнал использует всю полосу пропускания кабеля. Полоса пропускания - это разница между максимальной и минимальной частотой, которая может быть передана по кабелю. Каждое устройство в сетях с узкополосной передачей посылает данные в обоих направлениях, а некоторые могут одновременно и передавать их, и принимать.
Распространяясь по кабелю, сигнал постепенно затухает и искажается. Если кабель слишком длинный, на дальнем его конце передаваемый сигнал может исказиться до неузнаваемости или просто пропасть. Чтобы избежать этого, в узкополосных системах используют репитеры, которые усиливают сигнал и ретранслируют его в дополнительные сегменты, позволяя тем самым увеличить общую длину кабеля.
Широкополосная передача
Широкополосные (broadband) системы передают данные в виде аналогового сигнала, который использует некоторый интервал частот. Сигналы представляют собой непрерывные (а не дискретные) электромагнитные или оптические волны. При таком способе сигналы передаются по физической среде в одном направлении.
Если обеспечить необходимую полосу пропускания, то по одному кабелю одновременно может идти вещание нескольких систем, таких, как кабельное телевидение и передача данных. Каждой передающей системе выделяется часть полосы пропускания. Все устройства, связанные с данной системой (например, компьютеры), должны быть настроены таким образом, чтобы работать именно с выделенной частью полосы пропускания. Если в узкополосных системах для восстановления сигнала используют репитеры, то в широкополосных - усилители (amplifiers). В широкополосной системе сигнал передается только в одном направлении, поэтому, чтобы все устройства могли и принимать, и передавать данные, необходимо обеспечить два пути для прохождения сигнала. Разработано два основных решения:
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 лет вперед прогнозируя рост как количества узлов сети, так и изменение состава и объема удельного траффика.
Кабельная система должна соответствовать условиям ее применения. Требования, выдвигаемые к КС небольшими фирмами, существенно отличаются от требований со стороны крупных организаций, например банков. К числу факторов, влияющих на стоимость и пропускную способность КС, относятся следующие:
Насколько прост кабель в установке, насколько просто работать с ним? В небольших сетях, с небольшими расстояниями, где безопасность данных не самый главный вопрос, нет смысла прокладывать толстый, громоздкий и дорогой кабель.
Зкранирование кабеля приводит к его удорожанию, тем не менее практически любая сеть использует одну из форм экранированного кабеля. Чем больше помех в месте прокладки кабеля, тем большее экранирование требуется. Прокладка пленумного кабеля существенно увеличивает стоимость проекта.
Перекрестные помехи и внешние шумы могут вызвать серьезные проблемы в больших сетях, где критическим вопросом является вопрос зашиты данных. Недорогие кабели слабо защищены от внешних электрических полей, генерируемых электропроводкой, двигателями, реле и радиопередатчиками.
Скорость передачи измеряется в мегабитах в секунду (Мбит/с). Для медных кабелей категории 5 наиболее распространенными значениеми являются 10 и 100 Мбит/с. Толстый коаксиальный кабель передает сигналы на большие расстояния, чем тонкий. Но с ним сложнее работать. По оптоволоконному кабелю данные передаются со скоростью более 100 Мбит/с, но его установка требует высокой квалификации, стоимость же его в настоящее время постоянно снижается.
Стоимость кабелей, которые обеспечивают высокую степень защиты при передаче данных на большие расстояния, гораздо выше стоимости тонкого коаксиального каб простого в установке и эксплуатации.
Затухание сигнала - причина, которая ограничивает максимальную длину каб так как значительно ослабленный сигнал может быть не принят на принимающей стороне. Кабели разных типов имеют разную максимальную длину уверенной передачи данных.
Большинство сетей использует те или иные методы обнаружения и коррекции ошибок передачи - от методов кодирования данных до их повторной передачи. На повторную передачу уходит дополнительное время, и как результат, снижается общая пропускная способность сети.
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.
Кабели - общепринятая среда обмена данными между компьютерами. Однако сегодня появляются технологии беспроводной передачи, которые избавят нас от трудностей физических соединений. На следующем занятии Вы познакомитесь с основами технологии беспроводной связи.
Символ \
(``слэш'') позволяет вам отменить специальное значение следующего
за ним символа. Например, у вас есть файл trail, который содержит следующий
текст:
The all * game was held in Summit.Чтобы найти символ звездочка (
*
) в файле, воспользуйтесь командой
grep
:
$ grep \* trail The all * game $команда
grep
найдет символ *
в тексте и отобразит строку, в
которой она появилась. Без символа \
, символ звездочка будет
интерпретироваться shell
как метасимвол.
Беспроводная среда
Беспроводная среда постепенно входит в нашу жизнь. Как только технология окончательно сформируется, производители предложат широкий выбор продукции по приемлемым ценам, что приведет и к росту спроса на нее, и к увеличению объема продаж. В свою очередь, это вызовет дальнейшее совершенствование и развитие беспроводной среды.
Словосочетание «беспроводная среда» может ввести в заблуждение, поскольку как бы означает полное отсутствие проводов в сети. В действительности же это не так. Обычно беспроводные компоненты взаимодействуют с сетью, в которой В качестве среды передачи используется кабель. Такая сеть со смешанными компонентами называется гибридной.
Возможности
Идея беспроводной среды весьма привлекательна, так как ее компоненты обеспечивают временное подключение к существующей кабельной сети, помогают организовать резервное копирование в существующую кабельную сеть, гарантируют определенный уровень мобильности и позволяют снять ограничения на максимальную протяженность сети, накладываемые медными или даже оптоволоконными кабелями.
Применение
Трудность установки кабеля - фактор, который дает беспроводной среде неоспоримое преимущество. Она может оказаться особенно полезной в следующих ситуациях: в помещениях, заполненных людьми (например, в прихожей или приемной);
Типы беспроводных сетей
В зависимости от технологии беспроводные сети можно разделить на три типа:
Основные различия между этими типами сетей - параметры передачи. Локальные и расширенные локальные вычислительные сети используют передатчики и приемники, принадлежащие той организации, в которой функционирует сеть. Для перносных компьютеров в качестве среды передачи сигналов выступают AT&T, МCI, Sprint, местные телефонные компании и их общедоступные службы.
Локальные вычислительные сети
Типичная беспроводная сеть выглядит и функционирует практически так же, как обычная, за исключением среды передачи. Беспроводной сетевой адаптер с трансивером установлен в каждом компьютере, и пользователи работают так, будто их компьютеры соединены кабелем.
Точки доступа
Трансивер, называемый иногда точкой доступа (access point), обеспечивает обмен сигналами между компьютерами с беспроводным подключением и остальной сетью. В беспроводных ЛВС используются небольшие настенные трансиверы. Они устанавливают радиоконтакт между переносными устройствами. Такую сеть нельзя назвать полностью беспроводной именно из-за использования этих трансиверов.
Способы передачи
Беспроводные локальные сети используют четыре способа передачи данных:
Инфракрасное излучение
Все инфракрасные беспроводные сети используют для передачи данных инфракрасные лучи. В подобных системах необходимо генерировать очень сильный сигнал, так как в противном случае значительное влияние будут оказывать другие источники, например окна. Этот способ позволяет передавать сигналы с большой скоростью, поскольку инфракрасный свет имеет широкий диапазон частот. Инфракрасные сети способны нормально функционировать на скорости 10 Мбит/с. Существует четыре типа инфракрасных сетей
Как говорит само название, в таких сетях передача возможна лишь в случае прямор видимости между передатчиком и приемником.
При этой технологии сигналы, отражаясь от стен и потолка, в конце концов достигают приемника. Эффективная область ограничивается примерно 30 м (100 футами), и скорость передачи невелика из-за большого уровня внешних помех.
В этих сетях оптические трансиверы, расположенные рядом с компьютером, передают сигналы в определенное место, из которого они переадресуются соответствующему компьютеру.
Эти инфракрасные беспроводные сети предоставляют широкополосные услуги, соответствуют жестким требованиям мультимедийной среды и практически не уступают кабельным сетям.
Хотя скорость и удобство использования инфракрасных сетей очень привлетельны, возникают трудности при передаче сигналов на расстояние более 30 м (100 футов). К тому же такие сети подвержены помехам со стороны сильных источников света, которые есть в большинстве организаций.
Лазер
Лазерная технология похожа на инфракрасную тем, что требует прямой видимс между передатчиком и приемником. Если по каким-либо причинам луч будет прерван это прервет и обмен данными.
Радиопередача в узком спектре (одночастотная передача)
Этот способ напоминает вешание обыкновенной радиостанции. Пользователи
настраивают передатчики и приемники на определенную частоту. При этом
прямая видимость необязательна, площадь вещания составляет около (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), предназначенный для этой цели.
Микроволновые системы
Микроволновая технология помогает организовать взаимодействие между зданиями в небольших, компактных системах, например в университетских городках. В настоящее время микроволновая технология наиболее распространенный в Соединенных Штатах метод передачи данных на дальние расстояния. Он идеален при взаимодействии в прямой видимости двух точек, таких, как:
Микроволновая система состоит из следующих компонентов.
Один для генерации сигналов (передающая станция), а другой - для приема (приемная станция).
Они нацелены друг на друга так, чтобы осуществить прием сигналов, передаваемых трансиверами. Эти антенны часто устанавливают на вышки, чтобы покрыть большие расстояния.
Платы сетевого адаптера выступают в качестве физического интерфейса, или соединения, между компьютером и сетевым кабелем. Платы обычно вставляются в слоты расширения компьютеров. Чтобы обеспечить физическое соединение между компьютером и сетью, к ответствующему разъему, или порту платы (после ее установки) подключается сетвой кабель.
Назначение платы сетевого адаптера:
Плата сетевого адаптера, кроме того, принимает данные из кабеля и переводит их в форму, понятную центральному процессору компьютера.
Плата сетевого адаптера состоит из аппаратной части и встроенных программ, записанных в ПЗУ. Эти программы реализуют функции подуровней ``Управления логической связью и Управления доступом к среде Канального уровня'' модели OSI.
Подготовка данных
Перед тем как отослать данные в сеть, плата сетевого адаптера переводит их из параллельного представления, понятного компьютеру, в последовательное (сериальное), в котором они могут передаваться по сетевому кабелю. Внутри компьютера данные передаются по шинам шириной в 8, 16, 32, 64 и более бит. По шине данные передаются параллельно (parallel). В сетевом кабеле данные транспортируются в виде последовательного потока бит.
Плата сетевого адаптера принимает параллельные данные и организует их для последовательной (serial), побитовой, передачи. Этот процесс завершается переводом цифровых данных компьютера в электрические и оптические сигналы, которые и передаются по сетевым кабелям. Устройство, которое выполняет преобразование последовательного потока бит в электрические и оптические сигналы в кабеле - трансивер.
Помимо преобразования данных, плата сетевого адаптера должна указать свое местонахождение, или адрес, чтобы ее могли отличить от остальных плат. Этой цели служит сетевой адрес платы. Сетевые адреса (network address) определяются комитетом IEEE. Этот комитет закрепляет за каждым производителем плат сетевого адаптера некоторый интервал адресов. Производители зашивают эти адреса в микросхемы. Благодаря этому каждая плата и, следовательно, каждый компьютер имеют уникальный адрес в сети.
При приеме данных от компьютера и подготовке их к передаче по сетевому кабелю плата сетевого адаптера участвует также в других операциях.
Часто данные поступают быстрее, чем их способна передать плата сетевого адаптера, поэтому временно они помещаются в буфер.
Передача и управление данными
Перед тем как послать данные по сети, плата сетевого адаптера проводит электронный диалог с принимающей платой, во время которого они обговаривают :
Если новой (более сложной и быстрой) плате необходимо взаимодействовать со старой (медленной) платой, они должны найти общую для обеих скорость передачи. Схемы некоторых современных плат сетевого адаптера позволяют им приспособиться к медленной скорости старых плат. Каждая плата оповещает другую о своих параметрах, принимая ``чужие'' параметры и подстраиваясь к ним. После того как все детали определены, платы начинают обмен данными.
Параметры платы сетевого адаптера должны быть корректно установлены, чтобы ее работа протекала правильно. В их число входят:
Примечание
Параметры платы сетевого адаптера иногда устанавливаются в программном обеспечении, но они должны совпадать с установками, заданными на плате перемычками или 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 Кб памяти. Чем больше памяти Вы выделяете, тем выше скорость сети, но тем меньше памяти остается для других целей.
Плата сетевого адаптера может иметь и другие параметры, требующие конфигурации. К таким параметрам относится тип трансивера. Некоторые платы поставляются с внешним и встроенным трансивером. В этом случае необходимо явно задать используемый.
Чтобы обеспечить совместимость компьютера и сети, плата сетевого адаптера должна отвечать следующим требованиям:
Например, плата, которая должна работать в компьютере Apple в сети с топологией «шина», не будет работать в компьютере IBM в сети с топологией «кольцо». Сеть топологии «кольцо» требует плату, которая физически отличается от применяемой в сети топологии «шина», к тому же Apple использует другой метод взаимодействия по сети и внутреннюю системную шину, нежели IBM.
К распространенным типам архитектуры шины данных относятся 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, целью которой является возможность изменять конфигурацию персонального компьютера без вмешательства пользователя, т.е. максимально упростить подключение любого устройства.
Координируя взаимодействие сетевого кабеля и компьютера, плата сетевого адаптера выполняет три важные функции:
Прежде чем выбрать плату сетевого адаптера, следует определить тип кабеля и соединителей, которые будут использоваться. Каждый тип кабеля имеет различные физические характеристики, которым должна соответствовать плата. Поэтому плата сетевого адаптера рассчитана для работы с определенным типом кабеля (коаксиальным, витой парой или оптоволокном). Некоторые платы сетевого адаптера имеют несколько типов соединителей. Например, есть платы, разъемы которых подходят для тонкого и толстого коаксиальных кабелей или для витой пары и толстого коаксиального кабеля.
Если у платы сетевого адаптера более одного интерфейсного разъема, выбор дого из них производится с помощью перемычек или DIP-переключателей, расположенных на самой плате, либо программно. Чтобы правильно сконфигурировать сетевую плату, следует читать ее документацию. Ниже приведены три примера типичных соединителей, которые можно найти на плате сетевого адаптера.
Для подключения тонкого коаксиального кабеля используют разъем, представленный на рисунке 2.29.
Для подключения толстого коаксиального кабеля применяется 15-контактный AUI-кабель, соединяющий 15-контактный (DB-15) разъем платы сетевого адаптер внешним трансивером, который для подключения к толстому коаксиальному кабелю использует так называемый «зуб вампира». Внимание! Внешне очень похож на порт AUI игровой порт, который обычно присутствует на мультимедийных платах.
Для подключения витой пары прменяется разъем RJ-45, показанный на рис. 2.31. С виду он напоминает телефонный RG-11, но крупнее по габаритам и имеет 8 контактов а не 4, как телефонный.
Некоторые сетевые технологии используют телефонный разъем RJ-11. Их иногда называют pre-10BaseT.
Поскольку плата сетевого адаптера оказывает существенное влияние на передачу данных, естественно, она влияет и на производительность всей сети. Если плата медленная, то и скорость передачи данных по сети не будет высокой. В сети с топологией шина, где нельзя начать передачу, пока кабель занят, медленная сетевая плата увеличивает время ожидания для всех пользователей.
После определения физических требований к плате сетевого адаптера - типа разъема и типа сети, в которой она будет использоваться, необходимо рассмотреть ряд факторов, влияющих на возможности платы. Хотя все платы сетевого адаптера удовлетворяют определенным минимальным стандартам и спецификациям, некоторые из плат имеют дополнительные возможности, повышающие производительность сервера, клиента и всей сети.
Итак, к факторам, от которых зависит скорость передачи данных, относятся следующие.
Данные напрямую передаются из буфера платы сетевого адаптера в память компьютера, не затрагивая при этом центральный процессор.
Плата сетевого адаптера имеет собственную оперативную память, которую она использует совместно с компьютером. Компьютер воспринимает эту память как часть собственной.
Процессор платы сетевого адаптера использует для обработки данных часть памяти компьютера.
К плате сетевого адаптера временно переходит управление шиной компьютера. Без использования ЦПУ плата передает данные непосредственно в системную память компьютера. При этом повышается производительность компьютера, поскольку его процессор в это время может решать другие задачи. Подобные платы достаточно дороги, но они способны повысить производительность сети на 20..70 %. Архитектуры EISA, MCA и PCI поддерживают этот метод.
Для большинства плат сетевого адаптера современные скорости передачи данных по сети слишком высоки. Поэтому на плате сетевого адаптера устанавливается буфер с помошьм микросхем памяти. В случае, когда плата принимает данных больше, чем способна обработать, буфер сохраняет данные до тех пор, пока они не будут обработаны адаптером. Буфер повышает производительность платы, не давая ей стать узким местом системы. Размер буфера существенно варьируется от одного производителя сетевых адаптеров к другому. Обычно сетевые платы имеют буфер, вмещающий один или несколько полных кадров. В этом случае сетевая плата не прерывает работу процессора в момент, когда она может начать передачу.
С таким микропроцессором плате сетевого адаптера для обработки данных не требуется помощь компьютера. Большинство сетевых плат имеет свои микропроцессоры, которые увеличивают скорость сетевых операций освободив ЦПУ от выполнения функций по поддержке протоколов канального уровня. Мощный микропроцессор может обеспечить функции по установлению соединений и безошибочной передаче данных, существенно разгрузив ЦПУ сервера. В PCI системах это не дает заметного выигрыша в производительности, поскольку они не ориентированы на параллельную обработку данных несколькими быстрыми контроллерами шины, которыми являются ЦПУ, дисковая и видео подсистемы.
Серверы
С серверами связана значительная часть сетевого трафика, поэтому они должны быть оборудованы платами сетевого адаптера с наибольшей производительностью.
Рабочие станции
Рабочие станции могут использовать менее дорогие сетевые платы, если их работа с сетью ограничена приложениями, генерирующими небольшой объем сетевого трафика (например, текстовыми процессорами). Другие приложения (например, базы данных или инженерные приложения) довольно быстро перегрузят сетевые платы, не отвечающие их требованиям.
Отменить специальное значение символа вы также можете с помощью метасимвола
кавычки. Одиночные кавычки ('...'
) отменяют специальное значение всех
символов за исключением самих одиночных кавычек. Двойные кавычки
(``...''
) отменяют специальное значение всех символов, за исключением
символов двойные кавычки, $
и `
(слабое ударение). Использование
кавычек удобно для цифровых специальных символов.
Например, ваш файл trail содержит строку:
He really wondered why? Why???Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой
grep
:
$ grep '???' trail He really wondered why? Why??? $
Платы сетевого адаптера беспроводных сетей
Платы сетевого адаптера беспроводных сетей разработаны для большинства основных сетевых операционных систем. Вместе с такими платами часто поставляют:
Указанные платы сетевого адаптера могут быть использованы для построения беспроводных локальных сетей или для беспроводного подключения станций к кабельной ЛВС. Часто подобные платы применяются вместе с так называемым беспроводным концентратором. Это устройство функционирует как трансивер для передачи и приема сигналов.
Бывают ситуации, когда безопасность данных настолько важна, что рабочие станции не оборудуются жесткими и гибкими дисками. Эта мера гарантирует, что пользователи не смогут ни скопировать данные на какой-либо магнитный носитель, ни вынести диск с рабочего места. Однако (поскольку обычно компьютер загружается с дискеты или с жесткого диска) необходимо иметь другой источник загрузки программного обеспечения, запускающего компьютер и подключающего его к сети. В таких случаях плата сетевого адаптера снабжается специальной микросхемой ПЗУ удаленной загрузки (remote-boot PROM), которая содержит код для загрузки компьютера и для подключения его к сети (зависит от сетевой операционной системы). С такой микросхемой бездисковые рабочие станции при запуске могут подключаться к сети. Использование удаленной загрузки позволяет организовать любую вычислительную среду на любом компьютере, что очень важно в больших организациях и для мобильных пользователей. IBM поставляет такую технологию под названием Work Space on Demand (WSoD).
Резюме
Платы сетевого адаптера - это интерфейс между компьютером и сетевым кабелем. В обязанности платы сетевого адаптера входят подготовка, передача и управление данными в сети. Для подготовки данных к передаче по сети плата использует трансивер, который переформатирует данные из параллельной формы в последовательную. Каждая плата имеет уникальный сетевой адрес. Платы сетевого адаптера отличаются рядом параметров, которые должны быть правильно настроены. В их число входят: прерывание (IRQ), адрес базового порта ввода/вывода и базовый адрес памяти. Чтобы обеспечить совместимость компьютера и сети, плата сетевого адаптера должна, во-первых, соответствовать архитектуре шины данных компьютера и, во-вторых, иметь требуемый тип соединителя с сетевым кабелем. Плата сетевого адаптера оказывает значительное влияние на производительность всей сети. Существует несколько способов увеличить эту производительность. Некоторые платы обладают дополнительными возможностями. К их числу, например, относятся: прямой доступ к памяти, разделяемая память адаптера, разделяемая системная память, управление шиной. Производительность сети можно повысить также с помощью буферизации или встроенного микропроцессора.
Существуют специализированные платы сетевых адаптеров, например, для высокоскоростого обмена данными, для беспроводных сетей и бездисковых рабочих станций (в системах с повышенными требованиями к безопасности данных).
При выборе платы сетевого адаптера необходимо учитывать:
В настоящее время при анализе сетевого взаимодействия широко используется архитектурный подход, при котором функции, выполняются сетью, представляются иерархическими. Согласно данным представлениям сетевые системы описываются в контексте т.н. Эталонной модели взаимодействия открытых систем (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) -©это единица информации, передаваемая между устройствами сети как единое целое. Пакет проходит последовательно через все уровни программного обеспечения. На каждом уровне к пакету добавляется некоторая информация, форматирующая или адресная, которая необходима для успешной передачи данных по сети.
На принимающей стороне пакет проходит через все уровни в обратном порядке. Аппаратура и программное обеспечение на каждом уровне читает информацию пакета, затем удаляет информацию, добавленную к пакету на этом же уровне отправляющей стороной, передает пакет следующему уровню. Когда пакет дойдет до прикладного уровня, вся адресная информация будет удалена и данные примут свой первоначальный вид. Таким образом, за исключением самого нижнего уровня сетевой модели, никакой иной уровень узла-отправителя не может непосредственно послать информацию соответствующему уровню узла-получателя. Информация на узле-отправителе должна пройти через все уровни сверху вниз. Затем она передается по сетевому кабелю на узел-получатель и проходит все уровни снизу вверх, пока не достигнет того же уровня, с которого была послана на узле-отправителе.
В модели OSI/ISO сетевые функции распределены между семью уровнями.
Уровень | Наименование | ФУНКЦИЯ |
1em1 | Физический | Собственно кабель или физический носитель |
2 | Канальный | Передача и прием пакетов, определение аппаратных адресов |
3 | Сетевой | Маршрутизация и ведение учета |
4 | Транспортный | Обеспечение корректной сквозной пересылки данных |
5 | Сеансовый | Аутентификация и проверка полномочий |
6 | Представления данных | Интерпретация и сжатие данных |
7 | Прикладной | Предоставление услуг на уровне конечного пользователя: почта, регистрация и т.д. |
В числе "семь" нет ничего магического, просто в разработке Эталонной модели участвовали семь комитетов, и для каждого из них был создан один уровень. Схема OSI - не просто абстрактная модель; ее сопровождает реальный набор "стандартных" протоколов. Создание системы OSI началось в первой половине 80-х годов и растянулось на многие годы. Пока комитеты ISO спорили о своих стандартах, за их спиной менялась вся концепция организации сетей и по всему миру внедрялся протокол TCP/IP.
Каждому уровню соответствуют различные сетевые операции, оборудование и протоколы.
0.1mm
Рис. 1. Семь уровней модели OSI
На рис. 1 представлена многоуровневая архитектура модели OSI. На каждом уровне выполняются определенные сетевые функции, которые взаимодействуют с функциями соседних уровней, вышележащего и нижележащего. Например, Сеансовый уровень должен взаимодействовать только с Представительным и Транспортным. Все эти функции подробно описаны.
Прикладной уровень
Уровень 7, Прикладной (Application Layer), - самый верхний уровень модели OS1.
Он представляет собой окно для доступа прикладных процессов к сетевым услугам. Прикладной уровень обеспечивает доступ прикладных процессов в среде OSI. Функции прикладного уровня разделяются на две группы: общие и специальные. Первые дают средства взаимодействия, используемые различными приложениями, например, средства организации связи между прикладными процессами. Вторые обеспечивают определенные потребности конкретных приложений, например, обмен файлами, доступ к базам данных и электронную почту.
Представительный уровень
Уровень 6, Представительный (Presentation Layer),
Представительный уровень предназначен для представления данных, подлежащих передаче между прикладными объектами, представления структур данных, на которые ссылаются прикладные объекты, представлением методов, которые могут использоваться для манипулирования и обработки данных. Представительный уровень имеет дело с синтаксисом, т.е. с формальным их представлением. Семантика, т.е. способ интерпретации данных, их смысл - прерогатива только прикладного уровня. Наличие представительного уровня освобождает приложения от необходимости заботиться о проблеме общего представления данных и обеспечивает независимость от синтаксиса. Это позволяет прикладным объектам использовать любой локальный синтаксис, представительный уровень обеспечивает преобразование локальных синтаксисов в согласованный обеими прикладными объектами. Преобразования синтаксисов выполняются локально и видны для других открытых систем. В связи с этим представительные протоколы не стандартизируются.
Функции представительного уровня включают:
Сущность второй и третьей функции заключается в следующем. Существует три варианта синтаксиса данных: синтаксис отправителя, синтаксис получателя и синтаксис, используемый объектами представительного уровня (синтаксис пердачи). Любые или два из них могут быть иденитичными. Уровень представления содержит функции, необходимое для преобразования между синтаксисом передачи и каждым из синтаксисов прикладных объектов по мере необходимости. Единого синтаксиса передачи для всей 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.
Модель 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, физического.
Данные обычно содержатся в больших по размерам файлах. Однако сети не будут нормально работать, если компьютер посылает этот блок данных целиком. Существует две причины, замедляющие работу сети при передаче по кабелю больших блоков данных. Во-первых, такой блок, посылаемый одним компьютером, заполняет кабель и связывает© работу всей сети, т.е. препятствует взаимодействию остальных сетевых компонентов. Во-вторых, возникновение ошибок при передаче крупных блоков приведет к повторной передаче всего блока. А если поврежден небольшой блок данных, то требуется повторная передача именно этого небольшого блока, что значительно экономит время.
Чтобы быстро и легко, не тратя времени на ожидания, передавать по сети данные их необходимо разбить на небольшие управляемые блоки. Эти блоки называются пакетам©(packet) или кадрами (frame). Хотя термины пакет и кадр©схожи, полными синонимами они все-таки не являются.
Существуют различия между типами сетей, которые©эти термины отражают.
Пакет - основная единица информации в вычислительных сетях. При разбиении данных на пакеты скорость их передачи возрастает настолько, что каждый компьютер в сети получает возможность принимать и передавать данные практически одновременно с остальными компьютерами. На компьютере-получателе пакеты накапливаются и выстраиваются в должном порядке для восстановлени исходного вида данных.
При разбиении данных на пакеты сетевая операционная система добавляет к каждому пакету специальную управляющую информацию. Эта информация обеспечивает:
Пакеты могут содержать несколько типов данных:
Некоторые компоненты являются обязательными для всех типов пакетов:
Компоненты пакета группируются в три раздела: заголовок, данные и трейлер.
Заголовок
Заголовок включает:
Данные
Эта часть пакета - собственно передаваемые данные. В зависимости от типа сети её размер может меняться. Но для большинства сетей он составляет от 512 байтов (0,5 Кб) до 4 Кб. Так как обычно размер исходных данных гораздо больше 4 Кб, для помещения в пакет их необходимо разбивать на меньшие блоки. При передаче объемного файла может потребоваться много пакетов.
Трейлер (концевик, терминатор)
Содержимое трейлера зависит от метода связи, или протокола. Чаще всего трейлер содержит информацию для проверки ошибок, называемую циклическим избыточным кодом (Cyclical Redundancy Check, CRC). CRC - это число, получаемое в результате математических преобразований над пакетом и исходной информацией. Когда пакет достигает местоназначения, эти преобразования повторяются. Если результат совпадает с CRC, с высокой вероятностью можно считать, что пакет принят без ошибок.
Формат и размер пакета зависят от типа сети. А максимальный размер пакета определяет, в свою очередь, количество пакетов, которое будет сформировано для передачи большого блока данных.
Процесс формирования пакета начинается на прикладном уровне модели OSI, т.е там, где©рождаются данные. Информация, которую надо переслать по сети, проходит сверху вниз все семь уровней, начиная с прикладного. На каждом уровне компьютера-отправителя к блоку данных добавляется информация, предназначенная для соответствующего уровня узла-получателя. Например, информация, добавленная на канальном уровне узла-отправителя будет прочитана канальным уровнем узла-получателя.
Адресация пакета
Большинство пакетов в сети адресуется конкретному компьютеру, и, как результат, только он один реагирует на них. Каждая плата сетевого адаптера©видит все пакеты, в передаваемые по сегменту кабеля, но только при совпадении адреса назначения пакета с адресом компьютера она прерывает его работу.
Используется также и широковещательная адресация (broadcast addressing). На пакет с таким типом адреса одновременно реагирует множество компьютеров в сети.
В крупномасштабных сетях, покрывающих огромные территории (или государства), предлагается несколько возможных маршрутов для передачи данных. Коммутирующие и соединяющие сетевые компоненты используют адресную информацию пакетов для определения наилучшего из маршрутов.
Рассылка пакетов
Сетевые компоненты используют адресную информацию пакетов и для других целей: чтобы направлять пакеты по местоназначению и не допускать их в те области сети, к которым они не относятся. В правильной рассылке пакетов ключевую роль играют две функции:
Компьютер может отправить пакет на следующий подходящий сетевой компонент, ШВ основываясь на адресе из заголовка пакета.
Компьютер может отбирать определенные пакеты на основе некоторых критериев, например адреса.
Протоколы (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 помогает определить, какие протоколы нужно использовать на каждом уровне. Продукты от разных производителей, которые соответствуют этой модели могут вполне корректно взаимодействовать друг с другом.
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 или модифицировать уже существующую и опубликовать ее, например, в Интернет с соблюдением вышеуказанных условий.
Кавычки аналогично обратной косой черте часто используются для отмены
специального значения пробела. 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
печатает сообщения на экране терминала большими плакатного
размера буквами.
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.
Метод доступа -это набор правил, которые определяют, как компьютер должен отправлять и принимать данные по сетевому кабелю.
В сети несколько компьютеров должны иметь совместный доступ к кабелю. Однако, если два компьютера попытаются одновременно передавать данные, их сигналы будут мешать©друг другу и данные будут испорчены. Это называется «коллизия».
Чтобы передать данные по сети от одного пользователя к другому или получит с сервера, должен быть способ поместить данные в кабель без столкновения©с уже передаваемыми по нему данными, принять данные с достаточной степенью уверенности в том, что при передаче он были повреждены в результате коллизии.
Все сетевые компьютеры должны использовать один и тот же метод доступа, иначе произойдет сбой сети. Отдельные компьютеры, чьи методы будут доминировать, не дадут остальным осуществить передачу. Методы доступа служат для предотвращения одновременного доступа к кабе нескольких компьютеров, упорядочивая передачу и прием данных по сети и гарантируя, что в каждый момент времени только один компьютер может работать на передачу.
Существует три способа предотвратить одновременную попытку использовать кабель:
Множественный доступ с контролем несущей и обнаружением коллизий
При множественном доступе с контролем несущей и обнаружением коллизий (сокращенно CSMA/CD) все компьютеры в сети - и клиенты, и серверы © «прослушивают» кабель,стремясь обнаружить передаваемые данные (т.е. трафик).
В случае коллизии компьютеры приостанавливают передачу на случайный интервал времени, а затем вновь стараются отправить пакеты.
В то же время способность обнаружить коллизии - причина, которая ограничивает область действия метода. Из-за ослабления сигнала при расстояниях свыше 2500 м (1,5 мили) механизм обнаружения коллизий не эффективен. Если расстояние до передающего компьютера превышает это ограничение, некоторые компьютеры могут не «услышать»©его и начнут передачу данных, что приведет к коллизии и разрушению пакетов данных.
CSMA/CD известен как состязательный метод, поскольку сетевые компьютеры конкурируют между собой за право передавать данные. Он кажется достаточно громоздким, но современные реализации CSMA/CD настолько быстры, что пользователи даже не задумываются над тем, что применяют состязательный метод доступа.
Чем больше компьютеров в сети, тем интенсивнее сетевой трафик. При интенсивном трафике число коллизий возрастает, а это приводит к замедлению сети (уменьшению ее пропускной способности). Поэтому в некоторых ситуациях метод CSMA/CD может оказаться недостаточно быстрым. После каждой коллизии обоим компьютерам приходится возобновлять передачу, Если сеть очень загружена, повторные попытки опять могут привести к коллизиям, но уже с другими компьютерами. Теперь уже четыре компьютера (два от первой неудачной попытки и два от второй неудачной попытки первых) будут возобновлять передачу. Результат может оказаться тем же, что и в предыдущем случае, только пострадавших компьютеров станет еще больше. Такое лавинообразное нарастание вторных передач может парализовать работу всей сети.
Вероятность возникновения подобной ситуации зависит от числа пользователе пытающихся получить доступ к сети, и приложений, с которыми они работают.
Сеть с методом доступа CSMA/CD, обслуживающая многих пользователей, которые работают с несколькими системами управления базами данных (критическое числоло пользователей зависит от аппаратных компонентов, кабельной системы и сетев программного обеспечения), может практически остановиться из-за чрезмерного сетвого трафика.
Множественный доступ с контролем несущей и предотвращением коллизий
Множественный доступ с контролем несущей и предотвращением коллизий (сок щенно CSMA/CA) основан на том, что каждый компьютер перед передачей данных в сеть сигнализирует о своем намерении, поэтому остальные компьютеры узнают о готовящейся передаче и могут избежать коллизий. Однако широковещательное оповещение увеличивает общий трафик сети уменьшает ее пропускную способность. Поэтому CSMA/CA работает медленнее, чем CSMA/CD.
Суть доступа с передачей маркера заключается в следующем: пакет особого типа, ма кер (token), циркулирует по кольцу от компьютера к компьютеру. Чтобы послать данные в сеть, любой из компьютеров сначала должен дождаться прихода свободного маркера и захватить его.
Когда какой-либо компьютер «наполнит» маркер своей информацией и пошлет его по сетевому кабелю, другие компьютеры уже не могут передавать данные. Поскольку в каждый момент времени только один компьютер будет использовать маркер, то в сети не возникнет ни состязания, ни коллизий, ни временных пауз.
Доступ по приоритету запроса - относительно новый метод доступа, разработана для стандарта сети Ethernet со скоростью передачи данных 100 Мбит/с 1OOVG-AnyLAN. Он стандартизован IEEE в категории 802.12. Этот метод доступа основан на том, что все сети 1OOVG-AnyLAN строятся только из концентраторов и оконечных узлов. Концентраторы управляют доступом к кабелю последовательно опрашивая все узлы в сети и выявляя запросы на передачу. Концентратор, должен знать все адреса, связи и узлы и проверять их работоспособность. Оконечным узлом, в соответствии со спецификацией 1OOVG-AnyLAN, может быть компьютер, мост, маршрутизатор или коммутатор.
Как и при CSMA/CD, при доступе по приоритету запроса два компьютера могут бороться за право передать данные. Однако только последний метод реализует схему, по которой определенные типы данных - если возникло состязание, - имеют соответствующий приоритет. Получив одновременно два запроса, концентратор вначале отдаст предпочтение запросу с более высоким приоритетом. Если запросы имеют одинаковый приоритет, они будут обслужены в произвольном порядке. В сетях с использованием доступа по приоритету запроса каждый компьютер может одновременно передавать и принимать данные, поскольку для этих сетей разработана специальная схема кабеля. В них применяется восьмипроводной кабель, по каждой паре проводов сигналы передаются с частотой 25 МГц.
В сетях, где реализован доступ по приоритету запроса, связь устанавливается только между компьютером-отправителем, концентратором и компьютером-получателем. Такой вариант более эффективен, чем CSMA/CD, где передача осуществляется для всей сети. В среде с доступом по приоритету запроса каждый концентратор ©«знает»©только те оконечные узлы и репитеры, которые непосредственно подключены к нему, тогда как в среде с CSMA/CD каждый концентратор «знает» адреса всех узлов сети.
Сетевая архитектура (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 |
Версия сети 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 футов).
Компания Apple Computer, Inc. в 1983 году представила AppleTalk как ©фирменную© сетевую архитектуру для небольших рабочих групп. Сетевые функции были встроены в компьютеры Macintosh, что сделало реализацию сети AppleTalk очень простой по сравнению с другими сетями.
Основные термины, используемые в рабочей среде Apple, могут ввести в заблуждение, поскольку звучат так же, как и в остальных средах, но обозначают другие аспекты сетевой работы. Здесь будут рассмотрены следующие компоненты сетевого обеспечения Apple:
AppleTalk
AppleTalk - сетевая архитектура Apple, которая входит в операционную систем; Macintosh. Иначе говоря, сетевые возможности встроены в каждую машину Macintosh. AppleTalk Phase2 - последняя расширенная версия AppleTalk. Архитектура представляет собой набор протоколов, соответствующих модели OSI.
Когда устройство, соединенное с сетью LocalTalk, начинает работу, оно выполняет прежде всего три принципиально важных действия, причем в определенном порядке.
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.
Среда 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 футов) как при топологии ©звезда, так и при
топологии ©шина.
В системе Linux некоторые команды ожидают ввод только с клавиатуры
(стандартный ввод) и большинство команд отображают свой вывод на экране
терминала (стандартный вывод). Однако система Linux позволяет вам
перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать
shell
:
Комплект протоколов TCP/IP - это сетевое программное обеспечение низкого уровня, чаще всего используемое с ОС UNIX. В состав комплекта TCP/IP входит несколько компонентов:
TCP/IP предоставляет пользователям однородный интерфейс, обеспечивающий взаимодействие с сетевыми аппаратными средствами различных типов. Этот протокол гарантирует возможность обмена данными (взаимодействия) между системами, невзирая на многочисленные различия, существующие между ними. TCP/IP, кроме того, позволяет соединять на программном уровне отдельные физические сети в более крупную и более гибкую логическую сеть.
Нельзя говорить о технических деталях, лежащих в основе Интернета, не понимая средств, которые он обеспечивает. Эта глава кратко рассматривает средства Интернета, более подробно останавливаясь на тех средствах, которыми пользуется большинство пользователей, и откладывая до следующих глав рассмотрение вопроса о том, как компьютеры присоединяются к Интернету и как реализуются эти средства.
Большая часть описания средств будет посвящена стандартам, называемым протоколами. Протоколы, такие как 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, программисты часто могут обнаружить, что существующее программное обеспечение уже обеспечивает коммуникационные средства, которые им нужны.
Сетевая модель 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
Рис. 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авляет обменом информации между ними. Кроме того, прикладной уровень предоставляет средства для отправки информации и уведомления об исключительных ситуациях передачи данных.
Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:
command < имя\_файла
ОС UNIX может обеспечивать работу целого ряда физических сетей, включая Ethernet, Token Ring и системы на базе модемов. Управление техническими средствами осуществляется в пределах канального уровня архитектуры TCP/IP, а протоколы более высоких уровней не знают и не желают знать о том, как именно используются эти технические средства.
Каждое соединение машины с сетью называется сетевым интерфейсом. Машина, имеющая более одного интерфейса, может принимать данные по одному интерфейсу и передавать их по другому, осуществляя таким образом пересылку данных между сетями. Эта функция называется маршрутизацией, а машина, ыполняющая ее, - маршрутизатором, или шлюзом7.3. Большинство сложностей в низкоуровневом управлении сетями обусловлено именно вопросами маршрутизации.
Данные путешествуют по сети в форме пакетов, каждый из которых состоит из заголовка и полезной нагрузки. Заголовок содержит сведения о том, откуда прибыл пакет и куда он направляется. Заголовок, кроме того, может включать контрольную сумму, информацию, характерную для конкретного протокола, и другие инструкции по обработке. Полезная нагрузка - это данные, подлежащие пересылке. В контексте низкоуровневых аппаратных средств пакеты часто называют кадрами.
Когда пакет путешествует вниз по стеку протоколов, готовясь к отправке, каждый протокол вводит в него свою собственную информацию заголовка. Законченный пакет одного протокола становится полезной нагрузкой пакета, генерируемого следующим протоколом. Эта операция известна как инкапсуляция, или оформление. На принимающей машине инкапсулированные кадры разворачиваются в обратном порядке.
Например, UDP-пакет, передаваемый по сети Ethernet, содержит три различных "обертки". В среде Ethernet он "заворачивается" в простой заголовок, содержащий сведения об аппаратных адресах источника и получателя, длине кадра и его контрольной сумме. Полезной нагрузкой Ethernet-кадра является IP-пакет. Полезная нагрузка IP-пакета -UDP-пакет, и, наконец, полезная нагрузка UDP-пакета состоит собственно из передаваемых данных.
Существует множество стандартов протоколов коммуникации. Многие из них предшествовали Интернету, поэтому возникает вопрос:"Почему разработчики Интернета придумали новые протоколы, когда уже существует так много международных стандартов?". Ответ сложен, но тем не менее, может быть выражен в виде простого правила:
Группа протоколов TCP/IP не игнорировала международных стандартов. Она появилась просто потому, что существующие стандарты не удовлетворяли потребностям. Философия использования стандартов, когда они появляются, также означает, что когда появятся международные стандарты и обеспечат ту же самую взаимную работоспособность, что и TCP/IP, Интернет перейдет с TCP/IP на эти новые стандарты.
Обоснование
Протокол 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 Протоколы шлюзов
Чтобы обеспечить гибкость в присвоении адресов комптьютерным сетям и позволить применение большого количества малых и средних сетей, поле адреса кодируется таким образом, чтобы определять малое количество сетей с большим количеством хостов, среднее количество сетей со средним количеством хостов и большое количество сетей с малым количеством хостов. Дополнительно имеется escape код для расширенного режима адресации.
Старшие биты | Формат | Класс |
0 | 7 бит в сети, 24 бита для хостов | А |
10 | 14 бит в сети, 16 бит для хостов | В |
110 | 21 бит для сети, 8 бит для хостов | С |
111 | переход в расширенный режим адресации |
Нулевое значение в поле сети означает данную сеть. Этот режим
используется только в определенных ICMP сообщениях. Расширенный режим
адресации неопределен. Обе эти возможности зарезервированы для будущих
реализаций. Реальные значения, присваиваемые сетевым адресам, даны в
документе "Assigned Numbers" [].
Локальный адрес, присвоенный локальной сети, должен позволять одиночному физическому хосту работать как несколько отдельных Internet хостов. А именно, должен существовать промежуток между адресами Internet хостов и должны присутствовать интерфейсы между сетью и хостом, которые позволили бы нескольким Internet адресам соответствовать одному интерфейсу. Хост должен иметь возможность для поддержки нескольких физических интерфейсов и для обработки датаграмм с любого из них, как если бы они были адресованы к единственному хосту.
Карта соответствия между Internet адресами и адресами таких сетей,
как ARPANET, SATNET, PRNET и др. описаны в документе "Address Mapping"
[].
Формат заголовка 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 датаграммы
Поле версии показывает формат заголовка Internet. Данный документ описывает версию 4.
Длина Internet заголовка измеряется в словах по 32 бита каждый и указывает на начало поля данных. Заметим, что корректный заголовок может иметь минимальный размер 5 слов.
Тип сервиса определяет с помощью неких абстрактных параметров тип требуемого обслуживания. Эти параметры должны использоваться для управления выбором реальных рабочих характеристик при передаче датаграммы через конкретную сеть. Некоторые сети осуществляют обслуживание с приоритетом, которое неким образом дает преимущество для продвижения данной датаграммы по сравнению со всеми остальными. Реально выбор осуществляется между тремя альтернативами: малой задержкой, высокой достоверностью и высокой пропускной способностью.
биты 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" []. Значение "управление сетью"
следует присваивать приоритету только для использования внутри локальной
сети. Управление и реальное использование этого аргумента должно
находиться в согласии с каждой применяющей его сетью. Аргумент
"межсетевое управление" предназначен только для использования шлюзами,
берущими на себя управление. Если вышеописанные аргументы приоритета
находят применение в какой-либо сети, то это означает, что данная сеть
может управлять приемом и использованием этих аргументов.
Общая длина - это длина датаграммы, измеренная в октетах, включая Internet заголовок и поле данных. Это поле может задавать длину датаграммы вплоть до 65535 октетов. В большинстве хост-компьютеров и сетей столь большие датаграммы не используются. Все хосты должны быть готовы принимать датаграммы вплоть до 576 октетов длиной (приходят ли они целиком или по фрагментам). Хостам рекомендуется отправлять датаграммы размером более чем 576 октетов, только если они уверены, что принимающий хост готов обслуживать датаграммы повышенного размера.
Значение 576 выбрано с тем, чтобы соответсвующим образом ограниченный блок данных передавался вместе с требуемой информацией в заголовке. Например, этот размер позволяет заполнять датаграмму полем данных размером в 512 октетов и заголовком в 64 октета. Наибольший Internet заголовок занимает 60 октетов, а его типичный размер составляет всего 20 октетов, что оставляет место под заголовки протоколов более высокого уровня.
Идентификатор устанавливается отправителеим для сборки фрагментов какой-либо датаграммы.
бит 0 | зарезервирован, должен быть нуль |
бит 1 (DF) | 0 - возможно фрагментирование, 1 - запрет фрагментации |
бит 2 (MF) | 0 - последний фрагмент, 1 - будут еще фрагменты |
0 1 2 +----+----+----+ | 0 | DF | MF | +----+----+----+
Это поле показывает, где в датаграмме находится этот фрагмент. Смещение фрагмента изменяется порциями по 8 октет (64 бита). Первый фрагмент имеет смещение нуль.
Это поле показывает максимальное время, в течении которого датаграмме позволено находиться в системе Internet. Если это поле имеет значение нуль, то датаграмма должна быть разрушена. Значение этого поля изменяется при обработке заголовка Internet. Время измеряется в секундах. Однако, поскольку каждый модуль, обрабатывающий датаграмму, должен уменьшать значение поля TTL по крайней мере на единицу, даже если он обрабатываетт эту датаграмму менне, чем за секунду, то поле TTL следует понимать как максимальный интервал времени, в течении которого датаграмма может сущенствовать. Внимание следует обратить на разрушение датаграмм, не могущих достигнуть получателя, а также на ограничение времени жизни датаграммы.
Это поле показывает, какой протокол следующего уровня использует данные из Internet датаграммы. Значения для различных протоколов приводятся в документе "Assigned Numbers" [9].
Поскольку некоторые поля заголовка меняют свое значение (например, время жизни), это значение проверяется и повторно рассчитывается при каждой обработке Internet заголовка. Алгоритм контрольной суммы следующий: Поле контрольной суммы - это 16 бит, дополняющие биты в сумме всех 16 битовых слов заголовка. Для вычисления контрольной суммы значение этого поля устанавливается в нуль.
Контрольную сумму легко рассчитать и опытным путем доказать ее адекватность, однако это временная мера и должна быть заменена CRC процедурой в зависимости от дальнейшего опыта.
Опции могут появиться в датаграммах, а могут и не появляться. Они должны поддерживаться всеми 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. |
Отдельные описания опций
Эта опция обозначает конец списка опций. Он может не совпадать с окончанием Internet заголовка, обозначаемым полем Internet header length. Эта опция используется после всех опций, но не после каждой. Она необходима только в том случае, если конец списка опций не совпал с окончанием Internet заголовка. Может быть скопирован, внесен или удален при фрагментации, или по какой-либо другой причине.
Эта опция может быть использована между другими опциями. Ее целью может служить, к примеру, выравнивание очередной опции по 32- битной границе. Может быть скопирована, внесена или удалена при фрагментации и по любой другой причине.
Эта опция дает способ хост-компьютерам отправлять параметры, связанные с безопасностью, закрытостью, введением ограничений и параметрами 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 | резервировано |
Нулевое значение во всех позициях используется когда передача информации не ограничена. Остальные значения для этого поля можно получить от Секретного Оборонного Агенства.
Поле H (введение ограничений) 16 бит
Значения для управления и внесения меток являются буквенно- цифровыми диграммами и опредены в документе DIAM 65-19 "Standard Security Markings".
Поле TCC (поле управления переносом) 24 бита
Дает средства для отслеживания процесса отделения, его значения контролируются группами заинтересованных подписчиков. Значения TCC имеют три поля для записей и могут быть получены из документа HQ DCA Code 530.
Рассматриваемый тип должен копироваться при фрагментации. Эта опция появляется в датаграмме не более одного раза.
+--------+--------+---------+------- // ------+ |10000011| длина |указатель|данные о маршруте| +--------+--------+---------+------- // ------+
Опция потери отправителя и записи маршрута (LSRR) обеспечивает средства, позволяющие отправителю Internet датаграммы передавать информацию, используемую шлюзами при передаче датаграмм по назначению, а также записывать информацию о маршруте.
Опция начинается с кода типа. Второй октет - октет длины, которая учитывает код типа опции и сам себя, а также октет указателя. Третий октет является указателем на данные о маршруте, он определяет октет, с которого начинается следующий адрес отправителя, подлежащий обработке. Указатель отсчитывается от начала рассматриваемой опции, а его наименьшее допустимое значение - 4.
Данные о маршруте состоят из ряда Internet адресов. Каждый Internet адрес - это 32 бита или 4 октета. Если указатель превышает длину, то маршрут отправителя пуст (поле с записями маршрута заполнено), а маршрутизация должна основываться на значениях поля с адресом получателя.
Если адрес, записанный в поле адреса получателя, был достигнут, а указатель не превысил длину, то следующий адрес в маршруте отправителя замещает адрес в поле с адресом получателя. Записанный адрес маршрута заменяет только что использованный адрес отправителя, а указатель увеличивается на 4.
Записанный адрес маршрута является собственным Internet адресом Internet модуля, известным во внешнем окружении, куда эта датаграмма направляется.
Эта процедура замещения исходного маршрута записанным маршрутом (хотя при обратном порядке он должен использоваться как маршрут отправителя) означает, что данная опция (а также и весь IP заголовок) сохраняет постоянный размер при прохождении датаграммы по Internet системе.
Эта опция называется потерей маршрута отправителя (loose source route), поскольку шлюз или IP хост могут использовать любые маршруты через любое количество других промежуточных шлюзов для достижения следующего адреса в рассматриваемом маршруте. При фрагментации опция должна копироваться. В датаграмме она должна появляться не более одного раза.
+--------+--------+---------+------- // --------+ |10001001| длина |указатель| данные о маршруте | +--------+--------+---------+------- // --------+
Опция "уточнить отправитель и записать маршрут" (SSRR) дает средства отправителю Internet датаграммы для поддержания информации о маршрутизации, которая должна использоваться шлюзами при передаче датаграммы по назначению, а также для записи этой информации.
Опция начинается с кода типа. Второй октет - длина опции, которая учитывает код типа опции и октет длины, октет указателя (3 октета с данными о маршруте). Третий октет является указателем на данные маршрута, определяющим октет, с которого начинается следующий адрес отправителя, подлежащий обработке. Указатель отсчитывается с начала этой опции, а наименьшее допустимое значение указателя - 4.
Данные о маршруте состоят из серии Internet адресов. Каждый Internet адрес - это 32 бита или 4 октета. Если указатель превышает длину, то маршрут отправителя пуст (записываемый маршрут полон), а маршрутизация основывается на значении поля с адресом получателя.
Если адрес в поле адреса получателя был достигнут, а указатель не превышает длины, то следующий адрес в маршруте отправителя замещает адрес в поле с адресом получателя, а записанный адрес маршрута замещает только что использованный адоес отправителя, указатель увеличивается на 4.
Записанный адрес маршрута - это собственный Internet - адрес Internet - модуля, как он был бы распознан во внешней среде, куда эта датаграмма направляется.
Эта процедура замещения маршрута отправителя записанным маршрутом (хотя в обратном порядке он должен использоваться как маршрут отправителя) означает, что опция (и весь IP заголовок) сохраняет постоянный размер при прохождении датаграммы через Internet систему.
Эта опция является точным маршрутом отправителя, поскольку шлюз или IP хост должен посылать данную датаграмму непосредственно на следующий адрес в маршруте отправителя через напрямую соединенную сеть, на адрес, показывающий следующий шлюз или хост, указанный в маршруте.
Опция должна копироваться при фрагментации. Появляется не более одного раза в датаграмме.
+--------+--------+---------+------- // --------+ |00000111| длина |указатель| данные о маршруте | +--------+--------+---------+------- // --------+
Опция записи маршрута дает средства для записи маршрута Internet датаграммы.
Опция начинается с кода типа. Второй октет определяет длину опции, которая учитывает код типа опции, сам себя, октет указателя и длину трех октетов с данными о маршруте. Третий октет является указателем на данные маршрута. Указатель определяет октет, с которого начинается следующее поле для размещения адреса маршрута. Указатель отсчитывается от начала рассматриваемой опции, а его наименьшее допустимое значение - 4.
Записываемый маршрут состоит из серии Internet адресов. Каждый Internet адрес - это 32 бита или 4 октета. Если указатель больше, чем длина опции, то поле с записываемым маршрутом заполнено. Хост - компьютер, создающий эту опцию, должен зарезервировать поле с данными о маршруте и достаточным размером, с тем, чтобы оно вместило все ожидаемые адреса. Размер этой опции не изменяется при добавлении адресов. Первоначальное содержимое поля под данные о маршруте должно быть нулевым.
Когда Internet модуль направляет датаграмму, он проверяет ее на присутствие рассматриваемой опции с записываемым маршрутом. Если она присутствует, то он вставляет свой собственный Internet адрес в качестве распознанного во внешней среде, куда эта датаграмма направлена. Вставка осуществляется в опцию записи маршрута, в то место, на которое указывает октет указателя. Указатель затем увеличивается на 4.
Если поле с данными о маршруте уже заполнено (указатель превышает длину), то датаграмма направляется без вставки адреса в опцию заполняемого маршрута. Если имеется некоторое пространство, но недостаточное для вставки полного адреса, то исходная датаграмма считается ошибочной и разрушается. И в том, и в другом случае на хост-отправитель напрвляется сообщение о проблеме с ICMP параметром [3].
При фрагментации не копируется, присутствует лишь в первом фрагменте. В датаграмме присутствует не более одного раза.
+--------+--------+--------------------+ |10001000|00000010|идентификатор потока| +--------+--------+--------------------+
Эта опция дает средства для поддержания 16-битовой SATNET идентифткации потока в сетях, которые парвоначально не поддерживали потоковую концепцию.
Опция должна копироваться при фрагментации. В датаграмме появляется не более одного раза.
+--------+--------+---------+-----+-----+ |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].
Опция временного штампа не копируется при фрагментации, а сохраняется в первом фрагменте. В датаграмме появляется не более одного раза.
Выравнивание Internet заголовка используется для того, чтобы убедиться в том, Internet заголовок заканчивается на 32-битной границе. Варавнивание осуществляется нулями.
Поле 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.
Датаграмма наибольшего размера, которая еще может быть передана через очередную локальную сеть, называется наибольшей передаваемой единицей (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) Приготовить этот фрагмент к повторному тесту на необходимость фрагментации. Выполнить.
В предыдущей процедуре каждый фрагмент (за исключением последнего) получает максимально разрешенную длину. Альтернатива может заключаться в создании датаграмм, не достигающих максимального размера. Для примера, она может включать процедуру фрагментации, которая повторно делит большие датаграммы пополам до тех пор, пока получающиеся фрагменты не станут короче, чем максимальный допустимый размер передаваемой единицы.
Для каждой датаграммы идентификатор буфера определяется как объединение полей адреса отправителя, адреса получателя, протокола и идентификации. Если это целая датаграмма (поля 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.
В случае, если два или более фрагмента содержат одни и те же данные, либо идентичны или частично перекрываются, то эта процедура будет использовать последнюю полученную копию при создании буфера данных и воссоздании датаграммы.
Выбор способа идентификации исходит из необходимости уникальной идентификации фрагментов конкретной датаграммы. Модуль протокола, собирающий фрагменты, считает, что они относятся к одной и той же датаграмме, если они имеют общего отправителя, получателя, протокол и идентификатор. Таким образом, отправитель должен выбрать идентификатор таким образом, чтобы он был уникален для данной пары отправителя - получателя, для данного протокола и в течении того времени, пока данная датаграмма (или любой ее фрагмент) может существовать в сети Internet.
Очевидно, что модуль протокола, отправляющий датаграммы, должен иметь таблицу идентификаторов, где каждая запись соотносится с каждым отдельным получателем, с которым осуществлялась связь, и указывает последнее значение максимального времени жизни датаграммы в сети Internet.
Однако, поскольку поле идентификатора позволяет использовать 65536 различных значений, некоторые хост-компьютеры могут использовать просто уникальные идентификаторы независимо от адреса получателя.
Обычно идентификаторы выбирают протоколы более высокого уровня, например модули TCP протокола могут повторно передавать идентичные TCP сегменты. Вероятность правильного приема увеличивалась бы, если повторная передача осуществлялась с тем же самым идентификатором, что и исходная датаграмма, поскольку ее фрагменты могли бы использоваться для сборки правильного TCP сегмента.
Тип обслуживания (TOS) используется для выбора качества Internet сервиса. Тип обслуживания определяется абстрактными параметрами приоритета, задержки, продолжительности и достоверности. Эти параметры должны отображаться на реальные параметры сервиса для конкретных сетей, через которые проходит данная датаграмма.
Например, сеть ARPANET имеет бит приоритета, а также выбор между "стандартными" сообщениями (тип 0) и "неконтролируемыми" (тип 3) (также в качестве одного из сервисных параметров может использоваться выбор между единичным пакетом и многопакетными сообщениями). Неконтролируемые сообщения имеют тенденцию иметь меньшую достоверность, но и меньшую задержку. Допустим, Internet датаграмма должна быть передана через сеть ARPANET. Пусть тип Internet сервиса определен как
приоритет: | 5 |
задержка: | 0 |
пропускная способность: | 1 |
достоверность: | 1 |
В рассматриваемом примере отображение описанных параметров на параметры, допустимые в сети ARPANET, привело бы к установке бита приоритета ARPANET (поскольку приоритет Internet находится в верхней половине своего диапазона), выбору стандартного типа сообщений (поскольку указаны требования высокой пропускной способности и достоверности, а параметр задержки сброшен). Дополнительные детали реализации сервиса даны в документе "Service Mappings" [8].
Время жизни устанавливается отправителем в соответствии с максимальным значением, которое данная датаграмма может иметь в системе Internet. Если датаграмма пребывает в системе Internet дольше, чем указанное время жизни, она подлежит уничтожению.
Значение в поле, где указано время жизни, должно уменьшаться в каждой точке, где обрабатывается Internet заголовок, с тем, чтобы показать время, потраченное на обработку датаграммы. Даже если нет возможности получать информацию о том, сколько реально времени было потрачено, значение этого поля должно быть уменьшено на единицу. Время изменяется в секундах (т.е. указанная единица соответствует одной секунде). Таким образом, максимальное время жизни составляет 255 секунд или 4.25 минуты. Поскольку каждый модуль, обрабатывающий датаграмму, должен уменьшать значение поля TTL по крайней мере на единицу, даже если он обрабатывает ее быстрее, чем за секунду, то поле TTL следует рассматривать лишь как верхнюю границу для времени существования датаграммы. Цель процедуры заключается в разрушении датаграмм, не достигших получателя, а также в ограничении времени жизни датаграммы в сети.
Некоторые протоколы более высокого уровня, управляющие соединениями, основываются на предположении, что старые датаграммы-дубликаты не достигают цели по истечении определенного времени. TTL - это способ, с помощью которого такие протоколы могли бы убедиться, что их предположение удовлетворяется.
Опции могут присутствовать в любой датаграмме, но должны всегда быть обработаны. А именно, наличие или отсутствие какой-либо опции дело отправителя, но каждый Internet модуль должен быть в состоянии произвести разбор каждой опции.
Опции могут оканчиваться не на 32-битной границе. В этом случае Interntet заголовок может дополняться нулевыми октетами. Первый из них должен интрепретироваться как заключительная опция, а остальные - как октеты выравнивания Internet заголовка по границе.
Каждый Internet модуль должен быть в состоянии реагировать на каждую опцию. Например, опция безопасности требует классификации, внесения ограничений, или передачи по изолированному пути.
Пересчет контрольной суммы Internet заголовка осуществляется каждый раз при его изменении. Например, это происходит при уменьшении времени жизни, добавлении или изменении Internet опций или при фрагментации. Контрольная сумма на уровне Internet имеет целью защиту полей Internet заголовка от ошибок при пересылке.
Существуют некоторые приложения, которые могли бы допустить несколько ошибочных битов в поле данных при условии отсутствия задержки. Однако, если Internet протокол усиливает ошибочность данных, то такие приложения не могут поддерживаться.
Ошибки Internet заголовка могут быть оглашены посредством ICMP сообщений
[].
Функциональное описание взаимодействия между пользователем и 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 датаграммы
Порядок передачи заголовка и данных, описанных в данном документе, определяется на уровне октетов. В то время как диаграмма обозначает группу октетов, порядок их передачи является таким же, как при чтении на английском языке. Например, в нижеприведенной диаграмме октеты передаются в порядке номеров.
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 Старшинство битов
Аналогично, если многооктетное поле представляет число, то самый левый бит в этом поле является самым значащим битом. При передаче многооктетного чила самый значащий октет передается первым.
Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:
command > имя\_файла
Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.
Перед тем, как перенаправить вывод команды в конкретный файл убедитесь, что
этот файл не существует. shell
не предупреждает, что выполняет перезапись
существующего файла.
Чтобы убедиться, что файл с запланированным именем не существует,
воспользуйтесь командой ls
с аргументом ``имя_файла''
. Если этот
файл не существует, то ls
выдаст сообщение, что файл не найден в текущем
справочнике. Например, проверка существования файлов temp и junk даст следующий
результат:
$ ls temp temp $ ls junk junk: no such file or directiry $
Это означает, что вы можете назвать свой файл junk, но не можете использовать в качестве имени temp, если не хотите потерять содержимое существующего файла.
Рассмотрим две машины А и В, которые присоединены к одной физической сети. Каждая из них имеет назначенный 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-адрес.
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-адреса.
Физические сетевые адреса являются как низкоуровневыми, так и аппаратно зависимыми. При этом каждой машине, использующей 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 часто повторять запрос, можно добиться того, что сервер будет буквально захлестнут волной избыточного траффика. В то же время использование большого времени ожидания ответа гарантирует, что у серверов будет достаточно времени для приема запроса и выдачи ответа.
Протокол Internet (IP) используется для обработки датаграммы, передаваемой между хост-компьютерами в системе объединенных сетей, называемой Catenet. Устройства, осуществляющие соединение различных сетей, называются шлюзами. Для обеспечения управления шлюзы общаются друг с другом посредством протокола Gateway to Gateway Protocol (GGP). Порой шлюз или хост-компьютер, получающий данные, обменивается информацией с хост-компьютером, отправляющим эти данные. Именно для таких йелей используется данный протокол - протокол контрольных сообщений Internet (ICMP). ICMP использует основные свойства протокола Internet (IP), как если бы ICMP являлся протоколом более высокого уровня. Однако фактически ICMP является составной частью протокола Internet и должен являться составной частью каждого модуля IP.
Сообщения ICMP должны отправляться в некоторых затруднительных ситуациях. Например, когда датаграмма не может достичь своего адресата, когда шлюз не имеет достаточно места в своем буфере для передачи какой-либо датаграммы, или когда шдюз приказывает хост- компьютеру отправлять информацию по более короткому маршруту.
Протокол Internet не создан для того, чтобы обеспечивать абсолютную надежность передачи информации. Целью же данных контрольных сообщений является обеспечение обратной связи, оповещение отправителя данных о проблемах, возникающих в комминикационном оборудовании. Их целью не является придание надежности протоколу IP. Протокол не дает гарантий, что датаграмма достигает своего адресата или что контрольное сообщение будет возвращено компьтеру, отправившему данные. Некоторые из датаграмм могут исчезнуть в сети, не вызвав при этом ни каких оповещений. Протоколы более высокого уровня, использующие протокол IP, должны применять свои собственные процедуры для обеспечения надежности передачи данных, если таковая требуется.
Сообщения ICMP протокола, как правило, оповещают об ошибках, возникающих при обработке датаграмм. Чтобы проблемы с передачей сообщений не вызывали появление новых сообщений, чтобы это в свою очередь не привело к лавинообразному росту количества сообщений, циркулирующих в сети, констатируется, что нельзя посылать сообщения о сообщениях. Также констатируется, что ICMP сообщения можно посылать только о проблемах, возникающих при обработке нулевого фрагмента в сегментированной датаграмме (нулевой фрагмент имеет нуль в поле смещения фрагмента).
ICMP сообщения посылаются с помощью стандартного IP заголовка. Первый октет в поле данных датаграммы - это поле типа ICMP сообщения. Значение этого пля определяет формат всех остальных данных в датаграмме. Любое поле, которое помечено "unused", зарегистрировано для последующих разработок и должно при отправлении содержать нули. Однако получатель не должен использовать значения этих полей (за исключением процедуры вычисления контрольной суммы). Если обратное особо не оговорено при описании отдельных фрагметов, Internet заголовок должен иметь в своих полях следующие значения:
Версия | 4 | |
IHL | Длина Internet заголовка; единица измерения - 32-битное слово. | |
Тип сервиса | 0 | |
Общая длина | Длина Internet заголовка и поля данных в октетах. | |
Идентификация, флаги, смещение фрагмента | Используются в случае фрагментации. | |
Время жизни | Время жизни в секундах. Поскольку значение этого поля уменьшается на единицу в каждой машине, на которой обрабатывается данная датаграмма, то значение этого поля должно, по крайней мере, превышать количество шлюзов, через которые будет проходить данная датаграмма. | |
Протокол | ICMP=1 | |
Контрольная сумма заголовка | 16-битное дополнение до единицы суммы дополнений до единицы всех 16-битных слов в заголовке. При вычислении данной суммы следует первоначально устанавливать значение этого поля в нуль. В дальнейшем этот алгоритм вычисления контрольной суммы должен быть изменен. | |
Адрес отправления | Адрес шлюза или хост-компьютера, который составил данное ICMP сообщение. Если не оговорено обратное, в этом поле может находиться любой из адресов шлюза. | |
Адрес получателя | Адрес шлюза или хост-компьютера, которому следует послать данное сообщение. |
0 | ответ на запрос эхо |
3 | адресат недостижим |
4 | приостановка отправителя |
5 | переадресация |
8 | эхо-запрос |
11 | превышение контрольного времени |
12 | проблемы с параметрами |
13 | штамп времени |
14 | ответ на запрос штампа времени |
15 | запрос информации |
16 | ответ на запрос информации |
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 протокола
0 | невозможно передать датаграмму на локальную сеть, где находится адресат |
1 | невозможно передать датаграмму на хост-компьютер, являющийся адресатом |
2 | нельзя воспользоваться указанным протоколом |
3 | нельзя передать данные на указанный порт |
4 | для передачи датаграммы по сети требуется фрагментация, однако выставлен флаг DF. |
5 | сбой в маршрутизации при отправлении |
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений октетов в полях ICMP сообщения, начиная с поля типа ICMP. Для вычисления контрольной суммы первоначально значение этого поля обнуляется. В будущем процедура вычисления контрольной суммы может быть изменена.
Данное поле содержит Internet заголовок и первые 64 бита данных из исходной датаграммы для выработки сообщения для соответствующего процесса. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера находятся в первых 64 битах поля данных.
Описание
Если, согласно информации в таблицах маршрутизации шлюза, локальная сеть, указанная в Internet заголовке датаграммы в поле адресата, является недостижимой, например, из-за ее чрезмерной удаленности, то шлюз может послать хост-компьютеру, отправившему датаграмму по Internet сети, сообщение о недостижимости адресата.
Кроме этого, в некоторых сетях шлюз может иметь возможность определять доступность отдельного хост-компьютера. Шлюз в такой сети может послать данное сообщение, если хост-компьютер, являющийся адресатом, недоступен.
Иная ситуация возникает, когда для достижения адресата датаграмма должна быть разбита шлюзом на отдельные фрагменты, но установлен флаг запрета фрагментации. О этом случае шлюз обязан ликвидировать датаграмму и можен при этом послать сообщение о недостижимости адресата.
Шлюз может послать сообщения с кодами 0, 1, 4 и 5. Хост- компьютер может послать сообщения с кодами 2 и 3.
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 сообщения
0 | при передаче превышено время жизни |
1 | превышено контрольное время при сборке фрагментов датаграммы |
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислениии суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм контрольной суммы может быть изменен.
Описание
Если фрагмент нулевого размера превысил контрольное время, то сообщение в этом не посылается вовсе.
Шлюз может послать сообщение с кодом 0б а хост - с кодом 1.
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 сообщения
Описание
Если шлюз или хост-компьютер, обрабатывающий датаграмму, обнаруживает проблему с обработкой параметров заголовка, и это не позволяет завершить ее обработку, то он должен ликвидировать рассматриваемую датаграмму. Одной из потенциальных причин такой неприятности могут бить неправильные аргументы в опции. Шлюз или хост-компьютер в сообщении о проблеме с параметрами может также упомянуть хост-компьютер, породивший датаграмму с ошибкой. Сообщения такого типа посылаются лишь в том случае, если ошибка приводит к ликвидации этой датаграммы.
Указатель определяет октет в заголовке исходной датаграммы, где была обнаружена ошибка (этот ошибочный октет может находиться даже посередине опции). Например, 1 указывает на то, что имеется какая-то ошибка в поле типа сервиса, а (если имеются опции) 20 определяет, что имеется ошибка в коде типа для первой опции.
Код 0 сообщения может приходить как от шлюза, так и от хост-компьютера.
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 сообщения
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти данные используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных исходной датаграммы.
Описание
Шлюз может ликвидировать Internet датаграммы, если у него нет места в буфере для постановки этих датаграмм в очередь на отправление в очередную сеть по маршруту следования к адресату. Если шлюз ликвидирует датаграмму, то он должен послать сообщение для приостановки хост-компьютеру в Internet системе, отправившему данную датаграмму. Сообщение о приостановке может послать также сам адресат, если датаграммы приходят слишком быстро, чтобы успеть их обработать. Сообщение о приостановке является запросом для хост-компьютера уменьшить скорость посылки данных на этот конкретный адрес. Шлюз может посылать сообщение для приостановки отправителя в каждом случае ликвидации. При получении такого сообщения хост-компьютер, отправивший данные, должен уменьшить скорость посылки данных по этому адресу до тех пор, пока не перестанут приходить запросы на приостановку с данного шлюза. После этого хост-компьютер, отправляющий данные, может постепенно увеличивать скорость посылки данных по этому адресу, пока вновь не станут приходить сообщения о приостановке.
Шлюз или хост-компьютер может посылать сообщение о приостановке еще до достижения предельной пропускной способности, и не ждать, пока этот предел будет пройден. Это означает, что датаграмма с данными, вызвавшая появление сообщения о приостановке, все же может достичь своего адресата.
И шлюз и хост-компьютер могут отправить сообщение с кодом 0.
Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом »:
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. $
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 сообщения
0 | переадресация датаграмм для сети |
1 | переадресация датаграмм для хост-компьютера |
2 | переадресация датаграмм для типа услуг и сети |
3 | переадресация датаграмм для типа услуг и хост-компьютера |
Контрольная сумма - это 16-битное допонение до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении контрольной суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Адрес шлюза, на который должен быть проложен маршрут к сети, указанной в поле адреса в исходной датаграмме с данными.
Описание
Шлюз посылает сообщение на хост-компьютер о переадресации в следующей ситуации: Шлюз G1 получает Internet датаграмму от хост-компьютера в сети, где он расположен. Шлюз G1 проверяет таблицу маршрутизации и находит адрес слеудющего шлюза G2 в качестве маршрута для датаграммы по пути в сеть X, где расположен ее адресат. Если G2 и исходный хост-компьютер идентифицируются Internet адресом как находящиеся в одной и той же сети, то на хост-компьютер следует послать сообщение о переадресации. Сообщение о переадресации заставляет хост-компьютер посылать датаграммы для сети X прямо на шлюз G2, поскольку это более короткий путь, нежели привлекать еще шлюз G1. Шлюз передает данные исходной датаграммы их адресату в системе Internet.
Для датаграмм с опциями IP маршрутизации отправления и адресом шлюза в поле получателя сообщение не посылается, даже если и существует более оптимальный маршрут к конечному адресату, чем следующий адрес, указанный в такой опции маршрута.
Шлюзом могут быть переданы сообщения с кодами 0, 1, 2 и 3.
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
Описание
Данные из эхо-сообщения должны быть переданы в ответе на это сообщение.
Идентификатор и номер очереди может использоваться отправителем эхо-сообщения с целью идентификации приходящих пакетов. Например, идентификатор может использоваться в качестве порта подобно протоколам TCP и UDP для идентификации сеанса. Номер очереди может увеличиваться на единицу припосылке каждого эхо- сообщения (запроса). Компьютер, отозвавшийся на это сообщение, возвращает в своем ответе те же значения для идентификатора и номера очереди, что были в исходном эхо-сообщении.
Как шлюз, так и хост-компьютер могут возвращать сообщение с кодом 0.
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
Описание
Данные из сообщения (штамп времени) возвращаются вместе с ответом, при этом в них добавляется еще один штамп времени. Штамп времени - это 32 бита, где записано время в миллисекундах, прошедшее после полуночи по единому времени (UT).
Штамп времени отправления - это время, которое отправитель фиксировал последний раз перед посылкой сообщения. Штамп времени получения - это время, когда исходное сообщение впервые увидел получатель первоначального сообщения. Штамп времени передачи - это время, которое фиксировал в последний раз компьютер, отправляющий ответное сообщение.
Если нет возможности измерять время в миллисекундах или нельзя определить единое время (UT), то в штамп все же можно занести имющееся время, снабдив его единицей в старшем бите. Последнее также указывает на запись нестандартного значения в этом поле.
Идентификатор и номер очереди могут использоваться отправителем для соотнесения сообщений (запросов) и ответов на них. Например, идентификатор может использоваться в качестве порта, аналогично протоколам TCP и UDP, для идентификации сессии. Номер очереди может увеличиваться на единицу при каждой посылке сообщения (запроса). Адресат возвращает для этих параметров те значения, которые были обнаружены в запросе.
И шлюз и хост-компьютер могут возвращать сообщения с кодом 0.
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 заголовка
Поля ICMP сообщения
15 | сообщение с запросом информации |
16 | ответное сообщение с информацией |
0
Описание
Данное сообщение может быть послано, когда в IP заголовке в полях отправителя и получателя записаны нули (это означает "именно эту" локальную сеть). В ответ должен быть послан IP модуль с полностью заданными адресами. Данное сообщение является способом, с помощью которого хост-компьютер сможет определить номер сети, куда он подключен.
Отправитель сообщений может использовать идентификатор и номер очереди для соотнесения запросов и пришедших ответов. Например, идентификатор может использоваться как порт в протоколах TCP и UDP для идентификации сеанса. Номер очереди может увеличиваться на единицу всякий раз, когда посылается запрос. Адресат возвращает в ответе те же значения этих параметров, которые были обнаружены в запросе.
И хост-компьютер и шлюз могут возвращать сообщения с кодом 0.
Postel, J., "Address Mappings," RFC 796, USC/Институт Информатики, сентябрь 1981.
Strazisar, V., "How to Build a Gateway", IEN 109, Bolt Beranek and Newman, август 1979.
Shoch, J., "Packet Fragmentation in Inter-Network Protocols," Computer Networks, v.3, n.1, январь 1979.
Postel, J., "Service Mappings," RFC 795, USC/Институт Информатики, сентябрь 1981.
Postel, J., "Assigned Numbers," RFC 790, USC/Институт Информатики, сентябрь 1981.
Протокол UDP (User Datagram Protocol - протокол пользовательских датаграмм) является одним из двух основных протоколов, расположенных непосредственно над IP. Он предоставляет прикладным процессам транспортные услуги, которые не многим отличаются от услуг, предоставляемых протоколом IP. Протокол UDP обеспечивает ненадежную доставку датаграмм и не поддерживает соединений из конца в конец. К заголовку IP-пакета он добавляет два поля, одно из которых, поле "порт", обеспечивает мультиплексирование информации между разными прикладными процессами, а другое поле - "контрольная сумма" - позволяет поддерживать целостность данных.
Примерами сетевых приложений, использующих UDP, являются NFS (Network File System - сетевая файловая система) и SNMP (Simple Network Management Protocol - простой протокол управления сетью).
Взаимодействие между прикладными процессами и модулем UDP осуществляется через UDP-порты. Порты нумеруются начиная с нуля. Прикладной процесс, предоставляющий некоторые услуги другим прикладным процессам (сервер), ожидает поступления сообщений в порт, специально выделенный для этих услуг. Сообщения должны содержать запросы на предоставление услуг. Они отправляются процессами-клиентами.
Например, сервер SNMP всегда ожидает поступлений сообщений в порт 161. Если клиент SNMP желает получить услугу, он посылает запрос в UDP-порт 161 на машину, где работает сервер. В каждом узле может быть только один сервер SNMP, так как существует только один UDP-порт 161. Данный номер порта является общеизвестным, то есть фиксированным номером, официально выделенным для услуг SNMP. Общеизвестные номера определяются стандартами Internet.
Данные, отправляемые прикладным процессом через модуль UDP, достигают места назначения как единое целое. Например, если процессотправитель производит 5 записей в UDP-порт, то процесс-получатель должен будет сделать 5 чтений. Размер каждого записанного сообщения будет совпадать с размером каждого прочитанного. Протокол UDP сохраняет границы сообщений, определяемые прикладным процессом. Он никогда не объединяет несколько сообщений в одно и не делит одно сообщение на части.
Когда модуль UDP получает датаграмму от модуля IP, он проверяет контрольную сумму, содержащуюся в ее заголовке. Если контрольная сумма равна нулю, то это означает, что отправитель датаграммы ее не подсчитывал, и, следовательно, ее нужно игнорировать. Если два модуля UDP взаимодействуют только через одну сеть Ethernet, то от контрольного суммирования можно отказаться, так как средства Ethernet обеспечивают достаточную степень надежности обнаружения ошибок передачи. Это снижает накладные расходы, связанные с работой UDP. Однако рекомендуется всегда выполнять контрольное суммирование, так как возможно в какой-то момент изменения в таблице маршрутов приведут к тому, что датаграммы будут посылаться через менее надежную среду.
Если контрольная сумма правильная (или равна нулю), то проверяется порт назначения, указанный в заголовке датаграммы. Если к этому порту подключен прикладной процесс, то прикладное сообщение, содержащееся в датаграмме, становится в очередь для прочтения. В остальных случаях датаграмма отбрасывается. Если датаграммы поступают быстрее, чем их успевает обрабатывать прикладной процесс, то при переполнении очереди сообщений поступающие датаграммы отбрасываются модулем UDP.
Протокол UDP предоставляет прикладным программам возможность отправлять сообщения другим приложениям, используя минимальное количество параметров протокола. Этот протокол не обеспечивает достоверность доставки пакетов, защиты дублирования данных или надежности от сбоев в передаче. За исключением параметров приложения - номеров портов отправителя и получателя пакета, UDP практически ничего не добавляет к IP-дейтаграмме Формат UDP-пакета изображен на рис 1.
Протокол UDP намного проще, чем TCP и полезен в ситуациях, когда мощные механизмы обеспечения надежности протокола TCP не требуются или будут только помехой для решения определенного рода задач, например аутентификации пользователей.
0 1em | 1em | 16 1em | 31 | |
1emИсходящий порт | 1emПорт назначения | |||
1emДлина | 1emКонтрольная сумма | |||
1emДанные ... | ||||
Рис. 1. Формат UDP пакета
Это поле может содержать номер порта, с которого был отправлен пакет, когда это имеет значение (например отправитель ожидает ответа). Если это поле не используется, оно заполняется нулями.
Более подробное описание протокола UDP можно найти в RFC-768
Перенаправление вывода очень удобно в том случае, если вы не хотите, чтобы
вывод появлялся на экране немедленно, или хотите сохранить его. Рассмотрим две
команды: spell
и sort
.
Команда spell
сравнивает каждое слово в файле со своим словарем и
печатает список всех потенциальных орфографических ошибок на экране. Если в
словаре spell
нет какого-либо слова (например, персональное имя), то она
также выдает его как орфографическую ошибку. Если вы подадите на ввод
spell
большой файл, то его обработка займет много времени и список ошибок
может быть очень большим. Команда spell
распечатывает весь список ошибок
сразу. Поэтому лучше всего перенаправить вывод spell
в файл. Например,
spell
осуществляет поиск файла memo и помещает список орфографических
ошибок в файл misspell:
$ spell memo > misspellКоманда
sort
размещает строки указанного файла в алфавитном или цифровом
порядке. Прежде чем перенаправить вывод команды в файл убедитесь, что имя этого
файла не существует. Команда sort
сначала очищает файл, который будет
содержать вывод, затем выполняет сортировку и помещает вывод в пустой файл.
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
Рис. 1. Структура сетевого программного обеспечения семейства протоколов TCP/IP.
Прямоугольники обозначают обработку данных, а линии, соединяющие прямоугольники, - пути передачи данных. Горизонтальная линия внизу рисунка обозначает кабель сети Ethernet, которая используется в качестве примера физическаой среды. Понимание этой логической структуры является основой для понимания всей технологии TCP/IP.
Для установления соединения между двумя процессами на различных компьютерах сети необходимо знать не только 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 являются мультиплексорами типа
. Действуя в этом качестве, они переключают несколько входов на
один выход. Они же являются демультиплексорами
. Как
демультиплексоры, они переключают один вход на один из многих выходов в
соответствии с содержимым поля типа в заголовке протокольного блока
данных. Когда Ethernet кадр попадает в драйвер сетевого интерфейса, он
может быть направлен либо в модуль ARP, либо в модуль IP. Для этого
используется значение поля типа в заголовке кадра Ethernet.
Если IP-пакет попадает в модуль IP, то содержащиеся в нем данные могут быть переданы либо модулю TCP, либо UDP, что определяется полем «Protocol» в заголовке IP-пакета. Если TCP-сообщение попадает в модуль TCP, то выбор прикладной программы, которой должно быть передано сообщение, осуществляется на основе значения поля «порт» в заголовке TCP-сообщения.
Мультиплексирование данных в обратную сторону осуществляется довольно просто, так как из каждого модуля существует только один путь вниз. Каждый протокольный модуль добавляет к пакету свой заголовок, на основании которого машина, принявшая пакет, выполняет демультиплексирование.
Назначение портов приложениям на каждом компьютере происходит независмо
друг от друга. TCP может самостоятельно выбирать порт , с которым будет
работать приложение, либо приложение укажет, с каким портом на данном компьютере
оно будет работать. Как правило, часто используемые сервисы имеют
заранее предопределенные номера портов, которые являются общеизвестными.
К таким портам относятся http, fpt, smtp и многие другие. Номера портов
перечислены в /etc/services
.
Кроме того, машина может быть снабжена несколькими сетевыми интерфейсами,
тогда она должна осуществлять мультиплексирование типа
, т е.
между несколькими прикладными программами и сетевыми интерфейсами.
Соединение определяется вызовом OPEN с аргументами в виде номера локального порта и гнезда (IP-адрес + порта) удаленного процесса. Функция OPEN вызывыается и в том случае, когда данный процесс намерен передавать информацию (активный OPEN), и когда процесс ожидает поступления информации (пассивный OPEN). Функция возвращает идентификатор соединения, по которому пользователь может ссылаться в своих последующих вызовах.Идентификатор соединения указывает на структуру данных, в которой хранятся переменные и информация данного TCP-соединения. Эта тструктура данных называется TCB - Transmission Control Block (Управляющая структура передачи).
ТСВ хранит такие параметры соединения, как адреса локального и удаленного гнезд, указатели на полученные и отправляемые пользовательские данные, указатели на очередь блоков для повторной отправки, номер текущего сегмента и т. д , то есть всю информацию, используемую данным соединением.
Как уже отмечено выше, открытие соединения может быть активным и пассивным. Пассивное открытие обозначает, что процесс ожидает поступления сигнала открытия соединения и не пытается открыть канал самостоятельно. Иными словами, канал, открытый с одного конца как пассивный, ожидает инициирующего сигнала от какого-либо из хостов Этот тип открытия канала используется процессами, которые предоставляют свой сервис через заранее известный номер своего порта (например, HTTP, SMTP и т д) и работают с механизмом общеизвестных гнезд.
Пргоцесс может вызвать функцию пассивного открытия канала и ждать получения сигнала активного открытия канала от другого процесса, и только после получения такого сигнала соединение будет установлено. Соеддинение будет также установлено, если два процесса активно откроют канал навстречу друг другу. Эта гибкость в установлении соединений особенно важна в распределенных сетях, когда компьютеры работают асинхронно.
Только в двух случаях принципиально важно, чтобы гнездо на данном компьютере было открыто как пассивное, а на другой стороне как активное:
Если на одном гнезде открыто пассивно, с соответствующими записями ТСВ, несколько соединений, то при открытии активного соединения на другом конце будет задействовано ТСВ, соответствующее параметрам, заданным активным гнездом. Если такого не существует, выбирается любое другое открытое гнездо.
Процедура установления соединения использует специальный флаг синхронизации - SYN и состоит из трех этапов обмена сообщениями - так называемое "трехходовое квитирование" Использование именно трех тактов квитирующих сообщений всегда достаточно, чтобы синхронизировать потоки данных.
Инициализация соединения начинается с обмена пакетами, которые отправляются при открытиии канала пользователем, например, командой OPEN, и содержат флаг SYN и свой начальный порядковый номер пакетов данных. После этогго гнезда ожидают пакет, содержащий TCB партнера. Соединение считается установленным, когда в обоих направлениях синхронизируются нумерующие последовательности передаваемых пакетов, т.е и клиент и сервер «знают», пакет с каким номером поступит с противоположного конца соединения.
Соединение закрывается, когда гнезда обмениваются пакетами, содержащими команду FIN. При этом все ресурсы системы, занятые ТСВ-данных соединений, должны быть освобождены.
Вообще говоря, TCP сам определяет, как группировать и когда отправлять очередной блок данных. Однако в некоторых случаях, пользователю необходимо быть уверенным, что все данные, переданные на уровень TCP, отправлены. Для этих целей существует функция «проталкивания пакета» - PUSH-функция. Вызов этой функции позволяет проконтролировать отправку всех буферизированных TCP-протоколом данных.
Пользователь, отправляющий пакет вызовом SEND, указывает, передаются ли в сегменте, или в предшествующих сегментах данные немедленно, или при предече будет использоваться механизм кеширования данных, тогда данные будут отправляться в соответствии с системными установками. Когда же TCP получает пакет с флагом PUSH (устанавливается PUSH-функцией), вся кешированная информация немедленно передается получателю.
Назначение PUSH-функции и PUSH-флага состоит только в «проталкивании» данных к пользователю, минуя механизм кэширования. Команда PUSH не производит никаких дополнительных группировок или других действий над данными.
Следует отметить, что существует взаимосвязь между PUSH-функцией и использованием буферов данных, используемых как TCP, так и пользовательским интерфейсом. Всякий раз, когда с данными, помещенными в пользовательский буфер получателя, ассоциирован PUSH-флаг, буфер немедленно передается пользователю, даже если он не заполнен до конца. Если данные заполнили буфер до получения PUSH-флага, эти данные передадутся пользователю в размере целого буфера.
Протокол TCP должен уметь работать с поврежденными, потерянными, дублированными или поступившими с изменением порядка пакетами. Это достигается благодаря механизму присвоения порядкового номера каждому передаваемому пакету данных и механизму проверок получения пакетов подтвержэдения доставки.
Когда TCP передает сегмент данных, копия этих данных помещается в очередь повтора передачи и запускается таймер ожидания подтверждения. Когда система получает подтверждение (сегмент TCP, содержащий управляющий флаг АСК), что этот пакет данных получен, она удаляет его из очереди. Сегмент подтверждения получения содержит номер полученного сегмента, на основании которого и происходит контроль доставки данных адресату. Если подтверждение не поступило до истечения срока таймера, пакет отправляется еще раз. Уведомление TCP о получении пакета данных еще не означает, что он был доставлен конечному пользователю. Оно только означает, что TCP выполнил возложенные на него функции.
При передаче информации каждому байту данных присваивается порядковый номер, поэтому, в какой бы последовательности эти пакеты не достигали точки назначения, они всегда будут собраны в изначально заданной последовательности. Порядковый номер первого байта данных в передаваемом сегменте называется порядковым номером сегмента. Нумерация проводится «с головы состава», т.е. от заголовка пакета. TCP пакет также содержит "подтверждающий номер" (acknowledgment number), который представляет собой номер следующего ожидаемого пакета данных передачи в обратном направлении. Иными словами, номер обозначает «до сих пор я все получил». Механизм с использованием «подтверждающего номера» позволяет исключать дублирование пакетов при повторной отправке недоставленных данных.
Кроме определения порядка следоания, порядковый номер играет большую роль
в механизме синхронизации соединения и контроля потерянных пакетов при
разрывах соединения. Однако, необходимо помнить, что величина счетчика -
нумератора ограничена и все операции со счетчиком проводятся по
модулю
. Поскольку и отправляющая и получающая стороны знают
предыдущий и последующий номера, а также длину пакетов (TCB), выполнять
операции коректно не представляет труда.
Здесь стоит сказать несколько слов о механизме предотвращения появления в сети пакетов с одинаковыми номерами. Они могут появиться, например, при установлении и быстром сбросе соединения или при сбросе соединения и его быстром восстановлении, т е когда номер испорченного пакета может сразу использоваться новым пакетом данных. Механизм предотвращения подобных ситуаций основан на генерировании начального числа последовательности пакетов, а поскольку счетчик циклический, то не все ли равно, с какого места начинать отсчет.
При установлени нового соединения генерируется 32-битное число ISN (Initial Sequence Number). Генератор использует 32 младших разряда машинного таймера, который меняется каждые 4 микросекунды (полный цикл 4.55 часа). Это число служит отсчетом нумератора пакетов. Поскольку каждая дейтаграмма в сети имеет ограниченное время жизни MSL (Maximum Life Time), значительно меньшее периода генератора, то это исключает возможность появления в сети пакетов с одинаковыми номерами.
Поврежденные пакеты отсеиваются механизмом проверки величины контрольной суммы данных, которая размещается в каждом передаваемом пакете
Протокол TCP позволяет получателю регулировать поток данных, передаваемый отправителем. Механизм основан та том, что при передаче флага подтверждения получения пакета (ACK) в TCP сегменте передается размер буфера данных, который может быть передан отправителем, не дожидаясь от получателя разрешения на отправку очередной порции данных. Иными словами, передается размер свободного места во входной очереди протокола, куда записываются поступившие и ожидающие обработки данные. Из этой очереди данные обрабатываются и передаются соответствующим процессам. Механизм позволяет избегать «заторов» передачи.
Окно" задается количеством байт, отсчитываемых от номера байта, заданного в поле номера пакета "подтвержденного получения" (acknowledgment number) данных. Нулевой размер окна означает для отправителя команду приостановить передачу до готовности принимать данные получателем. В этом случае отправитель посылает однобайтные пакеты и на основании информации пакетов подтверждения возобновляет или нет дальнейшую передачу данных.
Безусловно, большой размер окна позволяет передавать данные быстрее, поскольку отправителю пакета не нужно ждать сигнала готовности приема от получателя. Однако в случае сбоя передачи, соответственно, возрастет объем данных, которые нужно отправить заново. При небольшом же размере окна сбойные сегменты данных можно локализовать с минимальными потерями.
Механизм контроля потока данных позволяет TCP влиять на изменение размера «окна» передачи. Это, в свою очередь, помогает значительно оптимизировать скорость достоверного обмена данных между процессами в гетерогенных сетях Internet.
Протокол TCP наследует все параметры секретности и приоритетности пакета, используемые IP и позволяет работать с ними для обеспечения собственной безопасности. В TCP спецификации термин «секретность и изолированность» обозначает безопасность соединения, изолированность потоков данных и другие ограничения, которые обеспечивает IP.
Кроме того, TCP поддерживает некоторые дополнительные механизмы, которые поддерживаются специальным аппаратным и программным обеспечением TCP.
Для того, чтобы TCP мог полностью реализовать свои возможности работы с иерархией приоритетных пакетов и информацией различного уровня секретности, необходима поддержка этих возможностей со стороны протоколов верхних уровней, пользовательских приложений и ОС.
Кроме наследуемых от IP-параметров, TCP имеет в своем распоряжении механизм работы с флагом важности пакетов - URG. Этот механизм позволяет отправителю «настоятельно сообщать» получателю о том, что тот или иной пакет содержит срочную информацию и позволяет получателю сигнализировать, когда вся срочная информация им получена. Такой механизм уведомления, т.е. манипулирование с URG-флагом TCP-пакета используется, например при обработке асинхронных событий.
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-пакета
Номер кадра первого октета данных в этом сегменте (за исключением пакета, где присутствует флаг SYN). Если в пакете присутствует флаг SYN, то номер данного пакета становится номером начала последовательности (ISN) и номером первого октета данных становится номер ISN+1.
U | URQ | флаг срочности |
A | ACK | флаг пакета подтверждения получения |
P | PSH | флаг форсированной отправки |
R | RST | переустановить соединение |
S | SYN | синхронизация чсел последовательности |
F | FIN | флаг завершения передачи со стороны отправителя |
Между 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.
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-сообщениями формируется таблица задержек маршрутизации пакетов на каждом из узлов и на пути к удаленному хосту в целом. Эта информация и выводится на экран пользователя
В общедоступном значении слова маршрутизация означает передвижение информации от источника к пункту назначения через сеть. При этом, как правило, на пути информационного пакета встречается по крайней мере один узел. Маршрутизация включает в себя два основных компонента: определение оптимальных трактов маршрутизации и транспортировка информационных пакетов через сеть или коммутация.
Алгоритмы коммутации сравнительно просты и, в основном, одинаковы для большинства протоколов маршрутизации. Получив определенным способом адрес маршрутизатора, хост - источник сообщения отправляет пакет, адресованный специально в физический адрес роутера (уровень MAC), содержащий, кроме всего прочего, адрес (сетевой уровень) машины пункта назначения. После проверки адреса протокола пункта назначения пакета маршрутизатор определяет, знает ли он, как передать этот пакет к следующему роутеру. Если роутер не знает, как переслать пакет, - пакет, как правило, игнорируется. В первом случае роутер отсылает пакет к следующему роутеру путем замены физического адреса пункта назначения на физический адрес следующего роутера и последующей передачи пакета. По мере того, как пакет продвигается через сеть, его физический адрес меняется, однако сетевой адрес получателя остается неизменным.
Определение маршрута может базироваться на различных показателях, например, длина маршрута, ширина полосы пропускания или стоимость канала связи, и их комбинациях. Алгоримы маршрутизации подсчитывают значения таких показателей и определяют оптимальные маршруты. Алгоритмы маршрутизации создают и поддерживают таблицы, в которых содержится маршрутная информация.
Алгоритмы маршрутизации заполняют маршрутные таблицы информацией о маршрутах. Ассоциации «пункт назначения - следующая пересылка» сообщают роутеру, что определенный пункт назначения может быть оптимально достигнут путем отправки пакета в определенный роутер, представляющий «следующую пересылку» на пути к конечному пункту назначения. В маршрутных таблицах может содержаться также и другая информация, как правило, это - различные характеристики канала (способа пересылки данных). Значения полей «характеристик» содержит информацию о желательности какого-либо канала или тракта. Роутеры сравнивают эти показатели, чтобы определить оптимальные маршруты. Показатели отличаются друг от друга в зависимости от используемой схемы алгоритма маршрутизации.
Маршрутизаторы взаимодействуют друг с другом (и поддерживают свои маршрутные таблицы) путем передачи различных сообщений. Анализируя информацию сообщений, поступающую от всех маршрутизаторов, любой из них может построить детальную картину топологии сети. После того, как топология сети становится понятной, маршрутизаторы могут определить оптимальные маршруты к пунктам назначения и использовать их при передаче данных.
Алгоритмы маршрутизации можно классифицировать, основываясь на нескольких характеристиках Во-первых, на работу результирующего протокола маршрутизации влияют конкретные задачи, которые решает разработчик алгоритма. Во-вторых, существуют различные типы алгоритмов маршрутизации, и каждый из них по-разному влияет на сеть и ресурсы маршрутизации. И наконец, алгоритмы маршрутизации используют разнообразные показатели, которые влияют на расчет оптимальных маршрутов.
Когда команда запущена в фоновом режиме, то вывод ее печатается на экране терминала. И если вы используете терминал в то же время для выполнения других задач, то вывод фоновой задачи будет прерывать вашу работу. Однако, если перенаправить вывод в файл, то вы сможете спокойно работать.
Предположим, что вы хотите найти все появления слова "test" в файле schedule.
Запустите команду grep
в фоновом режиме и перенаправьте вывод в файл
testfile:
$ grep test schedule > testfile
Теперь вы можете использовать терминал для других работ и просмотреть файл testfile позднее.
Все алгоритмы маршрутизации можно классифицировать как:
Динамические алгоритмы маршрутизации подстраиваются к изменяющимся обстоятельствам сети в масштабе реального времени. Они выполняют это путем анализа поступающих сообщений об обновлении маршрутизации. Если в сообщении указывается, что имело место изменение сети, программы маршрутизации пересчитывают маршруты и рассылают новые сообщения о корректировке маршрутизации. Такие сообщения пронизывают сеть, стимулируя маршрутизаторы заново прогонять свои алгоритмы и соответствующим образом изменять таблицы маршрутизации. Динамические алгоритмы маршрутизации могут дополнять, где это уместно, статические маршруты.
Отличаясь более быстрой сходимостью, алгоритмы состояния каналов меньше склонны к образованию петель маршрутизации. С другой стороны, алгоритмы состояния канала характеризуются более сложными расчетами в сравнении с дистанционно-векторными алгоритмами, требуя большей процессорной мощности и памяти, чем дистанционно-векторные алгоритмы.
Алгоритм маршрутизации протокола RIP (Roster Image Processor, Обработчик растровых образов) принадлежит к классу дистанционно-векторных алгоритмов. С 1988 года RIP был повсеместно принят производителями персональных компьютеров для использования в их изделиях передачи данных по сети. Алгоритм построен на обмене небольшими блоками информации из таблиц маршрутизации между соседними маршрутизаторами.
Каждая запись в базе данных маршрутизации состоит из:
RIP работает на основе UDP-протокола и использует порт 520. На каждом хосте, использующем RIP, должно быть установлено программное обеспечение, обрабатывающее RIP-пакеты.
OSPF является иерархическим протоколом маршрутизации с объявлением состояния о канале соединения (link-state). Он был спроектирован как протокол работы внутри сетевой области - AS (Autonomous System), которая представляет собой группу маршрутизаторов и сетей, объединенных по иерархическому принципу и находящихся под единым управлением и совместно использующих общую стратегию маршрутизации. В качестве транспортного протокола для маршрутизации внутри AS OSPF использует IP-протокол.
Для различных типов IP-сервиса (видов услуг высшего уровня, которые определяются значением поля TOS IP-пакета), OSPF может рассчитывать свои оптимальные маршруты на основании параметров, наиболее критичных для данного вида сервиса. Например, какая-нибудь прикладная программа может включить требование о том, что определенная информация является срочной. Если OSPF имеет в своем распоряжении каналы с высоким приоритетом, то они могут быть использованы для транспортировки срочных дейтаграмм.
Иерархия OSPF-сетей
AS представляет собой набор сетей, которые находятся под единым управлением и совместно используют общую стратегию маршрутизации. OSPF является протоколом маршрутизации внутри AS, хотя он также может принимать и отправлять пакеты в другие AS.
Архитектура сетей Internet постепенно перестраивается. Сети объединяются в домены или так называемые "автономные системы" (autonomous svstems), которые используют внутри себя единую стратегию маршрутизации и использует свои специфические роутеры. В Internet для междоменной маршрутизации используется протокол EGP - Exterior Gateway Protocol.
EGP не является протоколом маршрутизации пакетов данных. Он предназначен для обеспечения взаимодействия между шлюзами различных AS, для обмена информацией согласования алгоритмов маршрутизации между ними, а не для управления перемещением самой информации. Каждая из AS может работать со своим (RIP или OSPF) a EGP осуществляет управление маршрутизацией между AS. Все из менения обеспечивающие доступ AS к главной магистрали - backbone, должны быть также сделаны самой AS. Кроме того EGP не строит схем и алгоритмов маршрутизации данных.
Любая часть EGP сети Internet должна представлять собой структуру дерева, у которого стержневой роутер является корнем, и в пределах которого отсутствуют петли между другими AS. Это ограничение является основным ограничением EGP. Оно стало причиной его постепенного вытеснения другими, более совершенными протоколами внешних роутеров.
Несмотря на то, что EGP является динамическим протоколом маршрутизации, схема его работы очень проста. Он не может принимать интеллектуальных решений о маршрутизации. Корректировки маршрутизации EGP содержат информацию только о досягаемости сетей. Другими словами, они указывают, что в определенные сети информационные пакеты попадают через определенные роутеры.
EGP выполняет три основные функции:
Более подробную информацию о EGP можно найти, например, в RFC-827, RFC-888, RFC-904, RFC-1092.
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.
В связи с быстрым ростом 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
Региональная Система Имен
Числовые адреса хороши для связи машин, люди же предпочитают имена. Очень непросто разговаривать, используя машинную адресацию, еще труднее запомнить эти адреса. Поэтому компьютерам в Internet для удобства пользователей были присвоены собственные имена. Все приложения Internet позволяют пользоваться системными именами вместо числовых адресов.
Как мы уже упоминали, для понимания полезно использовать почтовую аналогию. Сетевые численные адреса вполне аналогичны почтовой индексации. Машины, сортирующие корреспонденцию на почтовых узлах, ориентируются именно по индексам, и только если с индексами выходит какая-то несуразность, передают почту на рассмотрение людям, которые по адресу могут определить правильный индекс почтового отделения места назначения. Людям же приятнее и удобнее иметь дело с географическими названиями - это аналоги доменных имен.
Конечно, такое именование имеет свои собственные проблемы. Прежде всего, следует убедиться, что никакие два компьютера, включенные в сеть, не имеют одинаковых имен. Должно также обеспечить преобразование имен в числовые адреса, для того чтобы машины (и программы) могли понимать нас, пользующихся именами: техника по-прежнему общается на языке цифр.
В начале Internet NIC создал регистратуру. Можно было послать запрос и в ответ высылали список имен и адресов. Этот файл, называется «host file» (файл рабочих ЭВМ), регулярно распространялся по всей сети - рассылался всем машинам. Имена были простыми словами, все были единственными. Если вы использовали имя, ваш компьютер просматривал этот файл и подставлял вместо имени реальный числовой адрес. Так же, как работает телефонный аппарат со встроенным списком абонентов. Все было легко, просто и замечательно. Всем хватало простых имен.
Но по мере развития и расширения Internet возрастало количество пользователей, хостов, а потому увеличивался и упомянутый файл. Возникали значительные задержки при регистрации и получении имени новым компьютером, стало затруднительно изыскивать имена, которые еще никто не использовал, слишком много сетевого времени затрачивалось на рассылку этого огромного файла всем машинам, в нем упомянутым. Стало очевидно, - чтобы справиться с такими темпами изменений и роста сети, нужна распределенная оперативная система, опирающаяся на новый принцип. Таковая была создана, ее назвали «доменной системой имен> - DNS, а способ адресации - способом адресации по доменному принципу. DNS иногда еще называют региональной системой наименований.
Доменная система имен - это метод назначения имен путем передачи сетевым
группам ответственности за их подмножество имен. Каждый уровень этой
системы называется доменом. Домены в именах отделяются друг от друга
точками: 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 (Менло-Парк, Калифорния, США) - государственной организации.
Эта система имен используется автоматически с помощью процедуры разрешения имени сервером доменных имен DNS. Нет необхлодимости самим разыскивать адрес, соответствующий этому имени, или подавать специальную команду для его поиска (в UNIX - команда nslookup). Все компьютеры Internet способны пользоваться доменной системой. И работающий в сети компьютер всегда знает свой собственный сетевой адрес.
Когда используется имя, например, lsi.bas-net.by
, компьютер должен
преобразовать его в адрес. Для этого он делает запрос к DNS-серверам.
Это узлы, рабочие машины, обладающие соответствующей базой данных, в число
обязанностей которых входит обслуживание такого рода запросов. DNS-сервер
начинает обработку имени с правого его конца и двигается по нему влево,
т.е. сначала производится поиск адреса в самой большой группе (домене),
потом постепенно сужает поиск. Но для начала опрашивается на предмет
наличия у него нужной информации местный узел. Здесь возможны три случая:
Как местный сервер может разузнать запрошенный адрес, например
os2.spb.ru
? В его прикладном или системном программном обеспечении
имеется информация о том, как связаться с корневым сервером. Это сервер,
который знает адреса серверов имен высшего уровня (самых правых в имени),
здесь это уровень государств (ранга домена ru
). У него
запрашивается адрес компьютера, ответственного за зону ru
. Местный
DNS-сервер связывается с этим более общим сервером и запрашивает у него
адрес сервера, ответственного за домен spb.ru
. Теперь уже
запрашивается этот сервер и у него запрашивается адрес рабочей машины
os2
.
На самом деле, для повышения эффективности, поиск начинается не с самого
верха, а с наименьшего домена, в который входите и вы, и компьютер, имя
которого вы запросили. Например, если ваш компьютер имеет имя
lsi.bas-net.by
, то опрос начнется (если имя не выяснится сразу) не
со всемирного сервера, чтобы узнать адрес сервера группы by
, а
сразу с группы by, что сразу сокращает поиск и по объему, и по
времени.
Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:
command1 | command2 | command3 ...Вывод
command1
используется как ввод для command2
. Вывод
command2
используется как ввод для command3
.
Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат:
banner
владельцу david. Выполним сначала по первому методу:
banner
и перенаправьте ее вывод во временный файл:
banner happy birhday > message.tmp
mail
и в качестве ввода воспользуйтесь файлом
message.tmp:
mail david < message.tmp
rm message.tmp
banner happy birthday | mail david
Распространено несколько заблуждений, с которыми можно столкнуться, имея дело с именами. Приведем несколько верных утверждений в качестве опорных, чтобы вывести из заблуждений, или предостеречь от них:
Региональная система имен, возможно, и выглядит сложно, но это одна из тех составляющих, делающих общение с сетью более простым и удобным. Несомненное преимущество доменной системы состоит в том, что она разбивает громадье Internet на набор вполне обозримых и управляемых частей. Хотя сеть включает миллионы компьютеров, все они поименованы, и именование это организовано в удобной рациональной форме, что упрощает работу.
Почему существуют два транспортных протокола TCP и UDP, а не один из них? Дело в том, что они предоставляют разные услуги прикладным процессам. Большинство прикладных программ пользуются только одним из них. Вы, как программист, выбираете тот протокол, который наилучшим образом соответствует вашим потребностям. Если вам нужна надежная доставка, то лучшим может быть TCP. Если вам нужна доставка датаграмм, то лучше может быть UDP. Если вам нужна эффективная доставка по длинному и ненадежному каналу передачи данных, то лучше может подойти протокол TCP. Если нужна эффективность на быстрых сетях с короткими соединениями, то лучшим может быть протокол UDP. Если ваши потребности не попадают ни в одну из этих категорий, то выбор транспортного протокола не ясен. Однако прикладные программы могут устранять недостатки выбранного протокола. Например, если вы выбрали UDP, а вам необходима надежность, то прикладная программа должна обеспечить надежность. Если вы выбрали TCP, а вам нужно передавать записи, то прикладная программа должна вставлять маркеры в поток байтов так, чтобы можно было различить записи.
Какие же прикладные программы доступны в сетях с TCP/IP?
Общее их количество велико и продолжает постоянно увеличиваться. Некоторые приложения существуют с самого начала развития internet. Например, TELNET и FTP. Другие появились недавно: X-Window, SNMP.
Протоколы прикладного уровня ориентированы на конкретные прикладные задачи. Они определяют как процедуры по организации взаимодействия определенного типа между прикладными процессами, так и форму представления информации при таком взаимодействии. В этом разделе мы коротко опишем некоторые из прикладных протоколов.
Протокол TELNET позволяет обслуживающей машине рассматривать все удаленные терминалы как стандартные "сетевые виртуальные терминалы" строчного типа, работающие в коде ASCII, а также обеспечивает возможность согласования более сложных функций (например, локальный или удаленный эхо-контроль, страничный режим, высота и ширина экрана и т.д.) TELNET работает на базе протокола TCP. На прикладном уровне над TELNET находится либо программа поддержки реального терминала (на стороне пользователя), либо прикладной процесс в обсуживающей машине, к которому осуществляется доступ с терминала.
Работа с TELNET походит на набор телефонного номера. Пользователь набирает на клавиатуре что-то вроде
telnet delta
и получает на экране приглашение на вход в машину delta.
Протокол TELNET существует уже давно. Он хорошо опробован и широко распространен. Создано множество реализаций для самых разных операционных систем. Вполне допустимо, чтобы процесс-клиент работал, скажем, под управлением ОС VAX/VMS, а процесс-сервер под ОС UNIX System V.
Принципы построения
Строится на базе TCP протокола и работает по дуплексному, многопользовательскому протоколу. Это значит, что один сервер может обслуживать одновременно несколько клиентов.
Telnet построен на трех основных принципах:
Сервис 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 является универсальным клиентом и позволяет соединиться с большим колическтвом портов и общаться с различными приложениями.
Протокол FTP (File Transfer Protocol - протокол передачи файлов) распространен также широко как TELNET. Он является одним из старейших протоколов семейства TCP/IP. Также как TELNET он пользуется транспортными услугами TCP. Существует множество реализаций для различных операционных систем, которые хорошо взаимодействуют между собой. Пользователь FTP может вызывать несколько команд, которые позволяют ему посмотреть каталог удаленной машины, перейти из одного каталога в другой, а также скопировать один или несколько файлов.
Протокол SMTP (Simple Mail Transfer Protocol - простой протокол передачи почты) поддерживает передачу сообщений (электронной почты) между произвольными узлами сети internet. Имея механизмы промежуточного хранения почты и механизмы повышения надежности доставки, протокол SMTP допускает использование различных транспотных служб. Он может работать даже в сетях, не использующих протоколы семейства TCP/IP. Протокол SMTP обеспечивает как группирование сообщений в адрес одного получателя, так и размножение нескольких копий сообщения для передачи в разные адреса. Над модулем SMTP располагается почтовая служба конкретных вычислительных систем.
Существует целая серия "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. Команды избавляют пользователя от необходимости набирать пароли при входе в удаленную систему и существенно облегчают работу.
Сетевая файловая система NFS (Network File System) впервые была разработана компанией Sun Microsystems Inc. NFS использует транспортные услуги UDP и позволяет монтировать в единое целое файловые системы нескольких машин с ОС UNIX. Бездисковые рабочие станции получают доступ к дискам файл-сервера так, как-будто это их локальные диски.
NFS значительно увеличивает нагрузку на сеть. Если в сети используются медленные линии связи, то от NFS мало толку. Однако, если пропускная способность сети позволяет NFS нормально работать, то пользователи получают большие преимущества. Поскольку сервер и клиент NFS реализуются в ядре ОС, все обычные несетевые программы получают возможность работать с удаленными файлами, расположенными на подмонтированных NFS-дисках, точно также как с локальными файлами.
Протокол SNMP (Simple Network Management Protocol - простой протокол управления сетью) работает на базе UDP и предназначен для использования сетевыми управляющими станциями. Он позволяет управляющим станциям собирать информацию о положении дел в сети internet. Протокол определяет формат данных, их обработка и интерпретация остаются на усмотрение управляющих станций или менеджера сети.
Система X-Window использует протокол X-Window, который работает на базе TCP, для многооконного отображения графики и текста на растровых дисплеях рабочих станций. X-Window - это гораздо больше, чем просто утилита для рисования окон; это целая философия человеко-машинного взаимодействия.
Вывод большинства команд может использоваться как аргумент в командной строке.
Для этого команду заключите между знаками "слабое ударение" (`...`
) и
поместите ее в командной строке в том месте, где вывод будет трактоваться как
аргумент.
Например, вы можете подставить вывод конвейера команд date
и cut
в
качестве аргумента в команде banner
:
$ banner `date | cut -c12-19`
Обратите внимание на результат: система печатает banner
с текущим
временем.
TEX (произносится как `тех') -- это компьютерная система типографского набора, созданная Д. Е. Кнутом из Стэнфордского университета, предназначенная для создания красивых книг, особенно книг, содержащих много математических формул. Полиграфическое качество документов, полученных с помощью TEX'а, сравнимо с самыми лучшими образцами печатных работ.
Содержит более 900 команд и примитивов. В настоящее время сам TEX, как процессор, не развивается.
PlainTEX- первая макронадстройка, созданная Кнутом.
LATEX- макронадстройка над TEX, созданная Лесли Лампортом в 1985 г. Содержит около 600 макрокоманд. Эти команды определяют такие параметры текста, как типы и размеры шрифтов основного текста, заголовков, высоту и ширину страниц, промежутки между строками, абзацами, отступы и многое другое.
Допускает использование большинства команд TEX.
Фундаментальнвя концепция LATEX'а - понятие стиля документа. Стиль реализуется выбором базового стиля и группы корректирующих стилей, которые дополняют базовый.
На сегодня используется версия LATEX2e, которая заметно отличается от оригинальной версии лесли Лампорта.
Сервер CTAN и его зеркала.
ftp://ftp.tex.ac.uk/tex-archive -- основной сервер, ftp://ftp.vsu.ru/pub/tex -- главный сервер рунета.
0.1mm
Схема обработки документа LATEX.
.tex | исходные файлы, содержащие текст и команды оформления. | |
.aux | ссылки | |
.toc | оглавление | |
.lof | список рисунков | |
.lot | список таблиц | |
.idx | термины алфавитного указателя |
Аббревиатура | Наименование | Соотношение | |
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' |
Минимальный шаблон исходного файла (англ.)
\documentclass[a4paper, 12pt]{article} \begin{document} ... \end{document}
Подключаем русский
\documentclass[a4paper, 12pt]{article} \usepackage[koi8-r]{inputenc} \usepackage[russian]{babel} \begin{document} Здесь набираем текст. \end{document}
Слова разделяются одним или несколькими пробелами. Абзацы разделяются одной или несколькими строками. Добавление лишних пробелов или строк во входном файле не влияет на результат.
Двойные кавычки печатаются как здесь: ``выделенный текст''. Простые кавычки печатаются как здесь: `выделенный текст'. Русские кавычки печатаются как здесь: «выделенный текст».
Длинное тире в предложениях печатается -- как здесь.
Курсив (italic) выглядит так: это курсив. Жирный шрифт (bold) выглядит так: это жирный шрифт.
Если вы получили слишком большой пробел после точки, не заканчивающей
предложения -- сокращения типа и т. д. бывают причиной -- напечатайте
после точки знак `
' и пробел, как в этом предложении.
Запомните, нельзя печатать 10 специальных символов (таких как доллар
или
) без учета их особого назначения! Семь из них печатаются с
помощью знака `
': $ & # % _ { и }.
Что либо еще игнорируется.
Неразрывный пробел печатается так: И.~О.~Фамилия
. В русском языке
в отличие от английского принято между инициалами и фамилией вставлять
пробел.
Выше напечатанное было выполнено следующим образом:
%------------------------------------------------------------------- Слова разделяются одним или несколькими пробелами. Абзацы разделяются одной или несколькими строками. Добавление лишних пробелов или строк во входном файле не влияет на результат. Двойные кавычки печатаются как здесь: ``выделенный текст''. Простые кавычки печатаются как здесь: `выделенный текст'. Русские кавычки печатаются как здесь: <<выделенный текст>>. Длинное тире в предложениях печатается --- как здесь. Курсив (italic) выглядит так: {\it это курсив}. Жирный шрифт (bold) выглядит так: {\bf это жирный шрифт}. Если вы получили слишком большой пробел после точки, не заканчивающей предложения --- сокращения типа и т.\ д.\ бывают причиной --- напечатайте после точки знак `$\backslash$' и пробел, как в этом предложении. Запомните, нельзя печатать 10 специальных символов (таких как доллар или $\backslash$) без учета их особого назначения! Семь из них печатаются с помощью знака `$\backslash$': \$ \& \# \% \_ \{ и \}. Как получить остальные символы, вы прочитаете в руководстве. Неразрывный пробел печатается так: \verb|И.~О.~Фамилия|. В русском языке в отличие от английского принято между инициалами и фамилией вставлять пробел. Все остальное игнорируется. %-------------------------------------------------------------------
При наборе простого текста не возникает никаких проблем, его следует печатать, как обычно.
Следует отметить несколько правил.
LATEX оставляет несколько редко употребляемых символов на свои нужды. Десять символов
# $ % & ~ _ ^ \ { }не могут быть напечатаны в вашем тексте, как обычные символы.
В этом разделе описывается:
batch
и
at
;
Начинаются символом
. Существует два типа команд: командные
слова и командные символы.
Командное слово начинается знаком `
' и состоит далее только
из букв (например,
LaTeX).
Прописные и строчные буквы в командных словах
LATEX'а имеют разное значение.
BEGIN не то же самое, что и
begin.
Вы всегда должны удостовериться, что за командным словом следует что-либо, не являющееся буквой, а именно, пробел, точка, скобка и т. п.
Мне нравится \LaTeX! - правильно Я не читал \LaTeXbook. - ошибка
Все пробелы после командного слова исчезают.
\LaTeX один, \LaTeX два, \LaTeX три.
LATEXодин, LATEXдва, LATEX три.
Командные слова могут иметь параметры:
\abc[необязательныe параметры]{обязательные параметры}
Обычно, параметры заключается в фигурные скобки
`{}
' и/или в квадратные скобки `[]
'.
Командный
символ состоит из знака `
' и одного символа, не являющегося буквой
(например,
$). Поскольку пробел не является буквой, сочетание
знака `
' и пробела является законным командным символом.
Концепция объединения текста в группы позволяет сильно упростить LATEX'овский входной файл. Каждая новая группа начинается левой фигурной скобкой `{' и заканчивается правой фигурной скобкой `}'. Изменения, сделанные внутри группы, теряют свою силу за пределами группы.
{ \hsize = 3in будет создавать абзац шириной 3 дюйма ... \par }
=3in будет создавать абзац шириной 3 дюйма, не смотря на параметры, установленные до начала группы. В этом абзаце действует данное значение параметра. После выхода из этой группы восстанавливаются старые значения параметров.
Скобки `{}
', выделяющие параметр команды
(например, команды \
fbox), тоже образуют группу.
Нет ни одного \fbox{\bf комара} в поле зрения.
Нет ни одного
в поле зрения.
LATEX'овские командные скобки -- тоже группы.
Текст до скобок. \begin{center} \bf Текст внутри скобок. \end{center} Текст после скобок.
Текст до скобок.
Удобно использовать пустую группу: {}
. Она может быть
использована для того, чтобы TEX прекратил ``поедать''
последовательные пробелы после командного слова.
Например, в предложении ``можно использовать
TeX{} '' пробел после ``TEX'' будет
оставлен в конечном документе.
После командного слова \TeX{} удобно использовать пустую группу.
После командного слова TEX удобно использовать пустую группу.
В LATEX'е существует несколько команд, обязательных для каждого
документа. Искомый текст в документе всегда должен начинаться с команды
begin{document} и заканчиваться командой
end{document}.
Все, что стоит до команды
begin{document},
называется преамбулой. Преамбула может содержать только
LATEX'овские команды, описывающие или модифицирующие стиль документа.
Все, что следует после команды
end{document},
игнорируется.
Одна команда обязательно должна стоять в преамбуле:
documentstyle{article}. Эта команда определяет
общий стиль документа.
Следующий пример показывает, как оформляется документ, который нужно напечатать в стиле article(статья) с двумя модификациями: выбран другой базовый размер символов (11pt) и некоторые размеры должны быть модифицированы для использования бумаги формата А4.
.... % Преамбула \documentstyle[a4paper, 11pt]{article} % Преамбула .... % Преамбула \begin{document} .... Искомый текст документа ... .... \end{document} Текст, который игнорируется \LaTeX'ом ... ....
Существует 10 символов, таких как `
', которые в LATEX'е имеют особое
назначение. Вот их полный список:
Символ | Назначение | Ввод |
![]() |
Признак команды | $\backslash$ |
![]() |
Начало группы | \{ |
![]() |
Конец группы | \} |
% | Комментарий | \% |
& | Табулятор | \& |
~ | Неразрываемый пробел | \~{} |
$ | Начало и конец математики | \$ |
^ | Верхний индекс | \^{} |
_ | Нижний индекс | \_{} |
# | Признак подстановки в макросах | \# |
Конец строки игнорируется после знака ком% ментария.
Конец строки игнорируется после знака комментария.
Как правило, для того, чтобы поставить акцент на какой-нибудь букве, перед буквой печатается соответствующее командное слово или командный символ (буквы с акцентами широко используются во многих европейских языках, например, в русском -- это `е').
Вот несколько примеров:
Ввод в LATEX | LATEX |
![]() |
a la mode |
![]() ![]() |
resume |
soup\c{c}on |
soupcon |
No\"el |
Noel |
na\"\i ve |
na![]() |
Большинство акцентов печатается с помощью командных символов такой же формы. Несколько из них печатается с помощью командных слов, содержащих одну букву.
Существует также командное слово
i. Оно дает строчную букву i
без точки над ней -- i; это позволяет поставить другой знак акцента над
нижней частью этой буквы.
Аналогичное командное слово
j дает букву j без точки над ней --
j.
Название | Ввод в LATEX | Результат |
grave |
![]() |
o |
acute |
![]() |
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 |
, |
![]() ![]() |
\OE, \oe |
![]() ![]() |
ngstrom | \AA, \aa |
, |
re, Kbenhavn | \O, \o |
, |
![]() ![]() |
\L, \l |
![]() ![]() |
Nup1.6cm | \ss |
p1.6cm |
¿Si? | ¿ | ¿ |
¡Si! | ¡ | ¡ |
Senor | \~ |
~ |
Используется четыре типа тире: дефис в сложных словах, тире для обозначения числовых пределов, тире как грамматический знак в предложениях, знак "минус", используемый с отрицательными числами.
Название | Ввод | Результат | Пример |
hyphen | - | - | 3-мерное пространство. |
en-dash | - | - | Читайте страницы 3-4. |
em-dash | -- | -- | Я видел их -- все были живы. |
minus sign | $-$ | ![]() |
Температура упала до ![]() |
Название | Ввод | Результат | |
левые кавычки | << |
« | |
правые кавычки | >> |
» | |
левые кавычки | ` | ` | |
правые кавычки | ´ | ' | |
левые двойные кавычки | `` | `` | |
правые двойные кавычки | ´´ | '' | |
многоточие | \ldots |
... | |
значимый пробел | \sp |
||
междусловный пробел |
![]() |
Неразрываемый пробел ~
между двумя словами обозначает,
что эти два слова должны быть напечатаны на одной строке.
Желательно указывать в именах, например, таких как ``Д. Э. Кнут'',
неразрываемый пробел: ``Д.~Э.~Кнут
´´.
Шрифт характеризуется определенным видом (семейством), размером (кеглем), начертанием и насыщенностью.
Гарнитур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 |
![]() |
||
Равноширинный | \tt |
typewriter |
Каллиграфический | \cal |
![]() |
Команда | Образец |
\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 текст.
Для того, чтобы напечатать текст в центре страницы, необходимо поместить его в командные скобки center. Сдвиг текста к левому или правому полю производится командными скобками flushleft и flushright. Обратите внимание на написание слова center - LATEX не понимает английское написание этого слова ``centre''.
Текст внутри этих командных скобок будет форматироваться обычным способом.
Как и всегда, концы строк будут рассматриваться, как пробелы. Чтобы
указать начало новой строки, вам нужно напечатать команду \\
.
Текст до командных скобок. \begin{flushleft} Этот текст \\ слева. \end{flushleft} Текст после командных скобок.
Текст до командных скобок.
Текст до командных скобок. \begin{flushright} Этот текст \\ справа. \end{flushright} Текст после командных скобок.
Текст до командных скобок.
Текст до командных скобок. \begin{center} Этот \\ текст \\ в \\ центре \end{center} Текст после командных скобок.
Текст до командных скобок.
Установленный при инсталляции загрузчик запускает ОС Linux. В ходе загрузки системы создаются несколько консолей - виртуальных устройств ввода-вывода, которыми могут пользоваться различные компоненты и пользовательские программы системы. В одной из консолей может автоматически запускаться графическая среда X Window System.
При запуске консоли появляется приглашение для входа в систему. Введите в поле
Login:
регистрационное имя обычного пользователя. Если по каким-либо
причинам при установке системы не было создано ни одной регистрационной записи
обычного пользователя, введите имя суперпользователя root
, а в дальнейшем
создайте хотя бы одну регистрационную запись обычного пользователя.
Чтобы получить регистрационное имя, обратитесь к администратору
системы(root
). Существует несколько правил выбора регистрационного имени.
Обычно длина имени составляет от 3 до 8 символов. Оно может состоять из больших
или маленьких букв, цифр, символа подчеркивания, но не может начинаться с цифры.
Однако ваше регистрационное имя, возможно, будет определяться конкретным применением. Примеры допустимых имен:
startship dmitry100 very_long_user_name
Суперпользователь (root
) может удалять, перемещать, переименовывать или
изменять существенно важные параметры любых файлов системы, поэтому ошибки,
совершенные начинающим пользователем при работе под этим именем, могут привести
систему в некорректное состояние. Никогда, кроме исключительных случаев,
оговоренных в настоящем Руководстве, не работайте под именем суперпользователя
(root
)!
После ввода имени пользователя система выполняет аутентификацию, для чего
требует ввести пароль, соответствующий данному имени пользователя. При этом
название поля изменится: вместе с Login:
появится Password:
.
Введите в это поле пароль пользователя (вводимые символы пароля не отображаются,
а заменяются звездочками).
Если пароль или имя пользователя были введены неправильно, система потребует снова ввести имя пользователя, а затем пароль. При корректном имени и пароле пользователь попадает в свой домашний каталог.
Команды 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", чтобы указать
время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание
должно быть выполнено сегодня, то дату вводить не надо.
Перечисления оформляются с помощью командных скобок трех типов.
Каждый новый пункт перечисления любого типа начинается командой
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}
Запомните.
Третий вид перечисления -- описание (командные скобки description).
Данный вид перечисления позволяет выделить ключевое слово в начале каждого
пункта. Ключевое слово помещается в квадратные скобки после команды
item.
Вы должны знать трех животных: \begin{description} \item[Комар] Маленькое ``животное''... \item[Антилопа] Большое животное... \item[Броненосец] ... \end{description}
Вы должны знать трех животных:
Если вам понадобилось включить в документ текст таким образом, чтобы он выглядел точно так, как на экране терминала, вы, конечно, захотите использовать все символы вашей клавиатуры, игнорируя 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;
Действие команды
verb аналогично действию командных скобок
verbatim, но команда
verb применяется к тексту
внутри строк.
Каково толкование символов: \verb|~!@#$%^&*()_+{}\| ?!
Каково толкование символов: ~!@#$%^&*()_+{}\
?!
Некоторые элементы внутри текста, такие как рисунки и таблицы, не могут быть разорваны между страницами. Рисунки и таблицы должны быть перенесены в подходящее место, например, в начало следующей страницы.
Существует два типа командных скобок, которые обозначают данный элемент, как плавающий: figure и table. LATEX не заботится о том, что именно вы помещаете в эти скобки.
\begin{figure}[htbp] \vspace{2cm} \caption{Это рисунок} \end{figure}
Необязательный параметр [htbp] служит для указания желаемой позиции данного элемента в тексте.
Еще один вид плавающего текста - замечания на полях.
Это замечание помещается на полях, \marginpar{\normalsize\it Это замечание на полях.} его первая строка уравнивается со строкой текста, содержащей команду.
Это замечание помещается на полях, его первая строка уравнивается со строкой текста, содержащей команду.
Для создания сносок используется команда
footnote{...}.
Это текст внутри абзаца. Это\footnote{первая сноска} текст внутри абзаца. Это текст\footnote{вторая сноска} внутри абзаца.
Это текст внутри абзаца. Это8.1 текст внутри абзаца. Это текст8.2 внутри абзаца.
Простая графика вставляется средствами 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}
Как правило, технические документы делятся на рубрики. Каждая рубрика имеет заголовок, содержащий название и номер. Последний часто используется для ссылок. LATEX имеет серию команд, которые позволят вам выбрать разные уровни рубрикации.
Таким образом, вы можете использовать следующие команды:
\part (часть) \chapter (глава) \section (раздел) \subsection (подраздел) \subsubsection (подраздел второго уровня)
Обычно эти команды используются следующим образом:
\section[короткий-заголовок]{Заголовок}
Включение в ваш документ команды
tableofcontents позволит
поместить в документ его оглавление. Вся информация, необходимая для
создания списка оглавления, записывается в рабочий файл. Это означает,
что документ пропускается через LATEX дважды, чтобы получить правильное
оглавление.
Команды
listoffigures и
listoftables
создают список рисунков и список таблиц, соответственно. Они
работают так же, как команда
tableofcontents, за
исключением того, что LATEX при этом использует другие рабочие файлы.
Данные команды могут быть введены со звездочками
\section*{Заголовок}
В этом случае пункты рубрикации в оглавление не попадают. Принудительное
помещение их в оглавление выполняется командой \addcontentsline
.
\tableofcontents \chapter*{ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ} \addcontentsline{toc}{chapter}{ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ} ... текст перечня ... \chapter*{ВВЕДЕНИЕ} \addcontentsline{toc}{chapter}{ВВЕДЕНИЕ} ... текст введения ... \chapter*{ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ} \addcontentsline{toc}{chapter}{ОБЩАЯ ХАРАКТЕРИСТИКА РАБОТЫ} ...
\title{Образец документа\\версия 0.01} \author{Первый автор\and Второй автор} \date{\today} ... \maketitle % Создает титульный лист
author |
thanks
Нумерация таких элементов, как рисунки и уравнения, производится хотя бы
для того, чтобы читатель мог понять ссылку на них, например: ``Смотри
рисунок 3 для большей информативности.'' Команда
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} объединяет ...
Уравнение из
раздела
-- знаменитый результат Эйлера.
Но не из раздела
...
Команда
pageref аналогична команде
ref, но
дает номера страниц.
Смотри страницу~\pageref{meaning} для большей информативности. .... Значение жизни \label{meaning} ...
Чтобы освоить систему в совершенстве, прочитайте книги: \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].
Чтобы освоить систему в совершенстве, прочитайте книги: \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].
Команда 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 <имя задания>
\indexentry{gnu}{42}
\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}
Предментный указатель выглядит примерно так:
Существует два варианта расположения математических формул в обычном тексте: внутри строки (in-line), когда математический текст является частью текстовой строки, и в явном виде (display), когда математический текст печатается в красную строку. Иногда одни и те же математические формулы выглядят по-разному в этих двух случаях.
Легко заметить, что уравнение в строке
отличается от того же самого уравнения, напечатанного
в красную строку:
$ ... $
или \(...\)
или \begin{math}...\end{math}
.
$$ ... $$
или \[...\]
или
\begin{displaymath}...\end{displaymath}
или
\begin{equation}...\end{equation}
Командные скобки \begin{equation}...\end{equation}
дают
расположение математического текста в красную строку, кроме того,
автоматически производят нумерацию формул (если не указано иначе, то
номер формулы помещается справа).
Символы _ и ^ обозначают, что следующий за ними символ является соответственно верхним или нижним индексом.
$x^{2y}$ |
![]() |
$x_{2y}$ |
![]() |
$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$^2$ |
x![]() |
Корни:
\sqrt{x^2+\sqrt[3]{y}}
Дроби:
\frac{1}{\frac{x^2+y^2+z^2}{x+y}}
Биноминальные коэффициенты:
{n\choose {n-k}}
Интегралы:
\int \limits_{-\infty}^{\infty}x^3
\int_{-\infty}^{\infty}x^3
Суммы:
\sum_{i=1}^{n}a_i
\sum\nolimits_{i=1}^{n}a_i
В математических текстах, как в тех, которые располагаются в текстовой строке, так и в тех, которые печатаются в красную строку, межсимвольные пробелы устанавливаются только LATEX'ом. Добавление лишних пробелов во входном файле никак не влияет на расположение символов в математических формулах.
Для того, чтобы простой текст внутри математической
формулы выглядел нормально, необходимо использовать команду
mbox{
}, например:
$x=y+1 \mbox{ при всех } y=x-1$ $x=y+1 при всех y=x-1$
при всех
.
Обратите внимание на пробелы с обеих сторон слова внутри скобок. Обычно нет необходимости вставлять пробелы в математический текст.
Название | Команда | ![]() ![]() Двойной матем. пробел |
![]() |
В следующих таблицах вы найдете все символы, известные обычно в математическом режиме.
^a | a |
`a | .a |
¯a | a |
Вы можете получить соответствующие отрицания добавлением перед
следующими символами команды \not
.
Для доступа к этому символу пользуйтесь
пакетом latexsym.
Для доступа к этому символу пользуйтесь
пакетом latexsym.
Для доступа к этому символу пользуйтесь
пакетом latexsym.
Эти символы можно использовать и в текстовом режиме.
Буквы греческого и иврита AMS
Бинарные отношения AMS
Стрелки AMS
Отрицательные бинарные отношения и стрелки AMS
Бинарные операторы AMS
Прочие символы AMS
Математические алфавиты
Команда kill
завершает активные процессы в фоновом режиме и команда
stop
приостанавливает временно процессы. Общий формат этих команд:
kill PIDили
stop JIDОбратите внимание, что вы не можете завершать фоновые задания нажатием клавиш
BREAK
или DEL
. Следующий пример показывает, как вы можете
завершить команду grep
, которая выполняется в фоновом режиме.
$ kill 28223<CR> 28223 Terminated $После того как система выдаст ответ на запрос, на экране появится подсказка
$
, означающая, что процесс завершен. Если система не найдет указанный
PID
, то появится сообщение об ошибке:
kill:28223:No such processЧтобы приостановить оперативный процесс (если активна функция управления заданиями), введите
^Z
. На экране появится следующее сообщение:
<JID> Stopped(user) <имя задания>
# cat thesis.txt > /dev/lpВ этом случае, /dev/lp это символическая ссылка на устройство печати - это может быть матричный или лазерный принтер, typesetter, или плоттер.
До недавнего времени выбор для пользователей Linux был очень прост - каждый запускал тот же самый старый lpd, который был почти дословно перенесен из кода BSD Net-2. Даже сегодня в большинство дистрибутивов входит это программное обеспечение. Но ситуация начинает меняться. Системы подобные SVR4, включая Sun Solaris, идут с полностью отличающимся пакетом печати, сконцентрированным вокруг lpsched.
Рассмотрим несколько наиболее распространенных пакетов печати под Linux.
PDQ - это система печати без центрального демона, которая имеет встроенный, разумный синтаксис настройки драйвера. Она включает возможность объявления настроек печати, а также графическую и командно-строковые утилиты для того, чтобы пользователи могли использовать эти настройки; пользователям предоставляется великолепное диалоговое окно, в котором указывается плотность печати, тип бумаги, и т.п.
Запуск всех этих фильтров пользователем имеет несколько преимуществ: нет большинства проблем безопасности при использовании Postscript, большинство заданий формата LaTeX могут печататься очень эффективно в виде dvi-файлов и т.п.
Если у вас много пользователей, много принтеров или какая-нибудь сложная система, то вам рекомендуется использовать PDQ как надстройку над сетевой печатью на базе протокола LPD (вы можете печатать через протокол на локальную машину). Во многих таких ситуациях вместо использования BSD lpd как базы рекомендуется использовать LPRng.
LPRng более легка для администрирования больших организаций и менее страшна , чем lpd. Она даже претендует на то, что система является безопасной - нет исполняемых файлов с битом SUID, и она поддерживает аутентификацию через PGP или Kerberos.
LPRng также включает некоторые примеры настроек для типовых сетевых принтеров - в основном HP LaserJets, которые имеют некоторые возможности учета ресурсов. Если вы хотите получить больше информации о LPRng, то посмотрите страницу LPRng.
LPRng распространяется либо под GPL либо под Artistic license.
PPR - это система буферизации печати, ориентированная на Postscript, которая включает возможность разбора Postscript (еще в зачаточном состоянии) из-за чего она имеет несколько хороших возможностей. Она включает в себя хорошие возможности учета, поддержку клиентов Appletalk, SMB и LPD, и более лучшую обработку чем lpd обработку ошибок. PPR, как и другие перечисленные системы буферизации, может вызывать Ghostscript для работы с принтерами не понимающими Postscript.
Одним из интересных новичков на сцене является "CUPS", реализация протокола печати Internet, определенный в RFC сходный с HTTP протокол заменяющий древний протокол lpd. Основная часть реализации этого пакета является продуктом с открытым исходным кодом от коммерческого продукта "Easy Print", который состоит из системы буферизации и набора коммерческих драйверов печати, созданных на основе Ghostscript (ESP Print Pro).
CUPS, сама система буферизации распространяется под действием лицензии GPL. ESP Print Pro распространяется только в двоичном виде как коммерческий продукт (за исключением системы буферизации, которая также доступна под действием GPL и называется CUPS).
Lpd обозначает Line Printer Daemon (демон линейной печати), и ссылается в разных контекстах и на программу-демона и на весь набор программ которые работают с системой печати. Это:
Система lp была спроектирована когда большинство принтеров было линейными принтерами - так что люди в большинстве печатали чистый ascii. Как показало время, только небольшое добавление было необходимо чтобы заставить lpd работать с заданиями сегодняшнего дня, которые часто идут в формате PostScript, или текст, или dvi, или...
Традиционная настройка 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-интерфейс, что дает возможность конфигурировать устройство печати как угодно и откуда угодно.
Для некоторых систем необходимо хранить информацию о том, кто и как много печатал; этот раздел описывает разные методы выполнения данной работы.
Обычный LPD предоставляет очень небольшую помощь в выполнение учета ресурсов. Вы можете указать имя файла для учета ресурсов используя атрибут af= в printcap, но он только передается как параметр вашему фильтру, указанному в if=. Возможно сделать так, что ваш if= фильтр будет писать данные в файл учета ресурсов, и вы будете обрабатывать этот файл позже (традиционный формат в основном полезен для строчных принтеров, и не тривиален для разбора с помощью Perl, так что нет причин использовать его).
Ghostscript предоставляет оператор PageCount, который вы можете использовать для подсчета страниц в каждом из заданий; обычно вам необходимо добавить несколько строк на postscript в конец задания для того, чтобы дописать запись в файл учета; лучшим примером этого является файл unix-lpr.sh в поставке исходного кода Ghostscript.
Заметьте, что реализация учета ресурсов использованная в unix-lpr пишет в файл из Ghostscript и таким образом несовместима с рекомендованным ключом -dSAFER. Лучшим решением мог бы быть опрос принтера с помощью команды PJL после каждого из заданий, или написать программу на postscript, которая будет выдавать число страниц на стандартный вывод, где данные могут быть захвачены другой программой.
Большие системы, под которыми здесь подразумеваются сети, включающие более двух принтеров или серверов, имеют специальные требования. Вот описание одной из возможных спецификаций.
Каждый принтер должен иметь одну точку контроля, откуда администратор может приостановить, переупорядочить или переназначить задания в очереди. Для реализации этого каждый должен печатать на локальный сервер, который будет выполнять буферизацию заданий и направлять их на соответствующий принтер. Используйте LPRng, по крайней мере на серверах; BSD LPD является имеет слишком много недостатков для "нормального" использования.
Клиентские системы не должны иметь уникальные настройки печати. Для реализации этого используйте расширенный синтаксис printcap в LPRng, так что вы сможете везде использовать один и тот же файл printcap.
Очереди печати не должны называться по названию производителя или модели; очереди печати лучше именовать лучше по расположению (floor2_nw) или по возможностям (color_transparency). Три года спустя, если сломается принтер, то вы сможете сменить его другой моделью без введения в заблуждение. Разработайте страницу web, которая показывает детальную информацию о каждом из принтеров, включая расположение, возможности и т.п. Рассмотрите возможность показа очереди. Сложные сетевые среды неуправляемы без соответствующей документации.
На машинах с Unix, используйте PDQ для того, чтобы предоставить выбор параметров печати, таких как двухстороннюю печать или размер бумаги, и заставить пользователей запускать все задания Ghostscript под правильным идентификатором пользователя.
На машинах с Windows и Apple, либо используйте везде поставляемые драйвера (Samba поддерживает механизм автоматической загрузки драйверов) или везде используйте драйвера Postscript. Не смешивайте разные драйвера; примитивные текстовые процессора часто производят разный код при изменении драйвера принтера; пользователи не могут связать изменения в виде с отдельной парой клиент/принтер.
Если возможно, то покупайте принтер с большими ресурсами для печати в больших объемах. Если возможно по бюджету, то используйте свойство LPRng печати на много принтеров через одну очередь и назначьте "приходящую няню"; принтера являются сложными механическими устройствами, которые будет часто зажимать бумагу или работать без нее в таких конфигурациях.
Не думайте, что принтера обязательно должны быть подключены к рабочим станциям; сейчас Ethernet "сервера печати" стоят в районе $100. Возможность размещать принтера где есть сеть является большим удобством по сравнению с расположением принтеров около машин; располагайте принтера в разумных, центральных точках.
Если функция управления заданиями активна, то вы можете вновь запустить
приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой
stop
, вы сначала должны определить JID
с помощью команды
jobs
. Затем вы можете использовать JID
со следующими командами:
Для того чтобы разрешить удаленным машинам печатать на ваш принтер используя протокол 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. Если удаленная машина занята или отключена, то задание с локальной машины будет находиться в очереди до тех пор пока оно не сможет быть послано.
Возможно перенаправить очередь 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. Смотрите справочные страницы.
Печать из под клиента Windows (или OS/2) на сервер Linux прямо поддерживается через SMB используя пакет SAMBA, который также поддерживает разделение вашей файловой системы Linux с клиентами Windows.
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.
Обычно ghostscript будет запускаться magic-фильтром, которым вы пользуетесь (Я рекомендую пакет apsfilter, если ваш поставщик не поставил вам этот пакет), но для целей отладки очень часто удобно запускать его прямо.
gs -help даст вам короткий, информативный список опций и доступных драйверов (заметим, что этот список является списком вкомпилированных драйверов, не основным списком доступных драйверов).
Вы можете запустить gs для тестирования примерно так:
gs options -q -dSAFER -sOutputFile=/dev/lp1 test.ps.
Существует набор вещей которые вы можете сделать если вывод 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, либо реализованное в драйвере.
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
Все процессы, за исключением at
и batch
, завершаются, когда вы
выходите из системы. Если вы хотите, чтобы после вашего выхода из системы
процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать
команду nohup
. Команда nohup
имеет следующий формат:
nohup command &
Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем каталоге строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:
nohup grep word * > word.list &
Вы можете завершить команду nohup
с помощью команды kill
.
man имя_командыа для некоторых команд можно получить еще и дополнительную информацию:
info имя_команды.
Команда 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 ] имя_каталогаНаиболее часто используются следующие опции:
Если вы попытаетесь удалить элементы каталога .
или ..
, то
будет выдано сообщение об ошибке:
$ 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ядке.
Можно использовать следующие опции:
$ ls -C dev dos etc kernel mnt stand tmp tools usr
$ ls -F dev/ dos/ etc/ kernel* mnt/ stand/ tmp/ tools/ usr/
$ 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
$ ls -ld stand drwxr-xr-x 3 0 0 1536 Jan 17 13:16 stand
$ 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
$ 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
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
Рассмот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ойства ввода.
Вы можете использовать следующие опции:
^I
.
^X
(CTRL+X), символ DEL (восьмеричное
0177) как ^?
. Символы не входящие в стандаpтный ASCII-
набоp (напpимеp, символы киppилицы с набоpом стаpших
pазpядов) выводятся как ``M-x'', где x - опpеделяемый
младшими семи битами символ.
file
выводится на устройство стандартного вывода:
cat file
file1
и file2
, после чего они
помещаются в файл file3
:
cat file1 file2 > file3
file1
к концу файла file2
:
cat file1 >> file2
cat -b file1 -------------- 1 Number 1 2 Number 2 3 Number 3 4 Number 4 5 Number 5
cat -e file1 Number 1$ Number 2$ Number 3$
cat -n file1 1 Number 1 2 Number 2 3 Number 3 4 Number 4 5 6 7 Number 5
more
-- выводит стандартный входной поток на экран порциями по 24
строки, ожидая нажатия на клавишу [Пробел]
для вывода очередной порции.
Досрочно завершает работу при нажатии на клавишу [Q]
.
less
-- аналогичная программа, однако она поддерживает возможности
прокрутки вверх и поиска.
find
-- команда со сложной структурой параметров, позволяющая найти и
вывести в выходной поток названия файлов, удовлетворяющих сколь угодно сложным
условиям.
grep
-- команда со сложной структурой параметров. Позволяет выбрать из
текстового файла (обычно созданного в результате работы других команд через
канал) строки по сколь угодно сложным критериям. Как правило, эти строки
передаются через канал для дальнейшей обработки.
Консолью называется совокупность основных устройств ввода информации в компьютер (клавиатура и мышь) и вывода информации (монитор). 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
.
df
-- команда выдает сведения о наличии свободного места на всех
смонтированных дисках.
top
-- команда выдает непрерывно обновляемую таблицу всех задач,
выполняющихся на компьютере, включая системные, с указанием объема используемых
ресурсов. Если какая-то программа или особенно системная задача потребляет
большую часть ресурсов, возникает подозрение в том, что эта программа
зациклилась. Для завершения работы команды нажмите на клавишу [Q]
.
Если в процессе работы в системе возникает ситуация, когда пользователь не знает, что предпринять для достижения необходимой цели, лучше всего начать искать подсказку в самой системе. Дистрибутивы Linux содержат тысячи страниц документации, представленной в электронном виде, так что ответы почти на все возникающие вопросы, по крайней мере на первых порах, находятся под рукой. Существует несколько независимых источников вспомогательной информации, которые содержат взаимодополняющие варианты ответов на тему работы в системе Linux:
man
;
info
;
whatis
и apropos
;
locate
;
info
;
help
оболочки bash
;
Xman
;
helptool
;
Необходимо сразу оговориться, что большаю часть информации из
этих источников представлена на английском языке. Только для
русифицированных дистрибутивов часть страниц интерактивного
руководства 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
, вообще
говоря, создавались не для первоначального изучения системы. Они
скорее предназначены для опытных пользователей, которым в процессе
работы нужно иметь под рукой справку по формату вызова команды -
чтобы не приходилось держать весь материал в голове.
Для того, чтобы получить искомую информацию, всегда нужно
знать, что искать. В таких случаях могут помочь команды whatis
(``Что есть'') и apropos
(``???''). Команда whatis
производит
контекстный поиск заданного ключевого слова (шаблона) в базе
данных, содержащей перечень системных команд с кратким их
описанием. Выводятся только точные совпадения с ключевым словом.
Команда apropos
производит поиск по фрагментам слов. Аналогично
команде apropos
работает команда man
с флагом -k
:
man -k net
Для того, чтобы команды man -k
, whatis
и apropos
работали,
необходимо предварительно создать базу данных о системных
командах, для чего ввести:
makewhatis
В противном случае в ответ на любой запрос будет выдано
сообщение ``nothing appropriate''. Правом запустить команду
makewhatis
обладает только суперпользователь root
. В случае
непрерывной работы компьютера лучше всего запускать эту команду
как задание для процесса cron
.
Иногда в поиске нужного файла документации может помочь
команда locate
(``локализовать???''). Команда locate
в некотором
смысле аналогична командам whatis
и apropos
. По этой команде
производится поиск всех файлов, имена которых содержат заданный
шаблон. Например, по команде:
locate net
будет найдена масса имен файлов, в названиях которых
встречается подстрока net
. В шаблоне могут применяться метасимволы
*
, ?
, [ ]
. Однако, команда locate
производит поиск не по каталогам
файловой системы, а в специально созданной базе имен файлов,
которую надо вначале создать (и иногда обновлять) командой:
updatedb
Команда 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.
Для получения помощи по встроенным командам оболочки bash
испотльзуется команда help
(``помощь''). Если ввести help
без
позиционных параметров в командной строке, то будет дан доступ к
списку всех встроенных команд оболочки. Опять же, обычно команда
help
используется с аргументом, в качестве которого выступает имя
одной из встроенных команд bash
:
help ????
В ответ будет дана краткая справка о применении этой команды.
Начиная с шестой версии в дистрибутив Red Hat Linux включена
программа, которая позволяет просмотреть страницы руководства man
при работе в графическом режиме. Поиск и вывод на экран страниц
руководства вызывается посредством щелчков по кнопкам и меню. В
остальном (содержание выдаваемой информации) команда Xman
аналогична команде man
.
По команде helptool
(``инстумент помощи'') появляется
графическое окно, имеющее строку ввода, в которой можно указать
интересующий термин. Команда просматривает все файлы документов
(можно сконфигурировать, какие документы следует просматривать при
поиске). По завершении поиска будет выдан список файлов, в которых
встречается данный термин. Если кликнуть на элементе списка, то
появится дополнительное окно, в котором будет отображаться
выбранный вами файл. При этом файл будет отображаться в том
формате, в котором он хранится на компьютере: info
, man
, html
и
т.д.
Если в процессе установки системы не было отказа от установки
документации, то после завершения процедур инсталляции в каталоге
/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. Изначально большая
часть этой документации написана на английском языке, но со
временем в русифицированных дистрибутивах она будет поставляться и
на русском языке.
Большинство пакетов программного обеспечения поставляются
разработчиками с обширной документацией по установке и
использованию этих пакетов. Если пакет представлен в формате rpm
(в дистрибутиве Red Hat Linux и его клонах используется именно
этот формат), то эта документация будет развернута в
соответствующих подкаталогах каталога /usr/doc
. Имена этих
подкаталогов соответствуют названию пакета и версии ПО. Например,
для графической оболочки KDE версии 1.1.1 создается подкаталог KDE-
1.1.1.
Естественно, что осваивать Linux проще и легче, если под рукой
имеется хорошая книга. Прежде всего, следут обратиться к
руководство к установленному дистрибутиву (если таковое есть).
Кроме того, на данный момент уже издано достаточное количество
книг, из которых можно подобрать наиболее подходящие. И, конечно,
если пользователь имеет выход в сеть Internet, то в ней он может
найти ответ практически на любой из возникающих у него вопросов.
Если проблемы возникают еще на этапе установки, то можно
обратиться в службу поддержки производителя дистрибутива (если
дистрибутив не пиратский, то на нем, как правило, указываются
координаты этой службы), на которую можно выйти через сайт
производителя. Пиратский дистрибутив может быть ``криво'' записан на
компакт-диск. Можно использовать возможности электронной посты.
Очень полезно подписаться на некоторые списки рассылки (или эхо-
конференции, как их еще называют). Например, чтобы подписаться на
список рассылки по дистрибутиву Black Cat Linux надо отправить
письмо, содержащее ``subscribe blackcat-list'', по адресу
majordomo@geon.donetsk.ua
. Некоторые вопросы очень часто
повторяются, поэтому можно просто просматривать с помощью браузера
архив списка рассылки - может быть кто-то уже задавал тот вопрос,
ответ на который нужен. Наконец, самый эффективный способ - это,
не стесняясь своего незнания, задать вопрос в конференции в режиме
диалога. Если вопрос, связанный с конкретной системой или
конкретной проблемой, то требуется дополнительная детализация
(какой дистрибутив, какая версия дистрибутива, какое
оборудование).
Как уже было сказано, файловая система - одна из основных составных частей любой операционной системы, так как она обеспечивает хранение информации на физических носителях и доступ приложений к этой информации. В этом разделе мы рассмотрим внутренние механизмы работы файловых систем, то есть обратную (невидимую для пользователя) сторону файловой системы. Эта сторона обращена к физическим устройствам и определяет способ хранения информации на носителях и механизмы записи и извлечения этой информации по запросам приложений. Здесь в основе всего лежит способ адресации отдельных участков носителя и механизмы размещения отрезков файла по этим участкам.
Но, прежде чем перейти к описанию конкретных механизмов, стоит
отметить, что Linux умеет работать с несколькими типами файловых
систем. Основной файловой системой для Linux является ``вторая
расширенная файловая система'' (second extended filesystem),
которую кратко обозначают как ext2fs
. Именно ее механизмы будут
подробно рассматриваться в настоящем разделе. Но прежде, чем
перейти к ее рассмотрению, ненадолго отвлечемся для того, чтобы
перечислить некоторые типы файловых систем, которые поддерживаются
в Linux. Эту табличку нельзя считать полной по той простой
причине, что работа по созданию новых типов файловых систем для
Linux продолжается постоянно. Примером вновь разрабатываемых
файловых систем являются журналируемая файловая система JFS
фирмы
IBM, файловая система ReiserFS
.
Типы файловых систем, поддерживаемых в Linux перечислены ниже
1.2emminix |
Файловая система |
|
1.0emextfs |
Еще одна из ранних версий файловой системы для Linux, расширение
файловой системы |
|
1.0emext2fs |
Вторая расширенная файловая система (second extended filesystem) была
создана как расширение расширенной файловой системы ( |
|
1.0emxiaf |
Файловая система |
1.2emmsdos |
Файловая система, используемая для разделов, сформатированных в MS-DOS и
Windows. Имена файлов в |
|
1.0emumsdos |
Файловая система UMS-DOS является расширением файловой системы DOS,
используемым под Linux. В ней добавлено использование длинных имен
файлов, идентификаторы пользователя и группы ( |
|
1.0emhpfs |
Файловая система для разделов OS/2. |
|
1.0emproc |
Это файловая система, которая используется для обращения к структурам
данных ядра. Файлы этой системы не занимают дискового пространства.
Подробнее см. |
|
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. Для того, чтобы
использовать эту файловую систему, надо иметь специальную программу
монтирования |
|
1.0emncpfs |
Это сетевая файловая система, обеспечивающая поддержку протокола NCP,
применяемого в Novell NetWare. Для того, чтобы использовать эту файловую
систему, надо тоже иметь специальную программу, которую можно найти на
сайте |
Производители жестких дисков обычно поставляют свои изделия
отформатированными на низком уровне. Насколько я знаю, это означает, что
все дисковое пространство с помощью специальных меток разбито на
``сектора'', размером 512 байт. Такой диск (или дисковый раздел) должен
быть подготовлен для использования в определенной операционной системе. В
MS-DOS или Windows процедура подготовки называется форматированием, а в
Linux - созданием файловой системы. Создание файловой системы
ext2fs
заключается в создании в разделе диска определенной
логической структуры. Эта структура строится следующим образом.
Во-первых, на диске выделяется загрузочная область. Загрузочная область
создается в любой файловой системе. На первичном разделе она содержит
загрузочную запись - фрагмент кода, который инициирует процесс загрузки
операционной системы при запуске. На других разделах эта область не
используется. Все остальное пространство на диске делится на блоки. Блок
может иметь размер от 1, 2 или 4 килобайта. Блок является адресуемой
единицей дискового пространства. Выделение места файлам осуществляется
целыми блоками, поэтому при выборе размера блока приходится идти на
компромисс. Большой размер блока, как правило, сокращает число обращений
к диску при чтении или записи файла, но зато увеличивает долю
нерационально используемого пространства, особенно, при наличии большого
числа файлов маленького размера.
Блоки, в свою область объединяются в группы блоков. Группы блоков в файловой системе и блоки внутри группы нумеруются последовательно, начиная с 1. Первый блок на диске имеет номер 1 и принадлежит группе с номером 1. Общее число блоков на диске (в разделе диска) является делителем объема диска, выраженного в секторах. А число групп блоков не обязано делить число блоков, потому что последняя группа блоков может быть не полной. Начало каждой группы блоков имеет адрес, который может быть получен как ((номер группы - 1)* (число блоков в группе)).
Каждая группа блоков имеет одинаковое строение.
Суперблок Group Descriptors Block Bitmap INode Bitmap Таблица индексных дескрипторов (INode Table) Область блоков данных
Первый элемент этой структуры (суперблок) - одинаков для всех групп, а все остальные - индивидуальны для каждой группы. Суперблок хранится в первом блоке каждой группы блоков (за исключением группы 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 байт |
Вслед за суперблоком расположено описание группы блоков (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.
Битовая карта блоков (block bitmap
) - это структура, каждый бит которой
показывает, отведен ли соответствующий ему блок какому- либо файлу. Если
бит равен 1, то блок занят. Эта карта служит для поиска свободных блоков
в тех случаях, когда надо выделить место под файл, Битовая карта блоков
занимает число блоков, равное
(число_блоков_в_группе / 8) / размер_блока(при необходимости округляем).
Файловая система 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
.
Битовая карта индексных дескрипторов выполняет аналогичную функцию по отношению к таблице индексных дескрипторов: показывает какие именно дескрипторы заняты.
Следующая область в структуре группы блоков служит для хранения таблицы индексных дескрипторов файлов. Структура самого индексного дескриптора подробнее рассматривается в следующем подразделе.
Ну, и наконец, все оставшееся место в группе блоков отводится для хранения собственно файлов.
Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером - индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела.
Индексный дескриптор файла имеет следующее строение.
Название поля | Тип | Описание | |
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] |
Имя файла |
Отдельная запись в каталоге не может пересекать границу блока (то есть должна быть расположена целиком внутри одного блока). Поэтому, если очередная запись не помещается целиком в данном блоке, она переносится в следующий блок, а предыдущая запись продолжается таким образом, чтобы она заполнила блок до конца.
Система адресации данных - это одна из самых существенных составных частей
файловой системы. Именно система адресации позволяет находить нужный файл
среди множества как пустых, так и занятых блоков на диске. В 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
индексного дескриптора задает адрес блока тройной косвенной адресации, то
есть блока со списком адресов блоков, которые являются блоками двойной
косвенной адресации.
До сих пор наш рассказ о файловой системе касался только ``статических'',
если можно так выразиться, составных частей файловой системы. Но, я
думаю, Вы понимаете, что все это хозяйство обслуживается какими-то
программными модулями. Эти программные части можно разделить на две
составных части. Одна часть входит в состав ядра и образует так
называемую виртуальную файловую систему (VFS). VFS обеспечивает
унифицированный программный интерфейс к услугам файловой системы, причем
безотносительно к тому, какой тип файловой системы (vfat
,
ext2fs
, nfs
и т.д.) имеется на конкретном физическом
носителе. Поэтому каждая файловая система должна предоставлять еще
какие-то конкретные процедуры доступа к своим файлам, для того, чтобы
использоваться под Linux. Виртуальная файловая система VFS,
расположенная как бы между приложениями и конкретными файловыми системами,
позволяет пользовательским приложениям получать доступ к множеству
файловых систем разных типов.
Файловая система ext2fs
была создана по образу и подобию файловой
системы UNIX (UNIX File System - UFS). Обе они (особенно UFS)
создавались еще в те времена, когда диски и другие физические носители
данных имели довольно маленький (по современным меркам) объем. Увеличение
объема дисков вело к возрастанию объема разделов диска, увеличению
размеров отдельных файлов и каталогов. Это породило ряд проблем,
связанных с ограниченностью внутренних структур данных файловой системы.
Существуют две основных проблемы этого рода:
fsck
и для очень больших дисков стало требовать нескольких часов.
Естественно, что появление этих проблем породило и попытки их решения. Были разработаны новые типы файловых систем, при создании которых учитывались требования масштабируемости. Наиболее известными разработками файловых систем новых типов являются:
ext3fs
;
В следующей таблице приведены данные по увеличению основных параметров, обеспечиваемых новыми файловыми системами.
Размер блока | Максим. размер файловой системы | Максим. размер файла | ||
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, ![]() |
Основная цель, которая преследуется при создании журналируемых файловых
систем, насколько я понял, состоит в том, чтобы обеспечить быстрое
восстановление системы после сбоев (например, после потери питания). Дело
в том, что если произойдет такой сбой, то часть информации о расположении
файлов теряется, поскольку не все изменения сразу записываются на диск.
После этого программа fsck
вынуждена просматривать весь диск блок
за блоком (пользуясь битовыми матрицами занятых блоков и индексных
дескрипторов) с целью восстановления потерянных связей. При увеличении
размера дисков вдвое, вдвое увеличивается и время, необходимое для
просмотра всего диска. А при тех объемах, которых достигают современные
диски, особенно на серверах, время, необходимое для того, чтобы
просмотреть весь диск, стало недопустимо велико: оно стало достигать часов
и даже суток. А сервер в это время не отзывается! Кроме того, нет
гарантии, что все связи удастся восстановить.
В журналируемых файловых системах для решения этой проблемы применяют технику транзакций, развитую в теории баз данных. Суть этой техники в том, что действие не считается завершенным, пока все изменения не сохранены на диске. А чтобы сбои, происходящие в течение времени, необходимого для завершения всех операций, не приводили к необратимым последствиям, все действия и все изменяемые данные протоколируются. Если сбой все-таки произойдет, то по этому протоколу можно вернуть систему в безошибочное состояние.
Главное отличие в технике транзакций, применяемой в базах данных, от аналогичной техники, применяемой в журналируемых файловых системах, состоит в том, что в базах данных сохраняются в протоколе как сами изменяемые данные, так и вся управляющая информация, в то время как понятие транзакции в файловых системах подразумевает сохранение только мета-данных: индексных дескрипторов изменяемого файла, битовых карт распределения свободных блоков и свободных индексных дескрипторов. Дело в том, что если сохранять все изменяемые данные, то теряется смысл кеширования записи на диск и уменьшается скорость дисковых операций. Мета-данные же, во-первых, меньше по размеру, а, во- вторых, сохраняются в специально выделенной области диска, что позволяет избежать чрезмерных затрат времени на ведение протокола.
Файловые системы ext3fs
и JFS являются журналируемыми. Надо
отметить, что ext3fs
не является совершенно новой разработкой, а
является просто надстройкой над ext2fs
, обеспечивающей ведение
журнала и организацию транзакций. Файловые системы XFS и JFS являются
открытыми версиями коммерческих файловых систем.
Здесь рассматриваются системные функции, обеспечивающие обращение к
существующим файлам, такие как 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 | +---------------------------------------------------------+
Системные функции классифицируются на несколько категорий, хотя некоторые из функций присутствуют более, чем в одной категории:
namei
для анализа
имени пути поиска.
ialloc
и ifree
.
alloc
, free
и алгоритмов
выделения буфера.
Вызов системной функции open
(открыть файл) - это первый шаг,
который должен сделать процесс, чтобы обратиться к данным в файле.
Для чтения из файла используется функция read
(читать), а для
записи в файл write
(писать).
В первой версии системы, разработанной Томпсоном и Ричи, отсутствовал внутренний механизм, с помощью которого процессу мог бы быть обеспечен исключительный доступ к файлу. Механизм захвата был признан излишним, поскольку ``мы не имеем дела с большими базами данных, состоящими из одного файла, которые поддерживаются независимыми процессами''. Для того, чтобы повысить привлекательность системы UNIX для коммерческих пользователей, работающих с базами данных, в версию V системы ныне включены механизмы захвата файла и записи. Захват файла - это средство, позволяющее запретить другим процессам производить чтение или запись любой части файла, а захват записи - это средство, позволяющее запретить другим процессам производить ввод-вывод указанных записей (частей файла между указанными смещениями).
Обычное использование системных функций read
и write
обеспечивает последовательный доступ к файлу, однако процессы могут
использовать вызов системной функции lseek
для указания места в
файле, где будет производиться ввод-вывод, и осуществления произвольного
доступа к файлу.
Процесс закрывает открытый файл, когда процессу больше не нужно обращаться
к нему с помощью функции close
.
Системная функция open
дает процессу доступ к существующему файлу,
а системная функция creat
создает в системе новый файл.
Системная функция mknod
создает в системе специальные файлы, в
число которых включаются поименованные каналы, файлы устройств и каталоги.
Смена владельца или режима (прав) доступа к файлу является операцией,
производимой над индексом, а не над файлом. Это делается операциями
chown
и chmod
, соответственно.
Системные функции stat
и fstat
позволяют процессам
запрашивать информацию о статусе файла: типе файла, владельце файла,
правах доступа, размере файла, числе связей, номере индекса и времени
доступа к файлу.
Системная функция dup
копирует дескриптор файла в первое свободное
место в таблице пользовательских дескрипторов файла, возвращая новый
дескриптор пользователю. Она действует для всех типов файла.
Системная функция mount
(монтировать) связывает файловую систему из
указанного раздела на диске с существующей иерархией файловых систем, а
функция umount
(демонтировать) выключает файловую систему из
иерархии. Функция mount
, таким образом, дает возможность
обращаться к данным в дисковом разделе как к файловой системе, а не как к
последовательности дисковых блоков.
Системная функция link
связывает файл с новым именем в структуре
каталогов файловой системы, создавая для существующего индекса новую
запись в каталоге.
Системная функция unlink
удаляет из каталога точку входа для файла.
Наличие типа файловой системы дает ядру возможность поддерживать одновременно множество файловых систем, таких как сетевые файловые системы или даже файловые системы из других операционных систем. Процессы пользуются для обращения к файлам обычными функциями системы UNIX, а ядро устанавливает соответствие между общим набором файловых операций и операциями, специфичными для каждого типа файловой системы.
Каналы позволяют передавать данные между процессами в порядке поступления
(``первым пришел - первым вышел''), а также синхронизировать выполнение
процессов. Их использование дает процессам возможность взаимодействовать
между собой, пусть даже не известно, какие процессы находятся на другом
конце канала. Традиционная реализация каналов использует файловую систему
для хранения данных. Различают два вида каналов: поименованные каналы и,
за отсутствием лучшего термина, непоименованные каналы, которые идентичны
между собой во всем, кроме способа первоначального обращения к ним
процессов. Для поименованных каналов процессы используют системную
функцию open
, а системную функцию pipe
- для создания
непоименованного канала. Впоследствии, при работе с каналами процессы
пользуются обычными системными функциями для файлов, такими как
read
, write
и close
. Только связанные между собой
процессы, являющиеся потомками того процесса, который вызвал функцию
pipe
, могут разделять доступ к непоименованным каналам.
Поименованный канал - это файл, имеющий почти такую же семантику, как и
непоименованный канал, за исключением того, что этому файлу соответствует
запись в каталоге и обращение к нему производится по имени. Процессы
открывают поименованные каналы так же, как и обычные файлы, и,
следовательно, с помощью поименованных каналов могут взаимодействовать
между собой даже процессы, не имеющие друг к другу близкого отношения.
Поименованные каналы постоянно присутствуют в иерархии файловой системы
(из которой они удаляются с помощью системной функции unlink
), а
непоименованные каналы являются временными: когда все процессы заканчивают
работу с каналом, ядро отбирает назад его индекс.
Для того чтобы сделать доступными файловые системы, размещенные на физических
устройствах, требуется совместить корневые каталоги этих устройств с некоторыми
подкаталогами файловой системы. Эта операция называется монтированием
устройства. Жесткие диски обычно монтируются при запуске системы (например,
основной раздел, куда Вы установили Linux, монтируется в корневой каталог
/
), однако их можно монтировать и отдельно.
Другие устройства, например, дисководы для гибких дисков A: (устройство
/dev/fd0
) и B: (/dev/fd1
) и дисковод CD-ROM (/dev/cdrom
),
монтируются по мере необходимости.
По окончании работы с устройствами они размонтируются, и размещенные на них файлы становятся недоступными. Для жестких дисков это действие обычно выполняется автоматически при отключении системы. Иначе обстоит дело с гибкими дисками и CD-ROM: соответствующие устройства необходимо размонтировать перед тем как удалять из компьютера носители.
Нельзя удалить компакт-диск из неразмонтированного привода (устройство не реагирует на кнопку извлечения); вынуть дискету из неразмотированного дисковода физически возможно, однако это приводит к полному уничтожению информации на ней.
Команда монтирования устройства имеет следующий вид:
mount -t тип_файловой_системы устройство каталогПараметр
устройство
задает физическое устройство в вышеописанном формате,
параметр каталог
точку монтирования (каталог общего дерева каталогов, с
которым будет совмещен корневой каталог устройства, каталог должен существовать
и быть пуст), параметр тип_файловой_системы
ключевое слово, обозначающее
стандарт, в котором записываются на устройстве файлы и каталоги. Чаще всего Вам
могут встретиться следующие типы файловых систем:
/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
Если Вы смонтировали дисковод для гибких дисков со вставленной дискетой, ошибочно защищенной от записи, снять защиту недостаточно, необходимо размонтировать и снова смонтировать устройство.
Ранее было показано, каким образом взаимодействуют между собой процессы,
протекающие на разных машинах, при этом обращалось внимание на то, что
способы реализации взаимодействия могут быть различаться в зависимости от
используемых протоколов и сетевых средств. Более того, эти способы не
всегда применимы для обслуживания взаимодействия процессов, выполняющихся
на одной и той же машине, поскольку в них предполагается существование
обслуживающего (серверного) процесса, который при выполнении функций
open
или read
будет приостанавливаться драйвером. В целях
создания более универсальных методов взаимодействия процессов на основе
использования многоуровневых сетевых протоколов для системы BSD был
разработан механизм, получивший название ``sockets'' (гнезда). Рассмотрим
некоторые аспекты применения гнезд (на пользовательском уровне
представления).
Модель с использованием гнезд.
Процесс-клиент Процесс-сервер | | +--+ +--+ +-------------------------+--+ +--+--------------------------+ | Уровень гнезд | | Уровень гнезд | +-------------------------+--+ +--+--------------------------+ | TCP | | TCP | | Уровень протоколов | | | | Уровень протоколов | | IP | | IP | +-------------------------+--+ +--+--------------------------+ | Драйвер| | Драйвер | | Уровень устройств Ethernet| |Ethernet Уровень устройств | +-------------------------+--+ +--+--------------------------+ +---+ +---+ | | С е т ь
Структура ядра имеет три уровня: гнезд, протоколов и устройств (рисунок). Уровень гнезд выполняет функции интерфейса между обращениями к операционной системе (системным функциям) и средствами низких уровней, уровень протоколов содержит модули, обеспечивающие взаимодействие процессов (на рисунке упомянуты протоколы TCP и IP), а уровень устройств содержит драйверы, управляющие сетевыми устройствами. Допустимые сочетания протоколов и драйверов указываются при построении системы (в секции конфигурации); этот способ уступает по гибкости вышеупомянутому потоковому механизму. Процессы взаимодействуют между собой по схеме клиент-сервер: сервер ждет сигнала от гнезда, находясь на одном конце дуплексной линии связи, а процессы-клиенты взаимодействуют с сервером через гнездо, находящееся на другом конце, который может располагаться на другой машине. Ядро обеспечивает внутреннюю связь и передает данные от клиента к серверу.
Как уже говорилось, ядро операционной системы поддерживает файлы на внешних запоминающих устройствах больщой емкости, таких как диски, и позволяет процессам сохранять новую информацию или вызывать ранее сохраненную информацию. Если процессу необходимо обратиться к информации файла, ядро выбирает информацию в оперативную память, где процесс сможет просматривать эту информацию, изменять ее и обращаться с просьбой о ее повторном сохранении в файловой системе. Подобно тому, как ядро должно заносить данные из файла в память, оно так же должно считывать в память и вспомогательные данные для работы с ними. Например, суперблок файловой системы содержит помимо всего прочего информацию о свободном пространстве, доступном файловой системе. Ядро считывает суперблок в память для того, чтобы иметь доступ к его информации, и возвращает его опять файловой системе, когда сохранить его содержимое. Похожая вещь происходит с индексом, который описывает размещение файла. Ядро системы считывает индекс в память, когда желает получить доступ к информации файла, и возвращает индекс вновь файловой системе, когда желает скорректировать размещение файла. Ядро обрабатывает такую вспомогательную информацию, не будучи прежде знакома с ней и не требуя для ее обработки запуска каких-либо процессов.
Ядро могло бы производить чтение и запись непосредственно с диска и на диск при всех обращениях к файловой системе, однако время реакции системы и производительность при этом были бы низкими из-за низкой скорости передачи данных с диска. По этой причине ядро старается свести к минимуму частоту об ращений к диску, заведя специальную область внутренних информационных буферов, именуемую буферным кешем и хранящую содержимое блоков диска, к которым перед этим производились обращения.
Модуль буферного кеша занимает в архитектуре ядра место между подсистемой управления файлами и драйверами устройств (ввода- вывода блоками). Перед чтением информации с диска ядро пытается считать что-нибудь из буфера кеша. Если в этом буфере отсутствует информация, ядро читает данные с диска и заносит их в буфер, используя алгоритм, который имеет целью поместить в буфере как можно больше необходимых данных. Аналогично, информация, записываемая на диск, заносится в буфер для того, чтобы находиться там, если ядро позднее попытается считать ее. Ядро также старается свести к минимуму частоту выполнения операций записи на диск, выясняя, должна ли информация действительно запоминаться на диске или это промежуточные данные, которые будут вскоре затерты. Алгоритмы более высокого уровня позволяют производить предварительное занесение данных в буфер кеша или задерживать запись данных с тем, чтобы усилить эффект использования буфера.
Файловая система /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оцесса.
NFS (Network File System)- это протокол, разработанный Sun Microsystems для разделения ресурсов (файлов и каталогов) локальной сети. NFS-клиент ``монтирует'' файловую систему, ``экспортируемую'' NFS-сервером. Смонтированная таким образом файловая система представляется на клиентском компьютере как часть локальной файловой системы. Протокол NFS предоставляет, в частности, возможность смонтировать корневую файловую систему в процессе загрузки. Таким образом, можно обеспечить работу бездисковых рабочих станций.
Для того, чтобы воспользоваться файловой системой 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
при загрузке.
Очень вероятно, что эти скрипты уже существуют на машине, и понадобится
только раскомментировать нужные разделы или активизировать их на нужном
уровне запуска.
Первым делом Вам нужно использовать ядро с поддержкой файловой системы 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 заключается в том, что клиент может гибко обрабатывать подобные неполадки, если вы правильно его установите. Существуют два различающихся режима обработки ошибок:
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
, но
помните, что это увеличивает риск потери данных.
Для настройки NFS сервера (Linux) необходимо выполнить следующие шаги:
portmap
(или rpcbind
)
/etc/exports
:
/home .lan (rw)
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
.
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
.
``$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ню.
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:
Заметим, что для доступа к SMB-ресурсам с машин с Windows 3.x, на
них должен быть установлен стек TCP/IP и библиотеки Win32s
. Оба
этих компонента доступны с сервера фирмы Microsoft.
Прежде всего, для того чтобы использовать 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
. Примеры скриптов даны ниже.
smbd
- Демон SMB.
nmbd
- Обеспечивает поддержку сервера имен NetBIOS для клиентов.
Заметим, что сервис имен, предоставляемый демоном nmbd
, является
отличным от сервиса имен, предоставляемого Domain Name Service
(DNS). Сервис имен NetBIOS является сервисом имен в стиле Windows,
используемым SMB. Другими словами, имеющийся сервис имен DNS никак
не используется Samba для нахождения имен машин.
Обычно следующие двоичные файлы Samba устанавливаются в директорию
/usr/bin
, хотя их расположение опционально.
smbclient
- Клиент SMB для UNIX-машин.
smbprint
- скрипт для печати на принтер на SMB-машине.
smbprint.sysv
- такое как выше, но для машин с SVR4 UNIX.
smbstatus
- Перечисляет текущие SMB-соединения для локальной
машины.
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
Есть два демона 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.
Настройка 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
.
Как показано выше в файле 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 и справочные страницы.
Машины с 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
для получения
дополнительной информации об описанных выше операциях.
Для организации доступа к 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
, что запретит прогон страниц, разделяющих
задание, но не будет влиять на прогон страниц внутри документов.
Для доступа к принтеру на Windows машине:
/etc/printcap
и они
должны соответствовать локальной структуре директориев (для
буферизации и т.п.)
/usr/bin/smbprint
. Он поставляется
вместе с исходными текстами Samba, но не со всеми двоичными
дистрибутивами Samba.
nenscript
, или ее эквивалент nenscript
-
конвертер Postscript. Она обычно устанавливается в директорию
/usr/bin
.
MagicFilter
. MagicFilter
имеет
преимущества потому, что он ``знает'' как автоматически
преобразовывать достаточно большое количество форматов файлов.
Запись в файле /etc/printcap
, приведенном ниже, сделана для
принтера HP 5MP на сервере Windows NT. Используются следующие поля
файла /etc/printcap
:
cm
- комментарий;
lp
- имя устройства, открываемого для вывода;
sd
- директория спула принтера (на локальной машине);
af
- файл учета пользования принтером;
mx
- максимальный размер файла (ноль - без ограничений);
if
- имя входного фильтра (скрипта).
Для более детальной информации о печати смотрите справочные
страницы по 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-документы являются уже
отформатированными, так что они печатаются сразу.
Для того, чтобы подключаться к новеловскому серверу, необходимо
установить пакет ncpfs
. NCPFS - это файловая система, которая
понимает протокол NCP фирмы Novell. Другими словами, это - Netware
client для Linux.