Дополнительная информация о соединениях UDP и TCP
Соединения UDP
Понятие соединения данных свойственно TCP/IP, так как это протокол, основанный на соединениях. UDP/IP, однако, - протокол без установления соединения, в котором все пакеты (датаграммы UDP) независимы друг от друга. Как же тогда понятие «соединение данных» применяется к транспортному протоколу UDP?
При транспортном протоколе UDP настоящие соединения данных (в «TCP-смысле» этого термина) невозможны, отсюда кавычки вокруг слова «соединение». Однако VSP старается по возможности имитировать поведение TCP-соединения данных. Ниже подробно описаны UDP-«соединения», их сходства и различия с TCP-соединениями.
Входящие «соединения»*. В UDP нет фазы установления соединения, поэтому входящее UDP-«соединение» считается установленным, когда VSP получает первый UDP-пакет на порту прослушивания. Сходство с TCP в том, что после получения пакета от DS VSP знает, кому отправлять свои UDP-пакеты.
Исходящие «соединения»**. VSP устанавливает исходящее UDP-соединение, отправляя UDP-датаграмму целевому адресату. Если есть данные для передачи, VSP отправляет первую UDP-датаграмму с (частью) этих данных. Если данных для немедленной передачи в DS нет, VSP отправляет первую UDP-датаграмму нулевой длины (это происходит, когда режим соединения установлен в «connect immediately»). Цель этого - сообщить другой стороне IP-адрес VSP (ПК, на котором он работает), а также порт данных, который сейчас использует VSP.
Передача данных и переключение адресата. Когда «соединение» установлено, VSP и DS обмениваются данными с помощью UDP-датаграмм. Отличие от TCP в том, что если другой DS отправит датаграмму VSP, то VSP воспримет это как новое входящее соединение*, забудет о первом DS и начнёт отправлять свои UDP-датаграммы второму. Иначе говоря, VSP всегда взаимодействует с «самым последним отправителем». В TCP такое поведение невозможно, так как третья сторона не может вмешаться в существующее соединение.
Завершение «соединения». В UDP нет фазы завершения соединения, поэтому VSP «завершает» свои UDP-соединения, просто забывая о них. Единственное событие, которое может запустить завершение UDP-«соединения» (кроме закрытия VSP), - это тайм-аут соединения.
Локальный порт, используемый VSP, зависит от выбранного режима маршрутизации:
- В режиме маршрутизации server VSP отправляет UDP-датаграммы с «автоматического» порта, выбранного ОС;
- В режимах server/client и client VSP отправляет и принимает UDP-датаграммы через порт, заданный параметром Listening port.
Соединения TCP
Только одно соединение одновременно. Стек протоколов TCP на ПК способен поддерживать тысячи одновременных TCP-соединений, но VSPD строго следит за тем, чтобы для каждого VSP в любой момент существовало только одно TCP-соединение. Дело в том, что последовательный порт не является разделяемым ресурсом, и если бы два сервера устройств могли подключиться к одному VSP, это привело бы к хаосу данных***. Ограничение одним соединением следует «культуре последовательных портов»: один последовательный порт - одно приложение! Если VSP уже занят соединением данных с DS и другой DS пытается подключиться к этому VSP, второму DS будет отказано.
Отдельные порты для исходящих и входящих соединений. VSP устанавливает исходящие соединения* с «автоматического» порта, выбранного ОС. Каждый раз при установлении такого соединения номер исходящего порта на стороне VSP будет другим. VSP принимает входящие соединения на фиксированном порту прослушивания, номер которого задаётся параметром Listening port. Когда входящие соединения не разрешены, порт прослушивания закрыт.
* Предполагается, что входящие соединения разрешены, то есть режим маршрутизации - server или server/client.
** Предполагается, что исходящие соединения разрешены, то есть режим маршрутизации - client или server/client.
*** Что, если оба сервера устройств начнут отправлять данные в VSP одновременно? Тогда приложение на ПК получило бы смесь данных от обоих DS! А если бы к одному VSP были подключены два DS и приложению понадобилось бы отправить данные, то какому из двух DS VSP должен был бы их передать?