Деятельность в сети


Сайт написание дипломных работ, в Москве, Дипстарт.

Теперь, когда подключение к сети установлено, как можно увидеть, что происходит в ней? Существует несколько способов заглянуть в сеть, и мы рассмотрим все эти способы по порядку. В отличие от многих коммерческих операционных систем, информацию о сети в системе FreeBSD можно получить с помощью команд netstat(8) и sockstat(1).

Текущая активность в сети

netstat(8) — это многоцелевая программа наблюдения за сетями, которая отображает различные сведения в зависимости от ключей, с которыми она была запущена. Наиболее часто возникает вопрос: «Какой объем трафика проходит через компьютер прямо сейчас?» Команда netstat(8) с ключом -w покажет количество пакетов и байтов, обработанных системой. Ключ -w принимает один аргумент — количество секунд между обновлениями. Ключ -d сообщит netstat(8) о необходимости включить в вывод информацию о сброшенных пакетах. Ниже представлена команда, которая заставляет netstat(8) обновлять информацию на экране каждые 5 секунд:

# netstat -w 5 -d

Сразу после ввода команды никаких видимых изменений на экране не происходит, но через несколько секунд выводится единственная строка с информацией. Первые три колонки описывают входящий трафик, а следующие три — исходящий. Здесь можно увидеть число пакетов, принятых с момента последнего обновления (1), число ошибок интерфейса при приеме входящего трафика с момента последнего обновления (2) и число байтов, принятых с момента последнего обновления (3). В следующих трех колонках выводится число пакетов, отправленных компьютером с момента последнего обновления (4), количество ошибок передачи с момента последнего обновления (5) и количество отправленных байтов (6). Далее выводится количество коллизий в сети, обнаруженных с момента последнего обновления (7), и количество сброшенных пакетов (8). Например, в данном случае система приняла 34 пакета (1), начиная с момента запуска команды netstat -w 5 -d.

Через пять секунд netstat(8) вывела вторую строку, описывающую сетевую активность, начиная с момента вывода первой строки.

Интервал обновления информации можно регулировать по своему желанию. Если необходимо выводить сведения раз в секунду, просто запустите команду netstat -w 1 -d. Если достаточно интервала в одну минуту, запустите команду netstat -w 60 -d. Когда я занимаюсь мониторингом сетевой активности, наиболее подходящим для меня является интервал в пять секунд, однако вы сами быстро поймете, какой интервал лучше подходит для ваших нужд.

Чтобы остановить работу утилиты, нужно нажать комбинацию клавиш Ctrl-С.

Открытые порты

Другой не менее популярный вопрос: «Какие порты открыты и какие программы ожидают соединения на них?» В состав системы FreeBSD входит утилита sockstat(1). Этот дружелюбный инструмент позволит получить ответ на столь важный вопрос. Он покажет список активных соединений и портов, доступных для клиентов.

Программа sockstat(1) не только перечислит порты, доступные для соединения, но и другие порты (или сокеты) в системе. Так как основной интерес для нас представляют открытые порты для протокола TCP/IP версии 4, то нужно не забывать использовать ключ -4.* Ниже приводится сокращенный вывод команды sockstat(1), запущенной на очень маленьком сервере:

# sockstat -4

В первой колонке выводится имя пользователя, с привилегиями которого исполняется программа, выполнившая привязку порта. Вторая колонка — это имя команды. Далее указаны идентификатор процесса (PID) программы и дескриптор файла, соответствующего сокету. В следующей колонке указано название транспортного протокола, который используется сокетом, — это либо tcp4 для TCP в TCP/IP версии 4, либо udp4 для UDP в TCP/IP версии 4. Далее выводится локальный IP-адрес с номером порта, а в последней колонке указываются IP-адрес и номер порта удаленной системы, в случае открытого соединения.

Взгляните на самую первую запись. Она соответствует работающей программе sshd (1). Страница справочного руководства sshd(8) рассказывает о демоне SSH. Основной демон sshd(8) запустил дочерний процесс от моего имени для обслуживания соединения с моей рабочей станцией, поэтому в списке имеется несколько экземпляров sshd(8) с различными идентификаторами процесса. В данном случае соединение установлено с локальным IP-адресом 198.22.63.43 (2) и с портом TCP 22. Удаленный хост, участвующий в этом соединении, имеет IP- адрес 24.192.127.92 (3) и соединение выполнено с портом 62937. Это SSH-соединение было выполнено на локальный компьютер с удаленной системы.

В число других соединений входят Sendmail (4), сервер электронной почты, принимающий запросы на порту 25. Обратите внимание: в этой записи отсутствуют IP-адреса. Данный сокет ожидает получения запросов на соединение. Процесс httpd (5) ожидает получение запросов на порту с номером 80.

Наиболее проницательные читатели могут заметить, что на этом сервере имеются два демона SSH, ожидающие получения запросов на подключение, один на порту с номером 23 (6) и другой на порту с номером 22 (7). В файле /etc/services указывается, что SSH обычно работает с портом 22, а порт 23 зарезервирован за службой telnet. Любой, кто попытается подключиться с помощью команды telnet, будет подключен к демону SSH, который работает совсем не так, как ожидается. Наиболее подозрительные читатели могут предположить, что данный сервер SSH был настроен для компенсации недостатков в настройках межсетевого экрана, который фильтрует трафик, исходя из исходящего и входящего номеров портов, а не из фактически используемого протокола. (У меня нет комментариев по поводу таких утверждений.)

Последняя запись в списке соответствует серверу имен named (8), ожидающему запросы на порту с номером 53. Здесь видно, что прослушивание производится по протоколу UDP (а не TCP) и соединения принимаются на IP-адресе 198.22.63.8.

Подробнее об открытых портах

Утилита sockstat(1) предоставляет обзорную информацию о доступных сетевых службах, однако с помощью netstat(8) можно получать более подробные сведения об отдельных соединениях. Чтобы увидеть открытые сетевые соединения, можно использовать команду netstat(8) с ключом -a. Ключ -n сообщает команде netstat(8), что она не должна выполнять преобразование IP-адресов в имена хостов, — такое преобразование не только замедляет вывод информации, но и может породить неоднозначность полученных результатов. Наконец, параметр -f inet требует от netstat(8) беспокоиться только о сетевых соединениях. Ниже приводится пример вывода, полученного от команды netstat с того же компьютера, на котором только что был получен вывод команды sockstat(1):

# netstat -na -f inet

Здесь нетрудно догадаться, какая программа к какому порту подключена. Первая колонка во всех записях — это название транспортного протокола, используемого сокетом, — здесь в большинстве случаев используется протокол TCP, и только в последней записи — UDP.

Колонки Recv-Q и Send-Q показывают, сколько байт в том или ином соединении ожидают обслуживания. Если в колонке Recv-Q ненулевые значения присутствуют постоянно, значит, система не может обрабатывать входные данные достаточно быстро. Точно так же постоянно присутствующие значения в Send-Q говорят о том, что либо сеть, либо другая сторона соединения не могут принять данные с той скоростью, с какой они посылаются. Случайные пакеты, ожидающие своей очереди, — это нормально. Исследуйте свою систему, чтобы определить, какая ситуация нормальна, а какая — нет.

Очевидно, что Local Address — это IP-адрес и номер порта локальной системы, на котором локальная система ожидает получение запросов на соединение. Сетевой порт находится в конце записи и отделяется от IP-адреса точкой. Например, 198.22.63.43.22 — IP-адрес 198.22.63.43 и порт 22. Если запись представлена как «звездочка, точка, номер порта», это означает, что система прослушивает этот порт на всех IP-адресах. В приведенном примере система готова принимать соединения по указанным портам.

Колонка Foreign Address (внешний адрес) показывает удаленный адрес (remote address) и номер порта для каждого соединения.

Наконец, колонка (state) показывает состояние рукопожатия TCP. В данный момент не требуется знать все возможные состояния ТСР-соединения; достаточно понять, какие из них являются нормальными. Состояние ESTABLISHED означает, что соединение установлено и данные, по всей видимости, передаются. Состояния LAST_ACK, FIN_WAIT_1 и FIN_WAIT_2 означают, что соединение закрывается. Состояния SYN_RCVD, АСК и SYN+ACK — это этапы нормального создания соединения. Состояние LISTEN говорит, что порт готов принимать входящие соединения. В предыдущем примере одно соединение TCP активно и четыре ожидают входящих соединений. Протокол UDP не устанавливает соединений, поэтому в данном листинге для этого протокола отсутствует информация о состоянии.

Ознакомившись с этой информацией и сопоставив ее со сведениями, полученными от sockstat(1), можно разобраться, какая программа ведет себя вполне нормально, а какая является узким местом в системе.

Если вас не интересуют сведения о сокетах, ожидающих входящие соединения, а интерес представляют только активные соединения, можно вместо ключа -a использовать ключ -b. Например, команда netstat -nb -f inet отобразит только установленные соединения с удаленными системами.

Пропускная способность сетевой подсистемы в ядре

Система FreeBSD оптимизирует сетевую работу с помощью mbufs. mbuf — это отдельный участок памяти ядра, выделенный для сетевых операций. При просмотре документации, описывающей сетевой стек FreeBSD, вы постоянно будете спотыкаться о термин mbuf, поэтому очень важно иметь хотя бы поверхностное представление об этом.

Во время загрузки FreeBSD автоматически выделяет память для нужд сетевой подсистемы, исходя из общего объема физической памяти. Предполагается, что если в системе имеется 4 Гбайт памяти, то было бы желательно выделить для нужд сетевой подсистемы больше памяти, чем ее выделяется на маломощном компьютере с 128 Мбайт памяти. Узнать, как FreeBSD распределяет эти ресурсы, можно с помощью команд netstat -s и netstat -m. Рассмотрим сначала самый короткий вариант.

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

# netstat -m

Здесь видно, сколько кластеров mbuf используется (1). Если вы сделали предположение, что они как-то связаны с mbufs, то вы были правы. Вам пока не обязательно точно знать, что такое кластеры mbuf, важно знать количество, которое может быть выделено (2), и что этот предел еще не достигнут.

Также здесь можно видеть количество запросов на выделение mbufs, отвергнутых ядром (3). В данном случае система не отвергла ни одного запроса, а это означает, что в ней отсутствуют проблемы производительности, связанные с нехваткой памяти. Если система начинает отвергать запросы на выделение mbufs, следовательно, в сетевой подсистеме ощущается нехватка памяти. О решении этой проблемы рассказывается в разделе «Оптимизация производительности сети» ниже.

Команда netstat -m производит всего с десяток строк результатов, а вот команда netstat -s выводит данные страница за страницей. Она выводит статистические данные о производительности для каждого из протоколов. Как и в случае с командой netstat -m, эти данные можно разбить на категории: как много было сделано и сколько проблем было обнаружено. Время от времени запускайте обе эти команды и просматривайте полученные результаты, чтобы быть в курсе событий и вовремя обнаруживать возникающие проблемы.

Комментарии запрещены.