Работа с сокетами c: The OpenNet Project: .

Работа с сокетами.

Содержание

  • Сетевые модели
    • Сетевая модель OSI
    • Cтек протоколов TCP/IP
  • Программный интерфейс сокет
  • Клиент на socket
  • Задачи
    • RSA
    • Шифрование и расшифрование
      • Алгоритм шифрования:
      • Алгоритм расшифрования:

Сетевая модель OSI

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

  1. Прикладной
  1. Представления
  1. Сеансовый
  1. Транспортный
  1. Сетевой
  1. Канальный
  1. Физический

Самый низкий уровень взаимодействия — передача информации (битов) между устройствами через сетевые кабеля, радиоканал и пр.

Канальный уровень — подразумевает работу с кадрами (frame) обеспечивая взаимодействие на физическом уровне и контроль ошибок.

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

Сетевой уровень предназначен для определения пути передачи данных. Отвечает за трансляцию логических адресов и имён в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию, отслеживание неполадок и «заторов» в сети. К этому уровню относяться такие протоколы, как 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 доступны из сети и требуют выделения номера порта.

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

Для работы с сокетами необходимо:

  1. Подключить socket;
  2. Создать сокет
  3. Присоединиться к серверу (для этого необходимо знать адрес сервера и номер порта, к которому Вы присоединяетесь)
  4. Отправить сообщение. Сообщение должно быть битовым: можно получить из строки при помощи метода encode
  5. Получить ответ
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")               # раскодируем сообщение в строку

Подсоединитесь к серверу 51.

250.21.231 на порт — 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.

image/svg+xml
Алгоритм шифрования:
  1. Взять открытый ключ (e, n) Алисы
  2. Взять открытый текст m
  3. Зашифровать сообщение с использованием открытого ключа Алисы: c = E(m) = m
    e\modn
Алгоритм расшифрования:
  1. Принять зашифрованное сообщение {displaystyle c} c
  2. Взять свой закрытый ключ {displaystyle (d,n)} (d,n)
  3. Применить закрытый ключ для расшифрования сообщения: m = D(c) = cd\modn
  4. Данная схема на практике не используется по причине того, что она не является практически надёжной (semantically secured). Действительно, односторонняя функция E(m) является детерминированной — при одних и тех же значениях входных параметров (ключа и сообщения) выдаёт одинаковый результат. Это значит, что не выполняется необходимое условие практической (семантической) надёжности шифра.

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

Как исправить ошибку «Работа с сокетами: Ошибка! Не работает.»

Почему появляется ошибка?

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

Причины возникновения проблемы могут быть самые разные, приведем наиболее часто встречающиеся:

  1. сайт был недавно перенесен на новый сервер, у него были изменены NS-сервера, но они еще в стадии обновления.  
  2. текущий сайт является копией сайта и работает на стороннем сервере под основным доменом, для обеспечения работоспособности в файле hosts прописан IP нового сервера,
  3. в /etc/hosts (для Linux) или C:\Windows\System32\drivers\etc\hosts (для Windows) прописан некорректный IP-адрес для текущего хоста.
  4. другие проблемы, касающиеся DNS,
  5. проблема с http-авторизацией,
  6. некорректные редиректы на сервере,
  7. у вас локальный сайт, который недоступен извне,
  8. проблема с SSL-сертификатом.

Более точно причину можно понять, посмотрев лог проверки сайта — он находится в папке /bitrix/ и имеет формат имени site_checker_*.log.

На что эта ошибка влияет?

Если проверка на работу сокетов не проходит, то другие тесты также не могут быть выполнены: «Замечание. Не удалось проверить из-за ошибки в работе с сокетами».

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

Как исправить ошибку?

Способ решения в полной мере зависит от причины.

Опишем так же по пунктам:

  1. в случае недавнего переезда сайта на новый сервер достаточно просто подождать, процесс обновления DNS обычно занимает несколько часов, но может занять до нескольких дней, этот процесс зависит от разных факторов,
  2. в данном случае необходимо в файле hosts прописать правило для домена, обычно это делается в той же строке, где и localhost — добавить домен сайта в конце строки,
  3. в этом случае нужно просто убрать некорректную запись из hosts,
  4. в случае других проблем с DNS необходимо более детально изучать вопрос и обращаться к специалистам,
  5. необходимо корректно сконфигурировать сервер (в т.ч. файл .htaccess),
  6. необходимо корректно настроить редиректы, также учитывая порт подключения,
  7. решение такое же как в пункте 2 — необходимо отредактировать hosts, добавив имя текущего домена,
  8. проверьте корректность установки SSL-сертификата.

Требуется наша помощь?

Мы имеем огромный опыт, на протяжении 10 лет помогая клиентам в решении самых различных проблем на их сайтах.

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

Задать вопрос специалисту



как работает прослушивание сокета

спросил

Изменено 2 года, 4 месяца назад

Просмотрено 29 тысяч раз

Если клиент прослушивает сокет, например, на 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

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Сеть

— Как работает функция accept() API сокета?

API-интерфейс сокетов является стандартом де-факто для TCP/IP и UDP/IP-коммуникаций (то есть сетевого кода в том виде, в каком мы его знаем). Однако одна из его основных функций, accept() немного волшебно.

Если взять полуформальное определение:

accept() используется на стороне сервера. Он принимает полученную входящую попытку для создания нового TCP-соединения из удаленный клиент и создает новый сокет, связанный с сокетом адресная пара этого соединения.

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

Как принимает ? Как это реализовано? На эту тему много путаницы. Многие люди утверждают, что accept открывает новый порт, и вы общаетесь с клиентом через него. Но это явно не так, так как новый порт не открывается. На самом деле вы можете общаться через один и тот же порт с разными клиентами, но как? Когда несколько потоков вызывают recv на одном и том же порту, как данные узнают, куда идти?

Я предполагаю, что это что-то вроде адреса клиента, связанного с дескриптором сокета, и всякий раз, когда данные проходят через recv , они направляются в правильный сокет, но я не уверен.

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

  • сеть
  • сокеты
  • TCP

3

Ваше замешательство заключается в том, что вы думаете, что сокет идентифицируется IP-адресом сервера: порт сервера. Когда на самом деле сокеты однозначно идентифицируются квартетом информации:

IP-адрес клиента: порт клиента и IP-адрес сервера: порт сервера

Таким образом, хотя IP-адрес сервера и порт сервера постоянны во всех принятых соединениях, информация на стороне клиента — это то, что позволяет ему отслеживать, где все идет.

Пример для пояснения:

Скажем, у нас есть сервер по адресу 192.168.1.1:80 и два клиента, 10.0.0.1 и 10.0.0.2 .

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

 10.0.0.1:1234 - 192.168.1.1:80.
 

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

 10.0.0.1:1234 - 192.168.1.1:80.
10.0.0.2:5678 - 192.168.1.1:80
 

13

Просто добавить к ответу пользователя «17 из 26»

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

Таким образом, возможно, чтобы разные приложения на сервере общались с одним и тем же клиентом по одним и тем же 4-м кортежам, но с разными полями протокола. Например,

Apache на стороне сервера говорит (server1. com:880-client1:1234 по TCP) и Разговор о World of Warcraft (server1.com:880-client1:1234 по UDP)

И клиент, и сервер обработают это, поскольку поле протокола в IP-пакете в обоих случаях отличается, даже если все остальные 4 поля одинаковы.

0

Что меня смутило, когда я изучал это, так это то, что термины сокет и порт предполагают, что они являются чем-то физическим, тогда как на самом деле это просто структуры данных, которые ядро ​​использует для абстрагирования деталей сети.

Таким образом, структуры данных реализованы так, чтобы иметь возможность различать соединения от разных клиентов. Что касается как они реализованы, ответ либо а) не имеет значения, цель API сокетов как раз в том, что реализация не должна иметь значения, либо б) просто взгляните. Помимо настоятельно рекомендуемых книг Стивенса, в которых содержится подробное описание одной из реализаций, ознакомьтесь с исходным кодом в Linux или Solaris или в одной из BSD.

1

Как сказал другой парень, сокет однозначно идентифицируется четырьмя кортежами (IP-адрес клиента, порт клиента, IP-адрес сервера, порт сервера).

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

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

Оставить комментарий

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

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