В 1984 году состоялся релиз сетевой модели OSI (Open Systems Interconnection model), цель которой была стандартизация сетевого взаимодействия в компьютерных системах.
В настоящее время модель OSI практически не используется. В основном модель применяется только в качестве обучения сетям.
Определяет метод передачи данных во внешней физической среде: передача электрических сигналов, радиоканала и пр.
Единицей данных являются биты.
Берет на себя задачу адресации в пределах локальной сети, обнаруживает ошибки, проверяет целостность данных, которые были переданы по физической среде.
Единицей данных являются кадры.
Каждое сетевое устройство должно иметь уникальный сетевой адрес в рамках одной сети.
Сетевой же уровень отвечает за объединение участков сети и маршрутизацию - выбор пути данных от отправителя получателю.
Единицей данных являются пакеты.
Самые яркие представители протоколов сетевого уровня - это IPv4 и IPv6.
Адрес в IPv4 представлен 32 битным числом.
Часто их представляют в виде 4 чисел через точку. Например, 192.168.0.1
Адрес 127.0.0.1 - локальный IPv4-адрес.
Адрес в IPv6 представлен 128 битным числом.
Например, 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d
Адрес ::1
- локальный IPv6-адрес.
Отвечает за взаимодействие между отдельными процессами разных узлов сети.
Адресом этого уровня служат, так называемые порты, которые нужны для указания конкретной службы, которая отправляет или получает данные.
Пара сетевого адреса и порта транспортного уровня определяет конечную точку сетевого вазимодействия.
Самые яркие представители протоколов сетевого уровня – это UPD и TCP.
TCP – протокол c установлением соединения.
Протокол TCP применяется в системах, где безоошибочность данных важнее, даже если приходится жертвовать скоростью.
Например, текстовые чаты, web-данные, передача файлов и пр.
UDP – протокол без установления соединения.
Протокол UDP применяется в системах, где скорость важнее надежности. Например, в передаче голоса или видеопотока.
Кроме этого, UDP применяют для создания протоколов, которые предназначены скрестить скорость UDP и надежность TCP.
…
…
На этом уроне работают конечные приложения: e-mail, браузеры, игры и пр.
Протоколы прикладного уровня: HTTP, FTP, DNS, Telnet, SSH…
Для работы с сетью традиционно используются сокеты.
Сокет – это абстракция, которая позволяет работать с сетевыми ресурсами, как с файлами. Мы можем писать и читать данные из сокета почти так же, как из обычного файла.
// Server
std::vector<socket_stream> sockets;
for (auto& socket : sockets) {
socket << "some info from server";
std::string data;
socket >> data;
}
// Client
socket_stream srv("192.41.1.1", 50123);
std::string data;
srv >> data;
srv << "send info to server";
socket
Функция socket
- создает новый сокет с заданными параметрами.
int socket(int domain, int type, int protocol);
int sock_udp = socket(AF_INET,
SOCK_DGRAM, IPPROTO_UDP);
int sock_tcp = socket(AF_INET,
SOCK_STREAM, IPPROTO_TCP);
bind
Функция bind - связывает сокет с конкретным адресом сетевого интерфейса.
int bind(int sockfd,
const struct sockaddr *addr,
socklen_t addrlen);
listen
Функция listen - переводит сокет в пассивный режим.
int listen(int sockfd, int backlog);
listen
Функция listen
принимает дескриптор слушающего сокета и размер очереди запросов.
Когда клиент пытается соединиться с сервером, его запрос ставится в очередь, так как сервер может быть занят обработкой других запросов. Если очередь заполнена, все последующие запросы будут игнорироваться.
accept
Функция accept
ожидает клиентские соединения.
int accept(int sockfd,
struct sockaddr *addr,
socklen_t *addrlen);
Функция accept является блокирующей.
accept
В качестве аргумента функции передается дескриптор слушающего сокета.
При успешной установке соединения, для него создается новый сокет. Функция accept
возвращает дескриптор этого сокета.
Если произошла ошибка соединения, то возвращается значение INVALID_SOCKET
.
accept
В структуру, на которую ссылается addr
, записывается адрес сокета клиента, который установил соединение с сервером.
В переменную, адресуемую указателем addrlen
, записывается размер структуры.
connect
Функция connect
соединят пользовательский сокет с удаленным сокетом.
int connect(int sockfd,
const struct sockaddr *addr,
socklen_t addrlen);
Эта функция используется на клиентской стороне подключения, т.к. именно клиент является инициатором подключения.
Boost.Asio - кросс-платформенная С++ библиотека для программирования сетевых приложений и других низкоуровневых программ ввода/вывода.
Подробности работы с данной библиотекой целесообразнее рассматривать на практических примерах и занятиях.
HTTP (HyperText Transfer Protocol) – протокол прикладного уровня.
HTTP – текстовый протокол для обмена данными между браузером и веб-сервером (по крайней мере это самый частый пример использования HTTP).
Первая строка передает метод запроса, идентификатор ресурса (URI) и версию HTTP-протокола.
После перечисляются заголовки запроса – служебные параметры, которые передает клиент серверу.
Опционально, запрос может иметь тело запроса – пользовательские данные.
POST /index.html HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
some_request_body
В первой строке передается версия протокола и статус ответа.
Тело ответа, как и у запроса, отделяется от заголовков одной пустой строкой.
HTTP/1.1 200 OK
Host: example.com
Connection: close
Content-Length: 2
OK