Сетевое программирование в .NET, страница 5

Следующая таблица 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-заголовка позволяют отследить процесс прохождения пакетов и подтвердить получение всего блока. Если каких-то пакетов не хватает, то система может запросить повторить их передачу и заново собрать блок данных перед тем, как передать его приложению.

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

Возвращаемое приемником значение, называемое подтверждающим числом (acknowledgement number) должно быть самым большим в рассмотренной последовательности чисел. Эта техника называется скользящим окном (sliding window). Пакеты, нарушающие порядок последовательности, хранятся в специальном буфере, а затем вставляются в поток, чтобы восстановить порядок. Если какой-либо пакет утерян, то это обнаруживается приемником и он посылает подтверждающее число (acknowledgement number), меньшее, чем ожидается. Этот факт трактуется как запрос на повторение передачи. Техника скользящего окна позволяет избежать процедуры подтверждения получения каждого пакета, что увеличило бы объем передаваемых данных (network traffic).

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

Учреждение TCP-сессии

В TCP-заголовке (вслед за полем, указывающим его длину) идет поле флагов (Flags) состояния сессии.