Зарегистрируйтесь, чтобы продолжить обучение

TCP/IP Администрирование Linux

Практически все взаимодействия в веб-приложениях – являются сетевыми. Запросы к сайтам из браузера, взаимодействие с базами данных, между Docker-контейнерами, системами кеширования, API внешних сервисов – всё это сводится к сетевым запросам. Сети крайне важны и для инфраструктурных задач. Начиная с ssh подключений к машинам, заканчивая организацией сетевого взаимодействия между сервисами внутри кластера или даже датацентрами.

Знание сетей можно грубо разделить на два уровня – инфраструктурный и прикладной. Первый – это всё что касается проводов, устройств и технологий (wi-fi, соты). На данном уровне работают сетевые инженеры и это слишком далеко от прикладной разработки. Второй уровень работает поверх инфраструктуры и не завязан на неё. Здесь мы оперируем программами на разных компьютерах, которые общаются друг с другом, не задумываясь (почти) о том, как физически данные ходят между ними.

Типичная ситуация – обращение к сайту. Здесь мы со своего компьютера отправляем запрос на другой компьютер и в ответ получаем страницу, которую показывает браузер. И хотя, судя по адресной строке, запрос выполняется по протоколу HTTP, всё чуть сложнее. HTTP – протокол прикладного уровня, он не знает про существование компьютеров в сети и работает уже поверх установленного соединения между компьютерами. А вот соединение делается с помощью протокола TCP, который нас интересует больше всего. На TCP держится практически всё сетевое взаимодействие.

TCP/IP

Протокол TCP позволяет общаться между собой процессам расположенным как на одном компьютере, так и на разных. Процессам, а не компьютерам, что очень важно. Подключение по TCP идёт из конкретного процесса в конкретный процесс. Для соединения нужно два параметра: ip–адрес и порт. Ip-адрес обычно устанавливается автоматически, а вот порт выбирается самим разработчиком, хотя и он может присваиваться автоматически. Связка адреса и порта однозначно говорит нам о том, с какой программой происходит связь. Именно поэтому параметра два. Одного ip-адреса недостаточно, тогда мы не сможем понять, какая программа хочет работать по сети.

TCP клиент-серверный протокол. То есть один компьютер выступает в качестве сервера, а те, кто к нему присоединяются – клиенты. Сервер во время старта указывает ip-адрес и порт, на которых нужно запуститься. Говорят, что сервер "слушает" порт.

// Пример на JS

// СЕРВЕР

import net from 'net';

// Этот сервер отвечает Echo Server на каждый входящий запрос
const server = net.createServer((socket) => {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

// Запускаем сервер на 3000 порту
// ip-адрес должен быть доступен снаружи
// После запуска вкладка терминала зависнет,
// так как сервер войдёт в режим ожидания входящих запросов
// Если её закрыть или нажать ctrl+c, то сервер остановится
server.listen(3000, '168.123.44.33');

// КЛИЕНТ

// Где-то в другом месте пишем клиент, который запускается отдельно
import net from 'net';

// Для соединения используется сетевой сокет
const client = new net.Socket();
client.connect(3000, '168.123.44.33', () => {
  client.write('Hello, server! Love, client.');
});

// Описываем, что делать, когда придут данные от сервера
client.on('data', (data) => {
  console.log(`Received: ${data}`);
  client.destroy(); // отключаемся от сервера
});

// Клиентов можно запустить сколько угодно

Примерно так происходят все сетевые взаимодействия. И даже HTTP отправляется по установленному TCP-соединению.


Самостоятельная работа

В большинстве случаев перед приложением на сервере ставится специальный прокси. В этой самостоятельной работе мы локально поднимем прокси сервер для нескольких сайтов и они будут открываться по собственным именам доменов. В качестве прокси сервера будем использовать Caddy.

  1. Установите Caddy на свой компьютер
  2. Создайте следующую файловую структуру:

    .
    ├── Caddyfile
    ├── localhost
    │   └── index.html
    ├── site1
    │   └── index.html
    └── site2
        └── index.html
    

    Содержимое Caddyfile:

    {
      auto_https off
    }
    
    http://localhost {
      file_server
      root * localhost/
    }
    
    http://ru.site1.test {
      file_server
      root * site1/
    }
    
    http://ru.site2.test {
      file_server
      root * site2/
    }
    

    Добавьте в файлы index.html строки: localhost, site1 и site2, соответственно.

  3. Запустите Caddy и сделайте так, чтобы при переходе по каждому URL из Caddyfile вы видели соответствующий текст


Дополнительные материалы

  1. Transmission Control Protocol
  2. IP-адрес

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»