Информационные сети и коммуникации. Учебное пособие
.pdf
|
|
|
Окончание таблицы |
|
|
|
|
|
|
Тип |
Префикс |
Нотация |
Использование |
|
адреса |
(двоичный) |
IPv6 |
||
|
||||
|
|
|
|
|
6Bone |
0011 1111 1111 |
3FFE::/16 |
Согласно RFC 3701 использо- |
|
|
1110 |
|
вание не рекомендуется |
|
Уникастный |
1111 1110 10 |
FE80::/10 |
Уникастный локального |
|
локального |
|
|
канала |
|
канала |
|
|
|
|
Зарезервиро- |
1111 1110 11 |
FEC0::/10 |
Согласно RFC 3879 использо- |
|
вано |
|
|
вание не рекомендуется |
|
Локальный |
1111 110 |
FC00::/7 |
Пространство уникальных |
|
IPv6-адрес |
|
|
уникастных адресов (и эни- |
|
|
|
|
кастных) [RFC 4193] |
|
Мультикаст- |
1111 1111 |
FF00::/8 |
Мультикастное адресное про- |
|
ный |
|
|
странство [RFC 4291] |
Принципиальным отличием IPv6 от IPv4 является то, что одному интерфейсу может быть выделен не один, а несколько адресов. Так, как минимум IPv6-интерфейс обладает собственным уникальным адресом автоконфигурации, который начинается с FE80::/10.
Специфический тип IPv6-адресов идентифицируется лидирующими битами адреса. Поле переменной длины, содержащее эти лидирующие биты, называется префиксом формата (Format Prefix – FP). Так, локальный адрес «персональный адрес хоста» в формате IPv6 имеет жестко определенный префикс: FC00::/7
Консольные утилиты
Для сетевых коммуникаций непосредственно из сеанса интерпретатора в операционных системах семейства Линукс удобно использовать сетевые утилиты командной строки семейства netcat. Netcat – утилита командной строки, позволяющая оперировать соединениями TCP и UDP, приниматьиотправлять данные.
Утилиты nc, nc6 и ncat – похожи по своим функциональным возможностям. Если вы планируете использовать сеть IPv6, то рекомендуется использовать ncat.
Команда с ключом nc –h распечатает справку.
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl]
21
[-m minttl] [-O length] [-P proxy_username] [-p source_port]
[-q seconds] [-s |
source] [-T keyword] [-V |
rtable] [-W recvlimit] |
[-w timeout] |
|
|
[-X proxy_protocol] [-x proxy_address[:port]] |
[destination] [port] |
|
Использование: |
|
|
–4 |
Использовать IPv4 |
|
–6 |
Использовать IPv6 |
|
–b |
Разрешать широковещание |
|
–C |
Отправлять CRLF вместе с концом строки |
|
–D |
Разрешить отладку |
|
–d |
Отсоединиться от stdin |
|
–F |
Использовать файл-сокет |
|
–h |
Распечатать помощь |
|
–I <length> |
Длина входного буфера TCP |
|
–i <interval> |
Задержка при операциях |
|
–k |
Разрешить соединение со многих точек |
|
–l |
Режим ожидания входящих соединений |
|
–M ttl |
Управление TTL |
|
–m minttl |
Минимизация TTL |
|
–N |
Закрыть сокет после получения EOF |
|
–n |
Отключить DNS и поиск разыменования |
|
|
номеров портов |
|
–O length |
Размер выходного буфера TCP |
|
–P proxyuser |
Аутентификация |
|
–p <port> |
Указать локальный порт |
|
–q <secs> |
Задать время ожидания после EOF для |
|
|
выхода (в секундах) |
|
–r |
Netcat выбирает локальный и удаленный порт |
|
|
случайным образом. |
|
–S |
Задействовать TCP MD5 сигнатуру |
|
–s source |
–s определяет исходящий IP-адрес, который Netcat |
|
|
используетдляустановкисоединения |
|
–T keyword |
TOS value |
|
–t |
Совместимость с Telnet |
|
–u |
Режим UDP |
|
–V rtable |
Использовать альтернативную таблицу маршрута |
|
–v |
Режим подробного вывода |
|
22
–W recvlimit Завершить работу после получения заданного
|
количества пакетов |
–w timeout |
Задание тайм-аута |
–X proto |
Прокси-протокол: "4", "5" (SOCKS) or "connect" |
–x addr[:port] |
Прокси address and port |
–Z |
Поддержка DCCP |
–z |
Не посылать данные |
Некоторые приемы работы с netcat: nc -vn 192.168.1.1 12345 –
Проверка наличия открытого порта echo -n "test" | nc -u -w1 192.168.1.1 162 –
Отправка UDP пакета nc -u localhost 7777 –
Прием одного пакета по UDP. После первого сообщения вывод будет остановлен. Если необходимо принять несколько сообщений, то необходимо использовать циклы с условием останова.
while true; do nc -lp 8888 < index.html; done –
Простейший веб-сервер.
while true; do nc -u6lW 1 7777; done
Прием данных по UDP (IPv6): while true; do nc -ulW 1 7777; done
Прием данных по UDP (IPv4):
Ниже приводятся некоторые приемы работы с IPv6. ip -f inet6 neigh :
Получить информацию о ip-адресах локального сегмента ping -6 -I eth0 ff02::1 -
Аналогично через ping
Виджеты
В качестве системы визуализации мы будем использовать публичные облачные серверы для IoT (Интернета вещей) с поддержкой интерфейса RestAPI. Предлагается использовать https://thingspeak.com/ в паре с приложением-виджетом для Андроид Iot ThingSpeakMonitorWidget.
Для получения свободного доступа к каналу в роли публикующего (бесплатно предоставляется 8219 сообщений в сутки) потребуется регистрация на сервисе. Документацию по использованию сервиса и Rest-запроса можно найти на вкладке “API Keys” страницы канала.
23
ПРАКТИЧЕСКАЯ РАБОТА
1.Разберите конфигурацию вашего компьютера (исходные данные необходимо получить как ответ команды ifconfig, ip).
2.Сформируйте локальные адреса по заданию преподавателя.
3.Вам известен MAC-адрес хоста в сети IPv4. Рассчитайте адрес автоконфигурации в сети IPv6 и выполните его эхотестирование при помощи команды ping6. Совет. Для этого вам потребуется определить его MAC-адрес, что можно выполнить путем анализа данных таблицы ARP.
4.Запишите адрес вашего локального компьютера в альтернативных формах.
5.Запишите свой IPv4-адрес в виде IPv6. (::{IPv4} (туннельный), ::FFFF:{IPv6} – адрес IPv4 mapped IPv6 address.
6.Сформируйте локальный IPv6-адрес и присвойте его своему интерфейсу при помощи утилиты Ip:
(/sbin/ip -6 addr add <ipv6address>/<prefixlength> dev <interface> )
7.Сформируйте локальный IPv6-адрес и присвойте его своему интерфейсу при помощи утилиты ifconfig:
/sbin/ifconfig <interface> inet6 add <ipv6address>/<prefixlength>
8.Выполните Ping6 соседних компьютеров.
9.Разработайте шелл-скрипт, выполняющий действия в соответствии с вариантами. Результат выполнения задачи необходимо направить на сервер преподавателя в виде пакета UDP (адрес и порт будут указаны дополнительно). Для получения информации о событии следует использовать консольные команды операционной системы Ли-
нукс, например, vmstat, free, ps.
10.Создайте виджет с использованием MQTT или Rest на базе серви-
са, предложенного преподавателем (например, https://thingspeak.com/) в соответствии с вариантом.
Замечание в соответствии с вариантом
Для разбора строк удобно пользоваться: tail -1 для выделения последней строки;
array=($line) для разделения (split) строки в массив.
Вариант 1
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу удаленного протоколирования состояния сервера. Необходимо отправлять информацию о памяти и ресурсах (vmstat)
24
испециальное предупреждение, если объем свободной памяти меньше установленного порога. Виджет должен отражать объем свободной памяти.
Вариант 2
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу удаленного протоколирования состояния сервера. Необходимо отправлять информацию о памяти и ресурсах (vmstat)
испециальное предупреждение, если объем занятой оперативной памяти больше установленного порога. Виджет должен отражать объем занятой памяти.
Вариант 3
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу удаленного протоколирования состояния сервера. Необходимо отправлять информацию о памяти и ресурсах (vmstat) и специальное предупреждение, если объем файла подкачки превысил установленный порог. Виджет должен отражать объем файла подкачки.
Вариант 4
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу удаленного протоколирования состояния сервера. Требуется анализировать загрузку центрального процессора сервера. Необходимо отправлять специальное предупреждение, если загрузка центрального процессора сервера превысила установленный порог. Виджет должен отражать текущую загрузку процессора.
Вариант 5
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу протоколирования попыток установки telnet соединения, отправлять серверу-сборщику отчет по udp. Виджет должен отражать количество попыток за интервал времени.
Вариант 6
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу протоколирования попыток установки httpсоединения, выводить страницу-заглушку. Виджет должен отражать количество попыток за интервал времени.
Вариант 7
Создать сетевое приложение на BASH с использованием nc, ncat, которое решает задачу протоколирования попыток установки ftp-соеди- нения. Виджет должен отражать количество попыток за интервал времени.
25
КОНТРОЛЬНЫЕ ВОПРОСЫ
1.Запишите адрес локальной петли в виде IPv6.
2.Запишите адрес 212.20.13.18 в виде отражения на адрес IPv6.
3.Запишите MAC-адрес вашего компьютера в виде уникаст-адреса локального канала.
26
4. РАЗРАБОТКА СЕТЕВОГО ПРИЛОЖЕНИЯ НА ЯЗЫКЕ СИ
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Сокет – конечная точка сетевых соединений в стеке протоколов TCP-IP. Процесс любого обмена данными по сети в многозадачной операционной системе сводится к тем или иным операциям с сокетами. Сокет – это точка входа в приложение, осуществляющее обмен данными в сети. Так, если пара IP адрес/маска (или только адрес в сетях IPv6) однозначно определяет узел в сети, то сокет – приложение, которое готово обмениваться данными. Существует три режима операций с сокетами:
•блокирующиеся сокеты;
•асинхронные сокеты;
•низкоуровневые сокеты.
Операции, которые потребуются для объявления сокета и привязки его к процессу, зависят от типа протокола, с помощью которого предполагается организовать соединение. Так, протокол TCP, как наиболее сложный, потребует создания соединения «точка–точка», в котором будут активно участвовать две оконечные точки, способные работать
вдвух режимах:
•режиме сервера;
•режиме клиента.
Для созданияTCP сокетана языкеСипотребуютсяследующиешаги.
• Выполнить инициализацию объекта «Сокет»
#include <sys/types.h> #include <sys/socket.h>
int socket(int domain, int type, int protocol);
Domain – пространство имен и протоколов:
IPV,4 IPV6, loopback.
Наиболее часто используются:
AF_UNIX(AF_LOCAL) – Фс ОS Unix- (локальный сокет) обмен дан-
ными через специальный объект ФС;
27
AF_INET – обмен данными через сетевой стек (в том числе через loopback);
AF_PACKET – низкоуровневый обмен.
• Выполнить объявление сокета
int socket(int domain, int type, int protocol);
Type – указывает способ обмена данными по сети. SOCK_STREAM – протокол TCP, требуется установка соединения.
Может быть использован, только если взаимодействующая сторона SOCK_STREAM с назначаемым IP адресом.
SOCK_DGRAM – протокол UDP, не требует соединения, допускает multicast, brodcast,network адреса.
SOCK_RAW – низкоуровневое формирование ip. Возможна обработка icmp.
Параметры объединяются через ||
SOCK_NONBLOCK – неблокирующий сокет – точка для обслуживания нескольких клиентов из одного треда.
•Заполнить структуру с адресом и выполнить привязку сокета
кIP-адресу и порту:
#include <sys/types.h> #include <sys/socket.h>
int bind(int sockfd, struct sockaddr *addr, int addrlen);
Sockfd – дескриптор сокета, то, что вернула команда socket на предыдущем шаге.
struct sockaddr {
unsigned short sa_family; // Семейство адресов, AF_xxx
char |
sa_data[14]; // 14 байт для хранения адреса |
}; |
|
sa_family |
– идентификатор домена, аналогичный первому пара- |
метру функции socket.
Адрес sa_data -> – указатель на структуру struct sockaddr_in {
short int sin_family; // Семейство адресов
28
unsigned short int sin_port; |
// Номер порта |
|
struct in_addr |
sin_addr; |
// IP-адрес |
unsigned char |
sin_zero[8]; // "Дополнение" до размера струк- |
|
туры sockaddr };
Обратите внимание, что адрес перевернут младшим байтом «вперед»:
struct in_addr { unsigned long s_addr;
};
Следовательно, потребуется преобразование порядка следования байт в словах.
Существует два формата представления адреса: порядок «хоста»
(host byte order) и «сетевой» (net byte order), отличающихся порядком следования старших/младших байт в слове. В сокете API используется сетевой порядок следования, поэтому требуется преобразование.
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);
Для создания серверного сокета потребуется инициализировать очередь запросов на соединение. Сокет прослушивает порт и ожидает нового соединения:
int listen(int sockfd, int sizeoflisten);
sockfd – знакомый нам дескриптор сокета
int sizeoflisten – длина очереди. 1 – всего один клиент сможет подключиться параллельно к сокету
0 – все в порядке – новое соединение готово принимать данные. –1 – произошла ошибка.
Сервер готов обслужить сокет – выполняется функция accept
29
#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
В структуру void *addr будет записан адрес клиента, который установил соединение.
int accept(int sockfd, null, null); – нам совершенно не интересно, «кто». Возврат – дескриптор, с которым можно делать send и receive, или –1.
На стороне клиентского сокета потребуется:
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
где все структуры и параметры нам уже знакомы. Возврат – дескриптор для read и write или –1.
Если не связывать по bind, клиентский сокет автоматически получит номер из пространства 1024–65535. Однако можно привязать и его, если это необходимо.
ОБМЕН ДАННЫМИ С СОКЕТАМИ
Отправка данных
int send(int sockfd, const void *msg, int len, int flags);
flags – манипулирование флагами пакета (например, TOS). Может быть NULL.
Возврат – количество байт, или –1.
Функция send отправит только то количество байт, которое сможет, и совершенно не обязана отправить весь буфер одной посылкой. Возврат 0 не является ошибкой.
Пример функции, которая корректно отправляет данные в сокет: int sendallbuf(int s, char *buf, int len, int flags)
{
int total = 0; int n;
30
