Протокол tcp

Навигация

Стек протокола IP.

Набор протоколов Internet разделяется на несколько уровней; каждый уровень предоставляет определенный набор функциональных возможностей (см. рисунок 1).

Рассмотрим уровни стека протокола IP, начиная с нижнего:

  • Канальный уровень предоставляет физический интерфейс к среде передачи (например, Ethernet).
  • Сетевой уровень управляет передачей пакетов по сети, обеспечивая их доставку получателю (этот процесс называют маршрутизацией).
  • Транспортный уровень обеспечивает управление потоком пакетов между двумя хостами в интересах прикладного уровня. Он также предоставляет приложению конечную точку взаимодействия, называемую портом.
  • Наконец, прикладной уровень обеспечивает представление данных, передаваемых через сокет. Эти данные могут, например, состоять из сообщений электронной почты, передаваемых по протоколу SMTP, или Web-страниц, передаваемых по протоколу HTTP.

В качестве интерфейса к протоколу транспортного уровня все протоколы прикладного уровня используют уровень сокетов. Интерфейс Sockets API был разработан для операционной системы UNIX Калифорнийским университетом в Беркли (UC Berkeley).

Перед рассмотрением функционирования протокола SCTP вспомним, как работают традиционные протоколы транспортного уровня.

Выполняем атаку TCP reset против себя

Примечание: я тестировал этот процесс на OSX, но получил несколько комментариев, что в Linux он не работает нужным образом.

  • Наблюдать за сетевым трафиком («сниффить» его), передаваемым между двумя жертвами
  • Сниффить TCP-сегмент со включенным флагом и считать его подтверждённый номер
  • Изготовить ложный TCP-сегмент со включенным флагом и порядковым номером, равным подтверждённому номеру перехваченного сегмента (стоит учесть, что это предполагает медленную передачу, иначе выбранный порядковый номер быстро устареет. (Чтобы повысить шансы на успех, можно передать несколько сегментов с большим интервалом порядковых номеров.)
  • Отправить фальшивые сегменты одной или обеим жертвам, надеясь, что это приведёт к разрыву их TCP-соединения
  1. Настроить TCP-соединение между двумя окнами терминала
  2. Написать атакующую программу, которая будет заниматься сниффингом трафика
  3. Модифицировать программу так, чтобы она изготавливала и отправляла фальшивые сегменты .

2. Сниффинг трафика

  • — приказывает слушать сетевой интерфейс , или localhost
  • — функция фильтра, приказывающая игнорировать все пакеты, не являющиеся частью соединения двух IP-адресов localhost на порте сервера. Эта фильтрация необходима, потому что на машине есть множество других программ, использующих интерфейс . Мы хотим игнорировать все пакеты, не являющиеся частью нашего эксперимента.
  • — функция, которую должна выполнять для каждого пакета, соответствующего требованиям функции . Функция в показанном выше примере просто выводит пакет на терминал. На следующем этапе мы изменим эту функцию, чтобы она также передавала сегменты .
  • — количество пакетов, которое должна сниффить до выхода.

3. Отправка фальшивых пакетов

  • Меняем местами IP-адреса отправителя и получатели, а также их порты. Это необходимо, потому что наш пакет будет ответом на перехваченный пакет. Исходная точка нашего пакета должна быть конечной точкой исходного пакета, и наоборот.
  • Включаем флаг сегмента, потому что именно он сообщает, что сегмент является
  • Присваиваем порядковому номеру точное значение номера подтверждения перехваченного пакета, так как это следующий порядковый номер, который ожидает получить отправитель
  • Вызываем метод библиотеки для отправки сегмента жертве — источнику перехваченного пакета.

Дальнейшая работа

  1. Продолжите эксперименты с инструментом для атак. Проследите, что происходит, если прибавить или вычесть 1 из порядкового номера пакета . Убедитесь, что он должен быть точно равен значению перехваченного пакета.
  2. Скачайте Wireshark и используйте его для прослушивания интерфейса во время проведения атаки. Это позволит вам увидеть подробности о каждом из передаваемых по соединению TCP-сегментов, в том числе и о ложном . Используйте фильтр для фильтрации всего излишнего трафика других программ.
  3. Усложните проведение атаки, передавая по соединению непрерывный поток данных. Это затруднит выбор скриптом правильного порядкового номера для его сегментов , потому что ко времени прибытия сегмента к жертве та уже может получить дальнейшие истинные данные, увеличив таким образом следующий порядковый номер. Чтобы противодействовать этому, мы можем передавать несколько пакетов , каждый из которых имеет свой порядковый номер.

Формат заголовка

TCP это это один из сложнейших протоколов, который мы будем рассматривать на сайте ZvonDoZvon.ru, на картинке ниже он представлен. Назначение большинства полей вам уже должно быть понятную из предыдущих лекций. Первые два поля порт отправителя и порт получателя. Порты это адреса на транспортном уровне они позволяют определить к какому приложению предназначен сегмент.

Порядковый номер

Следующее поле порядковый номер, мы помним, что TCP получает от вышестоящего уровня поток байт, который делится на отдельные части, называемые сегменты. TCP нумерует байты в потоке, и в поле порядковый номер содержится первый номер байта в сегменте.

Например, байт 1000, байт 2460 или 3920. Если мы используем сеть Ethernet, то размер сегмента как правило составляет 1460 байт, чтобы с заголовком TCP и IP можно было поместиться в кадр Ethernet размером 1500 байт.

Номер подтверждения

Следующее поле номер подтверждения, подтверждение используется для обеспечения гарантии доставки сообщений. Отправитель передает сегмент с указанием номера последовательности. Первый байт 1000, последний байт 1459. Получатель отправляет сегмент с подтверждением в которым он говорит, какие данные получены. Поле номер подтверждения используются для задания кумулятивного подтверждения, которая говорит о том, что получены все предыдущие байты. Особенности TCP в том, что в поле номер подтверждения указывается, не номер последнего байта, который получен в примере 2459, а номер следующего ожидаемого байта 2460.

Длина заголовка

Затем идет поле длина заголовка, как и в случае с IP, заголовок TCP состоит из двух частей, обязательной и необязательной. Длина обязательной части заголовка 20 байт, длина необязательный может быть разной в том числе и нулевой. Поэтому мы должны знать общую длину заголовка TCP.

9 полей флагов

Затем идут три зарезервированных бита, которые сейчас не используется. И 9 полей флагов:

  • Флаги NS, CWR и ECE используются для управления перегрузкой.
  • Флаг URG  указывает на то, что в сегменте содержатся срочные данные, которые необходимо быстро передать приложению. Этот флаг используется совместно с полем указатель на срочные данные, который содержит адрес этих данных. Сейчас этот флаг и поле указатель на срочные данные не используются.
  • Флаг ACK используются, если в поле номер подтверждения записаны осмысленные данным, то есть для подтверждения принятой ранее информации.
  • Флаг PSH указывает, что полученные данные необходимо полностью сразу передать приложение без промежуточной записи в буфер, также как и флаг URG этот флаг сейчас не используется.
  • Флаги RST и FIN используются для разрыва соединений, а флаг SYN синхронизация, используется для установки соединения.

Размер окна

Следующее поле размер окна, в этом поле получатель указывает сколько данных он может принять. Поле используется для управления потоком.

Контрольная сумма

Затем идет контрольная сумма, которая используется для проверки правильности доставки данных, если контрольная сумма рассчитанная получателем не совпадает с контрольной суммой в заголовке TCP, то этот сегмент отбрасывается.

Параметры

Затем идет не обязательная часть заголовка, которая в TCP называется параметры. В отличии от IP, где опции используются редко, параметры в TCP используется часто.

Рассмотрим некоторые примеры параметров:

Параметры (Maximum Segment Size, MSS) максимальный размер сегмента, говорит о том сегмент какого размера может принять получатель, если используется Ethernet, то максимальный размер сегмента 1460 байт. Максимальный размер сегмента, задается отправителем и получателем при установке соединения.

Другой важный параметр это масштаб окна, поле размер окна в заголовке TCP позволяет указать максимальный размер доступных для получения байт 65535, но это маленький объем для современных высокоскоростных и территориально протяженных каналов. Если использовать размер окна такого размера то, скорость передачи данных будет низкая. Параметр масштаб окна позволяет увеличить размер окна до 1 ГБ.

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

Для диагностических целей можно использовать параметр метки времени. После заголовка TCP обязательных и необязательных полей, идут данные. Данные в TCP также необязательны, вполне допускаются сегменты без данных, такие сегменты используются например, при установке соединения и теперь вы знаете как устроен формат заголовка протокола TCP.

TCP backlog

По метрикам TCP соединений можно не только диагностировать работу сети, но и определять проблемы в работе сервисов.

Например, если какой-то сервис, обслуживающий клиентов по сети, не справляется с нагрузкой и перестает обрабатывать новые соединения, они ставятся в очередь (backlog).

На самом деле очереди две:

  • SYN queue — очередь неустановленных соединений (получен пакет SYN, SYN-ACK еще не отправлен), размер ограничен согласно sysctl net.ipv4.tcp_max_syn_backlog;
  • Accept queue — очередь соединений, для которых получен пакет ACK (в рамках «тройного рукопожатия»), но не был выполнен accept приложением (очередь ограничивается приложением)

При достижении лимита accept queue ACK пакет удаленного хоста просто отбрасывается или отправляется RST (в зависимости от значения переменной sysctl net.ipv4.tcp_abort_on_overflow).

Наш агент снимает текущее и максимальное значение accept queue для всех listen сокетов на сервере.

Для этих метрик есть график и преднастроенный триггер, который уведомит, если backlog любого сервиса использован более чем на 90%:

Заголовок пакета

Пакеты RTP создаются на прикладном уровне и передаются транспортному уровню для доставки. Каждая единица медиаданных RTP, созданная приложением, начинается с заголовка пакета RTP.

Заголовок пакета RTP
Смещения Октет 1 2 3
Октет Немного 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 год 22 23 24 25 26 27 28 29 30 31 год
Версия п Икс CC M PT Последовательность чисел
4 32 Отметка времени
8 64 Идентификатор SSRC
12 96 Идентификаторы CSRC …
12 + 4 × СС 96 + 32 × СС Идентификатор заголовка расширения для конкретного профиля Длина заголовка расширения
16 + 4 × СС 128 + 32 × CC Заголовок расширения …

Заголовок RTP имеет минимальный размер 12 байтов. После заголовка могут присутствовать необязательные расширения заголовка. За ним следует полезная нагрузка RTP, формат которой определяется конкретным классом приложения. Поля в заголовке следующие:

  • Версия : (2 бита) Указывает версию протокола. Текущая версия — 2.
  • P (заполнение) : (1 бит) Используется для указания, есть ли дополнительные байты заполнения в конце пакета RTP. Заполнение может использоваться для заполнения блока определенного размера, например, в соответствии с требованиями алгоритма шифрования. Последний байт заполнения содержит количество добавленных байтов заполнения (включая его самого).
  • X (Расширение) : (1 бит) Указывает наличие заголовка расширения между заголовком и данными полезной нагрузки. Заголовок расширения зависит от приложения или профиля.
  • CC (счетчик CSRC) : (4 бита). Содержит количество идентификаторов CSRC (определенных ниже), следующих за SSRC (также определенным ниже).
  • M (Маркер) : (1 бит) Сигнализация, используемая на уровне приложения в зависимости от профиля. Если он установлен, это означает, что текущие данные имеют особое значение для приложения.
  • PT (Тип полезной нагрузки) : (7 бит). Указывает формат полезной нагрузки и, таким образом, определяет ее интерпретацию приложением. Значения зависят от профиля и могут быть присвоены динамически.
  • Порядковый номер : (16 бит) Порядковый номер увеличивается для каждого отправленного пакета данных RTP и должен использоваться приемником для обнаружения потери пакета и для обеспечения доставки вне очереди . Начальное значение порядкового номера должно быть рандомизировано, чтобы затруднить атаки с использованием известного открытого текста на безопасный транспортный протокол в реальном времени .
  • Отметка времени : (32 бита) Используется приемником для воспроизведения полученных отсчетов в соответствующее время и интервал. Когда присутствует несколько медиапотоков, метки времени могут быть независимыми в каждом потоке. Детализация времени зависит от приложения. Например, аудиоприложение, которое производит выборку данных каждые 125 мкс (8 кГц, обычная частота дискретизации в цифровой телефонии), будет использовать это значение в качестве своего тактового разрешения. Для видеопотоков обычно используется частота 90 кГц. Детализация часов — это одна из деталей, которая указывается в профиле RTP для приложения.
  • SSRC : (32 бита) Идентификатор источника синхронизации однозначно определяет источник потока. Источники синхронизации в рамках одного сеанса RTP будут уникальными.
  • CSRC : (32 бита каждый, количество записей указывается полем счетчика CSRC ) Идентификаторы вспомогательных источников перечисляют вспомогательные источники для потока, который был сгенерирован из нескольких источников.
  • Расширение заголовка : (необязательно, присутствие указывается полем Extension ) Первое 32-битное слово содержит идентификатор профиля (16 бит) и спецификатор длины (16 бит), который указывает длину расширения в 32-битных единицах, исключая 32 бита заголовка расширения. Далее следуют данные заголовка расширения.

Окно перегрузки в TCP

Таким образом в  TCP у нас есть два типа окна. Окно управления потоком, которое мы рассматривали в статье «Протокол TCP — Управление Потоком». Размер этого окна задаются получателем, в зависимости от того сколько места в буфере, и передается отправителю в сегментах с подтверждением.

Окно перегрузки, существует на стороне отправителя, его размер рассчитывается отправителем в зависимости от того, какая нагрузка на сеть, а не от того сколько данных может принять приложение. Приложение может быть готово принять много данных, но сеть загружена, в этом случае отправлять так много данных не имеет смысла.

Сетевой уровень

Сетевой уровень из полученной информации образует пакеты и добавляет заголовок

Наиболее важной частью данных являются IP и MAC-адреса отправителей и получателей

IP-адрес (Internet Protocol address) – логический адрес устройства. Содержит информацию о местоположении устройства в сети. Пример записи: .

MAC-адрес (Media Access Control address) – физический адрес устройства. Используется для идентификации. Присваивается сетевому оборудованию на этапе изготовления. Представлен как шестибайтный номер. Например: .

Сетевой уровень отвечает за:

  • Определение маршрутов доставки.
  • Передачу пакетов между сетями.
  • Присвоение уникальных адресов.

Маршрутизаторы — устройства сетевого уровня. Они прокладывают путь между компьютером и сервером на основе полученных данных.

Самый популярный протокол этого уровня – IP.

IP (Internet Protocol) — интернет-протокол, предназначенный для адресации в сети. Используется для построения маршрутов, по которым происходит обмен пакетами. Не обладает никакими средствами проверки и подтверждения целостности. Для обеспечения гарантий доставки используется TCP, который использует IP в качестве транспортного протокола. Понимание принципов этой транзакции во многом объясняет основу того, как работает стек протоколов TCP/IP.

Названия слоев и количество слоев в литературе

В следующей таблице показаны различные сетевые модели. Количество слоев варьируется от трех до семи.

Академия Cisco Куросе, Форузан Комер, Козерок Киоски Таненбаум Модель OSI
Четыре слоя Четыре слоя Пять слоев Четыре + один слой Пять слоев Пять слоев Три слоя Семь слоев
«Интернет-модель» «Интернет-модель» «Пятиуровневая модель Интернета» или «Набор протоколов TCP / IP» «Пятиуровневая эталонная модель TCP / IP» «Модель TCP / IP» «Пятиуровневая эталонная модель TCP / IP» «Эталонная модель Арпанет» Модель OSI
заявка заявка заявка заявка заявка заявка Прикладной процесс заявка
Презентация
Сессия
Транспорт Транспорт Транспорт Транспорт Хост-хост или транспорт Транспорт Хост-хост Транспорт
Интернет Межсетевое взаимодействие Сеть Интернет Интернет Интернет Сеть
Ссылка на сайт Сетевой интерфейс Канал передачи данных Канал передачи данных (сетевой интерфейс) Доступ к сети Канал передачи данных Сетевой интерфейс Канал передачи данных
Физический (Оборудование) Физический Физический Физический

Уровни в модели OSI:

Теперь пришло время рассказать какие уровни есть в модели OSI, для чего нужны и какие протоколы используют. Всего их семь как говорилось выше.

  1. Физический уровень — Определяет как переносить данные с одного компьютера на другой, работает на битовом уровне;
  2. Канальный уровень — Этот уровень нужен для обеспечения сети на физическом уровне;
  3. Сетевой уровень — Нужен для определения пути по которому будут отправятся данные;
  4. Транспортный уровень — Модель нужна для надёжной отправки данных от одного устройства, к другому;
  5. Сеансовый уровень — Этот уровень нужен для обеспечения сеанса связи между двумя компьютерами;
  6. Уровень представления — Обеспечивает преобразование протоколов и кодирование/декодирование данных;
  7. Прикладной уровень — Уровень обеспечивает взаимодействие пользователя со сетью;

Как видите тут описано кратко, для чего нужен каждый протокол, это сделано потому что, про каждый уровень по хорошому нужна отдельная статья, возможно такие статьи в будущем появится.

Протоколы транспортного уровня.

Двумя наиболее популярными протоколами транспортного уровня являются протоколы TCP и UDP:

  • Протокол TCP — это надежный протокол, который гарантирует последовательную упорядоченную передачу данных и обеспечивает управление нагрузкой в сети.
  • Протокол UDP, ориентированный на работу с сообщениями, не предоставляет никаких гарантий ни по очередности доставки сообщений, ни по контролю перегрузки.

Тем не менее UDP является быстрым протоколом и обеспечивает сохранение границ сообщений.

В этой статье рассматривается альтернативный протокол SCTP. Он обеспечивает надежную упорядоченную передачу данных подобно протоколу TCP, но ориентирован на передачу сообщений подобно протоколу UDP. Кроме того, протокол SCTP предоставляет дополнительные возможности:

  • множественная адресация;
  • многопотоковая передача данных;
  • безопасность устанавливаемого подключения;
  • формирование кадров сообщений;
  • настраиваемая неупорядоченная передача данных;
  • поэтапное завершение работы.

Считаем соединения

Disclaimer: для иллюстрации работы с метриками в разных срезах я буду показывать наш интерфейс (dsl) работы с метриками, но это можно сделать и на opensource хранилищах.

В первую очередь мы разделяем все соединения на входящие (inbound) и исходящие (outbound) по отношению к серверу.

Каждое TCP соединения в определенный момент времени находится в одном из , разбивку по которым мы тоже сохраняем (это иногда может оказаться полезным):

По этому графику можно оценить общее количество входящих соединений, распределение соединений по состояниям.

Здесь так же видно резкое падение общего количества соединений незадолго до 11 Jun, попробуем посмотреть на соединения в разрезе listen портов:

На этом графике видно, что самое значительное падение было на порту 8014, посмотрим только 8014 (у нас в интерфейсе можно просто нажать на нужном элементе легенды):

Попробуем посмотреть, изменилось ли количество входящий соединений по всем серверам?

Выбираем серверы по маске “srv10*”:

Теперь мы видим, что количество соединений на порт 8014 не изменилось, попробуем найти на какой сервер они мигрировали:

Мы ограничили выборку только портом 8014 и сделали группировку не по порту, а по серверам.

Теперь понятно, что соединения с сервера srv101 перешли на srv102.

Медленный старт

Метод аддитивного увеличения мультипликативного уменьшения хорошо работал на медленных каналах связи, которые были во времена создания сети интернет, но у на современных, быстрых и надежных каналах связи, этот метод работает плохо. С помощью аддитивного увеличения, размер окна перегрузкой увеличивается очень медленно, для того чтобы решить эту проблему был предложен другой метод управления размером окна — медленный старт.

При медленном старте размер окна увеличивается на каждое подтверждение не на 1 сегмент, а на 2, благодаря этому происходит экспоненциальное увеличение размера окна. Сначала мы отправляем один сегмент, получили подтверждение, отправляем два сегмента, получили 2 подтверждения, на каждое подтверждение отправляем по два сегмента всего 4, потом 8, потом 16 и так далее. То есть несмотря на название медленный старт, размер окна увеличивается гораздо быстрее, чем при аддитивном увеличении, мультипликативном уменьшении.

Недостаток метода заключается в том, что если произошла потеря сегмента, то размер окна уменьшается до нуля. Таким образом медленный старт быстро разгоняется, но также быстро тормозится.

Медленный старт и AIMD в TCP

В TCP используется комбинация медленного старта и аддитивного увеличения мультипликативного уменьшения. Cначала используется медленный старт, для того, чтобы быстро заполнить доступную пропускную способность канала. После того, как размер окна достиг определенного значения, порог медленного старта, происходит переход на аддитивное увеличение мультипликативное уменьшение. И дальше уже используется этот метод, размер окна увеличивается медленно, но если пришел сигнал о перегрузке, размер окна уменьшается в два раза, а не снижается до нуля.

Порог медленного старта определяется следующим образом. Сначала запускается медленный старт и работает до того, пока не поступит сигнал о перегрузке, после этого размера окна при котором пришел сигнал о перегрузке делится в два раза, и это значение выбирается порогом медленно старта. Таким образом, формируется достаточный запас размера окна, для того чтобы не произошла перегрузка, которые при аддитивном увеличении скорее всего не будет достигнут, если конечно загрузка сети останется на том же самом уровне.

Задержка сегмента

Один из возможных вариантов, задержка сегмента. В этом случае измеряется round trip time (RTT) время движения сегмента от отправителя до получателя и обратно.

Отправитель передавая сегменты, засекает RTT, измеряет средние время, и при существенном увеличении RTT уменьшается размер окна перегрузки.

Измерение времени задержки сегмента, позволяет обнаружить перегрузку до того как она произошла, но задержка может быть вызвана не только перегрузкой, но и другими причинами. Поэтому задержка сегмента не такой надежный сигнал, как его потеря.

Другая проблема заключается в том, что когда мы используем такой сигнал о перегрузке на загруженных каналах связи, то это приводит к не справедливому распределению пропускной способности. Наш компьютер начинает уменьшать размер окна перегрузки, когда увеличивается время задержки сегмента, в то же время другие компьютеры, которые используют сигнал о перегрузке потери сегмента, продолжают увеличивать размер окна пока перегрузка не произойдет.

Решением является совместное использование двух сигналов задержки и потери сегмента, такой подход используется например, в протоколе Compound TCP реализованного компанией Microsoft.

Функциональность

Протокол управления передачей данных (TCP) работает с Интернет-протоколом (IP). Отправка пакетов данных с одного компьютера на другой является его основной функцией. TCP и IP, вместе взятые, являются двумя протоколами, которые управляют Интернетом. В документе № 793 о стандартах Запроса комментариев (RFC) протокол управления передачей определен Целевой группой по инженерно-техническому обеспечению Интернета (IETF).

Данные, передаваемые по TCP соединениям, делятся на сегменты с независимой нумерацией. Каждый сегмент содержит пункт назначения источника и раздел данных, которые помещаются в заголовок. Протокол управления передачей данных отвечает за упорядочивание сегментов в правильной последовательности по мере их поступления в приемную часть. TCP отвечает за отслеживание этих сегментов, в то время как IP-адрес управляет фактической доставкой данных. Он включает встроенную проверку ошибок, которая гарантирует получение каждого запрошенного сегмента. TCP также включает в себя проверку ошибок, которая гарантирует, что каждый пакет доставлен в соответствии с запросом. Передача таких данных, как файлы и веб-страницы через Интернет, осуществляется с помощью TCP. Контроль над надежной передачей данных является основной функцией TCP.

В некоторых случаях пакеты теряются или доставляются не по назначению. Это связано с непредсказуемым сетевым поведением. Чтобы свести эту проблему к минимуму, ПТС запрашивает повторный заказ и доставку товаров. Это, однако, меняет скорость доставки на пару секунд. Необходимость в повторном упорядочении пакетов и ретрансляции после их получения создает задержку в потоке TCP. Согласно исследованиям, такие приложения, как FTP, Telnet, электронная почта и World Wide Web (WWW), предпочитают именно эту транспортную услугу — около 90% трафика этих сетей.

TCP/IP Адресация

Интернет-адреса, такие как IP (интернет-протокол), имеют полный механизм и являются одним из наиболее распространенных. TCP, с другой стороны, не нуждается в одной сложной системе адресации. TCP использует только номера, также называемые «портами», которые предоставляются устройством, с которым он в данный момент работает. Это делается для того, чтобы определить, для какой службы предназначены отправка и получение пакетов.

Например, порт 80 для TCP используется в основном для веб-браузеров, а порт 25 — для электронной почты. Для данной услуги вводится IP-адрес и номер порта, например 192.168.66.5:80.

Механизм действия протокола

Заключение

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector