В 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