UNIX: разработка сетевых приложений
Рис. Б.3. Адреса 6to4
Преимущество 6to4 перед 6bone состоит в том, что туннели, формирующие инфраструктуру, образуются автоматически. Для их создания не требуется предварительное конфигурирование. Сайт, использующий 6to4, настраивает основной маршрутизатор на известный адрес передачи наиболее подходящему узлу (anycast) IPv4 192.88.99.1 (RFC 3068 [48]). Он соответствует адресу IPv6 2002: :с058:6301::. Маршрутизаторы инфраструктуры IPv6, готовые действовать в качестве шлюзов 6to4, объявляют о маршруте к сети 2002/16 и отправляют упакованный трафик на адрес IPv4, скрытый внутри адреса 6to4. Такие маршрутизаторы могут быть локальными, региональными или глобальными в зависимости от областей действия их маршрутов.
Смысл виртуальных сетей состоит в том, чтобы постепенно исчезнуть с течением времени, когда промежуточные маршрутизаторы обретут требуемую функциональность (в частности, способность работать с IPv6).
Приложение В
Техника отладки
Это приложение содержит некоторые рекомендации и описание методов отладки сетевых приложений. Ни один из приведенных методов не является панацеей от всех возможных проблем, однако существует множество инструментальных средств, с которыми следует ознакомиться, чтобы в дальнейшем использовать подходящие для конкретной среды.
В.1. Трассировка системных вызовов
Многие версии Unix предоставляют возможность трассировки (отслеживания) системных вызовов. Зачастую это может оказаться полезным методом отладки.
Работая на этом уровне, необходимо различать системный вызов и функцию. Системный вызов является точкой входа в ядро, и именно это можно отследить с помощью инструментальных средств, описанных в данном разделе. Стандарт POSIX и большинство других стандартов используют термин функция, вкладывая в это понятие тот же смысл, что и пользователи, хотя на самом деле это может быть системный вызов. Например, в Беркли-ядрах
— это системный вызов, хотя программист приложений может считать, что это обычная функция языка С. В системе SVR4, как будет показано далее, это функция из библиотеки сокетов, которая содержит вызовыsocketиputmsg, в действительности являющиеся системными вызовами.getmsgВ этом разделе мы рассмотрим системные вызовы, задействованные в работе клиента времени и даты (см. листинг 1.1).
Сокеты ядра BSD
Мы начнем с FreeBSD, операционной системы с Беркли-ядром, в котором все функции сокетов являются системными вызовами. Программа трассировки системных вызовов имеет название
. Она выводит информацию о трассировке в файл (по умолчанию имя этого файлаktrace), который можно вывести на экран с помощьюktrace.out. Клиент сокета запускается следующим образом:kdumpfreebsd % <b>ktrace daytimetcpcli 192.168.42.2</b>Tue Aug 19 23:35.10 2003Затем запускаем
, чтобы направить трассировочную информацию в стандартный поток вывода.kdump3211 daytimetcpcli CALL socket(0x2,0x1,0)3211 daytimetcpcli RET socket 33211 daytimetcpcli CALL connect(0x3,0x7fdffffe820,0x10)3211 daytimetcpcli RET connect 03211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)3211 daytimetcpcli GIO fd 3 read 26 bytes"Tue Aug 19 23:35:10 2003"3211 daytimetcpcli RET read 26/0x1a...3211 daytimetcpcli CALL write(0x1,0x204000,0x1a)3211 daytimetcpcli GIO fd 1 wrote 26 bytes"Tue Aug 19 23:35:10 2003"3211 daytimetcpcli RET write 26/0x1a3211 daytimetcpcli CALL read(0x3,0x7fdffffe830,0x1000)3211 daytimetcpcli GIO fd 3 read 0 bytes""3211 daytimetcpcli RET read 03211 daytimetcpcli CALL exit(0)Число 3211 является идентификатором процесса.
идентифицирует системный вызов,CALLобозначает возвращение управления,RETподразумевает общую операцию ввода-вывода. Мы видим системные вызовыGIOиsocket, за которыми следуют вызовыconnect, возвращающие 26 байт. Наш клиент записывает эти байты в стандартный поток вывода, и при следующем вызовеreadвозвращает нулевое значение (конец файла).readСокеты ядра Solaris 9
Операционная система Solaris 2.x основывается на SVR4, и во всех версиях ранее 2.6 сокеты реализуются так, как показано на рис. 31.3. Однако во всех версиях SVR4 с подобными реализациями сокетов существует одна проблема: они редко обеспечивают полную совместимость с сокетами Беркли-ядер. Для обеспечения дополнительной совместимости в Solaris 2.6 способ реализации изменен за счет использования файловой системы
. Такой подход обеспечивает поддержку сокетов ядра, что можно проверить с помощью программыsockfsна нашем клиенте (использующем сокеты).trusssolaris % <b>truss -v connect daytimetcpcli 127.0.0.1</b>Mon Sep 8 12:16:42 2003После обычного подключения библиотеки осуществляется первый системный вызов
— системный вызов, инициированный нашим вызовомso_socket.socketso_socket(PF_INET, SOCK_STREAM, IPPROTO_IP, 1) = 3connect(3, 0xFFBFDEF0, 16, 1) = 0AF_INET name = 127.0.0.1 port = 13read(3, " M o n S e p 8 1", ... 4096) = 26Mon Sep 8 12:48:06 2003write(1, " M o n S e p 8 1", ... 26) = 26read(3, 0xFFBFDF03, 4096) = 0_exit(0)Первые три аргумента системного вызова
являются нашими аргументамиso_socket.socketДалее мы видим, что
является системным вызовом, aconnectпри вызове с флагомtrussвыводит на экран содержимое структуры адреса сокета, на которую указывает второй аргумент (IP-адрес и номер порта). Мы не показываем системные вызовы, относящиеся к стандартным потокам ввода и вывода.-v connect
