# [Лабораторна робота 1](https://en.wikipedia.org/wiki/Indentation_style)
[TOC]
## Завдання
1. Зробити клієнт-серверний додаток на мові javascript, використовуючи протокол HTTP, що тестує повний час подорожі запиту до сервера та назад (RTT) з обчисленням *мінімального, максимального, медіанного та середнього часу RTT, середнього квадратичного відхилення та коефіцієнта асимметрії* для частот запитів с клієнта до сервера 16Гц, 8Гц, 4Гц, 2Гц, 1Гц, а також для розмірів клієнтських запитів 128, 256, 512, 1024, 2048 байт. Результати представити у вигляді таблиць
2. Протестувати роботу Вашого клієнт-серверного додатку в персональній мережі (PAN) та у всесвітній мережі (WAN на хостінгу replit.com).
3. Дати оцінку відстані до сервера та тих характеристик каналу клієнт-сервер, що можно отримати з ціх даних
4. Порівняти отримані дані с даними системної мережевої утіліти ping.
### Посилання на [результати обчислень RTT у вигляді таблиць](https://docs.google.com/spreadsheets/d/1qeVgVbYJSnLpV6XVvkxWmT8nIr2e7qKHzIequLWPaV8/edit?usp=sharing)
### Посилання на [клієнт-серверний додаток](https://replit.com/join/qhzyxjwadq-sharkovskaya)
Cтворення веб-сервера, який обробляє запити різними маршрутами та обробляє POST-запити на сервер
``` glsl=1
const express = require("express");
const fs = require("fs");
const ejs = require("ejs");
const path = require("path");
const app = express();
// app.use(express.static("public"));
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.get("/home", (req, res) => {
const labs = [
{ name: "Lab 1", url: "/lab1" },
// { name: "Lab 2", url: "/lab2" },
];
res.render("index_client", { labs: labs });
});
app.get("/lab1", (req, res) => {
fs.readFile("views/lab1_client.ejs", "utf8", (err, data) => {
if (err) {
console.error("Error reading file:", err);
res.status(500).send("Internal Server Error");
} else {
const renderedHtml = ejs.render(data, { req });
res.status(200).send(renderedHtml);
}
});
});
app.post("/lab1/request/to/server", (req, res) => {
const contentSize = req.headers["content-length"];
console.log("Received request size: " + contentSize);
const t = Date.now();
res.status(200).send(t.toString());
});
app.get("*", (req, res) => {
res.redirect("/home");
});
const PORT = 3000;
const server = app.listen(PORT, () => {
console.log(`Server is running`);
});
```


<!--
Результати були отримані у наступному вигляді:


<br>
 -->
Оцінка відстані до сервера, використовуючи протокол HTTP та результати клієнт-серверного додатку на хостінгу replit.com:
$${2.9 * 10⁸ * 10.7 / 2 = 15.515 * 10^8 = 1551500 (km)}$$
Оцінка відстані до сервера, використовуючи протокол HTTP та результати клієнт-серверного додатку в персональній мережі (PAN):
$${2.9 * 10⁸ / 2 * 4.8 = 6.96 * 10^8 m = 696000 (km)}$$
Дані способи не дають дійсних значень відстані через фактори, які можуть впливати на час очікування відповіді (завантаженість сервера, обробка у черзі, пропускна здатність).
## Висновки
Чим менше частота надсилання запитів до сервера, тим стабільніше значення RTT, оскільки сервер витрачає на обробку запитів від клієнтів менше процесорного часу, а також знижується мережне навантаження.