Сети ЭВМ и телекоммуникации: Учебное методическое пособие по лабораторным занятиям, самостоятельной и индивидуальной работе студентов – 44 с.
Учебное методическое пособие содержит программу и задания для лабораторных занятий, а так же все необходимые формы документов для выполнения лабораторных заданий.
Суханов А.Я., 2012
1 Работа с WinSocket 5
1.1 Определения 5
1.2 Создание сервера 5
1.3 Создание клиента 8
2 Лабораторная работа №1 Работа с сокетами Беркли 9
Протокол передачи времени Time 10
Протокол Finger 11
Задание на лабораторную работу: 12
3 Лабораторная работа №2 Протоколы SMTP и POP3 12
4 Лабораторная работа №3 Браузер и FTP-клиент 17
5 Лабораторная работа №4. HTML, Javascript технология PHP 18
HTML и Javascript 18
Технология PHP 22
6 Лабораторная работа № 5. Технология XML 24
7 Лабораторная работа №6 Маршрутизация в ВС 28
8 Лабораторная работа №7 Кэширующий HTTP прокси-сервер и SOCKS5 прокси-сервер 29
9 Лабораторная работа №8 распределенный UDP сервер/ UDP клиент 38
Лабораторная работа 9. Перехват сетевых пакетов 40
Лабораторная работа 10. SASL аутоинтефикация 43
ЛИТЕРАТУРА 44
Базовой, но не единственной, технологией программирования на сетевом и транспортном уровне эталонной модели взаимодействия открытых систем (ISO/OSI) являются сокеты (socket) Беркли. Сокеты Беркли в настоящее время реализованы в виде прикладного интерфейса (API) практически во всех современных операционных системах. В связи с широким распространением сетей ЭВМ и телекоммуникаций на сегодняшний день знание этой технологии является необходимым для специалиста в области программного обеспечения. Мировые тенденции развития сетевых технологий указывают на то, что технология программирования сокетов эволюционирует, становится протоколо- и платформонезависимой и имеет широкие перспективы в будущем. В тоже время программирование сокетов является достаточно низкоуровневой технологией, сосредотачивающей внимание на транспортировке данных безотносительно их пользовательской семантики. Для реализации законченных пользовательских приложений требуется применение более эффективных высокоуровневых технологий передачи гипертекста, бинарных данных (HTTP, FTP), и организации логики клиент-серверного взаимодействия (веб-технологии). Также мощной тенденцией развития программного обеспечения вообще и сетевого в частности является создание технологий программирования максимально независимых от программного и аппаратного окружения. Ярчайшим примером здесь является технология Java корпорации Sun Microsystems (США) и свободно распространяемая среда разработки Eclipse, продвигаемая одноименным сетевым сообществом (community).
Студент должен обладать некоторым набором знаний и навыков для выполнения данного лабораторного практикума. Так, для работы с сокетами в ОС MS Windows и Unix-подобных системах, требуется знание языка программирования C, а также основ работы в соответствующих ОС.
Язык программирования Java является развитием ЯП C++, и для освоения Java необходимо владеть методами объектно-ориентированного проектирования и программирования. Теоретические знания о построении сетей ЭВМ приобретаются в ходе лекционных занятий и при изучении основной и дополнительной литературы.
Программное обеспечение, а также справочная информация, используемые в данном практикуме, являются свободно распространяемыми и доступны для загрузки из сети Интернет.
Для экономии времени всё обеспечение загружено, упорядочено в структуру и размещено на локальных и публичных сетевых ресурсах. Одним из таких ресурсов является веб-узел афедры АСУ ТУСУР http:
//www.asu.tusur.ru (раздел методического обеспечения) и FTP-серверы ftp:
//asu.tusur.ru;
ftp:
//unix2.asu.tusur.ru. Так как программное обеспечение постоянно обновляется разработчиками, то вполне возможно, что версии программных продуктов, указанные в тексте пособия, будут отличаться от версий продуктов на электронных ресурсах. Все отличия будут отражаться в сопровождающей документации. В описании лабораторных работ мы будем или прямо указывать наименование файла (например, TIJ.html), или просто – «см. в архиве». Ниже приводится описание ПО и справочной информации для лабораторного практикума.
Archive Documents – общий каталог с документацией и справочными пособиями Java – каталог с документацией по Java RFC – каталог с документами Request For Comments SOCKET – информация о работе с сокетами WWW – каталог с информацией по технологиям веб Sources - исходный код для выполнения лаб. работ Tools - инструментарий выполнения лаб. работ Eclipse - каталог с файлами для установки среды IDE Eclipse JDK – каталог с инструментарием JDK WEBDEV – каталог инструментария для веб-разработки Порядок установки программного обеспечения.
1. Устанавливаем JDK 6.0, по умолчанию ставится в каталог Program Files, но лучше поставить в корневой каталог 1.1 прописываем пути в переменной PATH к подкаталогу BIN в JDK (пригодится для консольной разработки) 1.2.копируем набор документации по JDK 6.0 в каталог с установленным JDK. Документация представляет собой организованную иерархически HTML справку 2. Устанавливаем Eclipse - просто разархивируем архив с сохранением имен папок (лучше в корневой каталог) 2.1.устанавливаем плагин VE - разархивируем подкаталоги plugins и features один в один в одноименные каталоги установленного Eclipse 2.2.аналогично п.2.1 поступаем с плагинами GEF и emf Если не установить все три модуля, то использовать визуальный редактор не удастся.
3. Запускаем Eclipse с ключем -clean для сканирования плагинов
UDP-сокет – сокет для работы с датаграммами, и TCP сокет – для работы с каналами.
При создании сокета необходимо точно специфицировать его тип. Эта спецификация производится с помощью трех параметров вызова socket(). Первый параметр указывает, к какому семейству протоколов относится создаваемый сокет, а второй и третий параметры определяют конкретный протокол внутри данного семейства.
Создание сокета осуществляется следующим системным вызовом:
#include
Аргумент type задает режим взаимодействия:
SOCK_STREAM - с установлением соединения;
SOCK_DGRAM - без установления соединения.
Аргумент protocol задает конкретный протокол транспортного уровня (из нескольких возможных в стеке протоколов). Если этот аргумент задан равным 0, то будет использован протокол "по умолчанию" (TCP для SOCK_STREAM и UDP для SOCK_DGRAM при использовании комплекта протоколов TCP/IP).
При удачном завершении своей работы данная функция возвращает дескриптор сокета - целое неотрицательное число, однозначно его идентифицирующее.
При обнаружении ошибки в ходе своей работы функция возвращает число "-1".
Прежде чем воспользоваться функцией socket необходимо проинициализировать процесс библиотеки wsock32.dll вызвав функцию WSAStartup например:
WSADATA WsaData;
int err = WSAStartup (0x0101, &WsaData;);
if (err == SOCKET_ERROR) { printf ("WSAStartup() failed:
%ld\n", GetLastError ());
return 1;
} Здесь 0х0101 версия библиотеки которую следует использовать.
Теперь объявить переменную типа SOCKET можно следующим образом:
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
Далее следует задать параметры для сокета (сервера) для этого нам необходимо объявить структуру SOCKADDR_IN sin примерно следующим образом:
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.s_addr = INADDR_ANY;
Структура SOCKADDR_IN используется несколькими системными вызовами и функциями socket-интерфейса, ее определение в файле in.h выглядит следующим образом:
struct SOCKADDR_IN { short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
Поле sin_family определяет используемый формат адреса (набор протоколов), в нашем случае (для TCP/IP) оно должно иметь значение AF_INET.
Поле sin_addr содержит адрес (номер) узла сети.
Поле sin_port содержит номер порта на узле сети.
Поле sin_zero не используется.
Определение структуры in_addr (из того же файла in.h) таково:
struct in_addr { union { u_long S_addr;
/* другие (не интересующие нас) члены объединения */ } S_un;
#define s_addr S_un.S_addr };
Для подключения сокета к коммуникационной среде, образованной вычислительной сетью, необходимо выполнить системный вызов bind, определяющий в принятом для сети формате локальный адрес канала связи со средой. В сетях TCP/IP socket связывается с локальным портом.
Системный вызов bind имеет следующий синтаксис:
int bind (SOCKET s, SOCKADDR_IN *addr, int addrlen) Пример:
err = bind( s, (LPSOCKADDR)&sin;, sizeof(sin) );
Аргумент s задает дескриптор связываемого сокета.
Аргумент addr в общем случае должен указывать на структуру данных, содержащую локальный адрес, приписываемый сокету. Для сетей TCP/IP такой структурой является SOCKADDR_IN.
Аргумент addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.
В случае успеха bind возвращает 0, в противном случае - "-1".
Для установления связи "клиент-сервер" используются системные вызовы listen и accept (на стороне сервера), а также connect (на стороне клиента). Для заполнения полей структуры sockaddr_in, используемой в вызове connect, обычно используется библиотечная функция gethostbyname, транслирующая символическое имя узла сети в его номер (адрес).
Системный вызов listen выражает желание выдавшей его программы- сервера ожидать запросы к ней от программ-клиентов и имеет следующий вид:
int listen (SOCKET s, int n);
Пример:
err = listen(s, SOMAXCONN);
Аргумент n определяет максимальную длину очереди входящих запросов на установление связи. Если какой-либо клиент выдаст запрос на установление связи при полной очереди, то этот запрос будет отвергнут.
Признаком удачного завершения системного вызова listen служит нулевой код возврата.
Перед тем как воспользоваться функцией accept, необходимо объявить ещё одну переменную типа SOCKET, например s1 .
SOCKADDR_IN from;
int fromlen=sizeof(from);
s1 = accept(s,(struct sockaddr*)&from;,&fromlen;);
Это сделано для того, что бы узнать IP адрес и порт удаленного компьютера.
Для приема запросов от программ-клиентов на установление связи в программах-серверах используется системный вызов accept, имеющий следующий прототип:
int accept (SOCKET s, sockaddr_in *addr, int *p_addrlen;
Аргумент s задает дескриптор сокета, через который программа-сервер получила запрос на соединение (посредством системного запроса listen ).
Аргумент addr должен указывать на область памяти, размер которой позволял бы разместить в ней структуру данных, содержащую адрес сокета программы-клиента, сделавшей запрос на соединение. Никакой инициализации этой области не требуется.
Аргумент p_addrlen должен указывать на область памяти в виде целого числа, задающего размер (в байтах) области памяти, указываемой аргументом addr.
Системный вызов accept извлекает из очереди, организованной системным вызовом listen, первый запрос на соединение и возвращает дескриптор нового (автоматически созданного) сокета с теми же свойствами, что и socket, задаваемый аргументом s. Этот новый дескриптор необходимо использовать во всех последующих операциях обмена данными.
Если очередь запросов на момент выполнения accept пуста, то программа переходит в состояние ожидания поступления запросов от клиентов на неопределенное время (хотя такое поведение accept можно и изменить).
Признаком неудачного завершения accept служит отрицательное возвращенное значение (дескриптор сокета отрицательным быть не может).
После установления соединения с клиентом можно передавать и получать данные. Для этого в операционной системе Window используются системные вызовы recv для чтения и send для записи.
Системные вызовы recv и send имеют следующие прототипы:
int recv (SOCKET s, void *buf, size_t len, int flags);
int send (SOCKET s, const void *buf, size_t len, int flags);
Возвращаемое значение:
число принятых или переданных байтов в случае успеха или -1 в случае ошибки Аргумент s задает дескриптор сокета, через который принимаются данные.
Аргумент buf для вызова recv указывает на область памяти, предназначенную для размещения принимаемых данных, а для вызова send - область памяти, содержащая передаваемые данные.
Аргумент len задает размер (в байтах) области buf.
Аргумент flags зависит от системы, но и UNIX, и Windows поддерживают следующие флаги:
MSG_OOB – следует послать или принять срочные данные.
MSG_PEEK – используется для просмотра поступивших данных без их удаления из приемного буфера. После возврата из системного вызова данные еще могут быть получены при последующем вызове recv.
MSG_DONTROUTE – сообщает ядру, что не надо выполнять обычный алгоритм маршрутизации. Как правило, используется программами маршрутизации или для диагностических целей.
При работе с протоколом TCP вам ничего больше не понадобиться. Но при работе с UDP нужны еще системные вызовы recvfrom и sendto. Они очень похожи на recv и send, но позволяют при отправке датаграммы задать адрес назначения, а при приеме – получить адрес источника.
Системные вызовы recvfrom и sendto имеют следующие прототипы:
int recvfrom (SOCKET s, void *buf, size_t len, int flags, struct socketaddt *from, int *fromlen);
int sendto (SOCKET s, const void *buf, size_t len, int flags, const struct sockaddr *to, int tolen);
Возвращаемое значение:
число принятых или переданных байтов в случае успеха или -1 в случае ошибки Первые четыре аргумента – s, buf, len и flags – такие же, как и в вызовах recv и send. Аргумент from в вызове recvfrom указывает на структуру, в которую ядро помещает адрес источника пришедшей датаграммы. Длина этого адреса хранится в целом числе, на которое указывает аргумент fromlen. Обратите внимание, что fromlen – это указатель на целое.
Аналогично аргумент to в вызове sendto указывает на адрес структуры, содержащей адреса назначения датаграммы, а аргумент tolen – длина этого адреса.
Заметьте, что to - это целое, а не указатель.
Для закрытия ранее созданного сокета в системе Windows используется системный вызов closesocket, а в UNIX – системный вызов close.
Прототипы системных вызовов close и closesocket имеют следующий вид:
int close(SOCKET s);
int closesocket(SOCKET s);
Аргумент s задает дескриптор ранее созданного сокета.
Cоздайте сокет так, как описано выше, но не пользуйтесь командой bind:
SOCKADDR_IN anAddr;
anAddr.sin_family = AF_INET;
anAddr.sin_port = htons(80);
anAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
Заполнение структуры производится почти также но во время инициализации переменной anAddr необходимо указать IP-адрес сервера ( пример 127.0.0.1 ) .
Для обращения программы-клиента к серверу с запросом на установление логической соединения используется системный вызов connect, имеющий следующий прототип:
int connect(SOCKET s, const struct sockaddr *peer, int peer_len));
Аргумент s задает дескриптор сокета, через который программа обращается к серверу с запросом на соединение.
Аргумент addr должен указывать на структуру данных, содержащую адрес, приписанный сокету программы-сервера, к которой делается запрос на соединение. Для сетей TCP/IP такой структурой является sockaddr_in.
Для формирования значений полей структуры sockaddr_in удобно использовать функцию gethostbyname.
Аргумент addrlen задает размер (в байтах) структуры данных, указываемой аргументом addr.
Для того, чтобы запрос на соединение был успешным, необходимо, по крайней мере, чтобы программа-сервер выполнила к этому моменту системный вызов listen для сокета с указанным адресом.
При успешном выполнении запроса системный вызов connect возвращает 0, в противном случае - "-1" (устанавливая код причины неуспеха в глобальной переменной errno).
Примечание. В режиме взаимодействия без установления соединения необходимости в выполнении системного вызова connect нет. Однако, его выполнение в таком режиме не является ошибкой - просто меняется смысл выполняемых при этом действий: устанавливается адрес "по умолчанию" для всех последующих посылок дейтаграмм.
Цель работы:
написать консольные приложения на языке C/C++, реализующие работу протоколов Time, DayTime и Finger.
Рекомендуемая литература:
Глава 1 Работа с WinSocket данного пособия.
Снайдер Й. Эффективное программирование TCP/IP. Библиотека программиста. – Спб: Питер, 2002. – 230 с.: ил.
Электронный вариант лекций «Основы операционных систем.
Практикум». Лекция 10 «Семейство протоколов TCP/IP. Сокеты (sockets) в UNIX и основы работы с ними». Лекции можно найти в архиве, в файле osintropractice.zip.
Описание протокола Time в спецификации RFC-868 (Archive\Documents\ RFC\rfc868.txt)
Описание протокола Finger в спецификации RFC-1288 (Archive\Documents\RFC\rfc1288.txt)
Примитивы сокетов Беркли Сокет обычно трактуется как дескриптор файла и указывается в качестве параметра практически во всех примитивах.
Примитивы сокетов для TCP
SOCKET (гнездо) Дескриптор сокета, именование ресурса
BIND (связать) Связывает ресурсы (сокет) с локальным адресом хоста
LISTEN (ожидать) Возможность принять данные с указанием размера очереди
ACCEPT (принять) Блокирует сервер до попытки соединения клиента
CONNECT (соединить) Попытка установить соединения
SEND (переслать) Посылает данные по соединению
RECEIVE (получить) Получает данные у соединения
CLOSE (закрыть) Разрывает соединение на стороне сервера и клиента примитивы используются в следующем порядке:
Сторона сервера:
Вызовы примитивов осуществляются в следующем порядке:
SOCKET - создает дескриптор (примерно так же как OPEN при открытии файла) и выделяет для него место в таблице транспортного объекта. При этом сообщается, какая служба необходима, канальная (TCP) или дейтаграммная (UDP).
BIND – привязывает конкретный сетевой адрес к сокету, после чего становится возможной подключение клиентов.
LISTEN – выделяет место для очереди входящих вызовов на случай одновременного обращения нескольких клиентов.
ACCEPT – сервер переходит в режим ожидания (блокируется) до прихода блока с запросом соединения от клиента. При этом создается новый сокет, с теми же параметрами, что и оригинального сокета. Сервер может распараллелить процесс обработки нового сокета, что бы иметь возможность вернуться к ожиданию новых соединений.
Сторона клиента:
SOCKET - аналогично серверу.
CONNECT – блокирует вызывающего до завершения процесса фазы установки соединения, т.е. до подтверждения сервера, что соединение установлено.
Далее между сервером и клиентом идет обмен с использованием RECEIVE и SEND.
Соединение разрывается, если обе стороны используют примитив CLOSE.
Примечание. Для того чтобы выполнить преобразование символьного имени сервера или IP-адреса, в формат, используемый при работе с сетевыми функциями, следует использовать функции gethostbyname и inet_addr соответсвенно.
Также, следует помнить, что аргументы и типы приведённых выше функций, могут различаться в разных ОС, поэтому, для получения более полной информации следует воспользоваться системой помощи в данной системе (команда man в UNIX или MSDN в Windows).
При работе с сокетами в Windows, не забывайте подгрузить, а по окончании работы выгрузить библиотеку реализующую поддержку сокетов через функции WSAStartup/WSACleanup.
Этот протокол может использовать в качестве транспортной службы как UDP-протокол, так и TCP-протокол. Стандартный порт протокола - 37.
Если в качестве транспортной службы используется TCP, взаимодействие осуществляется так:
SERVER: прослушивает 37 порт, ожидая соединений;
CLIENT: запрашивает соединение с портом 37 сервера;
SERVER: посылает время в виде двоичного 32х битного числа;
CLIENT: получает время;
SERVER: закрывает соединение;
CLIENT: закрывает соединение;
Если сервер по каким-либо причинам не может определить время на своей стороне, он отказывается от соединения, не посылая ничего.
Если в качестве транспортной службы используется UDP, взаимодействие осуществляется так:
SERVER: прослушивает 37 порт, ожидая соединений;
CLIENT: посылает серверу пустой UDP-пакет, номер порта = 37;
SERVER: получает пустой UDP-пакет;
SERVER: посылает UDP-пакет, содержащий время в виде двоичного 32х битного числа;
CLIENT: получает UDP -пакет, содержащий время;
Если сервер по каким-либо причинам не может определить время на своей стороне, он отбрасывает полученный пустой UDP-пакет и не посылает ничего в ответ.
Данный протокол базируется на TCP. Локальная ЭВМ осуществляет TCP-соединение с удаленным узлом через указанный порт. После этого становится доступной программа RUIP и пользователь может посылать ей свои запросы. Каждый запрос представляет собой строку текста. RUIP, получив запрос, анализирует его и присылает ответ, после чего соединение закрывается.
Любые пересылаемые данные должны иметь формат ASCII, не иметь контроля по четности и каждая строка должна завершаться последовательностью CRLF (ASCII 13, за которым следует ASCII 10).
Диалог двух машин через TCP выглядит следующим образом:
SERVER: слушает порт 79;
CLIENT: устанавливает соединение на 79 порт;
CLIENT: посылает имя пользователя;
SERVER: посылает информацию о запрашиваемом пользователе;
CLIENT: принимает;
SERVER: закрывает соединение;
CLIENT: закрывает соединение;
Пример реализации протокола Daytime
В качестве примера, приводится текст программы, реализующей работу Daytime Protocol’а.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define strHost "212.192.122.109"
#define Port 13
int main(void) { int s, res;
int nCharRecv;
struct sockaddr_in clnt_sin;
char timebuf[128];
if ((s=socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Cannot create socket!!!!\n");
return -1;
}
memset ((char *)&clnt;_sin, '\0', sizeof(clnt_sin));
clnt_sin.sin_addr.s_addr = inet_addr(strHost);
clnt_sin.sin_port = htons(Port);
res = connect (s, (struct sockaddr *)&clnt;_sin, sizeof(clnt_sin));
if (res == -1) { perror("connect");
}
else { printf("Connected\n");
memset(timebuf, '\0', 128);
nCharRecv = recv(s, &timebuf;, sizeof(timebuf), 0);
if (nCharRecv == -1) { printf("Cannot get info from server!!!!\n");
perror("Receive");
return -1;
}
close(s);
return 0;
}
Полученное от сервера 32 – битное число необходимо преобразовать в строку и вывести на экран.
Написать программу, запрашивающую информацию о пользователе от удаленного сервера через протокол Finger, описанный в RFC 1288.
Полученную информацию необходимо вывести на экран. Имя пользователя программа должна принимать из командной строки.
Пользоваться готовыми классами, компонентами, библиотеками, реализующими работу с сетью, ЗАПРЕЩЕНО. Все программы должны использовать элементарные функции, работающими с сокетами Беркли.
Цель работы:
написать GUI приложение для ОС Windows, реализующие работу протоколов SMTP или POP3.
Рекомендуемая литература:
Компьютерные сети. 4-е издание / Э. Таненбаум. – Спб.: Питер, 2003. – 992 с.:ил. Глава 7 («Прикладной уровень») раздел «Электронная почта».
Описание протокола SMTP в спецификации RFC-788 (ARCHIVE\Documents\RFC\rfc788.txt).
Описание протокола POP3 в спецификации RFC-1939 (ARCHIVE\Documents\RFC\rfc1939.txt).
Протокол электронной почты SMTP Протокол SMTP (Simple Mail Transfer Protocol) был разработан для обмена почтовыми сообщениями в сети Internet. SMTP не зависит от транспортной среды и может использоваться для доставки почты в сетях с протоколами, отличными от TCP/IP и Х.25.
Взаимодействие в рамках SMTP строится по принципу двусторонней связи, которая устанавливается между отправителем и получателем почтового сообщения. При этом отправитель инициирует соединение и посылает запросы на обслуживание, а получатель на эти запросы отвечает.
Фактически, отправитель выступает в роли клиента, а получатель - сервера. На рис. 2.1 приведена схема взаимодействия клиента и сервера по протоколу SMTP.
Канал связи устанавливается непосредственно между отправителем и получателем сообщения. При таком взаимодействии почта достигает абонента в течение нескольких секунд после отправки.
Обмен сообщениями и инструкциями в SMTP ведется в ASCII-кодах.
После установления соединения, как правило, используя 25 порт, клиент должен обязательно отправить на сервер команду HELO
Следующее командой должна идти команда MAIL, идентифицирующая отправителя:
MAIL
Пример:
MAIL FROM: [email protected]
Если адрес отправителя правильный и не содержит ошибок, то сервер вернёт ответ «250 OK».
Следующей командой идёт команда
RCPT:
Пример:
Эта команда передаёт на сервер почтовый адрес получателя письма.
Если адрес получателя не содержит ошибок, то тогда SMTP сервер вернёт ответ «250 OK». Если в адресе получателя есть ошибка, то сервер вернёт сообщение с кодом 550. Данная команда может повторяться сколь угодно долго по числу получателей, однако современные почтовые сервера вводят ограничения на количество одновременных получателей.
Следующей командой идёт команда DATA
Если она принимается сервером, то он возвращает сообщение с кодом 354, приглашающее продолжить отправку сообщения. После этого, на сервер можно передавать текст почтового сообщения. Признаком окончания передачи почтового сообщения является символ точки «.» в начале новой строки. Если сообщение принято к доставке, то сервер вернёт уведомление с кодом 250, а иначе – сообщение об ошибке.
После принятия сервером сообщения к отправке, клиент должен отправить команду QUIT, которая сигнализирует серверу, что больше отправки писем не будет. После принятия от сервера подтверждения этой команды, следует закрыть соединение с сервером.
Пример SMTP диалога, между отправителем (SENDER) и сервером (RECEIVER):
SENDER: MAIL FROM:
RECEIVER: 250 OK
SENDER: RCPT TO:
RECEIVER: 250 OK
SENDER: RCPT TO:
RECEIVER: 550 No such user here
SENDER: RCPT TO:
RECEIVER: 250 OK
SENDER: DATA
RECEIVER: 354 Start mail input; end with
SENDER: Blah blah blah...
SENDER: ...etc. etc. etc.
SENDER:
RECEIVER:
250 OK
Протокол электронной почты POP3 РОРЗ (Post Office Protocol v.3) — это простейший протокол для работы пользователя с содержимым своего почтового ящика. Он позволяет только забрать почту из почтового ящика сервера на рабочую станцию клиента и удалить ее из почтового ящика на сервере. Всю дальнейшую обработку почтовое сообщение проходит на компьютере клиента.
Многие концепции, принципы и понятия протокола POP выглядят и функционируют подобно SMTP. Команды POP практически идентичны командам SMTP. На рис. 4.2 изображена модель взаимодействия клиента и сервера по протоколу POP. Сервер POP находится между агентом пользователя и почтовыми ящиками.
Рис. 2.2 – Конфигурация модели клиент-сервер по протоколу POP3
В протоколе РОРЗ оговорены три стадии процесса получения почты:
авторизация, транзакция и обновление. После того как сервер и клиент РОРЗ установили соединение, начинается стадия авторизации. На стадии авторизации клиент идентифицирует себя для сервера. Если авторизация прошла успешно, сервер открывает почтовый ящик клиента и начинается стадия транзакции. В ней клиент либо запрашивает у сервера информацию (например, список почтовых сообщений), либо просит его совершить определенное действие (например, выдать почтовое сообщение). Наконец, на стадии обновления сеанс связи заканчивается.
Авторизация пользователя. После того как программа установила TCP-соединение с портом протокола РОРЗ (официальный номер 110), необходимо послать команду USER с именем пользователя в качестве параметра. Если ответ сервера будет +ОК, нужно послать команду PASS с паролем этого пользователя:
Пример:
SERVER: +ОК
CLIENT: PASS secret
SERVER: +ОК ivan's maildrop has 2 messages (320 octets)
Последняя строчка ответа означает, что в почтовом ящике ivan есть 2 сообщения (320 байтов).
Транзакции РОРЗ. После того как стадия авторизации окончена, обмен переходит на стадию транзакции. В следующих примерах демонстрируется возможный обмен сообщениями на этой стадии.
Команда STAT возвращает количество сообщений и количество байтов в сообщениях:
CLIENT: STAT
SERVER: +ОК 2 320
Команда LIST (без параметра) возвращает список сообщений в почтовом ящике и их размеры:
CLIENT: LIST
SERVER: +ОК
SERVER: 2 messages (320 octets)
SERVER: 1 120
SERVER: 2 200
...
CLIENT: LIST 2
SERVER: +ОК 2 200
...
SERVER: -ERR no such message, only 2 messages in maildrop
Команда TOP возвращает заголовок, пустую строку и первые десять строк тела сообщения:
CLIENT: TOP 10
SERVER: +ОК
SERVER:
SERVER:
....
SERVER: -ERR no such message
Команда NOOP не возвращает никакой полезной информации, за исключением позитивного ответа сервера. Однако позитивный ответ означает, что сервер находится в соединении с клиентом и ждет запросов:
CLIENT: NOOP
SERVER: +ОК
Следующие примеры показывают, как сервер POP3 выполняет действия.
Например, команда RETR извлекает сообщение с указанным номером и помещает его в буфер местного UA (почтового агента):
CLIENT: RETR 1
SERVER: +OK 120 octets
SERVER:
SERVER:
. . . . . .
CLIENT: DELE 1
SERVER: +OK message 1 deleted ...
(сообщение 1 удалено) CLIENT:
DELE 2
SERVER: -ERR message 2 already deleted (сообщение 2 уже удалено)
CLIENT: RSET
SERVER: +OK maildrop has 2 (в почтовом ящике 2 сообщения (320 байтов)) messages (320 octets)
Как и следовало ожидать, команда QUIT закрывает соединение с сервером:
CLIENT: QUIT
SERVER: +OK dewey POP3 server signing off
CLIENT: QUIT
SERVER: +OK dewey POP3 server signing off (maildrop empty)
CLIENT: QUIT
SERVER: +OK dewey POP3 server signing off (2 messages left)
Обратите внимание на то, что отмеченные для удаления сообщения на самом деле не удаляются до тех пор, пока не выдана команда QUIT и не началась стадия обновления. В любой момент в течение сеанса клиент имеет возможность выдать команду RSET, и все отмеченные для удаления сообщения будут восстановлены.
Задание на лабораторную работу:
Ознакомившись с протоколами SMTP, описанным в RFC 788 и POP3, описанным в RFC 1939 выполнить один из нижеприведенных вариантов. Для выбранного варианта должно быть написано GUI приложение для ОС Windows, в котором необходимые параметры будут вводиться, используя различные элементы управления (поля ввода, списки, переключатели, кнопки и т.д.).
Варианты:
Написать приложение, с помощью которого можно отправлять email сообщения.
Написать приложение, с помощью которого можно принимать email сообщения, оставленные в почтовом ящике.
Написать приложение, с помощью которого можно просматривать список email сообщений в почтовом ящике и удалять выбранные сообщения.
Написать приложение, с помощью которого можно просматривать дополнительную информацию о заданном сообщении и удалять выбранные сообщения из почтового ящика.
Цель работы:
написать GUI приложение для ОС Windows, представляющее собой простой Web – браузер и FTP – клиент, используя стандартные компоненты Delphi, Visual C++, Java Рекомендуемая литература:
Компьютерные сети. 4-е издание / Э. Таненбаум. – Спб.: Питер, 2003. – 992 с.: ил. Глава 7 («Прикладной уровень») раздел «HTTP – протокол передачи гипертекста».
Описание протокола HTTP в спецификации RFC-2616 (ARCHIVE\Documents\RFC\rfc2616.txt).
Описание протокола FTP в спецификации RFC-959 (ARCHIVE\Documents\RFC\rfc0959.txt).
Например, в состав библиотеки MFC (Microsoft Foundation Classes – библиотека базовых классов) включено большое количество классов, с помощью которых можно писать как клиентские, так и серверные приложения. В частности, для связи с Internet в Visual C++ существует так называемый WinInet Class. В него входят несколько подклассов.
1. Браузер HTML. Создать на любом из трех языков программирования (C++, Delphi, Java, С#) простой Web-браузер. С установленного ранее Web- сервера запросите и получите Web-страницу с рисунками, текстом и ссылками. Ссылки должны работать, то есть щелчок мышью по ссылке вызывает загрузку и отображение соответствующей страницы. У браузера должна быть адресная строка, в которую заносится адрес URL.
2. FTP - клиент. Создать на любом из трех языков программирования (C ++, Delphi, Java, C#) простое приложение-клиент для работы по протоколу FTP. Приложение должно обеспечивать соединение с сервером, передачу имени пользователя и пароля, отображение списка каталогов и файлов, навигацию по каталогам, копирование файла или каталога на сторону клиента. У приложения клиента должны быть текстовые поля для ввода имени сервера, пользователя, пароля, объект для отображения содержимого каталогов, кнопка для копирования, и удаления каталогов и файлов.
Цель работы:
Научиться использовать технологии HTML, JavaScript, PHP для создания простых Web - страниц со статическим содержанием Материалы:
1. Материалы лекций, 2. http:
//ru.wikipedia.org/wiki/ – элементы HTML.
3. http:
Инструменты:
Текстовый редактор Web - браузер Internet Explorer Структура HTML-документа HTML — это теговый язык разметки документов, то есть любой документ на языке HTML представляет собой набор элементов, причем начало и конец каждого элемента обозначается специальными пометками, называемыми тегами. Регистр, в котором набрано имя тега, в HTML значения не имеет. Элементы могут быть пустыми, то есть не содержащими никакого текста и других данных (например, тег перевода строки
). В этом случае обычно не указывается закрывающий тег.
Кроме того, элементы могут иметь атрибуты, определяющие какие-либо их свойства (например, размер шрифта для тега ). Атрибуты указываются в открывающем теге. Вот пример части разметки HTML- документа:
Текст между двумя тегами - открывающим и закрывающим.
//www.example.com">Здесь элемент содержит атрибут href. А вот пример пустого элемента:
Каждый HTML-документ, отвечающий спецификации HTML какой- либо версии, обязан начинаться со строки декларации версии HTML , которая обычно выглядит примерно так:
DOCTYPE
//www.w3.org/TR/html4/strict.dtd"> Если эта строка не указана, то добиться корректного отображения документа в браузере становится труднее.
10 10 2014
1 стр.
11 10 2014
1 стр.
11 10 2014
11 стр.
13 10 2014
1 стр.
04 09 2014
1 стр.
13 10 2014
1 стр.
24 09 2014
6 стр.
14 12 2014
1 стр.