Интерфейс сокетов в транспортном уровне операции сокетов Беркли

Интерфейс применяется для взаимодействия между разными уровнями. 

Транспортный уровень (ТУ) это первый уровень с которым может взаимодействовать программист. Поэтому интерфейс ТУ, который позволяет нам писать программы для сети, мы обязательно будем рассматривать.

Сокеты Беркли

Интерфейс называется интерфейсом сокетов. Сокеты впервые появились в операционной системе (ОС) Berkeley Unix 4.2 BSD в 1983 году. 

Там сокеты, как и любые другие устройства в UNIX это просто файл, специального типа. Вы пишите данные в этот файл, они автоматически передаются по сети на другой компьютер. Другой компьютер может прочитать данные оттуда, как из обычного файла. Хотя, на самом деле они пришли по сети. 

Таким образом взаимодействие с сетью скрыто от программиста. Такая абстракция оказалась очень удобной, сокеты стали использоваться не только в UNIX, но и во многих других ОС в том числе в windows и linux, поддержку сокетов добавили во многие языки программирования. 

Сокеты сейчас это де-факто стандарт для взаимодействия программ с транспортным уровнем, стека протоколов TCP/IP. 

Операции сокетов Беркли

МЫ будем рассматривать операции сокетов Беркли. Большая часть современных реализаций сокетов имеют такие же операции или очень похожие на них. 

Операции сокетов Беркли делятся на несколько типов. 

  • Первый тип это создание сокетов: Socket, Bind, Listen. 
  • Второй, установка соединения: Connect и Accept. 
  • Третья, передача данных Send, Receive. 
  • Четвёртое, закрытие соединения Close. 

Модель клиент-сервер

Сокеты Беркли используют модель клиент-сервер. Сервер это программа, которая постоянно работает на некотором компьютере, известен его IP адрес и порт и сервер ждет подключение клиентов. А клиент это приложение, которое активно устанавливает соединение с сервером. 

Работа сокетов

Рассмотрим подробнее, как используются сокеты Беркли. У нас есть два компьютера, клиент и сервер. Вначале необходимо создать сокет на сервере и сделать так, чтобы он мог принимать запрос на соединение. 

На сервере выполняется вызов Soket. Создается объект сокет, в простейшем случае, это просто файл специального вида. 

Затем вызывается метод Bind, который используется для присоединения сокета к определенному ip адресу и порту. Например, ip адрес из внутренней сети и порт 80, порт веб серверов. 

Вызов Listen говорит о том, что сокет готов принимать соединение по сети, сокет слушает. При вызове listen создаётся очередь для соединений, в вызове необходимо указать размер этой очереди. В примере на картинке ниже, размер очереди 5. Если сервер получит больше, чем 5 запросов на соединение, а предыдущие запросы еще не обработаны, то все новые запросы будут отбрасываться. 

Затем сервер вызывает метод сокета accept, это говорит о том, что сервер готов принимать соединения и он переходит в режим пассивного ожидания, ждет установку запросов на соединение от клиентов. 

Клиент со свой стороны, сначала вызывает метод сокет, для создания сокета, как правило для клиента не имеет значение, какой ip адрес и какой порт используется, номер порта назначается операционной системой. Поэтому метод bind на клиентском сокете обычно не вызывается. 

Сразу после создания сокета, вызывается метод connect, в котором указывается ip адрес и порт. В параметрах метода connect указываются ip адрес сервера и порт с которыми нужно установить соединение. Отправляется запрос на соединение. 

Для того, чтобы другие клиенты могли соединяться с этим сервером на этом ip адресе и на этом же порту, создаётся копия сокета. И соединение устанавливается не с исходным сокетом, который принимает соединения, а с копией сокета. Данные передаются через копию сокета. 

Клиент подготавливает порцию данных, вызывает метод send. Данные передаются по сети и сервер может их прочитать с помощью метода receive. 

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

Видео пример на Python. Серверный сокет

Рассмотрим пример применения сокетов для разработки программы на питон. Это популярный сейчас язык на котором очень удобно писать программы для работы сетей. Конечно существует большое количество других языков на которых можно писать программу для сетей, но работа с сокетами везде будет примерно одинаковая. 

Посмотри видео о примере сокета на языке питон. (timecode 5:15)

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

Рассмотрим более подробно, какие виды протоколов можно использовать в сокетах. На сетевом уровне можно использовать:

  • socket.AF_INET IPv4
  • socket.AF_INET6 IPv6

А на транспортном: 

  • socket.SOCK_STREAM TCP
  • socket.SOCK_DGRAM UDP

Есть и другие типы сокетов, но с сетями TCP/IP они используются редко. 

Пример на Python. Клиентский сокет

Рассмотрим использование сокетов на стороне клиентов. Также посмотри видео, которое указано выше. (Timecode 7:03)

Заключение

Сокеты это De-facto стандарт интерфейса транспортного уровня. Именно сокеты необходимо использовать, чтобы писать программы для сетей, которые взаимодействуют напрямую с транспортным уровнем. Хотя сейчас многие программы взаимодействуют не с транспортным уровнем, а прикладным уровнем, который предоставляет больше возможностей. 

Оцените статью
Все о технологиях, мобильных приложениях и тарифах на связь