Принципи мережевої взаємодії
Модель OSI
Модель OSI (ЕМВВС) (базова еталонна модель взаємодії відкритих систем, англ. Open Systems Interconnection Basic Reference Model, 1978 р.) — абстрактна мережева модель для комунікацій і розробки мережевих протоколів. Представляє рівневий підхід до мережі. Кожен рівень обслуговує свою частину процесу взаємодії. Завдяки такій структурі спільна робота мережевого обладнання й програмного забезпечення стає набагато простішою, прозорішою й зрозумілішою.Рівні моделі ISO
Модель складається з 7-ми рівнів, розташованих вертикально один над іншим. Кожен рівень може взаємодіяти тільки зі своїми сусідами й виконувати відведені тільки йому функції.
![]() |
Схема еталонної моделі відкритих систем ІSО ОSІ |
Фізичний рівень
Фізичний рівень (Physical layer) має справи з передачею бітів по фізичних каналах зв'язку, таким, як коаксіальний кабель, кручена пара, оптоволоконий кабель або цифровий територіальний канал. До цього рівня мають відношення характеристики фізичних середовищ передачі даних, такі як смуга пропускання, перешкодозахищеність, хвильовий опір і інші. На цьому ж рівні визначаються характеристики електричних сигналів, що передають дискретну інформацію, таку як крутість фронтів імпульсів, рівні напруги або струму переданого сигналу, тип кодування, швидкість передачі сигналів. Крім того, тут стандартизуються типи роз’ємів і призначення кожного контакту.
Функції фізичного рівня:
- передача бітів по фізичних каналах;
- формування електричних сигналів;
- кодування інформації;
- синхронізація;
- модуляція.
Реалізується апаратно.
Функції фізичного рівня реалізуються у всіх пристроях, підключених до мережі. З боку комп'ютера функції фізичного рівня виконуються мережним адаптером або послідовним портом.
Прикладом протоколу фізичного рівня може служити специфікація 100Base-TX технології Ethernet, що визначає в якості середовища передачі даних неекрановану кручену пару категорії 5 із хвильовим опором 100 Ом, роз’єм RJ-45, максимальну довжину фізичного сегмента 100 метрів, а також деякі інші характеристики середовища й електричних сигналів.
Канальний рівень
На фізичному рівні просто пересилаються біти. При цьому не враховується, що в тих мережах, у яких лінії зв'язку використовуються (розділяються) поперемінно декількома парами взаємодіючих комп'ютерів, фізичне середовище передачі може бути зайняте.
Тому одне із завдань канального рівня (Data Link layer) є перевірка доступності середовища передачі. Інше завдання канального рівня - реалізація механізмів виявлення й корекції помилок. Для цього на канальному рівні біти групуються в набори, називані кадрами (frames).
Канальний рівень забезпечує коректність передачі кожного кадру поміщаючи спеціальну послідовність біт у початок і кінець кожного кадру, для його виділення, а також обчислює контрольну суму, обробляючи всі байти кадру певним способом, і додає контрольну суму до кадру. Канальний рівень може не тільки виявляти помилки, але й виправляти їх за рахунок повторної передачі ушкоджених кадрів. Необхідно відзначити, що функція виправлення помилок для канального рівня не є обов'язкової, тому в деяких протоколах цього рівня вона відсутня, наприклад в Ethernet і Frame Relay.
Реалізується апаратно.
Мережевий рівень
Мережевий рівень (Network layer) служить для утворення єдиної транспортної системи, що поєднує кілька мереж, причому ці мережі можуть використовувати зовсім різні принципи передачі повідомлень між кінцевими вузлами й мати довільну структуру зв'язків. Функції мережного рівня досить різноманітні.
На мережному рівні сам термін мережа наділяють специфічним значенням. У цьому випадку під мережею розуміється сукупність комп'ютерів, з'єднаних між собою відповідно до однієї зі стандартних типових топологій і , що використовують для передачі даних один із протоколів канального рівня, певний для цієї топології.
Повідомлення мережного рівня прийнято називати пакетами (packets). При організації доставки пакетів на мережному рівні використовується поняття «номер мережі». У цьому випадку адреса одержувача складається зі старшої частини - номера мережі й молодшої - номера вузла в цій мережі. Всі вузли однієї мережі повинні мати ту саму старшу частину адреси, тому терміну «мережа» на мережному рівні можна дати й інше, більше формальне визначення: мережа - це сукупність вузлів, мережна адреса яких містить той самий номер мережі.
На мережевому рівні визначаються два види протоколів:
- мережеві протоколи (routed protocols) - реалізують просування пакетів через мережу. Саме ці протоколи звичайно мають на увазі, коли говорять про протоколи мережного рівня. Однак часто до мережного рівня відносять і інший вид протоколів, називаних протоколами обміну маршрутною інформацією або просто протоколами маршрутизації (routing protocols).
- протоколи вирішення адрес - Address Resolution Protocol, ARP, які відповідають за відображення адреси вузла, використовуваного на мережному рівні, у локальну адресу мережі.
Прикладами протоколів мережного рівня є протокол міжмережної взаємодії IP стека TCP/IP і протокол межмережевого обміну пакетами IPX стека Novell.
Транспортний рівень
Транспортний рівень (Transport layer) забезпечує додаткам або верхнім рівням
стека - прикладному й сеансовому - передачу даних з тим ступенем надійності, що
їм потрібно. Модель OSI визначає п'ять класів сервісу, надаваних транспортним рівнем. Ці
види сервісу відрізняються якістю надаваних послуг: терміновістю, можливістю відновлення перерваного зв'язку, наявністю засобів націлити декількох з'єднань між різними прикладними протоколами через загальний транспортний протокол, а головне - здатністю до виявлення й виправлення помилок передачі, таких як перекручування, втрата й дублювання пакетів.
Основні завдання транспортного рівня:
- розбивка повідомлення сеансового рівня на пакети, їхня нумерація;
- буферизація прийнятих пакетів;
- впорядочення пакетів, що прибувають;
- адресація прикладних процесів;
- керування потоком.
Як правило, всі протоколи, починаючи із транспортного рівня й вище, реалізуються програмними засобами кінцевих вузлів мережі - компонентами їх мережних операційних систем. Як приклад транспортних протоколів можна привести протоколи TCP і UDP стека TCP/IP і протокол SPX стека Novell.
Сеансовий рівень
Сеансовий рівень (Session layer) забезпечує керування діалогом: фіксує, яка зі сторін є активною в даний момент, надає засоби синхронізації. Останні дозволяють вставляти контрольні точки в довгі передачі, щоб у випадку відмови можна було повернутися назад до останньої контрольної точки, а не починати все спочатку. На практиці деякі додатки використовують сеансовий рівень, і він рідко реалізується у вигляді окремих протоколів, хоча функції цього рівня часто поєднують із функціями прикладного рівня й реалізують в одному протоколі.
Основні завдання сеансового рівня:
- встановлення способу обміну повідомленнями (дуплексний або напівдуплексний);
- синхронізація обміну повідомленнями;
- організація "контрольних точок" діалогу.
Представницький рівень
Представницький рівень (Presentation layer) має справу з формою подання переданої по мережі інформації, не міняючи при цьому її змісту. За рахунок рівня подання інформація, передана прикладним рівнем однієї системи, завжди зрозуміла прикладному рівню іншої системи. За допомогою засобів даного рівня протоколи прикладних рівнів можуть перебороти синтаксичні розходження в поданні даних або ж розходження в кодах символів, наприклад кодів ASCII і EBCDIC. На цьому рівні може виконуватися шифрування й дешифрування даних, завдяки якому таємність обміну даними забезпечується відразу для всіх прикладних служб. Прикладом такого протоколу є протокол Secure Socket Layer (SSL), що забезпечує секретний обмін повідомленнями для протоколів прикладного рівня стека TCP/IP.
Основні завдання представницького рівня:
- перетворення даних із зовнішнього формату у внутрішній;
- шифрування й розшифровка даних.
Прикладний рівень
Прикладний рівень (Application layer) - це в дійсності просто набір різноманітних протоколів, за допомогою яких користувачі мережі одержують доступ ресурсів, що розділяються, таким як файли, принтери або гіпертекстові Web-сторінки, а також організують свою спільну роботу, наприклад, за допомогою протоколу електронної пошти. Одиниця даних, який оперує прикладний рівень, звичайно називається повідомленням (message).
Основні завдання прикладного рівня:
- ідентифікація, перевірка прав доступу;
- принт- і файл-сервіс, пошта, вилучений доступ і т.д.
Стек протоколів OSI
Розглянемо стек протоколів OSI, який ,на відміну від моделі OSI, містить набір конкретних специфікацій протоколів. На відміну від інших стеків протоколів стек OSI повністю відповідає моделі OSI, включаючи специфікації протоколів для всіх семи рівнів взаємодії, визначених у цій моделі.
Протоколи стека OSI відрізняються складністю і неоднозначністю специфікацій. Ці властивості стали результатом спільної політики розробників стека, які прагнули врахувати в своїх протоколах все різноманіття вже існуючих і нових технологій.
На фізичному і канальному рівнях стек OSI підтримує протоколи Ethernet, Token Ring, FDDI, а також протоколи LLC, X.25 і ISDN, тобто, як і більшість інших стеків, використовує всі розроблені поза стека популярні протоколи нижніх рівнів.
Мережевий рівень включає порівняно рідко використовувані протоколи Connection- oriented Network Protocol (CONP) і Connectionless Network Protocol (CLNP). Як випливає з назв, перший з них орієнтований на з'єднання (connection-oriented), другий - на його відсутність (connectionless).
![]() |
Протоколи стеку OSI |
Більш популярними протоколами маршрутизації стека OSI є: протокол між кінцевою і проміжною системами (End System - Intermediate System, ES-IS) і між проміжними системами (Intermediate System - Intermediate System, IS-IS).
Транспортний рівень стека OSI відповідно до функцій, визначених для нього в моделі OSI, приховує відмінності між мережевими сервісами з встановленням з'єднання і без встановлення з'єднання, так що користувачі отримують необхідну якість обслуговування незалежно від нижчого мережного рівня. Щоб забезпечити це, транспортний рівень вимагає, щоб користувач задав потрібну якість обслуговування.Служби прикладного рівня забезпечують передачу файлів, емуляцію термінала, сервіс каталогів і пошту. З них найбільш популярними є сервіс каталогів (стандарт Х.500), електронна пошта (Х.400), протокол віртуального терміналу (VTP), протокол передачі, доступу та управління файлами (FTAM), протокол пересилки і управління роботами (JTM).
Стек протоколів TCP/IP
А тепер перейдемо до розгляду стеку протоколів TCP/IP. Сьогодні цей стек використовується для зв’язку вузлів всесвітньої інформаційної мережі Інтернет.
Стек TCP/IP на нижньому рівні підтримує всі популярні стандарти фізичного й канального рівнів: для локальних мереж — це Ethernet, Token Ring, FDDI, для глобальних — протоколи роботи на аналогових комутованих і виділених лініях SLIP, PPP, протоколи територіальних мереж X.25 і ISDN. Основними протоколами стека, що дали йому назву, є протоколи IP і TCP. Ці протоколи в термінології моделі OSI належать до мережного і транспортного рівнів, відповідно. IP забезпечує просування пакета по складеній мережі, а TCP гарантує надійність його доставки.
TCP/IP увібрав у себе велику кількість протоколів прикладного рівня. До них належать такі популярні протоколи: FTP, telnet, SMTP, гіпертекстові сервіси служби WWW і багато інших. Дуже корисною властивістю, завдяки якій цей протокол може застосовуватися у великих мережах, є його здатність фрагментувати пакети.
У протоколі TCP/IP інформація передається у вигляді послідовності дейтаграм. Одне повідомлення може передаватися як ряд дейтаграм, які збираються в повідомлення в місці прийому.
Application Programming Interface (API)
API (програмний інтерфейс програми, інтерфейс прикладного програмування) - набір готових класів, процедур, функцій, структур і констант, що надаються додатком (бібліотекою, сервісом) або операційною системою для використання в зовнішніх програмних продуктах. Використовується програмістами при написанні всіляких додатків.
API є абстрактним поняттям — програмне забезпечення, що пропонує деякий API, часто називають реалізацією (англ. implementation) даного API. У багатьох випадках API є частиною набору розробки програмного забезпечення, водночас, набір розробки може включати як API, так і інші інструменти/апаратне забезпечення, отже ці два терміни не є взаємозамінювані.
![]() |
API |
API визначає функціональність, яку надає програма (модуль, бібліотека), при цьому API дозволяє абстрагуватися від того, як саме ця функціональність реалізована.
Якщо програму (модуль, бібліотеку) розглядати як чорний ящик, то API - це безліч «ручок», які доступні користувачеві даного ящика і які він може крутити і смикати.
Програмні компоненти взаємодіють один з одним за допомогою API. При цьому зазвичай компоненти утворюють ієрархію - високорівневі компоненти використовують API низькорівневих компонентів, а ті, в свою чергу, використовують API ще більш низькорівневих компонентів.
За таким принципом побудовані протоколи передачі даних через Інтернет. Стандартний стек протоколів (мережева модель OSI) містить 7 рівнів (від фізичного рівня передачі біт до рівня протоколів програм, подібних протоколів HTTP і IMAP). Кожен рівень користується функціональністю попереднього ( «нижчого») рівня передачі даних і, в свою чергу, надає потрібну функціональність наступного ( «вищерозміщений») рівню.
API бібліотеки функцій і класів включає в себе опис сигнатур і семантики функцій.
Сигнатура функції - частина загального оголошення функції, що дозволяє засобам трансляції ідентифікувати функцію серед інших. У різних мовах програмування існують різні уявлення про сигнатурі функції, що також тісно пов'язане з можливостями перевантаження функцій в цих мовах.Іноді розрізняють сигнатуру виклику і сигнатуру реалізації функції. Сигнатура виклику зазвичай складається з синтаксичної конструкції виклику функції з урахуванням сигнатури області видимості даної функції, імені функції, послідовності фактичних типів аргументів у виклику і типі результату. У сигнатурі реалізації зазвичай беруть участь деякі елементи з синтаксичної конструкції оголошення функції: специфікатор області видимості функції, її ім'я і послідовність формальних типів аргументів.
Семантика функції - це опис того, що дана функція робить. Семантика функції включає в себе опис того, що є результатом обчислення функції, як і від чого цей результат залежить. Зазвичай результат виконання залежить тільки від значень аргументів функції, але в деяких модулях є поняття стану. Тоді результат функції може залежати від цього стану, і, крім того, результатом може стати зміна стану. Логіка цих залежностей і змін відноситься до семантиці функції. Повним описом семантики функцій є виконуваний код функції або математичне визначення функції.
Протокол IP (Internet protocol) - основний протокол мережного рівня. Визначає спосіб адресації на мережевому рівні. Забезпечує маршрутизацію в мережах, що представляють собою об'єднання мереж, що базуються на різних мережевих технологіях.
Протокол ARP (Address Resolution Protocol) - допоміжний протокол стека TCP / IP, призначений для визначення апаратної адреси вузла призначення по заданому IP-адресу.
Протокол ICMP (Internet Control Message Protocol) - допоміжний протокол стека TCP / IP, призначений для обміну інформацією про помилки передачі даних протоколом IP, а також для обміну інформацією, що управляє на мережевому рівні. Зокрема, утиліта PING використовує цей протокол для посилки так званого "луна-запиту".
Протокол НТТР - використовується для організації доступу до загальних даних, розташованих на веб-серверах, з метою публікації і читання загальнодоступної інформації. Протокол HTTP описує взаємодію між HTTP-серверами (веб-серверами) і HTTP-клієнтами (веб-браузерами).
Протокол FTP - служба Інтернету, що забезпечує передачу файлів між комп'ютерами.
Протокол SMTP - застосовується поштовими серверами для передачі електронної пошти. Сервер IIS підтримує роботу з протоколом SMTP для обробки поштових повідомлень;
Протокол Telnet - протокол емуляції терміналу, застосовуваний для підключення до віддалених вузлів мережі. Telnet дозволяє клієнтам віддалено запускати додатки; крім того, він спрощує віддалене адміністрування.
Протокол SNMP - дозволяє централізовано керувати вузлами мережі, наприклад серверами, робочими станціями, маршрутизаторами, мостами і концентраторами. Крім того, SNMP можна використовувати для конфігурування віддалених пристроїв, моніторингу продуктивності мережі, виявлення помилок мережі та спроб несанкціонованого доступу, а також для аудиту використання мережі.
Багаторівневі представлення засобів мережевої взаємодії мають свою специфіку, пов'язану з тим, що в процесі обміну повідомленнями беруть участь щонайменше дві сторони, тобто в даному випадку необхідно організувати узгоджену роботу двох ієрархій апаратних і програмних засобів на різних комп'ютерах. Обидва учасники мережевого обміну повинні прийняти безліч угод.
Наприклад, вони повинні узгодити рівні і форму електричних сигналів, спосіб визначення розміру повідомлень, домовитися про методи контролю достовірності і т.п. Іншими словами, угоди повинні бути прийняті на всіх рівнях, починаючи від найнижчого - рівня передачі бітів, і закінчуючи найвищим , які реалізують обслуговування користувачів мережі.
Терміни «протокол» і «інтерфейс» висловлюють одне і те ж поняття - формалізований опис процедури взаємодії двох об'єктів, але традиційно в мережах за ними закріпили різні області дії: протоколи визначають правила взаємодії модулів одного рівня в різних вузлах, а інтерфейси - правила взаємодії модулів сусідніх рівнів в одному вузлі.
Ієрархічно організований набір протоколів, достатній для організації взаємодії вузлів в мережі, називається стеком протоколів.
Протоколи нижніх рівнів часто реалізуються комбінацією програмних і апаратних коштів, а протоколи верхніх рівнів, як правило, програмними засобами. Програмний модуль, що реалізовує деякий протокол, називають протокольної сутністю, або, для стислості, теж протоколом. Зрозуміло, що один і той же протокол може бути реалізований з різним ступенем ефективності. Саме тому при порівнянні протоколів слід враховувати не тільки логіку їх роботи, але і якість програмної реалізації. Більш того, на ефективність взаємодії пристроїв в мережі впливає якість усієї сукупності протоколів, що складають стек, зокрема те, наскільки раціонально розподілені функції між протоколами різних рівнів і наскільки добре визначені інтерфейси між ними.
Протокольні представлення одного рівня двох взаємодіючих сторін обмінюються повідомленнями відповідно до визначеного для них протоколом. Повідомлення складаються з заголовка і поля даних (іноді воно може бути відсутнім). Обмін повідомленнями є своєрідною мовою спілкування, за допомогою якого кожна зі сторін «пояснює» іншій стороні, що необхідно зробити на кожному етапі взаємодії.
Робота кожного протокольного модуля полягає в інтерпретації заголовків надходять до нього повідомлень і виконанні пов'язаних з цим дій. Заголовки повідомлень різних протоколів мають різну структуру, що відповідає відмінностям в їх функціональності. зрозуміло, що чим складніше структура заголовка повідомлення, тим складніші функції покладені на відповідний протокол.
Приклад клієнт-серверного додатку.
Код сервера
#include <iostream>
#include "Server.h"
using namespace std;
#define REQ_WINSOCK_VER 2
int main()
{
try
{
WSockServer MyServer(REQ_WINSOCK_VER);
if(MyServer.RunServer(4444))
{
cout << "Client connected. " << endl;
MyServer.StartChat();
}
}
catch(char *ErrMsg)
{
cout << "\nError: " << ErrMsg;
}
return 0;
}
Сигнатура функції - частина загального оголошення функції, що дозволяє засобам трансляції ідентифікувати функцію серед інших. У різних мовах програмування існують різні уявлення про сигнатурі функції, що також тісно пов'язане з можливостями перевантаження функцій в цих мовах.Іноді розрізняють сигнатуру виклику і сигнатуру реалізації функції. Сигнатура виклику зазвичай складається з синтаксичної конструкції виклику функції з урахуванням сигнатури області видимості даної функції, імені функції, послідовності фактичних типів аргументів у виклику і типі результату. У сигнатурі реалізації зазвичай беруть участь деякі елементи з синтаксичної конструкції оголошення функції: специфікатор області видимості функції, її ім'я і послідовність формальних типів аргументів.
Семантика функції - це опис того, що дана функція робить. Семантика функції включає в себе опис того, що є результатом обчислення функції, як і від чого цей результат залежить. Зазвичай результат виконання залежить тільки від значень аргументів функції, але в деяких модулях є поняття стану. Тоді результат функції може залежати від цього стану, і, крім того, результатом може стати зміна стану. Логіка цих залежностей і змін відноситься до семантиці функції. Повним описом семантики функцій є виконуваний код функції або математичне визначення функції.
Сокети
Сокет (англ. Socket - роз'єм) - назва програмного інтерфейсу для забезпечення обміну даними між процесами. Процеси при такому обміні можуть виконуватися як на одній ЕОМ, так і на різних ЕОМ, пов'язаних між собою мережею. Сокет - абстрактний об'єкт, який представляє кінцеву точку з'єднання.
Слід розрізняти клієнтські і серверні сокети. Клієнтські сокети грубо можна порівняти з кінцевими апаратами телефонної мережі, а серверні - з комутаторами. Клієнтський додаток (наприклад, браузер) використовує лише клієнтські сокети, а серверний (наприклад, веб-сервер, якому браузер посилає запити) - як клієнтські, так і серверні сокети.
Інтерфейс сокетів вперше з'явився в BSD Unix. Програмний інтерфейс сокетів описаний в стандарті POSIX.1 І в тій чи іншій мірі підтримується усіма сучасними операційними системами.
Кожен процес може створити слухаючий сокет (серверний сокет) і прив'язати його до якогось порту операційної системи (в UNIX непривілейовані процеси не можуть використовувати порти менше 1024). Процес, що слухає, зазвичай знаходиться в циклі очікування, тобто прокидається при появі нового з'єднання. При цьому зберігається можливість перевірити наявність з'єднань у цей час, встановити тайм-аут для операції тощо.
Кожен сокет має свою адресу. ОС сімейства UNIX можуть підтримувати багато типів адрес, але обов'язковими є INET-адреса і UNIX-адреса. Якщо прив'язати сокет до UNIX-адреси, то буде створено спеціальний файл (файл сокета) за заданим шляхом, через який зможуть повідомлятися будь-які локальні процеси шляхом читання/запису з нього.
Сокети типу INET доступні з мережі і вимагають виділення номера порту.
Зазвичай клієнт явно під'єднується до слухача, після чого будь-яке читання або запис через його файловий дескриптор будуть передавати дані між ним і сервером.
Сокети (англ. socket - заглиблення, гніздо, роз'єм) — назва програмного інтерфейсу для забезпечення обміну даними між процесами. Процеси при такому обміні можуть виконуватися як на одній ЕОМ, так і на різних ЕОМ, пов'язаних між собою мережею. Сокет - абстрактний об'єкт, що представляє кінцеву точку з'єднання.Інтерфейс сокетів вперше з'явився в BSD Unix. Програмний інтерфейс сокетів описаний в стандарті POSIX.1 І в тій чи іншій мірі підтримується усіма сучасними операційними системами.
Кожен процес може створити слухаючий сокет (серверний сокет) і прив'язати його до якогось порту операційної системи (в UNIX непривілейовані процеси не можуть використовувати порти менше 1024). Процес, що слухає, зазвичай знаходиться в циклі очікування, тобто прокидається при появі нового з'єднання. При цьому зберігається можливість перевірити наявність з'єднань у цей час, встановити тайм-аут для операції тощо.
Кожен сокет має свою адресу. ОС сімейства UNIX можуть підтримувати багато типів адрес, але обов'язковими є INET-адреса і UNIX-адреса. Якщо прив'язати сокет до UNIX-адреси, то буде створено спеціальний файл (файл сокета) за заданим шляхом, через який зможуть повідомлятися будь-які локальні процеси шляхом читання/запису з нього.
Сокети типу INET доступні з мережі і вимагають виділення номера порту.
Зазвичай клієнт явно під'єднується до слухача, після чого будь-яке читання або запис через його файловий дескриптор будуть передавати дані між ним і сервером.
Взаємодія протоколів
Протокол IP (Internet protocol) - основний протокол мережного рівня. Визначає спосіб адресації на мережевому рівні. Забезпечує маршрутизацію в мережах, що представляють собою об'єднання мереж, що базуються на різних мережевих технологіях.
Протокол ARP (Address Resolution Protocol) - допоміжний протокол стека TCP / IP, призначений для визначення апаратної адреси вузла призначення по заданому IP-адресу.
Протокол ICMP (Internet Control Message Protocol) - допоміжний протокол стека TCP / IP, призначений для обміну інформацією про помилки передачі даних протоколом IP, а також для обміну інформацією, що управляє на мережевому рівні. Зокрема, утиліта PING використовує цей протокол для посилки так званого "луна-запиту".
Протокол НТТР - використовується для організації доступу до загальних даних, розташованих на веб-серверах, з метою публікації і читання загальнодоступної інформації. Протокол HTTP описує взаємодію між HTTP-серверами (веб-серверами) і HTTP-клієнтами (веб-браузерами).
Протокол FTP - служба Інтернету, що забезпечує передачу файлів між комп'ютерами.
Протокол SMTP - застосовується поштовими серверами для передачі електронної пошти. Сервер IIS підтримує роботу з протоколом SMTP для обробки поштових повідомлень;
Протокол Telnet - протокол емуляції терміналу, застосовуваний для підключення до віддалених вузлів мережі. Telnet дозволяє клієнтам віддалено запускати додатки; крім того, він спрощує віддалене адміністрування.
Протокол SNMP - дозволяє централізовано керувати вузлами мережі, наприклад серверами, робочими станціями, маршрутизаторами, мостами і концентраторами. Крім того, SNMP можна використовувати для конфігурування віддалених пристроїв, моніторингу продуктивності мережі, виявлення помилок мережі та спроб несанкціонованого доступу, а також для аудиту використання мережі.
Багаторівневі представлення засобів мережевої взаємодії мають свою специфіку, пов'язану з тим, що в процесі обміну повідомленнями беруть участь щонайменше дві сторони, тобто в даному випадку необхідно організувати узгоджену роботу двох ієрархій апаратних і програмних засобів на різних комп'ютерах. Обидва учасники мережевого обміну повинні прийняти безліч угод.
Наприклад, вони повинні узгодити рівні і форму електричних сигналів, спосіб визначення розміру повідомлень, домовитися про методи контролю достовірності і т.п. Іншими словами, угоди повинні бути прийняті на всіх рівнях, починаючи від найнижчого - рівня передачі бітів, і закінчуючи найвищим , які реалізують обслуговування користувачів мережі.
Кожен рівень підтримує інтерфейси двох типів. По-перше, це інтерфейси послуг з вище-і нижчого рівнів «своєї» ієрархії засобів. По-друге, це інтерфейс із засобами взаємодії іншого боку, розташованими на тому ж рівні ієрархії. Цей тип інтерфейсу називають протоколом. Таким чином, протокол завжди є одноранговим інтерфейсом.
Ієрархічно організований набір протоколів, достатній для організації взаємодії вузлів в мережі, називається стеком протоколів.
Протоколи нижніх рівнів часто реалізуються комбінацією програмних і апаратних коштів, а протоколи верхніх рівнів, як правило, програмними засобами. Програмний модуль, що реалізовує деякий протокол, називають протокольної сутністю, або, для стислості, теж протоколом. Зрозуміло, що один і той же протокол може бути реалізований з різним ступенем ефективності. Саме тому при порівнянні протоколів слід враховувати не тільки логіку їх роботи, але і якість програмної реалізації. Більш того, на ефективність взаємодії пристроїв в мережі впливає якість усієї сукупності протоколів, що складають стек, зокрема те, наскільки раціонально розподілені функції між протоколами різних рівнів і наскільки добре визначені інтерфейси між ними.
Протокольні представлення одного рівня двох взаємодіючих сторін обмінюються повідомленнями відповідно до визначеного для них протоколом. Повідомлення складаються з заголовка і поля даних (іноді воно може бути відсутнім). Обмін повідомленнями є своєрідною мовою спілкування, за допомогою якого кожна зі сторін «пояснює» іншій стороні, що необхідно зробити на кожному етапі взаємодії.
Робота кожного протокольного модуля полягає в інтерпретації заголовків надходять до нього повідомлень і виконанні пов'язаних з цим дій. Заголовки повідомлень різних протоколів мають різну структуру, що відповідає відмінностям в їх функціональності. зрозуміло, що чим складніше структура заголовка повідомлення, тим складніші функції покладені на відповідний протокол.
Приклад клієнт-серверного додатку.
Код сервера
#include <iostream>
#include "Server.h"
using namespace std;
#define REQ_WINSOCK_VER 2
int main()
{
try
{
WSockServer MyServer(REQ_WINSOCK_VER);
if(MyServer.RunServer(4444))
{
cout << "Client connected. " << endl;
MyServer.StartChat();
}
}
catch(char *ErrMsg)
{
cout << "\nError: " << ErrMsg;
}
return 0;
}
#include "Server.h"
WSockServer::WSockServer(int RequestVersion)
{
hSocket = INVALID_SOCKET;
ClientSocket = INVALID_SOCKET;
if(WSAStartup(MAKEWORD(RequestVersion, 0), &wsaData) == 0) // Check required version
{
if(LOBYTE(wsaData.wVersion < RequestVersion))
{
throw "Requested version not available.";
}
}
else
throw "Startup failed.";
}
WSockServer::~WSockServer()
{
if(WSACleanup() != 0)
throw "Cleanup failed.";
if(hSocket != INVALID_SOCKET)
closesocket(hSocket);
if(ClientSocket != INVALID_SOCKET)
closesocket(hSocket);
}
void WSockServer::SetServerSockAddr(sockaddr_in *sockAddr, int PortNumber)
{
sockAddr->sin_family = AF_INET;
sockAddr->sin_port = htons(PortNumber);
sockAddr->sin_addr.S_un.S_addr = INADDR_ANY; // Listen on all available ip's
}
bool WSockServer::RunServer(int PortNumber)
{
if((hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) // Create socket
throw "Could not create socket.";
SetServerSockAddr(&sockAddr, PortNumber); // Fill sockAddr
if(bind(hSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr)) != 0)
throw "Could not bind socket.";
if(listen(hSocket, SOMAXCONN) != 0)
throw "Could not put the socket in listening mode.";
cout << "Server settings: " << endl;
cout << "IP: " << inet_ntoa(sockAddr.sin_addr) << endl;
cout << "PORT: " << ntohs(sockAddr.sin_port) << endl << endl;
int SizeAddr = sizeof(ClientAddr);
cout << "Waiting for clients... ";
ClientSocket = accept(hSocket, (sockaddr*)(&ClientAddr), &SizeAddr);
cout << "client found!" << endl;
return true;
}
void WSockServer::StartChat()
{
while(true)
{
int BytesRec = recv(ClientSocket, Buffer, sizeof(Buffer), 0);
if(BytesRec == 0)
{
cout << "The client closed the connection. " << endl;
}
else if(BytesRec == SOCKET_ERROR)
{
throw "The client seems to be offline.";
}
else
{
Buffer[BytesRec] = 0;
cout << "Client: " << Buffer << endl;
}
}
}
Код клієнта
#include <iostream>
#include "Client.h"
using namespace std;
#define REQ_WINSOCK_VER 2
#define PORT 4444
int main(int argc, char *argv[])
{
char StrIP[30]; // StrIP will hold the ip if the
// user don't give an argument.
try
{
WSockClient MyClient(REQ_WINSOCK_VER); // Winsock startup.
cout << "Search server... " << endl;
if(argc >= 2) // If user give an argument (IP ADDRESS)
{
cout << argv[1] << endl;
if(!MyClient.ConnectServer(PORT, argv[1]))
{
cout << "ChatClient was unable to connect. " << endl;
}
}
else
{
cout << "IP ADRESS: ";
cin.getline(StrIP, 29, '\n');
if(!MyClient.ConnectServer(PORT, StrIP))
{
cout << "ChatClient was unable to connect. " << endl;
}
}
cout << "You are connected to the server. " << endl << endl;
cout << "Type 'exit' to disconnect. " << endl;
MyClient.StartChat();
}
catch(char *ErrMsg) { cout << "\nError: " << ErrMsg << endl; }
return 0;
}
#include "Client.h"
// Constructor //
WSockClient::WSockClient(int RequestVersion)
{
hSocket = INVALID_SOCKET;
if(WSAStartup(MAKEWORD(RequestVersion, 0), &wsaData) == 0)
{
if(LOBYTE(wsaData.wVersion < RequestVersion))
{
throw "Requested version not available.";
}
}
else
throw "Startup failed.";
}
// Destructor //
WSockClient::~WSockClient()
{
if(WSACleanup() != 0)
throw "Cleanup failed.";
if(hSocket != INVALID_SOCKET)
closesocket(hSocket);
}
void WSockClient::SetClientSockAddr(sockaddr_in *sockAddr, int PortNumber, char *IP)
{
sockAddr->sin_addr.S_un.S_addr = inet_addr(IP);
sockAddr->sin_family = AF_INET; // Use TCP/IP protocol
sockAddr->sin_port = htons(PortNumber);
}
bool WSockClient::ConnectServer(int PortNumber, char *IP)
{
SetClientSockAddr(&sockAddr, PortNumber, IP); // Settings
if((hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
throw "Could not create socket.";
cout << "Attempting to connect to " << inet_ntoa(sockAddr.sin_addr) << endl;
if(connect(hSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr)) != 0) // Connect to the server
throw "Could not connect";
return true;
}
void WSockClient::StartChat()
{
while(true)
{
char *SendText = new char[128];
cout << "Client: ";
cin.getline(SendText, 127, '\n');
if(strcmp(SendText, "exit") == 0)
return;
if(send(hSocket, SendText, strlen(SendText), 0) == SOCKET_ERROR)
throw "Server probably down. ";
delete[] SendText;
}
}
Демонстрація роботи сервера і клієнта.