Ну вроде все работает,начнем))
Рассказывать буду напримере IP.
Первым делом идем к гуглю и спрашиваем RFC IP.
Выдает нам что rfc ip протокола номер 791.
Если траблы с английским,то ищем "RFC 791 на русском".
Идем по первой попавшейся ссылке.
Ссылка скрыта от гостей
Если вы мазохист или же нужно досконально разобраться в протоколе,то читаем все.
Находим структуру заголовка.
Там вот такая бодяга.
Код:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Как написано,каждая позиция соответствует одному биту.
Можно читать,а можно и самому крестики/плюсики считать.
Для начала объявим структуру,пока что пустую.
Ну например так.
Первым у нас идет поле Version,и занимает оно у нас 4 бита.
Version (версия) 4 бита
Поле версии показывает формат заголовка Internet. Данный документ
описывает версию 4.
Значит нам нужно поле в 4 бита.
Код:
struct ip_header
{
unsigned int version: 4;
}
имя можно задавать любое,какое душе угодно,главное чтобы размер подходил.
Далее идет поле IHL,тоже 4 бита.
IHL (длина Internet заголовка) 4 бита
Длина Internet заголовка измеряется в словах по 32 бита каждый и
указывает на начало поля данных. Заметим, что корректный заголовок
может иметь минимальный размер 5 слов.
Дополняем нашу структуру:
Код:
struct ip_header
{
unsigned int version: 4;
unsigned int ihl: 4;
}
Далее у нас идет Type of Service-8 бит.
Для этого поля лучше создать свою структуру
Type of Service (тип сервиса) 8 бит
Тип сервиса определяет с помощью неких абстрактных параметров тип
требуемого обслуживания. Эти параметры должны использоваться для
управления выбором реальных рабочих характеристик при передаче
датаграммы через конкретную сеть. Некоторые сети осуществляют
обслуживание с приоритетом, которое неким образом дает преимущество
для продвижения данной датаграммы по сравнению со всеми остальными.
Реально выбор осуществляется между тремя альтернативами: малой
задержкой, высокой достоверностью и высокой пропускной способностью.
биты 0-2 приоритет
бит 3 0 - нормальная задержка, 1 - малая задержка
бит 4 0 - нормальная пропускная способность,
1 - высокая пропускная способность
бит 5 0 - обычная достоверность, 1 - высокая достоверность
биты 6-7 зарезервированы
0 1 2 3 4 5 6 7
+-----+-----+-----+-----+-----+-----+-----+-----+
| приоритет | D | T | R | 0 | 0 |
+-----+-----+-----+-----+-----+-----+-----+-----+
Разъяснять написание структуры уж не буду,просто приведу ее в конце.
Структура так и будет называться TypeOfService;
Дополняем структуру IP заголовка.
Код:
struct ip_header
{
unsigned int version: 4;
unsigned int ihl: 4;
struct TypeOfService typeServ;
}
Total Length,Identification.
Оба по 16 бит,то есть два байта.
Total Length (общая длина) 16 бит
Общая длина - это длина датаграммы, измеренная в октетах, включая
Internet заголовок и поле данных. Это поле может задавать длину
датаграммы вплоть до 65535 октетов. В большинстве хост-компьютеров и
сетей столь большие датаграммы не используются. Все хосты должны быть
готовы принимать датаграммы вплоть до 576 октетов длиной (приходят ли
они целиком или по фрагментам). Хостам рекомендуется отправлять
датаграммы размером более чем 576 октетов, только если они уверены,
что принимающий хост готов обслуживать датаграммы повышенного
размера.
Значение 576 выбрано с тем, чтобы соответсвующим образом
ограниченный блок данных передавался вместе с требуемой информацией в
заголовке. Например, этот размер позволяет заполнять датаграмму полем
данных размером в 512 октетов и заголовком в 64 октета. Наибольший
Internet заголовок занимает 60 октетов, а его типичный размер
составляет всего 20 октетов, что оставляет место под заголовки
протоколов более высокого уровня.
Identification (идентификатор) 16 бит
Идентификатор устанавливается отправителеим для сборки фрагментов
какой-либо датаграммы.
А два байта у нас занимает тип short.
Дописываем
Код:
struct ip_header
{
unsigned int version: 4;
unsigned int ihl: 4;
struct TypeOfService typeServ;
short length;
short id;
}
Далее поле Flags,занимает 3 бита.В переводе RFC по ссылке,которую я дал
ошибка,там написано 16 бит.На самом деле 3.
Flags (различные управляющие флаги) 3 бита
бит 0 зарезервирован, должен быть нуль
бит 1 (DF) 0 - возможно фрагментирование, 1 - запрет фрагментации
бит 2 (MF) 0 - последний фрагмент, 1 - будут еще фрагменты
0 1 2
+----+----+----+
| 0 | DF | MF |
+----+----+----+
Дорисываем в структуру еще одно значение.
unsigned int везде пишу не по каким-то правилам,а так,от балды :huh:
Далее:
Fragment Offset (смещение фрагмента) 13 бит
Это поле показывает, где в датаграмме находится этот фрагмент.
Смещение фрагмента изменяется порциями по 8 октет (64 бита). Первый
фрагмент имеет смещение нуль.
Код:
unsigned short offset: 13;
Далее у нас идет время жизни в размере 8 бит или одного байта.
Time to Live (Время жизни) 8 бит
Это поле показывает максимальное время, в течении которого датаграмме
позволено находиться в системе Internet. Если это поле имеет значение
нуль, то датаграмма должна быть разрушена. Значение этого поля
изменяется при обработке заголовка Internet. Время измеряется в
секундах. Однако, поскольку каждый модуль, обрабатывающий датаграмму,
должен уменьшать значение поля TTL по крайней мере на единицу, даже
если он обрабатываетт эту датаграмму менне, чем за секунду, то поле
TTL следует понимать как максимальный интервал времени, в течении
которого датаграмма может сущенствовать. Внимание следует обратить на
разрушение датаграмм, не могущих достигнуть получателя, а также на
ограничение времени жизни датаграммы.
Подойдет тип char.
Дописываем.
Далее идет протокол в размере 8 бит,протоколы описаны в документе "Assigned Numbers".
В сети не составит труда его найти.
Protocol (Протокол) 8 бит
Это поле показывает, какой протокол следующего уровня использует
данные из Internet датаграммы. Значения для различных протоколов
приводятся в документе "Assigned Numbers" [9].
Header Checksum (Контрольная сумма заголовка) 16 бит
Поскольку некоторые поля заголовка меняют свое значение (например,
время жизни), это значение проверяется и повторно рассчитывается при
каждой обработке Internet заголовка.
Алгоритм контрольной суммы следующий:
Поле контрольной суммы - это 16 бит, дополняющие биты в сумме всех
16 битовых слов заголовка. Для вычисления контрольной суммы
значение этого поля устанавливается в нуль.
Контрольную сумму легко рассчитать и опытным путем доказать ее
адекватность, однако это временная мера и должна быть заменена CRC
процедурой в зависимости от дальнейшего опыта.
Дописываем поле для контрольной суммы.
Далее идут адреса отправителя и получателя.
Source Address (адрес отправителя) 32 бита
Destination Address (адрес получателя) 32 бита
Здесь не будем ничего придумывать своего,а исполльзуем уже определенную структуру
для IP адресов.
Код:
struct in_addr source_addr;
struct in_addr dest_addr;
Ну вот и все,далее идут опции,поле переменной длины,
тут уж разбирайся сам,впринципе ничего сложного нет,по аналогии
составляешь структуру,можно в нете найти,если неохота изобретать велосипед.
Ну и в конце привожу,как все это выглядит вместе.
Код:
struct TypeOfService
{
unsigned int Priority: 3;
unsigned int D: 1;
unsigned int T: 1;
unsigned int R: 1;
unsigned int reserved:2;
}
struct ip_header
{
unsigned int version: 4;
unsigned int ihl: 4;
struct TypeOfService typeServ;
unsigned short length;
unsigned short id;
unsigned int flags:3;
unsigned short offset: 13;
unsigned char timeLive;
unsigned char proto;
unsigned short ckeksum;
struct in_addr source_addr;
struct in_addr dest_addr;
}
Ну вот такой маленький тутор получился.
Так как в будущем планирую открыть свою хом пагу,
то поставлю на всякий случай копирайт))).
зы.Обычно я под другим ником,просто тут так зарегился)).
©btrfly, 2008;