---
# System prepended metadata

title: Звіт. Лабораторна робота 4

---

# Звіт. Лабораторна робота 4
Виконав роботу: Якушев Максим

[TOC]

### Завдання (Виконати завдання ЛР 1, використовуючи методи протоколу WebSocket):
1. Зробити клієнт-серверний застосунок на мові javascript, використовуючи протокол HTTP, що тестує повний час подорожі запиту до сервера та назад (RTT) з обчисленням *мінімального, максимального, медіанного та середнього часу RTT, середнього квадратичного відхилення та коефіцієнта асиметрії* для частот запитів с клієнта до сервера 16Гц, 8Гц, 4Гц, 2Гц, 1Гц, а також для розмірів клієнтських запитів 128, 256, 512, 1024, 2048 байт. Результати представити у вигляді таблиць
2. Протестувати роботу Вашого клієнт-серверного застосунку в персональній мережі (PAN) та у всесвітній мережі (WAN на хостінгу replit.com). 
3. Дати оцінку відстані до сервера та тих характеристик каналу клієнт-сервер, що можно отримати з цих даних
4. Порівняти отримані дані с даними системної мережевої утиліти ping.

### Теоретична частина 

**WebSocket Protocol**

WebSocket - це протокол зв'язку, що забезпечує повнодуплексний обмін даними через єдине, постійне з'єднання TCP. Він забезпечує відкритий канал зв'язку, який дозволяє обмінюватися повідомленнями між браузером та веб-сервером в реальному часі. Він дозволяє ефективно передавати дані без зайвого навантаження на мережу та сервер, які є характерними для традиційних HTTP-з'єднань.

Основні характеристики:

- WebSocket дозволяє як клієнту, так і серверу відправляти та отримувати повідомлення одночасно, що дозволяє взаємодіяти в реальному часі.
- На відміну від HTTP, який використовує модель запит-відповідь, де кожен запит ініціює нове з'єднання, WebSocket підтримує постійне з'єднання між клієнтом та сервером, зменшуючи затримки та накладні витрати.
- Завдяки постійному з'єднанню та мінімальним накладним витратам WebSocket сприяє зниженню затримок у комунікації, роблячи його відповідним для інтерактивних застосунків, таких як онлайн-ігри, чатові додатки та фінансові торговельні платформи.

**Socket.IO**

Socket.IO - це бібліотека JavaScript для веб-застосунків в реальному часі. Вона дозволяє налаштовувати зв'язок між клієнтом та сервером на основі WebSocket. Забезпечує зручний інтерфейс для створення багаторівневих та інтерактивних веб-застосунків, що потребують миттєвої передачі даних між клієнтом та сервером. Вона складається з двох частин: клієнтської бібліотеки, яка виконується в браузері, та серверної бібліотеки для Node.js.

Підключення через Socket.IO може бути здійснене за допомогою різних транспортів на низькому рівні:
- HTTP long-polling
- WebSocket
- WebTransport

Socket.IO автоматично вибирає найкращий доступний варіант, залежно від можливостей браузера та мережі.

Socket.IO НЕ є реалізацією WebSocket. Хоча Socket.IO дійсно використовує WebSocket для транспорту, коли це можливо, воно додає додаткові метадані до кожного пакету. Тому клієнт WebSocket не зможе успішно підключитися до сервера Socket.IO, і клієнт Socket.IO також не зможе підключитися до простого WebSocket сервера.

### Код програми
Посилання на код: https://replit.com/join/hjsngihgrq-maksymyakushev

**index.js**
```js=1
const io = socketIO(server);
 
io.on('connection', socket => {
      ////----- Обробник підключення користувача
      console.log('Сonnected');
        
      socket.on('measureRTT', (data, clientCounter) => {
           ////----- Вимірювання RTT від клієнта
          console.log('Number =', clientCounter);
          const socketName = 'RTTMeasured' + clientCounter;
          socket.emit(socketName, data, clientCounter); 
      });
        
          socket.on('disconnect', () => {
          ////----- Обробник відключення користувача
          console.log('Disconnected');
          });
});
        
// Прослуховування порту
server.listen(3000, "127.0.0.1", () => {
  console.log('Server running at http://127.0.0.1:3000/');
});
```
У цьому коді використовуємо Socket.IO для налаштування зв’язку в реальному часі у Node.js. Він прослуховує підключення від клієнтів і реєструє, коли користувачі підключаються або відключаються. Коли клієнт надсилає повідомлення з назвою події `measureRTT`, сервер реєструє отримані дані та надсилає клієнту повідомлення підтвердження з тими самими даними.

**script.js**

```js=1
// Запит до серверу
let counter = 1; // Лічільник запитів
function requestToServer(requestSize) {
  const localCounter = counter;
  counter++;
  const data = generateData(requestSize); // Генеруємо дані для відправки на сервер
   const socketName = "RTTMeasured" + localCounter;
  const startTime = Date.now(); // Час початку відправки
  
        socket.on(socketName, (responseData, recievedCounter) => {
              ////------ Обробник для отримання відповіді від сервера
              const rtt = Date.now() - startTime; // Обчислення RTT
              const sizeInBytes = responseData.length;
              console.log(
                 "Requests number:", currentAmountOfRequests,
                 "localCounter=", localCounter,
                 "recievedCounter=", recievedCounter,
                 "RTT:", rtt, "ms",
                 "\nResponse size:", sizeInBytes,"bytes",
              );
                 socket.off(socketName);
                 // Обчислення метрик
                 calculateMetrics(rtt);
         });
         socket.emit("measureRTT", data, localCounter); // Відправлення RTT назад 
}
```
Цей код на стороні клієнта визначає функцію `requestToServer(requestSize)`, яка надсилає повідомлення на сервер для вимірювання RTT із вказаним розміром запиту. Він генерує дані на основі наданого розміру запиту, записує час початку та надсилає дані на сервер із назвою події `measureRTT`. Він також прослуховує подію відповіді під назвою `RTTMeasured` від сервера. Отримавши відповідь, він обчислює RTT, реєструє його разом із розміром відповіді, а потім переходить до обчислення показників на основі RTT.
```js=1
// Обчислення метрік
function calculateMetrics(rtt) {
  rttValues.push(rtt);
  minRTT = calculateMinimum(rttValues);
  maxRTT = calculateMaximum(rttValues);
  medianRTT = calculateMedian(rttValues);
  avgRTT = calculateAverage(rttValues);
  stdDevRTT = calculateStandardDeviation(rttValues);
  skewnessRatio = calculateSkewnessRatio(rttValues);
   myConsole.innerText =
     "Current frequency: " + frequenciesHz[currentFrequencyIndex] + "\n" +
     "Amount of requests: " + rttValues.length + "\n" +
     "RTT: " + rtt + " ms\n" +
     "Minimum RTT: " + minRTT + " ms\n" +
     "Maximum RTT: " + maxRTT + " ms\n" +
     "Median RTT: " + medianRTT + " ms\n" +
     "Average RTT: " + avgRTT + " ms\n" +
     "Standard Deviation RTT: " + stdDevRTT + " ms\n" +
     "Skewness Ratio: " + skewnessRatio + "\n";
}
```

**Помилки, які виникли:**

В файлі **index.js** є `app.use(express.static("public"))`, яка заміняє написання зайвих строчок для вказання місцезнаходження потрібних файлів (HTML, CSS і тд.). Тобто одразу посилається на папку public, яка містить потрібні файли.
### Аналіз результатів

**Тест роботи клієнт-серверного застосунку в персональній мережі (PAN)**

Дані були отримані шляхом проведення по 100 вимірювань для кожного набору параметрів.

**Таблиця результатів:**

| Measurement Frequency (hz) | Request Size (bytes) | Total Requests | Min. RTT (ms) | Max. RTT (ms) | Mean RTT (ms) | AVG. RTT (ms) | Standard Deviation RTT (ms) | Skewness RTT |
| ------------ | --------------------- | -------- | -------- | -------- | -------- | ---------------------- | ------------ |------------ |
|16|	128|	100| 1|	6	|1	|1.66	|0.90	|0.0220|
|8	|128	|100	|1|	7	|2	|2.39	|1.26	|0.0096|
|4	|128	|100	|1|	10|	3|	3.01|	1.50|	0.0132|
|2	|128	|100	|1|	6	|2	|2.45	|1.16	|0.0086|
|1	|128	|100	|1|	16|	2|	2.81|	1.84|	0.0397|
|16|	256|	100| 0|	8	|1	|1.41	|0.88	|0.0462|
|8	|256	|100	|1|	3	|1	|1.28	|0.47	|0.0130|
|4	|256	|100	|0|	7	|2	|1.82	|0.96	|0.0232|
|2	|256	|100	|0|	17|	4|	3.81|	2.13|	0.0249|
|1	|256	|100	|1|	8	|3	|3.45	|1.65	|0.0051|
|16|	512|	100| 1|	9	|2	|3.02	|1.97	|0.0123|
|8	|512	|100	|0|	7	|2	|2.13	|1.16	|0.0158|
|4	|512	|100	|1|	6	|2	|1.97	|0.66	|0.0223|
|2	|512	|100	|0|	6	|2	|1.86	|0.81	|0.0188|
|1	|512	|100	|1|	16|	2|	1.88|	1.63|	0.0688|
|16|	1024|	100|0|	11|	1|	1.75|	1.40|	0.048|
|8	|1024|	100|	0|	7	|2	|1.81	|0.99	|0.0194|
|4	|1024|	100|	0|	18|	2|	1.97|	1.91|	0.0643|
|2	|1024|	100|	0|	7	|3	|3.08	|1.45	|0.0026|
|1	|1024|	100|	0|	5	|2	|1.63	|0.77	|0.0131|
|16|	2048|	100|1|	3	|2	|1.53	|0.54	|0.0027|
|8	|2048|	100|	1|	2	|1	|1.44	|0.50	|0.0025|
|4	|2048|	100|	1|	4	|2	|1.97	|0.50	|0.0043|
|2	|2048|	100|	0|	3	|2	|1.96	|0.49	|-0.0063|
|1	|2048|	100|	1|	3	|2	|2.10	|0.46	|0.0039|

**Тест роботи клієнт-серверного застосунку у всесвітній мережі (WAN)**

Дані були отримані шляхом проведення по 100 вимірювань для кожного набору параметрів.

**Таблиця результатів:**

| Measurement Frequency (hz) | Request Size (bytes) | Total Requests | Min. RTT (ms) | Max. RTT (ms) | Mean RTT (ms) | AVG. RTT (ms) | Standard Deviation RTT (ms) | Skewness RTT |
| ------------ | --------------------- | -------- | -------- | -------- | -------- | ---------------------- | ------------ |------------ |
|16|	128|	100|	119|	302|	123|	127.40|	22.20|	0.0657|
|8	|128	|100	|118	|155	|122	|122.97|	4.67|	0.0425|
|4	|128	|100	|118	|156	|121	|122.69|	5.51|	0.0377|
|2	|128	|100	|118	|164	|126	|128.05|	8.37|	0.0118|
|1	|128	|100	|117	|181	|126	|127.60|	8.70|	0.0268|
|16|	256|	100|	117|	146|	121|	122.04|	4.22|	0.0309|
|8	|256	|100	|117	|365	|120	|130.31|	39.87|	0.0474|
|4	|256	|100	|117	|145	|122	|123.54|	5.75|	0.0179|
|2	|256	|100	|118	|465	|126.5|	131.04|	34.40|	0.0943|
|1	|256	|100	|117	|170	|125	|126.39|	7.81|	0.0251|
|16|	512|	100|	118|	312|	122|	127.22|	24.59|	0.0600|
|8	|512	|100	|118	|139	|122	|122.48|	3.92|	0.0211|
|4	|512	|100	|118	|741	|121	|141.36|	82.29|	0.0558|
|2	|512	|100	|117	|157	|126	|129.65|	10.18|	0.0064|
|1	|512	|100	|118	|483	|126	|134.56|	49.17|	0.0691|
|16|	1024|	100|	118|	312|	124|	135.88|	34.86|	0.0350|
|8	|1024|	100|	119|	137|	123|	124.10|	3.32|	0.0083|
|4	|1024|	100|	118|	746|	122|	134.49	|72.59|	0.0734|
|2	|1024|	100|	118|	146|	124|	124.40|	4.72|	0.0134|
|1	|1024|	100|	118|	142|	126|	126.16|	3.75|	0.0047|
|16|	2048|	100|	120|	367|	124|	142.74|	50.46|	0.0302|
|8	|2048|	100|	119|	377|	124|	148.09	|61.98|	0.0266|
|4	|2048|	100|	120|	485|	125|	133.22	|45.40|	0.0640|
|2	|2048|	100|	121|	153|	127|	130.30|	7.85|	0.0129|
|1	|2048|	100|	121|	304|	126|	129.74	|18.42|	0.0874|

### Оцінка відстані до сервера та характеристик отриманих з цих даних
Для аналізу будемо використовувати дані, отримані з вимірів для кожного розміру запиту та частоти вимірювань, які проводилися в мережах PAN та WAN.

**1. Мінімальний, максимальний, медіанний та середній час RTT:**

Можемо спостерігати, що у PAN мережі значення RTT в середньому нижчі порівняно з WAN. Це пов'язано з тим, що PAN мережа зазвичай забезпечує швидке та стабільне з'єднання, оскільки вона обмежена територіально та має меншу кількість вузлів порівняно з WAN, де можливі більші затримки через більшу відстань та кількість проміжних маршрутизаторів. Медіанний час RTT також може бути корисним показником, оскільки він вказує на середнє значення, яке відображає загальний стан мережі.

**2. Стандартне відхилення RTT та коефіцієнт асиметрії:**

Стандартне відхилення RTT вказує на рівень дисперсії даних. Чим вище відхилення, тим більше різноманіття у вимірах RTT, що може вказувати на нестабільність мережі. Коефіцієнт асиметрії вказує на те, наскільки далеко виміри розташовані від середнього значення. Це може бути корисним показником для виявлення асиметрії в розподілі даних.

**3. Оцінка відстані до сервера та характеристик каналу:**

Відстань до сервера в PAN мережі буде набагато менше, ніж в WAN мережі. Це може пояснити вищі значення RTT в WAN мережі через більшу фізичну відстань, яка має бути пройдена сигналом. Характеристики каналу також можна оцінити за допомогою даних про RTT. Низькі значення RTT та стандартного відхилення вказують на стабільний канал з малою затримкою та мінімальними втратами пакетів, тоді як високі значення можуть вказувати на перевантаження каналу або нестабільність мережі.


### Порівння отриманих даних з даними системної мережевої утиліти ping

Ping для PAN:

```
yakushev_maksym@Air---Maksym ~ % ping -c 10 127.0.0.1     
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.282 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.330 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.122 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.159 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.377 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.093 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.079 ms
64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.063 ms
64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.113 ms
64 bytes from 127.0.0.1: icmp_seq=9 ttl=64 time=0.116 ms

--- 127.0.0.1 ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.063/0.173/0.377/0.107 ms
```

Ping для WAN:

```
yakushev_maksym@Air---Maksym ~ % ping -c 10 81d6d6f2-c80a-42ea-a4d9-9860793b336b-00-2wksc27iszdcw.janeway.replit.dev
PING 81d6d6f2-c80a-42ea-a4d9-9860793b336b-00-2wksc27iszdcw.janeway.replit.dev (34.148.134.19): 56 data bytes
64 bytes from 34.148.134.19: icmp_seq=0 ttl=104 time=122.030 ms
64 bytes from 34.148.134.19: icmp_seq=1 ttl=104 time=115.802 ms
64 bytes from 34.148.134.19: icmp_seq=2 ttl=104 time=116.545 ms
64 bytes from 34.148.134.19: icmp_seq=3 ttl=104 time=115.761 ms
64 bytes from 34.148.134.19: icmp_seq=4 ttl=104 time=116.106 ms
64 bytes from 34.148.134.19: icmp_seq=5 ttl=104 time=116.312 ms
64 bytes from 34.148.134.19: icmp_seq=6 ttl=104 time=117.151 ms
64 bytes from 34.148.134.19: icmp_seq=7 ttl=104 time=116.097 ms
64 bytes from 34.148.134.19: icmp_seq=8 ttl=104 time=116.206 ms

--- 81d6d6f2-c80a-42ea-a4d9-9860793b336b-00-2wksc27iszdcw.janeway.replit.dev ping statistics ---
10 packets transmitted, 9 packets received, 10.0% packet loss
round-trip min/avg/max/stddev = 115.761/116.890/122.030/1.859 ms
```
Мінімальний, максимальний та середній часи відповідо до власної мережі набагато менші, ніж до глобальної мережі, це очікувано, оскільки сервер розташований на тому ж комп'ютері, де виконується ping, тому час відповіді надзвичайно короткий.
### Швидкість сигналу
Швидкість сигналу визначається швидкістю світла в середовищі, через яке передається сигнал. Швидкість світла у вакуумі становить приблизно 299,792,458 м/c.
У разі передачі цифрового сигналу по кабелю швидкість сигналу становить приблизно 2/3 швидкості світла в середовищі.

Отримаємо швидкість по кабелю 199 км/мс. Тоді можемо обчислити відстань, яку проходить сигнал до сервера, отримаємо 199 км/мс · 116 мс = 23084 км.
Тоді, можемо говорити, що сервер знаходиться приблизно в 11542 км від мого місцезнаходження

**Як RTT залежить від розміру?**

Зменшення частоти вимірювання збільшує середній RTT. Це може бути пов'язано з тим, що менша частота вимірювання зменшує точність визначення RTT (якщо дивитись на таблицю). 
Загалом, можна сказати, що розмір запиту не прямо впливає на RTT, але частота вимірювання та інші фактори можуть змінювати RTT (для цього потрібні інші тетсти), і зазвичай збільшення розміру запиту при не зміненні інших факторів призводить до збільшення RTT.

### Висновок
- У мережі PAN відзначено більш низькі значення RTT порівняно з мережею WAN. Це пояснюється більшою стабільністю та меншою фізичною відстанню в PAN.
- Порівняння з результатами ping-тестів також було проведено, підтверджуючи, що час відповіді впливає на умови мережі та відстань до сервера.
- Працювати з Socket.IO більш зручно та швидше.
- Великий плюс використовувати Socket.IO в порівнянні з іншими методами те, що дозволяє обмінюватися повідомленнями між браузером та веб-сервером в реальному часі.
- В файлі **index.js** є `app.use(express.static("public"))`, яка заміняє написання зайвих строчок для вказання місцезнаходження потрібних файлів (HTML, CSS і тд.). Тобто одразу посилається на папку public, яка містить потрібні файли.

