fieldbusbook

Посібник по промисловим мережам

Промислові мережі та інтеграційні технології в автоматизованих системах. 10. ПРОМИСЛОВИЙ ETHERNET

10.3. Протоколи транспортного рівня

10.3.1. Протоколи UDP та TCP

10.3.1.1. UDP.

Протокол UDP (User Datagram Protocol – дейтаграмний протокол користувача) – один із поширених транспортних протоколів, який використовується в Інтернеті. Він дозволяє відправляти інкапсульовані ІР-дейтаграми без встановлення з’єднання. В заголовку для ідентифікації кінцевих точок (програм) вказується порт джерела та порт призначення на мережевому вузлі відправника та отримувача. Принцип роботи портів висвітлений в другому розділі, тут тільки коротко нагадаємо, що коли прибуває пакет UDP інкапсульовані корисні дані передаються тій прикладній програмі, з якою пов’язаний порт призначення. Якщо на цю посилку треба відправити відповідь, то програма копіює поле порту джерела в поле порт призначення і таким чином направляє відповідь до програми-клієнта.

Таким чином єдина функція UDP – ідентифікація програм (процесів) відправника та отримувача, тобто адресація на транспортному рівні. Контролем потоку, помилок, повторною передачею після прийому пошкодженого сегменту даний протокол не займається.

10.3.1.2. TCP.

Протокол TCP (Transmission Control Protocol – контроль управління передачею) спеціально розроблений для забезпечення надійного потоку даних по ненадійній мережі. Транспортна сутність на мережному вузлі відправника розбиває корисні дані на декілька частин і відправляє окремими ІР-дейтаграмами. На вузлі отримувача ТСР сутність забезпечує “складання” цих частин. Оскільки ІР рівень не гарантує збереження послідовності доставки даних та взагалі їх доставку, то цією процедурою займається ТСР. У випадку відсутності деяких дейтаграм ТСР забезпечує їх повторну відправку і таким чином гарантує надійність передачі. Сутність ТСР орієнтована на з’єднання. Тобто спочатку необхідно провести з’єднання двох транспортних сутностей (ТСР клієнта і ТСР серверу) через яке два процеси зможуть передавати потоки байт. Адресація процесів на вузлах проходить аналогічно як в UDP. Для розуміння роботи ТСР розглянемо функціонування транспортних сутностей в контексті моделі примітивів – сокетів.

10.3.2. Модель сокетів

10.3.2.1. TCP в контексті моделі сокетів.

В табл.10.2 наведені основні примітиви роботи сокетів. Сокети можна уявляти як віртуальне гніздо зв’язку до якого підключається віртуальний канал. Дві прикладні програми створюють сокети за допомогою примітивів SOCKET і “з’єднують” їх між собою. Той хто очікує з’єднання являється Сервером, а той хто активно з’єднується називається Клієнтом. При з’єднанні сокетів створюються канали.

Тепер детальніше. Сервер виконує примітив BIND для того, щоб зв’язати даний сокет з ІР адресою та потрібним номером ТСР-порту. Після цього він виконує процедуру LISTEN якою вказує системі, що очікує з’єднання по цьому сокету.

Для того щоб підключитися до сокету Сервера, Клієнту необхідно скористатися примітивом CONNECT, вказавши ІР адресу та порт отримувача. Коли запит на з’єднання приходить на Сервер, той підтверджує з’єднання примітивом ACCEPT. Слід зазначити, що Клієнт не повинен прив’язуватись до конкретної локальної адреси порту, тому що клієнтські адреси формуються динамічно.

Таблиця 10.2 основні примітиви сокетів

Примітив Призначення
SOCKET (СОКЕТ) Створити новий сокет (гніздо зв’язку)
BIND (ЗВ’ЯЗАТИ) Зв’язати локальну адресу з сокетом
LISTEN (ОЧІКУВАТИ) Очікувати з’єднання зі сторони клієнта
ACCEPT (ПРИЙНЯТИ) Підтвердити з’єднання
CONNECT (З’ЄДНАТИ) Активно пробувати з’єднатись з сервером
SEND (ВІДПРАВИТИ) Відправити дані по встановленому каналі
RECEIVE (ОТРИМАТИ) Отримати дані із з’єднаного каналу
CLOSE (ЗАКРИТИ) Розірвати з’єднання

Після установки з’єднання Клієнт і Сервер можуть обмінюватись даними по дуплексному ТСР каналу за допомогою примітивів SEND та RECEIVE.

Для роз’єднання каналу викликається примітив CLOSE.

Всі ТСР-з’єднання є повнодуплексними та двухточковими, тобто трафік може йти в обидва боки одночасно між двома точками. Широкомовна та багатоадресна пересилка не підтримуються. Кожний сокет має адресу, яка складається з ІР адреси та 16-бітного номеру порту.

Порти використовуються як в TCP так і в UDP протоколах. Номера портів із значеннями нижче 1024, які називаються популярними портами, зарезервовані стандартними сервісами. Наприклад, будь-який процес може з’єднатися з портом 21 необхідного вузла для того щоб доступитися до його FTP-серверу. Тобто порт 21 зарезервований для FTP-серверів. Список таких портів приведений на сайті www.iana.org. В табл.10.3 представлені деякі з них.

Таблиця 10.3 Призначення портів TCP та UDP протоколів

Порт Протокол Використання
21 FTP Пересилка файлів
23 Telnet Дистанційний вхід в систему
25 SMTP Електронна пошта
69 TFTP Простий протокол передачі файлів
79 Finger Пошук інформації про користувача
80 HTTP WEB сервер
110 POP-3 Віддалений доступ до електронної почти
502 Modbus TCP Modbus TCP сервер

10.3.2.2. Використання Winsock з TCP/IP.

Припустимо, що є дві SCADA-програми в яких є вбудована мова VBA. Є необхідність в передачі даних між вузлами з використанням ТСР або UDP над протоколом IP. Для цього можна скористатися ActiveX-елементом Winsock, який як правило вже присутній на комп’ютерах з операційною системою Windows. Цей компонент являється інтерфейсом до однойменного сервісу в операційній системі Windows і функціонує приблизно так, як на приведеній вище моделі сокетів. Однак він може працювати як в режимі TCP так і UDP. Для останнього – з’єднання проводити не потрібно. Достатньо розмістити Winsock елемент на контейнері (наприклад формі) і можна користуватися його методами, властивостями та подіями.

Приклад 10.2. Промисловий Ethernet. Обмін даними за допомогою компонентів Winsock.

Завдання. Передати одну змінну типу Integer між прикладними програмами VBA за допомогою компонентів Winsock.

Рішення. Елемент Winsock на сервері має назву tcpServer, а на клієнтському комп’ютері – tcpClient. На стороні сервера прописуємо наступний код:

 Private RegInput As Integer, RegOutput As Integer
 Private Sub Server_Listen() ’очікувати з’єднання
	   tcpServer.LocalPort = 1001 ’Задається номер порту для з’єднання 
	   tcpServer.Listen 		   ’чекаємо на з’єднання	
 End Sub
 Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long)
	   ' якщо попереднє з’єднання не закінчилось закрити його примусово
   	   If tcpServer.State <> sckClosed Then tcpServer.Close
	   ' Прийняти запит з параметром requestID на установку з’єднання
	   tcpServer.Accept requestID
 End Sub
 Private Sub Send_Reg()
	tcpServer.SendData RegOutput 'Відправити значення RegOutput
 End Sub
 Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long)
      tcpServer.GetData RegInput ’прийняти з буферу прийому RegInput
 End Sub

Програма на стороні клієнта:

  Private RegInput As Integer, RegOutput As Integer
Private Sub Client_Connect()
   tcpClient.RemoteHost = 192.168.1.1
   tcpClient.RemotePort = 1001
   tcpClient.Connect
End Sub
Private Sub Send_Reg ()
   tcpClient.SendData RegOutput
End Sub
Private Sub tcpClient_DataArrival ByVal bytesTotal As Long)
   tcpClient.GetData RegInput
End Sub

<– 10.2. Протоколи рівня ІР

–> 10.4. Промисловий Ethernet