Механизм сокетов
Сокеты
Применение сокетов
Схема использования сокетов для модели «клиент-сервер»
Типы сокетов
Типы сокетов
Коммуникационный домен
Коммуникационный домен
Создание сокета
Создание сокета
Создание сокета
Связывание
Связывание
Сокеты с предварительным установлением соединения. Запрос на соединение
Запрос на соединение
Запрос на соединение
Прослушивание сокета
Прослушивание сокета
Подтверждение соединения
Подтверждение соединения
Подтверждение соединения
Прием и передача данных c предварительным соединением
Прием и передача данных
Прием и передача данных без установления соединения
Закрытие сокета
Закрытие сокета
Схема работы с сокетами с установлением соединения
Схема работы с сокетами без установления соединения
Схема работа сетевого приложения
Схема работа сетевого приложения
Схема работа сетевого приложения
410.07K
Категория: ПрограммированиеПрограммирование

Лекция 13. Операционные системы. Сокеты

1.

Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский технологический университет»
РТУ МИРЭА
Институт искусственного интеллекта
Кафедра компьютерной и информационной безопасности
Тема №13:
Сокеты
Преподаватель: доцент Ставцев Алексей Вячеславович

2. Механизм сокетов

Средства межпроцессного взаимодействия ОС Unix,
представленные в системе IPС, решают проблему
взаимодействия процессов, выполняющихся в рамках
одной операционной системы.
Но необходимы:
• Унифицированный
механизм,
позволяющий
использовать одни и те же подходы для локального и
нелокального взаимодействия.
• Общий интерфейс, позволяющий пользоваться услугами
различных протоколов по выбору пользователя.
Эти проблемы решает механизм сокетов (sockets)

3. Сокеты

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

4. Применение сокетов

• Механизм сокетов чрезвычайно удобен
при разработке взаимодействующих
приложений, образующих систему
«клиент-сервер».
• Клиент посылает серверу запросы на
предоставление услуги
• Сервер отвечает на эти запросы.

5. Схема использования сокетов для модели «клиент-сервер»

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

6. Типы сокетов

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

7. Типы сокетов

• Соединение с использованием виртуального
канала
• Датаграммное соединение
• Используется для передачи отдельных пакетов, содержащих
порции данных – датаграмм.
• Надежность соединения в этом случае ниже, чем при установлении
виртуального канала (для датаграмм не гарантируется доставка в
том же порядке, в каком они были посланы, и доставка вообще)
• Скорость выше, чем у соединений с использованием виртуального
канала.

8. Коммуникационный домен

• Поскольку сокеты используются как для локального, так
и для удаленного взаимодействия, встает вопрос о
пространстве адресов сокетов.
• Коммуникационный домен сокета определяет форматы
адресов и правила их интерпретации.
• Мы будем рассматривать:
- домен AF_UNIX (для локального взаимодействия)
- домен AF_INET (взаимодействия в рамках сети)
• Современные системы поддерживают и другие домены,
например:
- домен AF_NS (использует протоколы удаленного
взаимодействия Xerox NS).

9. Коммуникационный домен

• Префикс AF обозначает сокращение от address
family – семейство адресов
• В домене AF_UNIX формат адреса – это
допустимое имя файла,
• в домене AF_INET адрес образуют имя хоста +
номер порта.
• Фактически коммуникационный домен
определяет также используемые семейства
протоколов. Так, для домена AF_UNIX это будут
внутренние протоколы ОС, для домена AF_INET
– протоколы семейства TCP/IP.

10. Создание сокета

#include <sys/types.h>
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
• domain – коммуникационный домен, к которому
должен принадлежать создаваемый сокет
• AF_UNIX
• AF_INET
• type – тип соединения, которым будет пользоваться
сокет
(тип сокета)
• SOCK_STREAM виртуальный канал
• SOCK_DGRAM датаграммы

11. Создание сокета

#include <sys/types.h>
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
• protocol –протокол, который будет использоваться в рамках данного
коммуникационного домена для создания соединения.
• Если установить значение данного аргумента в 0, система
автоматически выберет подходящий протокол. Константы для
протокола AF_INET:
• IPPROTO_TCP – обозначает протокол TCP
типа SOCK_STREAM)
(корректно при создании сокета
• IPPROTO_UDP – обозначает протокол UDP
типа SOCK_DGRAM)
(корректно при создании сокета

12. Создание сокета

#include <sys/types.h>
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
• В случае успеха функция возвращает положительное
целое число – дескриптор сокета (аналог файлового
дескриптора и может быть использован в дальнейших
вызовах при работе с данным сокетом).
• В случае неудачи (например, при некорректном
сочетании коммуникационного домена, типа сокета и
протокола), функция возвращает –1.

13. Связывание

#include <sys/types.h>
#include <sys/socket.h>
int bind (int sockfd, struct sockaddr *myaddr, int addrlen);
sockfd – дескриптор сокета
myaddr – указатель на структуру, содержащую адрес сокета
#include <sys/un.h>
Для домена
AF_UNIX
struct sockaddr_un {
short sun_family; /* == AF_UNIX */
char sun_path[108];
};

14. Связывание

#include <sys/types.h>
#include <sys/socket.h>
int bind (int sockfd, struct sockaddr *myaddr, int addrlen);
addrlen – последний аргумент функции задает реальный размер структуры, на
которую указывает myaddr
Если мы имеем дело с локальными сокетами и адрес сокета представляет
собой имя файла, то при выполнении функции bind система в качестве
побочного эффекта создает файл с таким именем. Поэтому для успешного
выполнения bind необходимо, чтобы такого файла не существовало к
данному моменту.
Если мы «зашиваем» в программу определенное имя и намерены запускать
нашу программу несколько раз – необходимо удалять этот файл перед
связыванием.
В случае успешного связывания bind возвращает 0, в случае ошибки – -1.

15. Сокеты с предварительным установлением соединения. Запрос на соединение

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

16. Запрос на соединение

#include <sys/types.h>
#include <sys/socket.h>
int connect (int sockfd,
struct sockaddr *serv_addr,
int addrlen);
sockfd – дескриптор сокета
serv_addr – указатель на структуру, содержащую адрес сокета, с которым
производится соединение, в формате, который мы обсуждали выше
addrlen – реальная длина структуры
В случае успешного связывания функция возвращает 0, в случае
ошибки – -1. Код ошибки заносится в errno.

17. Запрос на соединение

• В рамках модели «клиент-сервер» клиенту, вообще говоря, не
важно, какой адрес будет назначен сокету, т.к. никакой процесс
не будет пытаться непосредственно установить соединение с
сокетом клиента.
• Поэтому клиент может не вызывать предварительно функцию
bind, в этом случае при вызове connect система автоматически
выберет приемлемые значения для локального адреса клиента.
• Однако сказанное справедливо только для взаимодействия в
рамках домена AF_INET, в домене AF_UNIX клиентское
приложение само должно позаботиться о связывании сокета.

18. Прослушивание сокета

#include <sys/types.h>
#include <sys/socket.h>
int listen (int sockfd, int backlog);
• Этот вызов используется процессом-сервером для того,
чтобы сообщить системе о том, что он готов к обработке
запросов на соединение, поступающих на данный сокет.
• До тех пор, пока процесс – владелец сокета не вызовет listen,
все запросы на соединение с данным сокетом будут
возвращать ошибку.

19. Прослушивание сокета

#include <sys/types.h>
#include <sys/socket.h>
int listen (int sockfd, int backlog);
sockfd – дескриптор сокета
backlog – максимальный размер очереди запросов на
соединение, ОС буферизует приходящие запросы на
соединение, выстраивая их в очередь до тех пор, пока процесс
не сможет их обработать. В большинстве современных
систем равен 5
В случае успешного связывания функция возвращает 0,
в случае ошибки – -1. Код ошибки заносится в errno.

20. Подтверждение соединения

#include <sys/types.h>
#include <sys/socket.h>
int accept (int sockfd,
struct sockaddr *addr,
int *addrlen);
• Этот вызов применяется сервером для удовлетворения
поступившего клиентского запроса на соединение с сокетом,
который сервер к тому моменту уже прослушивает (т.е.
предварительно была вызвана функция listen).
• accept извлекает первый запрос из очереди и устанавливает с
ним соединение. Если к моменту вызова accept никаких
запросов на соединение с данным сокетом еще не поступало,
процесс, вызвавший accept, блокируется до поступления
запросов.

21. Подтверждение соединения

#include <sys/types.h>
#include <sys/socket.h>
int accept (int sockfd,
struct sockaddr *addr,
int *addrlen);
• Когда запрос поступает и соединение устанавливается, accept возвращает дескриптор
нового сокета, соединенного с сокетом клиентского процесса. Через этот новый сокет
и осуществляется обмен данными, в то время как старый сокет продолжает
обрабатывать другие поступающие запросы на соединение (напомним, что именно
первоначально созданный сокет связан с адресом, известным клиентам, поэтому все
клиенты могут слать запросы только на соединение с этим сокетом).
• Это позволяет процессу-серверу поддерживать несколько соединений одновременно.
• Обычно это реализуется путем порождения для каждого установленного соединения
отдельного процесса-потомка, который занимается собственно обменом данными
только с этим конкретным клиентом, в то время как процесс-родитель продолжает
прослушивать первоначальный сокет и порождать новые соединения.

22. Подтверждение соединения

#include <sys/types.h>
#include <sys/socket.h>
int accept (int sockfd,
struct sockaddr *addr,
int *addrlen);
sockfd – дескриптор сокета
addr – указатель на структуру, в которой возвращается адрес
клиентского сокета, с которым установлено соединение (если
адрес клиента не интересует, передается NULL).
addrlen – возвращается реальная длина этой структуры.
максимальный размер очереди запросов на соединение.
Возвращает дескриптор нового сокета, соединенного с
сокетом клиентского процесса.

23. Прием и передача данных c предварительным соединением

#include <sys/types.h>
#include <sys/socket.h>
int send(int sockfd,
const void *msg,
int len,
unsigned int flags);
int recv(int sockfd,
void *buf,
int len,
unsigned int flags);
sockfd - дескриптор сокета, через который передаются данные
msg – сообщение
buf – указатель на буфер для
приема данных
len – длина сообщения
len – первоначальная длина
буфера.

24. Прием и передача данных

#include <sys/types.h>
#include <sys/socket.h>
int send(int sockfd,
const void *msg,
int len,
unsigned int flags);
int recv(int sockfd,
void *buf,
int len,
unsigned int flags);
Функция возвращает
количество переданных
байт в случае успеха и -1 в
случае неудачи. Код
ошибки при этом
устанавливается в errno.
В случае успеха функция
возвращает количество
считанных байт, в случае
неудачи -1

25. Прием и передача данных без установления соединения

int sendto(int sockfd,
const void *msg,
int len,
unsigned int flags,
const struct sockaddr *to,
int tolen);
int recvfrom(int sockfd,
void *buf,
int len,
unsigned int flags,
struct sockaddr *from,
int *fromlen);
Такие же, как и у
рассмотренных раньше
указатель на структуру,
содержащую адрес
получателя
размер структуры to
Такие же, как и у
рассмотренных раньше
указатель на структуру
с адресом отправителя
размер структуры from

26. Закрытие сокета

• Если процесс закончил прием либо передачу данных, ему следует
закрыть соединение. Это можно сделать с помощью функции
shutdown.
• В принципе, для закрытия сокета можно было бы
воспользоваться просто функцией close, но тут есть одно
отличие. Если используемый для соединения протокол
гарантирует доставку данных (тип сокета – виртуальный канал),
то вызов close будет блокирован до тех пор, пока система будет
пытаться доставить все данные, находящиеся «в пути», в то
время как вызов shutdown извещает систему о том, что эти
данные уже не нужны и можно не предпринимать попыток их
доставить.

27. Закрытие сокета

#include <sys/types.h>
#include <sys/socket.h>
int shutdown (int sockfd, int mode);
sockfd – дескриптор сокета
mode – режим закрытия соединения
= 0, сокет закрывается для чтения
= 1, сокет закрывается для записи
= 2, сокет закрывается и для чтения, и для записи
В случае успеха функция возвращает 0, в случае неудачи -1

28. Схема работы с сокетами с установлением соединения

Серверный сокет
Клиентский сокет
socket
socket
bind
bind
listen
connect
accept
recv
send
recv
send
shutdown
close
shutdown
close

29. Схема работы с сокетами без установления соединения

socket
bind
recvfrom
sendto
close

30. Схема работа сетевого приложения

Процесс
клиент
Процесс
сервер
Запрос данных
у сервера
Получение
запроса
Порождение дочернего
процесса или потока
для обработки запроса
Ожидание
нового запроса
Действия по обработке
запроса

31. Схема работа сетевого приложения

32. Схема работа сетевого приложения

English     Русский Правила