Для генерации TCP и UDP данных использовалась простая тестовая
программа, называемая sock. Она выполняла функции как
клиента, так и сервера. С помощью этой тестовой программы, которую можно
запустить из приглашения shellа, мы избежали необходимости писать новые
программы клиента и сервера на языке программирования C для каждой специальной
характеристики, которую хотели протестировать. Так как цель этой книги -
понимание сетевых протоколов, а не сетевого программирования, в этом приложении
мы ограничимся описанием программы и ее опций.
Существует определенное количество
программ, функционально похожих на sock. Juergen Nickelsen
написал программу, которая называется socket, а Dave Yost программу sockio. Обе реализуют
много похожих функций. Части программы sock также были получены из свободно
распространяемой программы ttcp, написанной Mike Muuss и Terry Slattery.
Программа sock может работать в одном из четырех режимов:
- Интерактивный клиент: по умолчанию. Программа подсоединяется к
серверу и затем копирует стандартный ввод на сервер и копирует все, что получено
от сервера, на стандартный вывод. Это показано на рисунке С.1.

Рисунок С.1 Функционирование программы sock как
интерактивного клиента.
Мы должны указать имя хоста сервера и имя сервиса, к которому
необходимо подсоединиться. Хост может быть указан в виде IP адреса, а сервис
может быть указан в виде целого номера порта. Подсоединение к стандартному эхо
серверу (глава 1, раздел "Стандартные простые
сервисы"), от sun к bsdi, отражает эхом все, что
введено: sun % sock bsdi echo
a test line вводим строку
a test line эхо сервер вернул копию
^D вводим символ конца файла, чтобы прекратить работу программы
- Интерактивный сервер: указана опция -s. Необходимо указать имя
сервиса (или номер порта):
sun % sock s 5555 работает как сервер, слушает порт 5555
Программа ожидает соединения от клиента и затем копирует стандартный
ввод клиенту и копирует все, что получено от клиента, на стандартный вывод. В
командной строке перед номером порта может стоять Internet адрес, чтобы указать,
с какого локального интерфейса будет принято соединение: sun % sock -s 140.252.13.33 5555 принимает соединения только по Ethernet
По умолчанию запрос на соединение принимается с любого локального
интерфейса.
- Клиент источник: указана опция -i. По умолчанию, буфер размером 1024
байта записывается в сеть 1024 раза. С помощью опций -n и -w можно изменить эти
значения. Например, команда
sun % sock -i -n12 -w4096 bsdi discard
запишет 12 буферов, каждый из которых по 4096 байт, на discard сервис
хоста bsdi.
- Сервер приемник: указаны опции -i и -s. Данные читаются из сети и
отбрасываются.
Несмотря на то, что в этих примерах использовался TCP (по умолчанию),
с помощью опции -u можно использовать UDP.
Существует большое количество опций, что позволяет полностью
контролировать функционирование программы. С помощью этих опций можно
реализовать практически все, что было показано в тексте.
-b n
- Воспринимает n как номер локального порта клиента. (По умолчанию
используется динамический номер порта, назначенный системой клиента.)
-c
- Конвертирует символы новой строки, которые прочитаны из стандартного
ввода, в символы возврата каретки и пропуска строки. Когда осуществляется чтение
из сети, конвертирует последовательность <возврат каретки, пропуск строки>
в единственный символ новой строки. Большинство Internet приложений работают с
NVT ASCII ,
где возврат каретки и пропуск строки используются для завершения каждой
строки.
-f a.b.c.d.p
- Указывает удаленный IP адрес (a.b.c.d) и
удаленный номер порта (p) для конечной точки UDP (глава 11, раздел "Сервер UDP").
-h
- Переводит TCP соединение в наполовину закрытое
состояние (глава 18, раздел "Наполовину закрытый
TCP"). То есть, соединение не разрывается при появлении в стандартном
вводе символа конца файла. Вместо этого, соединение наполовину закрывается, при
этом чтение из сети продолжается до тех пор, пока сам хост не закроет
соединение.
-i
- Клиент источник или сервер приемник. Либо пишет данные в сеть (по
умолчанию), либо, если используется с опцией -s, читает данные из сети. Опция -n
указывает количество буферов, которые необходимо записать (или считать), опция
-w указывает размер каждой записи, а опция -r указывает размер каждого
чтения.
-n n
- Когда используется с опцией -i, n указывает количество буферов,
которые необходимо считать или записать. По умолчанию n равно 1024.
-p n
- Указывает количество секунд, в течение которых необходимо выдержать
паузу, перед каждым чтением или записью. Это может быть использовано в случае
клиента источника (-i) или сервера приемника (-is), чтобы вставить задержку
между каждым чтением или записью в сеть. Также существует опция -P, которая
позволяет вставить паузу перед первым чтением или записью.
-q n
- Указывает размер очереди ожидания соединения для
TCP сервера: разрешенное количество соединений, которое TCP может поставить в
очередь для приложения (рисунок 18.23). По умолчанию
равно 5.
-r n
- Когда используется с опциями -is, n определяет размер каждого чтения
из сети. По умолчанию 1024 байта за одно чтение.
-s
- Функционирует как сервер, а не как клиент.
-u
- Использует UDP вместо TCP.
-v
- Отладочный режим. Печатает дополнительные подробности (как, например,
динамически назначаемые номера портов клиента и сервера) в стандартный вывод
ошибок.
-w n
- Когда используется с опцией -i, определяет размер каждой записи в
сеть. По умолчанию 1024 байта за запись.
-A
- Включает опцию сокета SO_REUSEADDR. В случае TCP
это позволяет процессу назначить самому себе номер порта, который является
частью соединения, находящегося в состоянии ожидания 2MSL. В
случае UDP, если система поддерживает групповую адресацию, это позволяет
нескольким процессам использовать один и тот же локальный порт для получения
широковещательных или групповых датаграмм.
-B
- Включает опцию сокета SO_BROADCAST, что позволяет UDP датаграммам быть отправленным
на широковещательный IP адрес.
-D
- Включает опцию сокета SO_DEBUG. При этом выводится дополнительная отладочная
информация, которую содержит ядро для этого TCP соединения (приложение A, раздел
"Опция отладки
сокета"). Эта информация может быть получена позже, с помощью запуска
программы trpt(8).
-E
- Включает опцию сокета IP_RECVDSTADDR, если она
поддерживается реализацией (глава 11, раздел "Сервер
UDP"). Это предназначено для UDP серверов, чтобы
печатать IP адреса назначения полученных UDP датаграмм.
-F
- Будет использоваться конкурентный TCP сервер. В
этом случае сервер создает новый процесс с использованием программы fork для каждого соединения клиента.
-K
- Включает опцию TCP сокета SO_KEEPALIVE (глава 23).
-L n
- Устанавливает время задержки (опция сокета SO_LINGER) для конечной точки TCP в значение n. Время задержки
равное 0 означает, что когда соединение закрывается, любые данные, оставшиеся в
очереди для отправки, отбрасываются, а удаленному хосту посылается сброс (глава
18, раздел "Сегменты сброса
(Reset)"). Положительное время задержки - это время (в сотых долях
секунды), в течение которого соединение не закрывается, пока все данные не будут
отправлены и подтверждены. Если, после закрытия сетевого соединения, не все
данные были отправлены и подтверждены в момент истечения этого таймера, закрытие
вернет ошибочный код возврата.
-N
- Устанавливает опцию сокета TCP_NODELAY, чтобы выключить алгоритм Нагла
(глава 19, раздел "Алгоритм
Нагла").
-O n
- Сообщает TCP серверу количество секунд, в течение которых тот должен
выдержать паузу, перед приемом первого соединения от клиента.
-P n
- Указывает количество секунд, в течение которых необходимо выдержать
паузу, перед тем как будет осуществлено первое чтение или запись в сеть. Это
может быть использовано с сервером приемником (-is), чтобы осуществить задержку
после приема запроса на соединение от клиента, однако перед тем, как осуществить
первое чтение из сети. При использовании с клиентом источником или сервером
приемником (-i), эта величина определяет промежуток времени между установлением
соединения и перед первой записью в сеть. Опция -p определяет паузу между
каждыми соседними чтениями или записями.
-Q n
- Указывает количество секунд для TCP клиента или сервера, в течение
которых необходимо выдержать паузу, после получения символа конца файла с
удаленного конца, перед тем как закрыть соединение со своей стороны.
-R n
- Устанавливает приемный буфер сокета (опция сокета
SO_RCVBUF) в значение n. Это может непосредственно повлиять
на размер приемного окна, объявляемого TCP. В случае UDP определяет максимальный
размер UDP датаграммы, которая может быть принята.
-S n
- Устанавливает отправляющий буфер сокета (опция
сокета SO_SNDBUF) в значение n. В случае UDP определяет
максимальный размер UDP датаграммы, которая может быть отправлена.
-U n
- Переводит TCP в режим срочности после
осуществления записи номер n в сеть. Для входа в режим срочности записывается
один байт данных (глава 20, раздел "Режим срочности (Urgent
Mode)").
|