Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

Основы программирования сетевых приложений на .NET: протоколы, соединение, обмен данными, безопасность

Программирование 20.02.2024 0 93 Нашли ошибку? Ссылка по ГОСТ

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

Помощь в написании работы

Введение

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

Нужна помощь в написании работы?

Написание учебной работы за 1 день от 100 рублей. Посмотрите отзывы наших клиентов и узнайте стоимость вашей работы.

Подробнее

Основы программирования сетевых приложений на .NET

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

Для программирования сетевых приложений на .NET используются различные технологии и инструменты, такие как классы и библиотеки .NET Framework, ASP.NET, WCF (Windows Communication Foundation) и другие. Они предоставляют разработчикам удобные средства для работы с сетевыми протоколами, создания сетевых соединений, обмена данными и обработки ошибок.

Протоколы передачи данных

Протоколы передачи данных определяют правила и форматы, по которым данные передаются между компьютерами в сети. На платформе .NET поддерживаются различные протоколы, такие как TCP (Transmission Control Protocol), UDP (User Datagram Protocol), HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol) и другие. Каждый протокол имеет свои особенности и предназначен для определенных типов приложений и задач.

Создание сетевого соединения

Для создания сетевого соединения между клиентом и сервером на платформе .NET используются классы и методы из пространства имен System.Net. Разработчики могут использовать классы TcpClient и TcpListener для создания TCP-соединения, классы UdpClient и UdpListener для создания UDP-соединения, а также классы WebClient и WebRequest для работы с HTTP-соединением. Кроме того, существуют специальные классы и методы для работы с другими протоколами и типами соединений.

Обмен данными между клиентом и сервером

После установки сетевого соединения между клиентом и сервером необходимо организовать обмен данными. Для этого на платформе .NET предоставляются различные средства, такие как классы NetworkStream и StreamReader/StreamWriter для работы с потоками данных, классы Socket и SocketAsyncEventArgs для асинхронного обмена данными, а также классы WebClient и WebRequest для работы с HTTP-запросами и ответами. Разработчики могут выбрать наиболее подходящий способ обмена данными в зависимости от требований и особенностей приложения.

Обработка ошибок и исключений

При разработке сетевых приложений на .NET необходимо учитывать возможность возникновения ошибок и исключений. Неправильное соединение, потеря данных, недоступность сервера и другие проблемы могут привести к сбою приложения. Для обработки ошибок и исключений на платформе .NET используются механизмы исключений, такие как блок try-catch-finally, а также классы и методы для обработки конкретных типов ошибок. Разработчики должны предусмотреть обработку ошибок и исключений в своем коде, чтобы обеспечить надежность и стабильность приложения.

Асинхронное программирование в сетевых приложениях

Асинхронное программирование является важной частью разработки сетевых приложений на .NET. Оно позволяет выполнять операции ввода-вывода и обмена данными асинхронно, не блокируя основной поток выполнения приложения. Это повышает отзывчивость и производительность приложения, особенно при работе с сетью. На платформе .NET для асинхронного программирования используются ключевые слова async и await, а также классы и методы из пространства имен System.Threading.Tasks. Разработчики могут использовать эти средства для создания асинхронных сетевых приложений.

Безопасность в сетевых приложениях

Безопасность является важным аспектом разработки сетевых приложений на .NET. Разработчики должны обеспечить защиту данных, аутентификацию пользователей, контроль доступа и другие меры безопасности. На платформе .NET предоставляются различные средства и технологии для обеспечения безопасности, такие как SSL/TLS для шифрования данных, аутентификация на основе сертификатов, управление правами доступа и другие. Разработчики должны учитывать требования безопасности при проектировании и реализации сетевых приложений.

Отладка и тестирование сетевых приложений

Отладка и тестирование являются неотъемлемой частью разработки сетевых приложений на .NET. Разработчики должны проверить правильность работы приложения, обнаружить и исправить ошибки, а также убедиться в его надежности и производительности. Для отладки и тестирования сетевых приложений на платформе .NET используются различные инструменты и техники, такие как отладчик Visual Studio, модульное тестирование, интеграционное тестирование и другие. Разработчики должны провести достаточное количество тестов, чтобы убедиться в качестве своего приложения перед его развертыванием и использованием.

Протоколы передачи данных

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

Основные протоколы передачи данных

Существует множество протоколов передачи данных, но некоторые из наиболее распространенных включают:

Протокол передачи гипертекста (HTTP)

HTTP – это протокол, который используется для передачи гипертекстовых документов в Интернете. Он определяет формат запросов и ответов между клиентом и сервером, а также способы обработки различных типов данных, таких как HTML, CSS, JavaScript и изображения.

Протокол передачи почты (SMTP)

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

Протокол передачи файлов (FTP)

FTP – это протокол, который используется для передачи файлов между клиентом и сервером. Он определяет команды и форматы данных для установления соединения, передачи файлов и управления файловой структурой на сервере.

Протокол передачи голоса по Интернету (VoIP)

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

Протоколы передачи данных в .NET

В платформе .NET существуют различные классы и библиотеки, которые облегчают работу с протоколами передачи данных. Например, классы System.Net.Http и System.Net.Sockets предоставляют функциональность для работы с HTTP и TCP/IP протоколами соответственно.

Для работы с протоколами передачи данных в .NET разработчики могут использовать следующие функции:

Установка соединения

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

Отправка и получение данных

После установки соединения разработчики могут использовать методы классов для отправки и получения данных. Например, класс HttpClient предоставляет методы для отправки HTTP-запросов и получения ответов, а класс TcpClient предоставляет методы для отправки и получения данных по TCP/IP протоколу.

Обработка ошибок и исключений

При работе с протоколами передачи данных важно учитывать возможные ошибки и исключения. Разработчики должны предусмотреть обработку ошибок, таких как потеря соединения, неверный формат данных или недоступность удаленного сервера. Для этого в .NET предусмотрены механизмы обработки исключений, такие как блок try-catch.

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

Создание сетевого соединения

Создание сетевого соединения – это процесс установления связи между клиентом и сервером для обмена данными. В .NET для создания сетевого соединения используются классы TcpClient и TcpListener.

Класс TcpClient

Класс TcpClient представляет клиентское соединение TCP/IP. Он позволяет установить соединение с удаленным сервером и обмениваться данными.

Для создания экземпляра класса TcpClient необходимо указать IP-адрес или доменное имя сервера и порт, на котором сервер прослушивает соединения. Например:

“`csharp
TcpClient client = new TcpClient(“1”, 8080);
“`

После создания экземпляра TcpClient можно использовать его методы для отправки и получения данных. Например, метод GetStream() возвращает объект NetworkStream, который предоставляет поток для чтения и записи данных.

“`csharp
NetworkStream stream = client.GetStream();
“`

После получения потока можно использовать его методы для отправки и получения данных. Например, метод Write() позволяет отправить данные на сервер, а метод Read() – получить данные от сервера.

“`csharp
byte[] data = Encoding.ASCII.GetBytes(“Hello, server!”);
stream.Write(data, 0, data.Length);

byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
“`

Класс TcpListener

Класс TcpListener представляет серверное соединение TCP/IP. Он позволяет прослушивать определенный порт и принимать входящие соединения от клиентов.

Для создания экземпляра класса TcpListener необходимо указать порт, на котором сервер будет прослушивать соединения. Например:

“`csharp
TcpListener server = new TcpListener(IPAddress.Any, 8080);
“`

После создания экземпляра TcpListener можно использовать его методы для прослушивания и принятия входящих соединений. Например, метод Start() запускает прослушивание порта, а метод AcceptTcpClient() блокирует выполнение программы до тех пор, пока не будет получено входящее соединение.

“`csharp
server.Start();
TcpClient client = server.AcceptTcpClient();
“`

После принятия клиентского соединения можно использовать объект TcpClient для обмена данными с клиентом, как описано выше.

После завершения работы с клиентом необходимо закрыть соединение. Для этого можно использовать методы Close() или Dispose().

“`csharp
client.Close();
server.Stop();
“`

Создание сетевого соединения является важной частью разработки сетевых приложений на платформе .NET. Правильное использование классов TcpClient и TcpListener позволяет создавать надежные и эффективные приложения, которые могут обмениваться данными с другими устройствами и серверами в сети.

Обмен данными между клиентом и сервером

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

Протоколы передачи данных

Протоколы передачи данных определяют правила и форматы, по которым данные передаются между клиентом и сервером. Некоторые из наиболее распространенных протоколов включают HTTP, TCP, UDP и WebSocket.

HTTP (Hypertext Transfer Protocol) – это протокол, используемый для передачи данных веб-страниц и других ресурсов через Интернет. Он основан на запросах и ответах между клиентом и сервером.

TCP (Transmission Control Protocol) – это протокол, который обеспечивает надежную и упорядоченную передачу данных между клиентом и сервером. Он используется для создания соединений и передачи потоков данных.

UDP (User Datagram Protocol) – это протокол, который обеспечивает ненадежную и неупорядоченную передачу данных между клиентом и сервером. Он используется для передачи данных в реальном времени, таких как видео и аудио.

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

Методы передачи данных

Существует несколько методов передачи данных между клиентом и сервером:

  • GET – используется для получения данных от сервера. Данные передаются в URL-адресе запроса.
  • POST – используется для отправки данных на сервер. Данные передаются в теле запроса.
  • PUT – используется для обновления данных на сервере. Данные передаются в теле запроса.
  • DELETE – используется для удаления данных на сервере. Данные передаются в теле запроса.

Кроме того, существуют и другие методы передачи данных, такие как PATCH, HEAD, OPTIONS и TRACE, которые имеют свои особенности и используются в определенных ситуациях.

Пример обмена данными между клиентом и сервером

Для обмена данными между клиентом и сервером в сетевых приложениях на платформе .NET можно использовать классы TcpClient и TcpListener.

Сначала необходимо создать экземпляр TcpListener и запустить прослушивание определенного порта:

“`csharp
TcpListener server = new TcpListener(IPAddress.Any, 1234);
server.Start();
“`

Затем можно использовать метод AcceptTcpClient() для принятия входящего соединения от клиента:

“`csharp
TcpClient client = server.AcceptTcpClient();
“`

После принятия соединения можно использовать объект TcpClient для обмена данными с клиентом. Например, для отправки данных на клиент можно использовать методы GetStream() и Write():

“`csharp
NetworkStream stream = client.GetStream();
byte[] data = Encoding.UTFGetBytes(“Hello, client!”);
stream.Write(data, 0, data.Length);
“`

Для чтения данных от клиента можно использовать методы Read() и ReadBytes():

“`csharp
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string message = Encoding.UTFGetString(buffer, 0, bytesRead);
Console.WriteLine(“Received message from client: ” + message);
“`

После завершения обмена данными необходимо закрыть соединение:

“`csharp
client.Close();
server.Stop();
“`

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

Обработка ошибок и исключений

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

Исключения в сетевых приложениях

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

  • SocketException – возникает при ошибке в работе сокетом, например, при невозможности установить соединение или при разрыве соединения.
  • IOException – возникает при ошибках ввода-вывода, например, при невозможности записать или прочитать данные.
  • InvalidOperationException – возникает при некорректном использовании методов и свойств объектов, например, при попытке отправить данные до установления соединения.

Обработка исключений

Для обработки исключений в сетевых приложениях можно использовать конструкцию try-catch. В блоке try размещается код, который может вызвать исключение, а в блоке catch указывается код, который будет выполнен в случае возникновения исключения. Пример обработки исключения SocketException:

“`csharp
try
{
// Код, который может вызвать исключение
client.Connect(“1”, 8080);
}
catch (SocketException ex)
{
// Код, который будет выполнен при возникновении исключения
Console.WriteLine(“Ошибка подключения: ” + ex.Message);
}
“`

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

“`csharp
try
{
// Код, который может вызвать исключение
client.Connect(“1”, 8080);
}
catch (SocketException ex)
{
// Код, который будет выполнен при возникновении исключения
Console.WriteLine(“Ошибка подключения: ” + ex.Message);
}
finally
{
// Код, который будет выполнен в любом случае
client.Close();
}
“`

Таким образом, обработка ошибок и исключений в сетевых приложениях позволяет предотвратить сбои в работе приложения и обеспечить его стабильность. Использование конструкции try-catch позволяет ловить исключения и выполнять соответствующие действия в случае их возникновения.

Асинхронное программирование в сетевых приложениях

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

Асинхронные методы

В .NET Framework асинхронное программирование осуществляется с помощью асинхронных методов. Асинхронный метод обозначается ключевым словом async и возвращает объект типа Task или Task<T>. Он может быть вызван с помощью ключевого слова await, которое указывает, что выполнение кода должно быть приостановлено до завершения асинхронной операции.

Пример асинхронного метода:

“`csharp
public async Task GetDataAsync()
{
// Асинхронная операция
string data = await GetDataFromServerAsync();

// Другие операции
// …

return data;
}
“`

В данном примере метод GetDataAsync выполняет асинхронную операцию получения данных с сервера. Ключевое слово await указывает, что выполнение метода должно быть приостановлено до завершения операции GetDataFromServerAsync. После завершения операции, выполнение метода продолжается.

Асинхронные события

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

Пример асинхронного события:

“`csharp
public event EventHandler DataReceived;

public async Task StartListeningAsync()
{
while (true)
{
// Асинхронное ожидание события
await Task.Delay(1000);

// Генерация события
DataReceived?.Invoke(this, new DataReceivedEventArgs());
}
}
“`

В данном примере метод StartListeningAsync асинхронно ожидает событие DataReceived с помощью метода Task.Delay. После наступления события, код внутри метода DataReceived?.Invoke выполняется.

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

Безопасность в сетевых приложениях

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

Аутентификация и авторизация

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

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

Авторизация – это процесс определения прав доступа пользователя к определенным ресурсам или функциональности приложения. После успешной аутентификации сервер проверяет права пользователя и разрешает или запрещает доступ к определенным функциям или данным.

Шифрование данных

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

Для шифрования данных в сетевых приложениях часто используются алгоритмы шифрования, такие как AES (Advanced Encryption Standard) или RSA (Rivest-Shamir-Adleman). Ключи шифрования должны быть хранены в безопасном месте и передаваться только по защищенным каналам связи.

Защита от атак

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

  • Валидация входных данных: проверка и фильтрация входных данных, чтобы предотвратить внедрение вредоносного кода.
  • Использование параметризованных запросов: использование параметров в SQL-запросах, чтобы предотвратить SQL-инъекции.
  • Ограничение прав доступа: предоставление пользователю только необходимых прав доступа к ресурсам и функциональности приложения.
  • Мониторинг и журналирование: отслеживание и регистрация событий, чтобы обнаружить и предотвратить атаки.

Важно также регулярно обновлять и патчить приложение, чтобы исправить уязвимости и обеспечить его безопасность.

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

Отладка и тестирование сетевых приложений

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

Отладка сетевых приложений

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

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

Тестирование сетевых приложений

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

  • Модульное тестирование: тестирование отдельных модулей приложения для проверки их правильной работы. Модульное тестирование позволяет выявить ошибки на ранних этапах разработки и обеспечить надежность кода.
  • Интеграционное тестирование: тестирование взаимодействия различных компонентов приложения для проверки их совместной работы. Интеграционное тестирование помогает выявить ошибки, которые могут возникнуть при взаимодействии сетевых компонентов.
  • Функциональное тестирование: тестирование функциональности приложения для проверки его соответствия требованиям и ожиданиям пользователей. Функциональное тестирование включает в себя проверку различных сценариев использования приложения.
  • Нагрузочное тестирование: тестирование производительности приложения при высоких нагрузках для проверки его стабильности и отзывчивости. Нагрузочное тестирование помогает выявить узкие места и оптимизировать производительность приложения.
  • Безопасность: тестирование безопасности приложения для проверки его устойчивости к атакам и утечкам данных. Тестирование безопасности включает в себя проверку уязвимостей и применение различных методов атаки.

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

Таблица по теме “Основы программирования сетевых приложений на .NET”

Тема Описание
Протоколы передачи данных Изучение различных протоколов, таких как TCP, UDP, HTTP, FTP, и их особенностей в передаче данных
Создание сетевого соединения Описание процесса установки соединения между клиентом и сервером, включая использование сокетов и IP-адресов
Обмен данными между клиентом и сервером Изучение методов передачи данных между клиентом и сервером, включая отправку и получение сообщений
Обработка ошибок и исключений Описание методов обработки ошибок и исключений при работе с сетевыми приложениями, включая обработку исключений сетевых соединений
Асинхронное программирование в сетевых приложениях Изучение принципов асинхронного программирования и его применение в сетевых приложениях для повышения производительности
Безопасность в сетевых приложениях Описание методов обеспечения безопасности в сетевых приложениях, включая шифрование данных и аутентификацию пользователей
Отладка и тестирование сетевых приложений Изучение методов отладки и тестирования сетевых приложений для обнаружения и исправления ошибок

Заключение

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

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

Нашли ошибку? Выделите текст и нажмите CTRL + Enter
Аватар
Филипп Х.
Редактор.
Копирайтер, коммерческий автор, писатель, сценарист и автор-универсал в широком смысле.

Средняя оценка 0 / 5. Количество оценок: 0

Поставьте вашу оценку

Сожалеем, что вы поставили низкую оценку!

Позвольте нам стать лучше!

Расскажите, как нам стать лучше?

93
Закажите помощь с работой

Не отобразилась форма расчета стоимости? Переходи по ссылке

Не отобразилась форма расчета стоимости? Переходи по ссылке

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

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