Работа с сокетами.
Содержание
- Сетевые модели
- Сетевая модель OSI
- Cтек протоколов TCP/IP
- Программный интерфейс сокет
- Клиент на socket
- Задачи
- RSA
- Шифрование и расшифрование
- Алгоритм шифрования:
- Алгоритм расшифрования:
Сетевая модель OSI
Эталонная модель взаимодействия открытых систем описывает уровни сетевого взаимодействия между компьютерами. Данная модель подразумевает семь уровней взаимодействия.
- Прикладной
- Представления
- Сеансовый
- Транспортный
- Сетевой
- Канальный
- Физический
Самый низкий уровень взаимодействия — передача информации (битов) между устройствами через сетевые кабеля, радиоканал и пр.
Канальный уровень — подразумевает работу с кадрами (frame) обеспечивая взаимодействие на физическом уровне и контроль ошибок.
Сетевой уровень предназначен для определения пути передачи данных. Отвечает за трансляцию логических адресов и имён в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию, отслеживание неполадок и «заторов» в сети. К этому уровню относяться такие протоколы, как IP, RIP и пр.
Транспортный уровень модели предназначен для обеспечения надёжной передачи данных от отправителя к получателю. К данному уровню относятся протоколы как TCP, UDP.
Сеансовый уровень модели обеспечивает поддержание сеанса связи, позволяя приложениям взаимодействовать между собой длительное время. Уровень управляет созданием/завершением сеанса, обменом информацией, синхронизацией задач, определением права на передачу данных и поддержанием сеанса в периоды неактивности приложений. Сюда относяться протоколы PPTP, SOCKS и пр.
Уровень представления обеспечивает преобразование протоколов и кодирование/декодирование данных. Запросы приложений, полученные с прикладного уровня, на уровне представления преобразуются в формат для передачи по сети, а полученные из сети данные преобразуются в формат приложений. На этом уровне может осуществляться сжатие/распаковка или шифрование/дешифрование, а также перенаправление запросов другому сетевому ресурсу, если они не могут быть обработаны локально.
Прикладной уровень — верхний уровень модели, обеспечивающий взаимодействие пользовательских приложений с сетью. К этому уровню относяться такие протоколы, как HTTP, FTP и пр.
Данная выше модель — эталонная. Реальная же модель, на которой работает современный интернет — стек протоколов TCP/IP
Cтек протоколов TCP/IP
Модель OSI являеться эталонной, в то время, как реально в сетях применяеться TCP/IP, который выглядит следующим образом:
- Прикладной уровень (Application Layer)
HTTP
; - Транспортный уровень (Transport Layer)
TCP
; - Межсетевой уровень (Сетевой уровень) (Internet Layer)
IP
; - Канальный уровень (Network Access Layer)
Ethernet
. - Физический (непосредственно не относится к TCP/IP)
Сокет — программный интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.
Сокеты бывают клиентские и серверные. Клиентские можно сравнить с конечными аппаратами телефонной сети, а серверные — с коммутаторами. Клиентское приложение (например, браузер) использует только клиентские сокеты, а серверное (например, веб-сервер, которому браузер посылает запросы) — как клиентские, так и серверные сокеты.
Программный интерфейс сокетов в той или иной мере поддерживается всеми современными операционными системами.
Для взаимодействия между машинами с помощью стека протоколов TCP/IP используются адреса и порты. Адрес представляет собой 32-битную структуру для протокола IPv4, 128-битную для IPv6. Номер порта — целое число в диапазоне от 0 до 65535 (для протокола TCP).
Эта пара определяет сокет («гнездо», соответствующее адресу и порту).
В процессе обмена, как правило, используется два сокета — сокет отправителя и сокет получателя. Например, при обращении к серверу на HTTP-порт сокет будет выглядеть так: 194.106.118.30:80, а ответ будет поступать на mmm.nnn.ppp.qqq: xxxxx.
Каждый процесс может создать «слушающий» сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024).
Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т. д.
Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него. Сокеты типа INET доступны из сети и требуют выделения номера порта.
Обычно клиент явно «подсоединяется» к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.
Для работы с сокетами необходимо:
- Подключить
socket
; - Создать сокет
- Присоединиться к серверу (для этого необходимо знать адрес сервера и номер порта, к которому Вы присоединяетесь)
- Отправить сообщение. Сообщение должно быть битовым: можно получить из строки при помощи метода
encode
- Получить ответ
import socket # Подключаем sock = socket.socket() # Создаём sock.connect(("<address>", "<port>")) # Присоединяемся sock.send("some text data".encode()) # Отправка data = sock.recv(<data length in bytes>) # Ответ data = data.decode("utf8") # раскодируем сообщение в строку
Подсоединитесь к серверу 81.
на порт — 9000. После того как вы присоединитесь — начинайте общение с сервером:
Cервер отправляет вопрос
Вы отправляете ответ
Cервер отправляет вопрос
Вы отправляете ответ
…
Имя первой задачи — Register
P.S. Для упрощения работы с сервером целесообразно обработку входящих сообщений вынести в отдельный поток, поскольку сервер периодически будет отправлять сразу по несколько запросов.
Например, отдельной нитью (Thread) можно запустить следующую функцию
def listener(sock): while sock.fileno() != -1: data = sock.recv(1000) if len(data) > 0: print(data.decode())
RSA
RSA — криптографический алгоритм с открытым ключом пригодный и для шифрования и цифровой подписи. Используется в большом числе криптографических приложений, включая TLS/SSL, который и шифрует HTTP соединение, «превращая» его в HTTPS.
Криптографические системы с открытым ключом используют так называемые односторонние функции, которые обладают следующим свойством:
- если известно x, то f(x) вычислить относительно просто;
- если известно y = f(x), то для вычисления x нет простого (эффективного) пути.
Под односторонностью понимается не теоретическая однонаправленность, а практическая невозможность вычислить обратное значение, используя современные вычислительные средства, за обозримый интервал времени.
Шифрование и расшифрование
Предположим, Боб хочет послать Алисе сообщение m.
Сообщениями являются целые числа в интервале от 0 до n-1
, т.е m ∈ Zn.
Алгоритм шифрования:
- Взять открытый ключ (e, n) Алисы
- Взять открытый текст m
- Зашифровать сообщение с использованием открытого ключа Алисы: c = E
Алгоритм расшифрования:
- Принять зашифрованное сообщение {displaystyle c} c
- Взять свой закрытый ключ {displaystyle (d,n)} (d,n)
- Применить закрытый ключ для расшифрования сообщения: m = D(c) = cd\modn
- Данная схема на практике не используется по причине того, что она не является практически надёжной (semantically secured). Действительно, односторонняя функция E(m) является детерминированной — при одних и тех же значениях входных параметров (ключа и сообщения) выдаёт одинаковый результат. Это значит, что не выполняется необходимое условие практической (семантической) надёжности шифра.
Наиболее используемым в настоящее время является смешанный алгоритм шифрования, в котором сначала шифруется сеансовый ключ, а потом уже с его помощью участники шифруют свои сообщения симметричными системами. После завершения сеанса сеансовый ключ, как правило, уничтожается.
Как исправить ошибку «Работа с сокетами: Ошибка! Не работает.»
Почему появляется ошибка?
Ошибка появляется в случае, если сайт не может подключиться к себе же, используя сокеты.
Причины возникновения проблемы могут быть самые разные, приведем наиболее часто встречающиеся:
- сайт был недавно перенесен на новый сервер, у него были изменены NS-сервера, но они еще в стадии обновления.
- текущий сайт является копией сайта и работает на стороннем сервере под основным доменом, для обеспечения работоспособности в файле hosts прописан IP нового сервера,
- в /etc/hosts (для Linux) или C:\Windows\System32\drivers\etc\hosts (для Windows) прописан некорректный IP-адрес для текущего хоста.
- другие проблемы, касающиеся DNS,
- проблема с http-авторизацией,
- некорректные редиректы на сервере,
- у вас локальный сайт, который недоступен извне,
- проблема с SSL-сертификатом.
Более точно причину можно понять, посмотрев лог проверки сайта — он находится в папке /bitrix/ и имеет формат имени site_checker_*.log.
На что эта ошибка влияет?
Если проверка на работу сокетов не проходит, то другие тесты также не могут быть выполнены: «Замечание. Не удалось проверить из-за ошибки в работе с сокетами».
При этом, в большинстве случаев сайт продолжает нормально работать.
Как исправить ошибку?
Способ решения в полной мере зависит от причины.
Опишем так же по пунктам:
- в случае недавнего переезда сайта на новый сервер достаточно просто подождать, процесс обновления DNS обычно занимает несколько часов, но может занять до нескольких дней, этот процесс зависит от разных факторов,
- в данном случае необходимо в файле hosts прописать правило для домена, обычно это делается в той же строке, где и localhost — добавить домен сайта в конце строки,
- в этом случае нужно просто убрать некорректную запись из hosts,
- в случае других проблем с DNS необходимо более детально изучать вопрос и обращаться к специалистам,
- необходимо корректно сконфигурировать сервер (в т.ч. файл .htaccess),
- необходимо корректно настроить редиректы, также учитывая порт подключения,
- решение такое же как в пункте 2 — необходимо отредактировать hosts, добавив имя текущего домена,
- проверьте корректность установки SSL-сертификата.
Требуется наша помощь?
Мы имеем огромный опыт, на протяжении 10 лет помогая клиентам в решении самых различных проблем на их сайтах.
Поэтому, если Вы не имеете возможности решить эту проблему самостоятельно, обращайтесь к нам — мы все сделаем оперативно и квалифицированно.
Задать вопрос специалисту
как работает прослушивание сокета
спросил
Изменено 2 года назад
Просмотрено 27 тысяч раз
Если клиент прослушивает сокет, например, на http://socketplaceonnet.com, как он узнает, что есть новый контент? Я предполагаю, что сервер не может отправлять данные напрямую клиенту, так как клиент может находиться за маршрутизатором без переадресации портов, поэтому прямое соединение невозможно. Клиентом может быть мобильный телефон, который меняет свой IP-адрес. Я понимаю, что для того, чтобы клиент был слушателем, серверу не нужно знать IP-адрес клиента.
Спасибо
- розетки
2
Клиентский сокет не прослушивает входящие соединения, он инициирует исходящее соединение с сервером. Сокет сервера прослушивает входящие соединения.
Сервер создает сокет, привязывает его к IP-адресу и номеру порта (для TCP и UDP), а затем прослушивает входящие соединения. Когда клиент подключается к серверу, создается новый сокет для связи с клиентом (только TCP). Механизм опроса используется, чтобы определить, произошла ли какая-либо активность на каком-либо из открытых сокетов.
Клиент создает сокет и подключается к удаленному IP-адресу и номеру порта (для TCP и UDP). Можно использовать механизм опроса ( select()
, poll()
, epoll()
и т. д. ) для мониторинга сокета для получения информации с сервера без блокировки потока.
В случае, если клиент находится за маршрутизатором, который обеспечивает NAT (преобразование сетевых адресов), маршрутизатор перезаписывает адрес клиента, чтобы он соответствовал общедоступному IP-адресу маршрутизатора. Когда сервер отвечает, маршрутизатор меняет свой общедоступный IP-адрес обратно на IP-адрес клиента. Маршрутизатор хранит таблицу активных подключений, которые он переводит, чтобы он мог сопоставить ответы сервера с правильным клиентом.
0
Итеративный сервер TCP принимает соединение клиента, затем обрабатывает его, выполняет все запросы от клиента, и отключается. Сервер итерации TCP может одновременно обрабатывать только один запрос клиента. Только когда все запросы клиента удовлетворены, сервер может продолжить последующие запросы. Если один клиент занимает server, другие клиенты не могут работать, поэтому TCP-серверы редко используют итеративную модель сервера.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Многопоточность— Как работает асинхронный сервер сокетов?
Задавать вопрос
спросил
Изменено 8 лет, 7 месяцев назад
Просмотрено 7к раз
Должен сказать, что я не спрашиваю о конкретных деталях реализации (пока), а просто общий обзор того, что происходит. Я понимаю основную концепцию сокета и нуждаюсь в разъяснении процесса в целом. Мое (возможно, очень неправильное) понимание в настоящее время таково:
Сокет постоянно ожидает клиентов, которые хотят подключиться (в своем собственном потоке). Когда происходит соединение, возникает событие, которое порождает другой поток для выполнения процесса соединения. В процессе подключения клиенту назначается собственный сокет для связи с сервером. Затем сервер ожидает данных от клиента, и когда данные поступают, возникает событие, которое порождает поток для чтения данных из потока в буфер.
Мои вопросы:
Насколько я понимаю?
Требует ли каждый клиентский сокет собственный поток для прослушивания данных?
Как данные направляются в правильный сокет клиента? Об этом позаботятся внутренности TCP/UDP/kernel?
Какие типы данных обычно используются совместно в этой многопоточной среде и каковы точки разногласий?
Будем признательны за любые разъяснения и дополнительные пояснения.
РЕДАКТИРОВАТЬ:
Что касается вопроса о том, какие данные обычно передаются, и о спорных моментах, я понимаю, что это больше относится к деталям реализации, чем к вопросу об общем процессе принятия соединений и отправки/получения данных. Я просмотрел пару реализаций (SuperSocket и Kayak) и заметил некоторую синхронизацию для таких вещей, как кеш сеанса и повторно используемые пулы буферов. Не стесняйтесь игнорировать этот вопрос. Я оценил все ваши отзывы.
- многопоточность
- сокеты
- tcp
- асинхронный сокет
2
Один поток на соединение — это плохой дизайн (не масштабируемый, слишком сложный), но, к сожалению, слишком распространенный.
Сервер сокетов работает примерно так:
- Сокет прослушивания настроен для приема соединений и добавлен в набор сокетов
- Набор сокетов проверен на наличие событий
- Если прослушивающий сокет имеет ожидающие соединения, новые сокеты создаются путем принятия соединений, а затем добавляются в набор сокетов
- Если у подключенного сокета есть события, вызываются соответствующие функции ввода-вывода .
- Набор сокетов снова проверяется на наличие событий
Это происходит в одном потоке, вы можете легко обрабатывать тысячи подключенных сокетов в одном потоке, и есть несколько веских причин усложнять это путем введения потоков.
во время работы выбрать на наборе сокетов для каждого сокета с событиями если сокет слушатель принять новый подключенный сокет добавить новый сокет в набор сокетов иначе, если сокет является соединением если событие читаемо читать данные обрабатывать данные иначе, если событие доступно для записи записать данные в очередь иначе, если событие закрыто, соединение удалить сокет из набора сокетов конец конец Выполнено Выполнено
Стек IP заботится обо всех деталях того, какие пакеты идут к какому «сокету» и в каком порядке. С точки зрения приложений, сокет представляет собой надежный упорядоченный поток байтов (TCP) или ненадежную неупорядоченную последовательность пакетов (UDP)
РЕДАКТИРОВАТЬ: в ответ на обновленный вопрос.
Я не знаю ни одной из библиотек, которые вы упомянули, но о концепциях, которые вы упомянули:
- Кэш сеанса обычно хранит данные, связанные с клиентом, и может повторно использовать эти данные для нескольких подключений. Это имеет смысл, когда логике вашего приложения требуется информация о состоянии, но это уровень выше фактического конца сети. В приведенном выше примере кеш сеанса будет использоваться частью «данные процесса». Пулы буферов
- также являются простой и часто эффективной оптимизацией сервера с высокой нагрузкой. Эту концепцию очень легко реализовать: вместо выделения/освобождения пространства для хранения данных, которые вы читаете/записываете, вы извлекаете предварительно выделенный буфер из пула, используете его, а затем возвращаете в пул. Это позволяет избежать (иногда относительно дорогих) внутренних механизмов выделения/освобождения. Это не имеет прямого отношения к сети, вы также можете использовать буферные пулы, например. что-то, что читает куски файлов и обрабатывает их.
3
Насколько я понимаю?
Довольно далеко.
Требует ли каждый клиентский сокет собственный поток для прослушивания данных?
№
Как данные направляются в правильный клиентский сокет? Об этом позаботятся внутренности TCP/UDP/kernel?
TCP/IP — это несколько уровней протокола. В нем нет «ядра». Это части, каждая из которых имеет отдельный API для других частей.
IP-адрес обрабатывается на месте.
Номер порта обрабатывается в другом месте.
IP-адреса сопоставляются с MAC-адресами для идентификации конкретного хоста. Номер порта — это то, что связывает сокет TCP (или UDP) с определенной частью прикладного программного обеспечения.
Какие типы данных обычно используются совместно в этой многопоточной среде и каковы точки разногласий?
Какая многопоточная среда?
Обмен данными? Какая?
Конфликт? Физический канал является предметом спора номер один.