Skip to content

Instantly share code, notes, and snippets.

@vchernogorov
Last active October 8, 2022 03:15
Show Gist options
  • Save vchernogorov/71f8a29efb1371a976a95fb7fcd3b130 to your computer and use it in GitHub Desktop.
Save vchernogorov/71f8a29efb1371a976a95fb7fcd3b130 to your computer and use it in GitHub Desktop.
Сокеты и Сети (mit-6.005-21)

Клиент/сервер паттерн

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

Множество интернет приложений работают таким образом: веб браузеры являются клиентами для веб серверов, почтовые сервисы, такие как Outlook являются клиентами для почтовых серверов и т.д.

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

[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#clientserver_design_pattern

I/O

Буфер

Данные, которыми по сети обмениваются клиент и сервер, шлются блоками. Редко когда бывает, что эти блоки хранят лишь байт информации (хотя и такое возможно). Отправитель (клиент посылает запрос или сервер посылает реквест) создает такой блок, который может содержать как строку "HELLO, WORLD!", так и 20 мегабайт видео данных. На транспортном уровне этот блок данных разбивается на фрагменты. После чего каждый фрагмент распределяется независимо по всему сетевому каналу. Тем временем получатель собирает эти фрагменты в единый поток байтов.

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

Когда же все данные перешлются, они отправляются в буфер, массив в памяти, который содержит их до момента их прочтения.

Потоки

Данные, которые передаются в сокет или приходят из него - это поток байтов.

В джаве InputStream объект представляет собой поток входных данных. Примеры:

  • Чтение из файла на диске с помощью FileInputStream
  • Пользовательский ввод из System.in
  • Входные данные из сокета

OutputStream объект является приемником данных. Примеры:

  • FileOutputStream для создания файлов на диске.
  • System.out - это PrintStream, OutputStream, который печатает читаемые для нас данные различного типа.
  • Выходные данные в сокет.

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

[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#io

Сокеты

IP адреса

Точка соединения определяется IP адресом. IPv4 использует 32-битные (четырёхбайтные) адреса:

  • 18.9.22.69 - IP адрес веб сервера MIT'a. Каждый адрес, у которого в первом октете число 18, находится в сети MIT'a.
  • 18.9.25.15 - адрес обработчика электронных писем MIT'a.
  • 173.194.123.40 - адрес веб сервера гугла.
  • 127.0.0.1 - это замыкание на локальный адресс, т.е. он всегда будет указывать на локальную машину. Технически, любой адрес, у которого 127 в первом октете, является замыканием.

Любой может узнать IP адрес, например, гугла. Каждый раз, когда кто-то конектится к новой сети с ноутбука, ему присваивается новый IP адрес.

Хостнейм

Хостнейм - это наименование, которое транслируется в IP адресс. Один и тот же хостнейм может указывать на разные IP адреса в разные промежутки времени; множество хостнеймов могут указывать на один и тот же IP адрес. Например:

  • web.mit.edu - имя веб сервера MIT'a. Можно транслировать этот хостнейм в IP адрес с помощью dig, host или nslookup в командной строке:
$ dig +short web.mit.edu
18.9.22.69
  • dmz-mailsec-scanner-4.mit.edu - хостнейм для одного из спам фильтров MIT'a, отвечающего за обработку входщих электронных писем.
  • localhost - это имя для 127.0.0.1. Если вы хотите обратиться к серверу, запущенному на вашей машине, то можете обращаться по этому хостнейму. Трансляцией хостнеймов в IP адреса занимается DNS (Domain Name System).

Порты

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

Сетевые интерфейсы содержат множество портов, которые определяются 16-битным номером от 0 (который является рарезирвированным, поэтому скорее от 1) и до 65535.

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

  • Порт 22 - стандартый SSH порт. Когда кто-то присоединяется к athena.dialup.mit.edu по SSH, автоматически используется 22 порт.
  • Порт 25 - стандартый порт для почтового сервера.
  • Порт 80 - стандартный порт для веб сервера. Когда кто-то переходит по ссылке http://web.mit.edu через веб браузер, он конектится к 18.9.22.69 по 80 порту.

Если порт не является стандартным портом, он должен указываться явно, как часть адреса. Например, http://128.2.39.10:9000 указывает на 9000 порт машины с таким IP 128.2.39.10.

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

Сокеты

Сокет представляет из себя соединение между клиентом и сервером.

"Слушающий" сокет используется серверным процессом чтобы ждать соединения от удаленного клиента.

В джаве используется класс ServerSocket для создания слушающего сокета.

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

В джаве используются Socket конструктор для создание сокет соединения с сервром. Сервера получают присоединенный сокет в виде Socket объекта, возвращаемого из ServerSocket.accept.

[1] http://web.mit.edu/6.005/www/fa16/classes/21-sockets-networking/#network_sockets

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment