Сетевое программирование в .NET. Расшифровка IP-адреса (IP address specification). Обеспечение надежности доставки пакетов, страница 5

Порты TCP-соединений, используемые приложениями

Для идентификации соединения TCP использует порты сетевых устройств. Первые два поля расширенного заголовка TCP—это идентификаторы портов отправителя и получателя (source and destination ports). Как мы уже говорили, комбинация IP-адреса и номера порта определяет IP endpoint. Сетевое приложение использует эти значения для установления соединения. Так как много разных приложений могут одновременно работать с одним и тем же устройством, то для каждого приложения устройство должно отвести какой-то диапазон номеров портов.

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

¨  Сетевым устройством Device A пользуются 2 серверных приложения: ServerApp1 и ServerApp2. Они ожидают прихода пакетов от удаленных устройств. Первому приложению приписан TCP-порт 8000, а второму—9000.

¨  Сетевое устройство Device B является клиентом, на котором работают два клиентских приложения (ClientApp1и ClientApp2). Они хотят соединиться с сервером и получить доступ к приложениям 1 и 2. Для того, чтобы послать данные серверному приложению, клиентские приложения тоже должны получить от операционной системы номера свободных портов. Эти порты остаются занятыми на протяжении всей сессии.

Номера клиентских портов обычно не имеют значения (они просто должны быть свободны в момент получения). Поэтому номера портов клиента на рисунке не указаны. Пакеты отправляются от свободного порта Device B к порту Device A, приписанному конкретному приложению.

Следующая таблица IANA определяет список стандартных TCP-портов, присваиваемых известным сетевым приложениям. Это гарантирует, что любой host, выполняющий указанное приложение, получит соединение по указанному порту. Таблица показывает лишь часть допустимых вариантов приписки портов.

Port

Description

7

Echo

13

Daytime

17

Quote of the day

20

FTP (data channel)

21

FTP (control channel)

22

SSH

23

Telnet

25

SMTP

37

Time

80

HTTP

110

POP3

119

NNTP

123

Network Time Protocol (NTP)

137

NETBIOS name service

138

NETBIOS datagram service

143

Internet Message Access Protocol (IMAP)

389

Lightweight Directory Access Protocol (LDAP)

443

Secure HTTP (HTTPS)

993

Secure IMAP

995

Secure POP3

Номера портов в диапазоне (0, 1023) считаются известными (well-known ports), потому что они приписаны известным, широко используемым приложениям. При создании нового приложения избегайте присвоения этих значений. На деле, если порт уже занят другим приложением, то система не позволит его использовать, но к чему лишние ветви обработки исключений и алгоритмы выбора других значений?

Номера портов в диапазоне (1024, 65535) можно использовать в любом приложении, но даже в таком широком диапазоне существует возможность того, что выбранный порт уже занят каким-то приложением. Поэтому многие приложения предоставляют выбор номера порта пользователю. При этом важно, чтобы клиентское приложение как-то учитывало факт изменения порта серверным приложением, иначе оно не сможет с ним соединиться.

Обеспечение надежности доставки пакетов

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