Содержание
- 1 Номер Socket на самой материнской плате
- 2 Основы сокетов
- 3 Класс Socket
- 4 Назначение материнской платы
- 5 Наилучшие варианты
- 6 Пример использования локальных сокетов
- 7 Сокеты AMD
- 8 Сокет: что это такое, его значение для функционирования ПК
- 9 socket()¶
- 10 Типы розеток
- 11 Как узнать сокет материнской платы
- 12 Программы для распознавания
- 13 Характеристики сокетов Intel и AMD
- 14 Чтение/запись данных
Номер Socket на самой материнской плате
Основы сокетов
При создании сокета, необходимо определить три параметра: стиль взаимодействия,
пространство имен, и пртокол. Стиль взаимодействия контролирует, как сокет
обрабатывает передаваемые данные, и определяет количество партнеров взаимодействия.
Через сокеты данные передаются блоками (пакетами). Стиль взаимодействия определяет,
как эти пакеты будут обработаны и как они передаются от отправителя к получателю.
- Стили соединения гарантируют доставку всех пакетов в том порядке, в каком они были
отправлены. Если во время передачи пакеты были потеряны или доставлены в
неправильном порядке, получатель автоматически отправляет запрос на их
повторную передачу. Стиль соединения напоминает телефонный звонок: адреса
отправителя и получателя фиксируются в начале соединения, при установке подключения. - Стили датаграм не гарантирует доставки и правильного порядка прибытия. Пакеты могут быть
потеряны или переупорядочены в пути из-за сетевых ошибок. Каждый пакет должен быть помечен
его адресатом, и нет гарантии, что он будет доставлен. Система гарантирует только
«максимальные усилия», поэтому пакеты могут исчезнуть или прибыть в различном
порядке. Сокет стиля датаграмы ведет себя сходно с почтой. Отправитель определяет
адрес получателя для каждого индивидуального сообщения.
Пространство имен определяет, как записаны адреса сокета ( socket
addresses ). Адрес сокета идентифицирует один конец подключения сокета. Например,
адреса сокета в локальном пространстве имен являются обычными именами файлов. В
пространстве имен Интернет адрес сокета состоит из Интернет адреса (
IP адрес) главного компьютера, присоединенного к сети и номера порта, который
идентифицирует сокет среди множества сокетов на том же главном компьютере.
Протокол определяет, как передаются данные. Существуют следующие виды протоколов:
TCP/IP , первичные сетевые протоколы, используемые
Интернетом; сетевой протокол AppleTalk ; локальный
UNIX протокол взаимодействия. Не все комбинации стилей,
пространств имен и протоколов поддерживаются.
Системные вызовы
Виды системных вызовов:
- socket — создать сокет
- closes — уничтожить сокет
- connect — создать соединение между двумя сокетами
- bind — привязать сокет к порту сервера
- listen — настройка сокета для принятия подключений
- accept — принять запрос на соединение и создать сокет
для процесса взаимодействия
Сокеты представляются дескрипторами файлов.
Создание и уничтожение сокетов
С помощью функций socket и close
создаются и уничтожаются сокеты. При создании сокета, необходимо определить три параметра
сокета: пространство имен, стиль взаимодействия и протокол.
Для указания пространства имен
используются константы, начинающиеся с PF_ (сокращение «семейство
протокола»). Например, PF_LOCAL или PF_UNIX
определяют локальное пространство имен, и PF_INET
определяет Интернет пространство имен.
Второй параметр, стиль взаимодействия, представляет
собой константу, начинающиюся с SOCK_ .
SOCK_STREAM опеределяет стиль взаимодейтсвия соединение, SOCK_DGRAM
— стиль датаграмы.
Третий параметр, протокол, определяет механизм нижнего уровня для передачи и получения данных.
Для каждой комбинации пространство имен — стиль взаимоделйствия существует свой протокол.
Для каждой пары существует лучший протокол, поэтому можно указать 0, что соответсвует этому
протоколу. Если команда socket выполнена успешно, в качестве
результата возвращается дескриптор файла для сокета. С помощью команд
read и write , можно читать и записывать данные в сокет.
Вызов connect
Для создания соединение между двумя сокетами, клиент вызывает connect
, передавая адрес сокета сервера для подключения. Клиент — процесс, инициализирующий
соединение, а сервер — процесс, ожидающий разрешения соединения. Клиент посылает запрос
connect , чтобы инициализировать соединение между локальным
сокетом и сокетом сервера, переданным в качестве второго параметра. В качестве третьего
параметра передается длина, в байтах, адресной структуры, на которую указывает второй параметр.
Отправка данных
Любая техника записи в дескриптор файла, может использоваться при записи в сокет.
Функция send , определенная для дескрипторов файлов сокета,
аналогична функции write с несколькими дополнительными
параметрами.
Класс Socket
Класс Socket играет важную роль в сетевом программировании, обеспечивая функционирование как клиента, так и сервера. Главным образом, вызовы методов этого класса выполняют необходимые проверки, связанные с безопасностью, в том числе проверяют разрешения системы безопасности, после чего они переправляются к аналогам этих методов в Windows Sockets API.
Прежде чем обращаться к примеру использования класса Socket, рассмотрим некоторые важные свойства и методы этого класса:
Свойство или метод | Описание |
---|---|
AddressFamily | Дает семейство адресов сокета — значение из перечисления Socket.AddressFamily. |
Available | Возвращает объем доступных для чтения данных. |
Blocking | Дает или устанавливает значение, показывающее, находится ли сокет в блокирующем режиме. |
Connected | Возвращает значение, информирующее, соединен ли сокет с удаленным хостом. |
LocalEndPoint | Дает локальную конечную точку. |
ProtocolType | Дает тип протокола сокета. |
RemoteEndPoint | Дает удаленную конечную точку сокета. |
SocketType | Дает тип сокета. |
Accept() | Создает новый сокет для обработки входящего запроса на соединение. |
Bind() | Связывает сокет с локальной конечной точкой для ожидания входящих запросов на соединение. |
Close() | Заставляет сокет закрыться. |
Connect() | Устанавливает соединение с удаленным хостом. |
GetSocketOption() | Возвращает значение SocketOption. |
IOControl() | Устанавливает для сокета низкоуровневые режимы работы. Этот метод обеспечивает низкоуровневый доступ к лежащему в основе классу Socket. |
Listen() | Помещает сокет в режим прослушивания (ожидания). Этот метод предназначен только для серверных приложений. |
Receive() | Получает данные от соединенного сокета. |
Poll() | Определяет статус сокета. |
Select() | Проверяет статус одного или нескольких сокетов. |
Send() | Отправляет данные соединенному сокету. |
SetSocketOption() | Устанавливает опцию сокета. |
Shutdown() | Запрещает операции отправки и получения данных на сокете. |
Назначение материнской платы
Для большей наглядности, мы начнем с перечисления всех основных функций системной платы:
- Соединяет между собой все компоненты компьютера.
- Материнская плата создает между: мышкой, клавиатурой, дисплеем и другими компонентами – единую работоспособную систему.
- Она направляет процессор, чтобы тот форсировал и контролировал работу всех остальных компонентов ПК.
- Также он поддерживает связь между ними. Также материнская плата может отвечать за передачу картинки на дисплей, если она имеет встроенный графический адаптер.
- Материнская плата отвечает за звук компьютера. Как следствие, в нее встроена звуковая карта, многие модели располагаю ими.
- Также в современных версиях часто имеется встроенный сетевой адаптер. Поэтому она может отвечать за непосредственный выход в интернет.
Наилучшие варианты
Как уже было сказано, ответить на вопрос однозначно, какой сокет лучше для ПК, практически невозможно, так как всё зависит от критерия, для чего собирается устройство
Если потребителю нужен агрегат исключительно для выполнения офисных задач, несложных программ, тогда стоит обратить внимание на модель LGA 1150 от Intel или варианты AM1, FM2 и FM2+ от разработчика AMD. Каждая из этих моделей разъёмов будет превосходно справляться с несложными офисными задачами, не требующими сложных графических решений, санкционирует работу в интернете, позволяет просматривать видео, даже эксплуатировать простые игры, но не больше
Сокеты этого класса уже начинают уходить из рынка, так как их пик популярности давно прошёл – эти модели невозможно в дальнейшем усовершенствовать, что при желании модернизировать компьютер повлечёт потребность в покупке новой материнской платы с новым советом для нового процессора. Единственным преимуществом этих моделей является цена, которая относится к категории бюджетных, в сравнении со следующими деталями, предназначенными для сборки мощных и производительных компьютеров.
Получше по критериям и техническим возможностям будет модель сокета Intel LGA 1151 и Intel LGA 1151 v2. Эти разъёмы находится на данный момент на пике популярности, считаются наиболее востребованным на рынке компьютерных деталей, сочетают отличное качество, доступную цену и возможность сборки на этом разъёме довольно производительного компьютерного устройства. Хорошая репутация и у модели AM3+ из средней ценовой категории. На его базе можно собрать мощный агрегат с процессором AMD, подходящий для решения не только базовых задач, но и для игр современной категории. В этом случае всё зависит от технических показателей процессора, который будет установлен в комплекте
Если потребителя интересуют не бюджетные решения вопроса, какой сокет лучше, позволяющие на несколько лет забыть о потребности модернизации своего компьютера, тогда ему стоит обратить внимание LGA 1151 v2 от Intel и AM4 для AMD. Эти сокеты позиционируются как лучшие в нынешнее время варианты для сборки профессионального или игрового компьютера
Пример использования локальных сокетов
В листинге 5.10 представлена программа сервера, в которой создается локальный сокет
и слушает запросы на соединения с сервером. При получении запроса на соединение,
сервер читает текстовые сообщения, передаваемые через соединение и печатает их.
Если одно из этих сообщений — «выход», программа сервера удаляет сокет и завершается.
Программа socket-server предполагает, что путь к сокету передается через параметр
командной строки.
Листинг 5.10 (socket-server.c)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> /* Чтение текста из сокета и вывод его на печать. Продолжение цикла до закрытия сокета. * В качестве результата возвратит не ноль, если клиент передал сообщение "quit", иначе 0 */ int server (int client_socket) { while (1) { int length; char* text; /* Сначала из сокета прочитать длину текстого сообщения. Если в качестве результата возвратиться 0, то клиент закрыл соединение */ if (read (client_socket, &ength, sizeof (length)) == 0) return 0; /* выделить место в буфере для хранения текста */ text = (char*) malloc (length); /* Чтение текста и распечатка */ read (client_socket, text, length); printf ("%s\n", text); /* Освободить буфер */ free (text); /* Если от клиента поступило сообщение "quit", завершить работу */ if (!strcmp (text, "quit")) return 1; } } int main (int argc, char* const argv[]) { const char* const socket_name = argv; int socket_fd; struct sockaddr_un name; int client_sent_quit_message; /* Создать сокет */ socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); /* Определить что это сервер */ name.sun_family = AF_LOCAL; strcpy (name.sun_path, socket_name); bind (socket_fd, &name, SUN_LEN (&name)); /* Слушать (ожидать) соединения */ listen (socket_fd, 5); /* Неоднократно принимать соединения, создавая для каждого клиента server(). Продолжать до получения от клиента сообщения "quit" */ do { struct sockaddr_un client_name; socklen_t client_name_len; int client_socket_fd; /* Принимать соединение */ client_socket_fd = accept (socket_fd, &client_name, &client_name_len); client_sent_quit_message = server (client_socket_fd); /* Закрыть соединение с нашей стороны */ close (client_socket_fd); } while (!client_sent_quit_message); /* Удалить файл сокета */ close (socket_fd); unlink (socket_name); return 0; }
Клиент-программа, представленная в листинге 5.11, соединяется с локальным сокетом
и посылает сообщения. Путь к сокету и сообщения передаtтся через командную строку.
Листинг 5.11(socket-client.c)
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> /* Записать TEXT в сокет, переданный дескриптором файла SOCKET_FD */ void write_text (int socket_fd, const char* text) { /* Записать в строку количество байт, включая NUL-терминал */ int length = strlen (text) + 1; write (socket_fd, &length, sizeof (length)); /* Записать строку */ write (socket_fd, text, length); } int main (int argc, char* const argv[]) { const char* const socket_name = argv; const char* const message = argv; int socket_fd; struct sockaddr_un name; /* Создать сокет */ socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0); /* Сохранить имя сервера в адресе сокета */ name.sun_family = AF_LOCAL; strcpy (name.sun_path, socket_name); /* Соединиться с сокетом */ connect (socket_fd, &name, SUN_LEN (&name)); /* Записать текст командной строки в сокет */ write_text (socket_fd, message); close (socket_fd); return 0; }
Перед передачей сообщения, посылается размер сообщения в байтах в качестве переменной length.
Сервер сохраняет размер сообщения, для выделения памяти под сообщение. Чтобы выполнить этот
пример, необходимо запустить сервер-программу в одном окне, определить путь к сокету.
Например, /tmp/socket .
% ./socket-server /tmp/socket
В другом окне запустить клиент-программу несколько раз, опеределяя один и тот же путь
сокета и посылая клиенту сообщение:
% ./socket-client /tmp/socket "Hello, world." % ./socket-client /tmp/socket "This is a test."
Сервер-программа получает и печатает эти сообщения. Для закрытия соединения,
клиент посылает сообщение «quit»:
% ./socket-client /tmp/socket "quit"
Сервер-программа завершена.
Сокеты AMD
Политика компании AMD, в этом плане более консервативна. Несколько сокетов имеют совместимость благодаря сериям с «+». К примеру, Socket AM2 совместим с AM2+, что дает более широкие возможности для апгрейда, но вместе с этим, это немного неприятное топтание на одном месте, что не позволительно для IT- сферы.
Некоторые примеры сокетов AMD:
Socket (сокет AM3 и AM3+) – можно сказать сокет и его модификация, по спецификациям они совместимы между собой, разрабатывались под процессоры FX, Phenom II, Athlon II. Сокет для наиболее мощных Bulldozer (FX) среди лагеря AMD, которые не оправдали надежды, но упав в цене стали более интересным приложением, с точки зрения неплохой производительности за низкую цену. Сокеты AM3 и AM3+, сейчас являются наиболее ходовыми, на них комплектуется большинство как дешевых, так и более дорогих систем. То есть можем смело констатировать практичность данных сокетов.
Socket (сокет AM2 и AM2+) – сокеты для процессоров Phenom, Athlon, Sempron. Также, полностью совместимы. На сегодняшний день можно считать немного устаревшими, хотя еще активно работает масса систем построенных на основе данных сокетов.
Socket (сокет FM1 и FM2) – сокеты FM создавались под процессоры серии AMD Fusion, которые отличаются очень мощной интегрированной графикой. На данный сокет и совместимые с ним процессоры, следует ориентироваться тем, кто не желает тратиться на дискретную видеокарту и будет довольствоваться интегрированной графикой.
Вот мы и рассмотрели, в довольно подробном виде, понятие сокета и основные сокеты процессоров intel и amd. Рекомендую ознакомиться с другими статьями на сайте, где описаны другие характеристики процессоров.
blog comments powered by DISQUS
Сокет: что это такое, его значение для функционирования ПК
Большинство потребителей при подборе нового компьютера или модернизации старой модели ориентируются на мощные технические параметры процессора, количество ядер, тактовую частоту, что по умолчанию должно предопределять критерии функциональности ПК. Эта позиция является правильной, однако не стопроцентно. Если разобраться в технической стороне работы компьютера, то покупателю устройства придётся столкнуться с фразами «материнская плата» и «сокет». Что такое материнская плата, большинство людей знают или имеют приблизительное представление о её значении для агрегата, однако понятие «сокет» для многих является неизвестным
Слово «сокет» относится к компьютерной области терминологии, деталь выступает важной составляющей ПК. С практической стороны, сокет является разъёмом, устанавливающимся на системную плату, в который вставляется процессор
Сокеты, как и другие компоненты системы, имеют разные характеристики, отличаются предназначеными для работы с определёнными процессорами.
При подборе комплектующих для ПК важно учитывать не только критерии процессора, но и характеристики сокета, устанавливающегося на материнскую плату. Одни уже устарели технически, другие отличаются прекрасными показателями с перспективными возможностями дальнейшего обновления компьютера и подходят для новейших процессоров
Современный рынок предлагает множество разновидностей этого элемента системы. Визуально деталь представляет собой прямоугольную платформу с контактами и фиксатором, на который устанавливается процессор, а также специальными отверстиями для крепления охладительных элементов.
socket()¶
См.также
- http://unixhelp.ed.ac.uk/CGI/man-cgi?socket+2
Создаёт конечную точку соединения и возвращает файловый дескриптор.
Принимает три аргумента:
-
domain указывающий семейство протоколов создаваемого сокета
- AF_INET для сетевого протокола IPv4
- AF_INET6 для IPv6
- AF_UNIX для локальных сокетов (используя файл)
-
type
-
SOCK_STREAM (надёжная потокоориентированная служба (сервис) или
потоковый сокет) -
SOCK_DGRAM (служба датаграмм или датаграммный
сокет) - SOCK_RAW (Сырой сокет — сырой протокол поверх сетевого уровня).
-
SOCK_STREAM (надёжная потокоориентированная служба (сервис) или
-
protocol
Протоколы обозначаются символьными константами с префиксом IPPROTO_*
(например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение
protocol=0 (протокол не указан), в этом случае используется значение по
умолчанию для данного вида соединений.
Примечание
Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число,
представляющее присвоенный дескриптор.
Пример на Си
#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> void error(const char *msg) { perror(msg); exit(); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv]); exit(); } // Задаем номер порта portno = atoi(argv2]); // Создаем сокет sockfd = socket(AF_INET, SOCK_STREAM, ); if (sockfd < ) error("ERROR opening socket"); // Конвертирует имя хоста в IP адрес server = gethostbyname(argv1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(); } // Указываем тип сокета Интернет bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; // Указаваем адрес IP сокета bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); // Указываем порт сокета serv_addr.sin_port = htons(portno); // Устанавливаем соединение if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < ) error("ERROR connecting"); // Вводим сообщение из консоли printf("Please enter the message: "); bzero(buffer, 256); fgets(buffer, 255, stdin); // Отправляем данные n = write(sockfd, buffer, strlen(buffer)); if (n < ) error("ERROR writing to socket"); // Сбрасываем буфер bzero(buffer, 256); // Читаем ответ n = read(sockfd, buffer, 255); if (n < ) error("ERROR reading from socket"); printf("%s\n", buffer); close(sockfd); return ; }
Пример на Python
Типы розеток
Ниже перечислены различные типы розеток:
Розетки датаграммы
Это тип сетевой розетки, которая обеспечивает точку без подключения для отправки и получения пакетов данных. Каждый пакет, отправляемый из гнезда датаграммы, маршрутизируется и доставляется по отдельности. Он также может использоваться для отправки и получения широковещательных сообщений.
Сырьевые розетки
Это гнездо позволяет получить доступ к базовому поставщику транспортных услуг. Они могут предоставить пользователям доступ к основным протоколам связи, поддерживающим абстракции сокетов. Обычно они ориентированы на датаграммы, хотя их точные характеристики зависят от интерфейса, предоставляемого протоколом. Они не предназначены для общего пользования, но предназначены в основном для тех, кто заинтересован в разработке новых коммуникационных протоколов или для получения доступа к некоторым уже существующим загадочным средствам протоколов.
Последовательные розетки пакетов Гнезда
Это похоже на сокет потока, за исключением того, что границы записи сохраняются. Этот тип сокета позволяет пользователям управлять протоколом последовательностей пакетов (SPP) или заголовками протокола интернет-протокола датаграмм (IDP) в пакете или даже группе пакетов. Этот сокет также позволяет пользователю получать заголовки входящих пакетов.
Розетки для ручьев
Этот тип сокета полагается на TCP для передачи данных. Если доставка данных невозможна, отправитель получит сообщение о том, что соединение привело к ошибке. Записи данных не имеют границ. Этот разъем обеспечивает ориентированный на подключение, последовательный и уникальный поток данных без границ записи, с четко определенными механизмами для создания и/или разрушения соединений и обнаружения ошибок. Он передает надежные данные в порядке и без использования внеполосных возможностей.
Предполагается, что процессы взаимодействуют только между розетками одного типа, но нет никаких ограничений, препятствующих взаимодействию между этими розетками разных типов.
Активное гнездо
Это разъемное соединение с активными удаленными разъемами через открытое соединение для передачи данных. Если это соединение будет закрыто, активные розетки в каждой точке также будут разрушены. Используется клиентами, которые хотят инициировать запросы на подключение для подключения. Однако, это активное гнездо также может быть преобразовано в пассивное гнездо путем привязки имени к гнезду с помощью bind-macro и путем указания готовности принимать соединения с микрофоном listen-macro.
Пассивная розетка
Эта розетка не подключена, а ждет входящего соединения, которое вызовет новую активную розетку. Используется серверами для того, чтобы принимать запросы на соединение с микрофоном Connect-macro. Эта пассивная розетка не может использоваться для инициирования запросов на подключение.
Понятия активных и пассивных сокетов для потоковых сокетов не применимы к другим типам сокетов, таким как сокеты датаграммы.
Порты и розетки
Гнездо — это интерфейс для отправки и получения данных по определенному порту, в то время как порт представляет собой числовое значение, назначенное определенному процессу или приложению в устройстве. Даже при наличии тесной связи между гнездом и портом, гнездо на самом деле не является портом. Каждый порт может иметь одну пассивную розетку, ожидающую входящие соединения, и несколько активных розеток, каждая из которых соответствует открытому соединению в порту. В настоящее время розетка делает общение более простым и эффективным. Это позволяет установить связь между двумя разными процессами на одном и том же или разных машинах. Проще говоря, это способ общения с другим компьютером.
Термин «розетка» начал употребляться с 1971 года, когда он использовался при разработке ARPANET. Большинство розеток, реализуемых сегодня, основаны на розетках Беркерли, которые были разработаны в 1983 году. Однако розетки, используемые для подключения к Интернету, созданы по образцу моделей Winsock, которые были сделаны в 1991 году. Гнезда Беркерли также известны как гнезда BSD. В 1989 году Berkerley выпустила версии своей операционной системы и сетевой библиотеки, свободные от лицензионных ограничений. Другие ранние версии были написаны для TOPS-20, MVS, VM и IBM-DOS.
Как узнать сокет материнской платы
Программы для распознавания
Характеристики сокетов Intel и AMD
Чтение/запись данных
Для операций чтения-записи данных через сокеты могут применяться стандартные вызовы read() и write(), однако существуют и более специализированные вызовы:
Все вызовы применимы и к потоковым сокетам и к сокетам датаграмм. При попытке прочитать датаграмму в слишком маленький буфер, её хвост будет утерян.
write(fd,buf,size) == send(fd,buf,size,0) == sendto(fd,buf,size,0,NULL,0)
send() может применяться только к тем сокетам, для которых выполнен connect().
При использовании sendto() с потоковым сокетом адрес toaddr игнорируется если был выполнен connect(). Если же connect() не был выполнен — в errno возвращается ошибка ENOTCONN.
sendmsg() и recvmsg() близки к вызовам writev() и readv(), поскольку позволяют одним вызовом отправить/принять несколько буферов данных.
Флаги send():
- MSG_DONTWAIT — неблокирующая отправка. В случае невозможности отправить порцию данных возвращается -1, а переменная errno выставляется в EAGAIN.
- MSG_OOB — отправка внеочередных данных (out-of-band) если они поддерживаются протоколом
Флаги recv():
- MSG_DONTWAIT — неблокирующее чтение
- MSG_OOB — приём внеочередных данных
- MSG_PEEK — «подглядывание» — чтение данных без удаления их из канала