Сидни Фейт - TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)
/* argv[2] ссылается на порт, */
/* а argv [3] ссылается на текстовое сообщение. */
{
int sock;
struct sockaddr_in, servAddr, clientAddr;
struct hostent *hp, *gethostbyname();
/* Должно быть четыре аргумента. */
if (argc < 4) {
printf ("ВВЕСТИ udpclient имя_хоста порт сообщениеn");
exit(1);
}
/* 1. Создать socket для UDP. */
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("He получен socketn");
exit(1);
}
/* 2. Занести адрес и порт сервера в servAddr.
* Сначала заполнить адресную структуру нулями.
* Использовать функцию gethostbyname для получения имени хоста
* и его IP-адреса. Затем скопировать IP-адрес
* в servAddr функцией bcopy.
* Наконец занести номер порта из argv[2]. */
bzero((char *)&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
bcopy(hp->h_addr, &servAddr.sin_addr, hp->h_length);
servAddr.sin_port = htons(atoi(argv[2]));
/* 3. Вызвать bind для получения порта UDP. Система
* назначает свободный порт. */
bzero((char *)&clientAddr, sizeof(clientAddr));
clientAddr.sin_family = AF_INET;
clientAddr.sin_addr.s_addr = htonl(INADDR_ANY);
clientAddr.sin_port = 0;
if (bind(sock, &clientAddr, sizeof(clientAddr)) < 0) {
perror("Клиент не получил порт.n");
exit(1);
}
/* 4. Клиент анонсирует свою готовность к приему сообщений.
* Он посылает сообщение и распечатывает последнюю строку. */
printf ("CLIENT: Готов к пересылкеn");
if (sendto(sock, argv[3], strlen(argv[3]), 0, &servAddr, sizeof(servAddr)) < 0) {
perror "Проблема с sendto.n");
exit(1);
}
printf ("CLIENT: Пересылка закончена. Счастливо.n");
/* Закрытие socket */
close(sock);
}
21.11.1 Запросы в клиентской программе UDP
1. sock = socket(AF_INET, SOCK_DGRAM, 0); UDP клиента создает socket для UDP.
2. bzero((char *)&servAddr, sizeof(servAddr));
servAddr.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
bcopy(hp->h_addr, &servAddr.sin_addr, hp->length);
servAddr.sin_port = htons(atoi(argv[2]));
Структура servAddr заполнена введенными конечным пользователем значениями, как это делалось и в клиенте для TCP.
3. bind (sock, &clientAddr, sizeof(clientAddr)); Клиент вызывает bind для получения порта.
4. sendto(sock, argv[3], strlen(argv[3]), 0, &servAddr, sizeof(servAddr));
Вызов sendto имеет форму:
sendto(дескриптор_socket, буфер, длина_буфера, флаги, адресная_структура_назначения, длина адресной_структуры_назначения)
Этот запрос содержит всю информацию о точке назначения, необходимую для отправки датаграммы протокола UDP.
21.12 Дополнительная литература
Любое техническое руководство по программированию в Unix содержит описания программных вызовов socket. В книге Ричарда Стивенса (Richard Stevens) Unix Network Programming детально обсуждается программирование socket. Руководства программиста TCP/IP для других операционных систем, описывают вызовы socket и часто содержат примеры типичных программ. Следует ознакомиться с подобным руководством, поскольку между операционными системами могут существовать различия.
Глава 22
IP версии 6
22.1 Введение
За относительно короткий период времени персональные компьютеры стали подключаться к локальным сетям, которые объединялись в региональные сети. Многие из этих систем связаны со всем миром. Результатом стало распространение Интернета среди миллионов пользователей.
Структура исходной схемы адресации IP не вполне подходит для такого окружения. Пространство номеров ограничено, и, в отличие от структуры телефонных номеров с иерархической системой кодов стран и областей, здесь нумерация не является иерархической. Присваивание организациям блоков адресов не слишком эффективно, поскольку большая часть адресного пространства не используется.
Пространство номеров быстро истощилось. Кроме того, поскольку номера присваивались не иерархически, быстро разрослись таблицы маршрутизации.
Однако расширение Интернета нельзя остановить. Количество персональных компьютеров и их подключений к глобальной сети постоянно растет. Появляются новые потребности:
■ Работа в сети нового поколения мобильных компьютеров, заменяющих деловые бумаги и выполняющих роль цифрового персонального секретаря.
■ Требования для аудио и видео в реальном времени, приведшие существующую технологию к своему естественному пределу.
К Интернету обратился серьезный деловой мир, которому требуется обеспечение реальной безопасности сетевых инфраструктур.
Существует и проблема с сетевым управлением. Многие организации используют магистральные соединения по IP для объединения своих сетей и пересылке трафика средствами протокола IP. На сегодняшний день эти задачи не решены полностью и нет эффективных механизмов для управления нагрузкой.
Разработка IP версии 6 (IPv6, называемый еще IP следующего поколения) проводилась для решения проблем адресации, маршрутизации, производительности, безопасности и нагрузки в Интернете. В этой главе рассматриваются наиболее важные возможности IPv6. При реализации следует учитывать требования самых последних RFC.
22.2 Обзор IPv6
Протокол IPv6 имеет следующие характеристики:
■ Введен 128-разрядный адрес (16 октетов), который иерархически структурирован для упрощения делегирования прав выделения адресов и маршрутизации.
■ Упрощен главный заголовок IP, но определены многие необязательные заголовки расширения, что позволяет при необходимости добавлять новые сетевые возможности.
■ Поддерживаются аутентификация, целостность данных и конфиденциальность на уровне IP.
■ Введены потоки, поддерживающие многие новые типы пересылки запросов, например видео в реальном времени.
■ Упрощена инкапсуляция других протоколов, и предложен механизм для управления нагрузкой при пересылке данных от других протоколов.
■ Реализован новый метод автоматической самоконфигурации адресов и проверки уникальности IP-адресов.
■ Улучшены методы исследования маршрутизаторов, определения неисправных путей и недостижимых соседей по связи.
На момент написания книги многие детали IPv6 находились еще в стадии разработки, однако основные архитектурные элементы уже подготовлены и рассматриваются в этой главе. Уже стали стандартами IPv6, ICMPv6, расширение DNS и архитектура адресации IPv6.
22.3 Терминология
Версия 6 вносит некоторые изменения в терминологию версии 4 и вводит новые термины:
■ Пакетом (packet) называется заголовок IPv6 плюс полезные данные
■ Узел (node) — любая система, реализующая IPv6
■ Маршрутизатор (router) — узел, пересылающий не адресованные ему пакеты IPv6
■ Связь (link) — носитель, по которому взаимодействуют узлы на уровне связи данных
■ Соседи (neighbor) — узлы, подключенные к одной связи
Термином "пакет" наиболее злоупотребляют в сетевом мире. Пакетами называются любые элементы данных протокола (PDU) от уровня связи данных до уровня приложений.
Почему авторы версии 6 перешли от термина "датаграмма" к "пакету"? Одно из новшеств в IPv6 — это возможность переноса трафика для многих других протоколов. Следовательно, полезные данные не обязательно будут PDU из набора протоколов TCP/IP. Когда пересылается родной PDU из IP, можно пользоваться термином "датаграмма".
В этой главе рассматриваются текущие документы IPv6 и используется термин "пакет".
22.4 Адреса IPv6
Адреса IPv6 имеют длину 16 октетов (128 бит). Для записи адресов используется компактная (хотя и уродливая) нотация. Адреса представлены как 8 шестнадцатеричных чисел, разделенных двоеточиями. Каждое шестнадцатеричное число представляет 16 бит. Например:
41BC:0:0:0:5:DDE1:8006:2334
Ведущие нули в шестнадцатеричных полях могут быть опущены (например, 0 вместо 0000 и 5 вместо 0005). Формат может быть еще более сжат при замене последовательности смежных нулевых полей на "::". Например:
41BC::5:DDE1:8006:2334
Отсутствуют три позиции, так как "::" заменяет последовательность ":0:0:0:".
Адреса версии 4 протокола IP часто вкладываются в последние четыре октета адреса версии 6. Они могут быть записаны с использованием смешанного формата адреса (сочетающего как нотацию с точками, так и нотацию с двоеточиями), например: