2420x400Сетевое взаимодействие
} else { // Передать файл.
printf(“ 200 OK\n”);
send_string(sockfd, “HTTP/1.0 200 OK\r\n”);
send_string(sockfd, “Server: Tiny webserver\r\n\r\n”);
if(ptr == request + 4) { // Это запрос GET if( (length = get_file_size(fd)) == -1)
fatal(“getting resource file size”);
if( (ptr = (unsigned char *) malloc(length)) == NULL)
fatal(“allocating memory for reading resource”);
read(fd, ptr, length); // Читать файл в память.
send(sockfd, ptr, length, 0); // Отправить в сокет.
free(ptr); // Освободить память файла.
}
close(fd); // Закрыть файл.
} // Конец блока if для файла найден/не найден.
} // Конец блока if для корректного запроса.
} // Конец блока if для корректного HTTP.
shutdown(sockfd, SHUT_RDWR); //
Корректно закрыть сокет}
/* Эта функция принимает дескриптор открытого файла и возвращает
* размер ассоциированного с ним файла. Возвращает -1 при ошибке.
*/
int get_file_size(int fd) {
struct stat stat_struct;
if(fstat(fd, &stat_struct) == -1)
return -1;
return (int) stat_struct.st_size;
}
В функции handle_connection поиск подстроки HTTP/ в буфере запроса выполняет функция strstr(). Функция strstr() возвращает указатель на подстроку, которая должна быть в самом конце запроса. В этом ме- сте строка завершается, а доступными для обработки признаются за- просы HEAD и GET. Запрос HEAD лишь возвращает заголовки, тогда как за- прос GET возвращает и запрашиваемый ресурс (если он найден).
Как показано ниже, в корневой каталог помещаются файлы
index.html и
image.jpg, после чего компилируется программа tinyweb. Чтобы вы- полнить привязку к порту, номер которого меньше 1024, нужны пра- ва суперпользователя, поэтому программе назначаются права setuid root, и она запускается. В режиме отладки сервера показаны результа- ты запроса веб-броузера на
http://127.0.0.1:
reader@hacking:/booksrc $ ls -l webroot/
total 52
-rwxr--r-- 1 reader reader 46794 2007-05-28 23:43 image.jpg
-rw-r--r-- 1 reader reader 261 2007-05-28 23:42 index.html reader@hacking:/booksrc $ cat webroot/index.html
0x420 Сокеты
243
This is a sample webpage
...and here is some sample text
..and even a sample image:
2440x400Сетевое взаимодействие
0x430 Более низкие уровниКогда вы работаете в веб-броузере, обо всех семи уровнях модели OSI уже позаботились вместо вас, и вы можете разгуливать по Сети, не за- думываясь о протоколах. На верхних уровнях OSI многие протоколы могут быть текстовыми, так как все детали соединения скрыты на бо- лее низких уровнях. На уровне сеанса (5) (см. рис. 4.1) есть сокеты, пре- доставляющие интерфейс для передачи данных с одного узла на дру- гой. На транспортном уровне (4) обеспечивается надежность и управ- ление транспортом, а на сетевом уровне (3) IP обеспечивает адреса- цию и передачу пакетов. На канальном уровне (2) Ethernet обеспечива- ет адресацию между портами Ethernet, пригодную для связи в рамках локальной сети (LAN). В самом низу находится физический уровень
(1), состоящий из проводов и протоколов для передачи битов из одного устройства в другое. Отдельное сообщение HTTP оборачивается на не- скольких уровнях, по мере того как его передача задействует разные стороны связи.
Эту процедуру можно представить в виде запутанной бюрократиче-
ской системы движения документов, как в фильме «Brazil». На каждом уровне находится клерк с узкой специализацией, понимающий только язык и протокол этого уровня. При передаче пакета каждый клерк вы- полняет обязанности, предписанные его уровнем, – кладет пакет в кон- верт для внутриофисной переписки, пишет на нем заголовок и переда- ет клерку, находящемуся на следующем уровне. Этот клерк в свою оче- редь выполняет обязанности своего уровня, кладет конверт целиком внутрь другого конверта, пишет снаружи заголовок и передает следу- ющему клерку.
Сетевой трафик – это болтливая бюрократия серверов, клиентов и од- норанговых соединений. На более высоком уровне трафик может со- стоять из финансовых данных, электронной почты и практически чего угодно. Независимо от содержимого пакетов протоколы нижнего уров- ня для передачи данных из пункта А в пункт Б обычно одни и те же. Ра- зобравшись с офисной бюрократией стандартных протоколов нижних уровней, вы сможете заглядывать в передаваемые пакеты и даже под- делывать документы, чтобы манипулировать системой.
0x431 Канальный уровеньСамый нижний из видимых уровней – канальный. Если вернуться к аналогии с клерками и бюрократией и сравнить нижний физический уровень с тележками, на которых почта развозится по офису, то сетевой уровень можно уподобить международной почтовой системе, а каналь- ный – внутриофисной. Этот уровень предоставляет средства адресации и отправки почты любому сотруднику офиса, а
также возможность вы- яснить, кто находится в офисе в данный момент.
0x430 Более низкие уровни
245
На этом уровне располагается Ethernet, обеспечивая стандартную си- стему адресов для всех Ethernet-устройств. Такой адрес называют адресом управления доступа к среде передачи (Media Access Control,
MAC), или MAC-адресом. Каждому Ethernet-устройству присваива- ется глобально уникальный адрес из шести байт, обычно записывае- мый в шестнадцатеричном формате xx:xx:xx:xx:xx:xx. MAC-адрес ино- гда называют также аппаратным адресом, потому что он уникален для каждого аппаратного устройства и хранится в его интегральной схеме памяти. MAC-адрес можно рассматривать как номер системы социаль- ного страхования для устройства, потому что каждое устройство долж- но иметь уникальный MAC-адрес.
Ethernet-заголовок имеет размер 14 байт и содержит MAC-адреса от- правителя и получателя Ethernet-пакета. Среди Ethernet-адресов есть также специальный широковещательный адрес, состоящий из одних двоичных единиц (ff:ff:ff:ff:ff:ff). Любой Ethernet-пакет, отправ- ленный на этот адрес, будет послан всем подключенным к сети устрой- ствам.
MAC-адрес устройства в сети неизменен, а его IP-адрес может регуляр- но изменяться. Понятия IP-адреса на этом уровне нет – есть только ап- паратные адреса, поэтому необходимо каким-то образом связать эти две схемы адресации. В офисе почта, посланная работнику на его слу- жебный адрес, попадает на нужный стол. В Ethernet применяется ме- тод, названный протоколом разрешения адресов (Address Resolution
Protocol, ARP).
Этот протокол позволяет создавать «схемы размещения сотрудников», чтобы связать IP-адрес с аппаратным устройством. В ARP есть четыре типа разных сообщений, но наиболее важны два – ARP-запрос и ARP-
ответ. В Ethernet-заголовке любого пакета есть указатель типа этого пакета. Этот тип указывает, чем является данный пакет – сообщением
ARP или IP-пакетом.
ARP-запрос – это сообщение, посылаемое по широковещательному адресу, содержащее IP-адрес и MAC-адрес отправителя и, по суще- ству, говорящее: «Эй, есть здесь кто-нибудь вот с таким IP-адресом?
Если есть, ответьте мне, пожалуйста, и сообщите свой MAC-адрес».
ARP-ответ – это соответствующее сообщение, отправляемое по ука- занному MAC-адресу (и IP-адресу), в котором говорится: «Вот мой
MAC-адрес, и этот IP-адрес принадлежит мне». В большинстве реали- заций пары адресов MAC/IP, полученные из ARP-ответов, временно кэшируются, чтобы не посылать ARP-запросы и ARP-ответы для каж- дого отдельного пакета. Такие буферы аналогичны схемам размеще- ния сотрудников офиса.
Например, если у одной системы IP-адрес 10.10.10.20 и MAC-адрес
00:00:00:aa:aa:aa
, а у другой системы в той же сети IP-адрес 10.10.10.50 и MAC-адрес 00:00:00:bb:bb:bb, то эти системы не смогут общаться меж- ду собой, пока не узнают MAC-адреса друг друга (рис. 4.4).
2460x400Сетевое взаимодействие
Вторая система
IP: 10.10.10.50MAC: 00:00:00:bb:bb:bbARPответ «10.10.10.50 у 00: 00: 00: bb: bb: bb»
ARPзапрос«У кого адрес 10.10.10.50?»
MAC отправителя:MAC получателя:00:00:00:aa:aa:aaff:ff:ff:ff:ff:ffMAC отправителя:MAC получателя:00:00:00:bb:bb:bb00:00:00:aa:aa:aaПервая система
IP: 10.10.10.20MAC: 00:00:00:aa:aa:aaРис. 4.4. Распознавание IP-адреса Если первая система желает установить TCP-соединение по IP со вто- рым устройством с IP-адресом 10.10.10.50, то первая система снача- ла поищет в своем ARP-кэше запись для 10.10.10.50. Так как это пер- вая попытка двух данных систем соединиться, то
такой записи не ока- жется, и по широковещательному адресу будет послан ARP-запрос, суть которого такова: «Если ты 10.10.10.50, ответь мне, пожалуйста, на
00:00:00:aa:aa:aa
».
Поскольку этот запрос отправляется с широковещательным адресом, его видят все системы в сети, но ответить должна только система, име- ющая заданный IP-адрес. В данном случае вторая система генерирует и отправляет прямо указанному 00:00:00:aa:aa:aa ARP-ответ, в котором говорится: «Я 10.10.10.50, и мой MAC-адрес 00:00:00:bb:bb:bb». Первая система, получив этот ответ, кэширует IP- адрес и MAC-адрес в своем
ARP-кэше и использует для связи аппаратный адрес.
0x432 Сетевой уровеньСетевой уровень можно сравнить с международным почтамтом: он описывает способ адресации и доставки, позволяющий посылать от- правления в любое место. Действующий на этом уровне протокол адре- сации и доставки в Интернете так и называется – интернет-протокол
(Internet Protocol, IP). В большей части Интернета применяется IP вер- сии 4.
У каждой системы в Интернете есть IP-адрес. Его составляет группа из четырех байт хорошо известного вида xx.xx.xx.xx. IP-заголовки пакетов этого уровня имеют размер 20 байт и состоят из полей и битовых фла- гов, описанных в RFC 791.
0x430 Более низкие уровни
247Фрагмент RFC 791[Стр. 10]
Сентябрь 1981
Internet Protocol
3. Спецификация
3.1. Формат заголовка IP
Заголовок дейтаграмм IP имеет следующий вид (рисунок 4):
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Каждая позиция соответствует одному биту
1
Эта весьма наглядная ASCII-диаграмма показывает поля и их место в заголовке. Стандартные протоколы прекрасно документированы.
Как и в Ethernet-заголовке, в IP-заголовке есть поле протокола, опи- сывающее тип данных в пакете, а также адреса отправителя и полу- чателя для маршрутизации. Кроме того, в заголовке есть контрольная сумма, помогающая выявить ошибки передачи, и поля для управления фрагментацией пакетов.
IP используется в основном для передачи пакетов, формируемых на более высоких уровнях. Однако на этом уровне существуют пакеты межсетевого протокола управляющих сообщений (Internet Control
Message Protocol, ICMP). Пакеты ICMP применяются для передачи со- общений и диагностики. IP менее надежен, чем почта, поскольку до- ставка IP-пакета конечному адресату не гарантируется. Если возни- кают трудности, то получатель уведомляет о них отправителя посред- ством ICMP-пакета.
1
Version – версия, IHL – размер заголовка, Type of Service – тип сервиса,
Total Length – общая длина, Identification – идентификационный номер,
Flags – флаги, Fragment Offset –
смещение фрагмента, Time to Live – мак- симальный срок существования, Protocol – протокол, Header Checksum – контрольная сумма полей заголовка, Source Address – адрес отправителя,
Destination Address – адрес получателя, Options – параметры, Padding – до- полнение пробелами. –
Прим. перев. 2480x400Сетевое взаимодействие
С помощью ICMP часто проверяют возможность связи. ICMP-сообщения
Echo Request и Echo Reply используются в утилите
ping. Если один узел хочет проверить, может ли он маршрутизировать трафик другому узлу, то посылает ему через ping ICMP-сообщение Echo Request. Удаленный узел, получив Echo Request, посылает обратно ICMP-пакет Echo Reply.
Эти сообщения позволяют определить задержку при прохождении дан- ных между узлами. Важно, однако, помнить, что как ICMP, так и IP не устанавливают соединение: протоколы этого уровня лишь старают- ся доставить пакет адресату.
Иногда в сетях есть ограничения на размер пакетов, и передача боль- ших пакетов запрещена. IP справляется с такой ситуацией, фрагмен- тируя пакеты, как показано на рис. 4.5.
Заголовок
Данные
Продолжение данных
Еще данные
Большой пакет IP
Пакетыфрагменты
Заголовок
Данные
Заголовок
Продолжение данных
Заголовок
Еще данные
Рис. 4.5. Фрагментация пакетаБольшой пакет разбивается на более мелкие, способные пройти че- рез участок сети с ограничением, к каждому фрагменту добавляется
IP-заголовок, после чего фрагмент отправляется. В заголовке каждого фрагмента содержится величина его смещения. Адресат, получивший фрагменты, по этим значениям смещений воссоздает большой IP-пакет.
Такие функции, как фрагментация, способствуют доставке IP-пакетов, но они никак не связаны с поддержкой соединений или гарантирован- ной доставкой. Эту работу выполняют протоколы транспортного уровня.
0x433 Транспортный уровеньТранспортный уровень можно рассматривать как первую шерен- гу клерков, забирающих почту с сетевого уровня. Если клиент хочет вернуть дефектный товар, он посылает сообщение с запросом номера разрешения на возврат (Return Material Authorization, RMA). Затем клерк,
следуя протоколу возврата, просит квитанцию и в итоге выда- ет покупателю номер RMA, с которым тот может отослать товар. Почту
0x430 Более низкие уровни
249
интересует только пересылка этих сообщений (и пакетов) туда и обрат- но, а не их содержимое.
Два главных протокола этого уровня – протокол управления переда- чей (Transmission Control Protocol, TCP) и протокол дейтаграмм поль- зователя (User Datagram Protocol, UDP). TCP чаще всего применяет- ся интернет-службами: telnet, HTTP (протокол веб-страниц), SMTP
(почтовый протокол) и FTP (передача файлов) основаны на TCP. Одна из причин популярности TCP в том, что он обеспечивает прозрачное и при этом надежное двунаправленное соединение между двумя IP- адресами.
Двунаправленное соединение в TCP похоже на разговор по телефону: после набора номера устанавливается соединение, позволяющее або- нентам на обоих его концах общаться друг с другом. Надежность под- разумевает, что TCP обеспечивает доставку данных адресату в пра- вильном порядке. Если пакеты при передаче перемешаются и посту- пят в беспорядке, TCP обеспечит их правильный порядок для переда- чи на следующий уровень. Если какие-то пакеты окажутся утрачен- ными, получатель придержит свои пакеты, пока отправитель не пере- даст отсутствующие пакеты заново.
Все эти функции осуществляются с помощью ряда флагов TCP и от- слеживания порядковых номеров пакетов. TCP использует следующие флаги:
Флаг TCP
Смысл
Назначение
URG
Urgent
Указывает на важные данные
ACK
Acknowledg ment
Подтверждает соединение; включен на протяжении большей части соединения
PSH
Push
Приказывает получателю передать данные сразу без буферизации
RST
Reset
Сбрасывает соединение в исходное состояние
SYN
Synchronize
Синхронизирует порядковые номера в начале соединения
FIN
Finish
Корректно закрывает соединение, когда участники связи прощаются друг с другом
Эти флаги хранятся в заголовке TCP вместе с портами отправителя и получателя. Заголовок TCP описан в RFC 793.
2500x400Сетевое взаимодействие
Фрагмент RFC 793[Стр. 14]
Сентябрь 1981
Transmission Control Protocol
3. Спецификация для функций протокола
3.1. Формат заголовка
Передача сегментов TCP осуществляется в виде интернет-дейтаграмм. IP- заголовок
содержит несколько информационных полей, включая адреса узлов отправителя и получателя [2]. TCP-заголовок следует за IP-заголовком и дополняет его информацией, специфичной для протокола TCP. Такое деление допускает использование на уровне узлов протоколов, отличных от TCP.
Формат заголовка TCP (рисунок 3):
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Каждая метка указывает здесь место для соответствующего бита
1
Порядковый номер очереди и номер подтверждения служат для сохра- нения состояния. Флаги SYN и ACK используются для открытия сое- динения в трехшаговой процедуре. Клиент, собираясь открыть соеди- нение с сервером, посылает ему пакет, в котором установлен флаг SYN и сброшен флаг ACK. Сервер отвечает пакетом, в котором установле-
1
Source Port – порт отправителя, Destination Port – порт получателя,
Sequence Number – порядковый номер, Acknowledgment Number – номер подтверждения, Data Offset – смещение данных, Reserved – резервное поле, контрольные биты (URG – поле срочного указателя задействовано, ACK – поле подтверждения задействовано, PSH – функция проталкивания, RST – перезагрузка данного соединения, SYN – синхронизация номеров очереди,
FIN – данных для передачи больше нет), Window – окно, Checksum - кон- трольная сумма, Urgent Pointer – срочный указатель, Options – параметры,
Padding –
дополнение пробелами, data – данные. –
Прим. перев.
0x430 Более низкие уровни