- •6.4. Внешние коммуникации
- •6.4.1. Протоколы тср/ip
- •6.4.1.1. Определение и достоинства протокола tcp/ip
- •6.4.1.2. Архитектура tcp/ip
- •6.4.1.3. Соответствие между моделями tcp/ip и iso osi
- •6.4.2. Протокол ip
- •6.4.2.1. Структура заголовка ip-пакета
- •Ip-датаграмма
- •6.4.2.2. Ip-адресация
- •190.50.1.1
- •190.50.1.2
- •190.50.2.1
- •190.50.2.2
- •6.4.3. Протокол udp
- •6.4.4. Протокол tcp
- •6.4.4.1. Структура tcp-сегмента
- •6.4.4.2. Этапы tcp-сеанса
- •6.4.5. Программные средства поддержки сетей
- •6.4.5.1. Состав программных средств поддержки сетей
- •1. Почтовые ящики
- •2. Именованные каналы
- •3. Удаленные вызовы процедур
- •4. Протокол NetBios
- •6.4.5.2. Программные средства работы с сокетами
- •6.4.6. Сетевое программное обеспечение уровня приложений
- •6.4.6.1. Протокол ftp
- •6.4.6.2. Протокол smtp
- •Заключение
6.4.6. Сетевое программное обеспечение уровня приложений
В качестве примеров рассмотрим два варианта приложений, основных на протоколах TCP/IP.
Первый вариант – это протокол передачи файлов FTP – самый распространенных протокол передачи файлов через Интернет.
Второй вариант – это протокол передачи электронной почты SMTP.
6.4.6.1. Протокол ftp
В соответствии с технологией клиент-сервер для получения и отсылки файлов на удаленном компьютере должна быть установлена программа FTP-сервер.
Если такая программа установлена, то с помощью FTP-клиента можно к ней подсоединиться и передавая команды, определенные FTP-протоколом, получать нужные результаты.
Для написания клиентских программ существует API, обеспечивающий программиста функциями, соответствующими командам, отсылаемым на FTP-сервер.
Примеры API-вызовов мы сейчас и рассмотрим.
Для создания FTP-соединения используется структура данных FTPINFO, которая заполняется при инициализации соединения, а потом используется во всех API-вызовах на протяжении всего сеанса связи.
Установление соединения начинается вызовом:
ftp_prconnect(&ftpinfo,ip_address);
Если соединение установлено, то клиент должен передать серверу имя пользователя и пароль. Эти действия выполняются вызовами:
ftp_user(&ftpinfo,user_name);
ftp_passwd(&ftpinfo,password);
Если регистрация пользователя прошла успешно, то можно начинать прием и передачу файлов. Обычно это делается следующим образом. Производится установка ascii-режима приема данных и считывается список файлов из интересующего каталога.
ftp_ascii(&ftpinfo);
ftp_dir(&ftpinfo,dir,filename);
Затем переходят в двоичный режим приема файлов:
ftp_binary(&ftpinfo);
Получение и передача файла обеспечиваются вызовами:
ftp_getfile(&ftpinfo,remfile,locfile);
ftp_putfile(&ftpinfo,locfile,remfile);
Закрытие FTP-соединения производится вызовом:
ftp_bye(&ftpinfo);
Если рассмотреть структуру данных FTPINFO, то можно увидеть в ней такие элементы данных, как сокеты.
6.4.6.2. Протокол smtp
Основная задача протокола SMTP (Simple Mail Transfer Protocol) заключается в том, чтобы обеспечивать передачу электронных сообщений (почту). Для работы через протокол SMTP клиент создаёт TCP соединение с сервером через порт 25. Затем клиент и SMTP сервер обмениваются информацией, пока соединение не будет закрыто или прервано. Основной процедурой в SMTP является передача почты (Mail Procedure). Далее идут процедуры форвардинга почты (Mail Forwarding), проверка имён почтового ящика и вывод списков почтовых групп. Самой первой процедурой является открытие канала передачи, а последней - его закрытие.
Команды SMTP указывают серверу, какую операцию хочет произвести клиент. Команды состоят из ключевых слов, за которыми следует один или более параметров. Ключевое слово состоит из 4-х символов и отделено от аргумента одним или несколькими пробелами. Каждая командная строка заканчивается символами CR LF.
Подсоединившись к SMTP-серверу с помощью какой-нибудь терминальной программы, например, Telnet или HyperTerminal, можно подавать команды с клавиатуры. А можно написать программу с использованием сокетов и, таким образом, обеспечить программную отправку почтовых сообщений.
Вот синтаксис всех команд протокола SMTP (SP - пробел):
HELO <SP> <domain> <CRLF>
MAIL <SP> FROM:<reverse-path> <CRLF>
RCPT <SP> TO:<forward-path> <CRLF>
DATA <CRLF>
RSET <CRLF>
SEND <SP> FROM:<reverse-path> <CRLF>
SOML <SP> FROM:<reverse-path> <CRLF>
SAML <SP> FROM:<reverse-path> <CRLF>
VRFY <SP> <string> <CRLF>
EXPN <SP> <string> <CRLF>
HELP <SP> <string> <CRLF>
NOOP <CRLF>
QUIT <CRLF>
Обычный ответ SMTP сервера состоит из кода ответа, за которым через пробел следует дополнительный текст. Код ответа служит индикатором состояния сервера..
Отправка почты
Первым делом подключаемся к SMTP серверу через порт 25. Теперь надо передать серверу команду HELO и наш IP адрес:
C: HELO 195.161.101.33
S: 250 smtp.mail.ru is ready
При отправке почты передаём некоторые нужные данные (отправитель, получатель и само письмо):
C: MAIL FROM:<svv@mail.ru> 'указываем отправителя
S: 250 Sender OK
C: RCPT TO:<svv@yandex.ru> 'указываем получателя
S: 250 Recipient OK (will queue)
указываем серверу, что будем передавать содержание письма (заголовок и тело письма)
C: DATA
S: 354 Enter mail; end with <CRLF>.<CRLF>
передачу письма необходимо завершить символами CRLF.CRLF
C: From: Drozd <drozd@mail.ru>
C: To: Drol <drol@mail.ru>
C: Subject: Hello
между заголовком письма и его текстом не одна пара CRLF, а две.
C: Hello, Drol!
заканчиваем передачу символами CRLF.CRLF
S: 250 Message accepted for delivery
Теперь завершаем работу, отправляем команду QUIT:
C: QUIT
S: 221 smtp.mail.ru is closing transmission channel
Другие команды
SEND - используется вместо команды MAIL и указывает, что почта должна быть доставлена на терминал пользователя.
SOML, SAML - комбинации команд SEND или MAIL, SEND и MAIL соответственно.
RSET - указывает серверу прервать выполнение текущего процесса. Все сохранённые данные (отправитель, получатель и др.) удаляются. Сервер должен отправить положительный ответ.
VRFY - просит сервер проверить, является ли переданный аргумент именем пользователя. В случае успеха сервер возвращает полное имя пользователя.
EXPN - просит сервер подтвердить, что переданный аргумент - это список почтовой группы, и если так, то сервер выводит членов этой группы.
HELP - запрашивает у сервера полезную помощь о переданной в качестве аргумента команде.
NOOP - на вызов этой команды сервер должен положительно ответить. NOOP ничего не делает и никак не влияет на указанные до этого данные.
Набор команд и тексты ответов слегка различаются в серверах разных производителей.