Дополнительные сведения о 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-датаграмму нулевой длины (это происходит, когда режим соединения установлен в «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-датаграммы через порт, заданный параметром порта привязки.

Соединения для передачи данных по TCP

Только одно соединение одновременно. Стек TCP на ПК способен поддерживать тысячи одновременных TCP-соединений, но VSPDL строго следит, чтобы для каждого VSP в любой момент существовало только одно TCP-соединение. Причина в том, что последовательный порт не является разделяемым ресурсом, и если бы к одному VSP могли подключиться два сервера устройств, возник бы хаос данных***. Ограничение одного соединения одновременно соответствует «культуре последовательного порта»: один последовательный порт - одно приложение! Если VSP уже участвует в соединении для передачи данных с DS и другой DS пытается установить соединение с этим VSP, этот DS получит отказ.

Отдельные порты для исходящих и входящих соединений. VSP устанавливает исходящие соединения* с «автоматического» порта, выбранного ОС. Каждый раз при установлении такого исходящего соединения номер исходного порта на стороне VSP будет другим. VSP принимает входящие соединения на фиксированном порту прослушивания, номер которого задаётся параметром порта привязки. Если входящие соединения не разрешены, порт привязки закрыт.

* При условии, что входящие соединения разрешены (то есть режим маршрутизации - «server» или «server/client»).

** При условии, что исходящие соединения разрешены (то есть режим маршрутизации - «client» или «server/client»).

*** Что если оба сервера устройств начнут отправлять данные на VSP одновременно? Тогда приложение на ПК, использующее VSP, получило бы смесь данных от обоих серверов устройств! А если бы к одному VSP были подключены два сервера устройств и приложению на ПК понадобилось бы отправить данные, то какому из двух DS VSP должен был бы их передать?