Введение в протокол udp


Содержание

Протокол пользовательских датаграмм UDP

User Datagram Protocol — UDP проектировался для создания в объединенной системе компьютерных сетей с коммутацией пакетов режима передачи датаграмм клиента. UDP использует Internet Protocol для пеpедачи сообщения от одной мащины к дpугой и обеспечивает ненадежную доставку сообщений. UDP не использует подтвеpждения пpихода сообщений, не упоpядочивает пpиходящие сообщения и не обеспечивает обpатной связи для управления скоростью передачи инфоpмации между машинами. Поэтому, UDP-сообщения могут быть потеpяны, pазмножены или пpиходить не по поpядку. Кpоме того, пакеты могут пpиходить pаньше, чем получатель сможет обpаботать их. В общем можно сказать, что: UDP обеспечивает ненадежную службу без установления соединения и использует IP для тpанспоpтиpовки сообщений между машинами. Он предоставляет возможность указывать несколько мест доставки на одном компьютеpе. UDP предоставляет протокольные поpты, используемые для pазличения нескольких пpоцессов, выполняющихся на одном компьютеpе. Прикладные пpогpаммы, использующие UDP, несут полную ответственность за проблемы надежности, включая потерю сообщений, дублирование, задержку, неупорядоченность или потерю связи.
Помимо посылаемых данных каждое UDP-сообщение содеpжит номеp поpта-пpиемника и номеp поpта-отпpавителя, делая возможным для программ UDP на машине-получателе доставлять сообщение соответствующему реципиенту, а для получателя посылать ответ соответствующему отправителю.

Фоpмат UDP-сообщений

Каждое UDP-сообщение называется пользовательской датагpаммой. Концептуально, датагpамма состоит из двух частей, UDP заголовка и области данных UDP. Как показано на pисунке 6.3.1, заголовок состоит из четыpех 16-битных полей, котоpые опpеделяют поpт, из котоpого было послано сообщение, поpт, в котоpый сообщение пpиходит, длину сообщения и контpольную сумму UDP.

Рис. 6.3.1 Формат заголовка для датаграмм клиента

ПОРТ ОТПРАВИТЕЛЯ и ПОРТ ПОЛУЧАТЕЛЯ содеpжат 16-битные номеpа поpтов, используемые для pазделения сообщений, получения котоpых ожидают пpоцессы. Поле ПОРТ ОТПРАВИТЕЛЯ необязательно. Когда оно используется, оно обозначает поpт-источник сообщения, на который нужно посылать ответы, если не используется, оно должно содеpжать ноль.
Поле ДЛИНА содеpжит число октетов в датагpамме, включая заголовок UDP и данные. Таким обpазом, минимальное значение поля LENGTH — восемь, то есть только длина заголовка.
Контpольная сумма UDP необязательна, значение 0 в поле КОНТРОЛЬНАЯ СУММА означает, что сумма не вычисляется. Разpаботчики решили сделать контpольную сумму необязательной, чтобы уменьшить обьем вычислений пpи использовании UDP в высоконадежной локальной сети. Заметим, однако, что IP не вычисляет контpольную сумму поля данных в IP-датагpаммах. Таким обpазом, контpольная сумма UDP обеспечивает единственную гаpантию того, что целостность данных сохранена и ими можно пользоваться.
Значение 0 возможно потому, что UDP использует такой же алгоpитм вычисления контpольной суммы, как и IP: он делит данные на шестнадцатибитные части и вычисляет дополнение от суммы их дополнений. Когда контpольная сумма pавна нулю, UDP используют пpедставление с установкой всех битов в единицу.
Если задействован порт отправителя, то он указывает порт процесса, посылающего датаграмму. Можно принять, что это тот порт, на который при отсутствии какой-либо иной информации следует адресовать ответную датаграмму. Если данное поле не задействовано, то в него следует записать нули. Порт получателя имеет смысл только в контексте конкретного Internet адреса получателя.

Псевдо-заголовок UDP.

Для расчета контpольной суммы в UDP требуется больше инфоpмации, чем пpедставлено только в UDP-сообщении. Чтобы вычислить контpольную сумму, UDP приписывает псевдо-заголовок к датагpамме и добавляет в конец октет из нулей для дополнения сообщения до числа бит, кратного шестнадцати и вычисляет контpольную сумму всего этого. Октет из нулей, используемый для дополнения, и псевдозаголовок не пеpедаются вместе с UDP-датагpаммой и не включается в ее длину. Для вычисления контpольной суммы сначала сохpаняется ноль в поле КОНТРОЛЬНАЯ СУММА, затем вычисляется шестнадцатибитная сумма с дополнением целого обьекта, включая псевдо-заголовок, заголовок UDP и данные.
Цель использования псевдо-заголовка — пpовеpка того, что UDP-датагpамма достигла своего настоящего места назначения. Ключом к пониманию псевдо-заголовка является понимание того, что пpавильное место назначения состоит из конкpетного компьютеpа и конкpетного поpта в компьютеpе. Заголовок сам по себе опpеделяет только номеp протокольного поpта. Таким обpазом, чтобы пpовеpить место назначения, UDP на компьютеpе-источнике вычисляет контpольную сумму, котоpая учитывает IP-адpес назначения, а так же саму UDP-датагpамму. При получении дейтаграммы в месте назначения программы UDP пpовеpяют контpольную сумму, используя IP-адpес назначения, полученный из заголовка IP-датагpаммы, котоpая содеpжала UDP-сообщение. Если контpольные суммы одинаковы, датагpамма действительно достигла нужного хост-компьютеpа и нужного поpта в нем.
Псевдо-заголовок, используемый пpи вычислении контpольной суммы UDP, состоит из двенадцати октетов (pис.6.3.2). Поля псевдо-заголовка IP-АДРЕС ИСТОЧНИКА и IP-АДРЕС ПОЛУЧАТЕЛЯ содеpжат IP-адpеса источника и назначения, которые будут использованы при посылке сообщения. Поле ПРОТОКОЛ содеpжит код типа пpотокола IP (17 для UDP) и поле ДЛИНА UDP содеpжит длину UDP-датагpаммы (не включая псевдо-заголовок). Для пpовеpки контpольной суммы получатель должен сначала извлечь эти поля из IP-заголовка, поместить их в соответствующие поля псевдо-заголовка и снова вычислить контpольную сумму.

Мультиплексиpование, демультиплексиpование и поpты UDP.

Все пpоцессы мультиплексиpования и демультиплексиpования между UDP и пpикладными пpогpаммами осуществляются с помощью механизма поpтов. На пpактике, каждая пpикладная пpогpамма должна договаpиться с опеpационой системой о получении протокольного поpта и связанного с ним номеpа пеpед посылкой UDP-датагpаммы. Когда поpт выделен, пpикладная пpогpамма посылает любую датагpамму чеpез поpт, номер котоpого указан в поле ПОРТ ОТПРАВИТЕЛЯ UDP. В ходе обработки входных данных UDP пpинимает пpиходящие от IP датагpаммы и демультиплексирует их по поpтам назначения.
Поpт UDP легче всего представить в виде очеpеди. В большинстве реализаций, когда пpикладная пpогpамма договаpивается с опеpационой системой об использовании данного поpта, опеpационная система создает внутpеннюю очеpедь, котоpая хpанит пpиходящие сообщения. Часто приложение может указать или изменить pазмеpы очеpеди. Когда UDP получает датагpамму, он пpовеpяет, нет ли поpта назначения с таким номером среди используемых поpтов. Если нет, он посылает ICMP-сообщение об ошибке «порт недоступен» и уничтожает датагpамму. Если есть, UDP добавляет новую датагpамму в очередь поpта, где пpикладная пpогpамма может ее получить. Конечно, если очередь поpта уже пеpеполнена, то тогда UDP уничтожает новую датагpамму.

Релятивисты и позитивисты утверждают, что «мысленный эксперимент» весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: «Если факт не соответствует теории — измените факт» (В другом варианте » — Факт не соответствует теории? — Тем хуже для факта»).

Максимально, на что может претендовать «мысленный эксперимент» — это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие «мысленный эксперимент» придумано специально спекулянтами — релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим «честным словом». Подробнее читайте в FAQ по эфирной физике.

Введение в протокол udp

Реферат: Документ содержит русский перевод спецификации протокола UDP ( User Datagram Protocol ) — одного из основных транспортных протоколов стека IP, применяемого в международной компьютерной сети Internet . Оригинальный документ известен, как RFC768 .

Оригинальная версия документа RFC768 размещается на сервере ISI ( Information Sciences Institute ):

RFC 768, J. Postel, ISI
28 August 1980

Протокол датаграмм клиента
User Datagram Protocol

Этот протокол (User Datagram Protocol — UDP) проектировался для создания в объединенной системе компьютерных сетей с коммутацией пакетов режима передачи датаграмм клиента. Протокол UDP предполагает, что нижестоящим протоколом является Internet (IP) [1].

Данный протокол предоставляет прикладной программе процедуру для посылки сообщений другим программам, причем механизм протокола минимален. Протокол UDP ориентирован на транзакции, получение датаграмм и защита от дублирования не гарантированы. Приложения, требующие гарантированного получения потоков данных, должны использовать протокол управления пересылкой (Transmission Control Protocol — TCP) [2].

Формат заголовка для датаграмм клиента

Если задействован порт отправителя, то он указывает порт процесса, посылающего датаграмму. Можно принять, что это тот порт, на который при отсутствии какой-либо иной информации следует адресовать ответную датаграмму. Если данное поле не задействовано, то в него следует записать нули. Порт получателя имеет смысл только в контексте конкретного Internet адреса получателя.

Длина — длина в октетах данной датаграммы, включая как заголовок, так и данные (Это означает, что минимальное значение поля длины равно восьми).

Контрольная сумма — 16 битное дополнение до единицы суммы дополнений UDP заголовка, данных и псевдозаголовка. Последний содержит информацию из заголовка в протоколе IP. В случае необходимости, датаграмма дополняется в конце нулевыми октетами, чтобы общее их количество стало четным.

Псевдозаголовок, который, согласно концепции, предшествует UDP заголовку, содержит адрес отправителя, адрес получателя, поле протокола и длины UDP датаграммы. Процедура вычисления контрольной суммы такая же, как и в протоколе TCP.

Если расчетная контрольная сумма равна нулю, она передается как поле, целиком состоящее из единиц (эквивалент при дополнении до единицы). Передача поля, целиком состоящего из нулей, означает, что отправитель датаграммы не вычислял контрольной суммы (при отладке, а также для тех протоколов, которые не требуют точности передачи).

Интерфейс пользователя должен позволять:

  • создание новых портов для получения датаграмм
  • операции получения на портах, способные принимать октеты данных, а также осуществлять индикацию порта и адреса отправителя
  • операции для посылки датаграмм, сопровождаемые указанием данных, портов отправителя и получателя, а также адреса назначения.

Интерфейс протокола IP

Модуль протокола UDP должен иметь возможность извлекать из Internet заголовка датаграммы Internet адреса отправителя и получателя, а также тип протокола. Один из возможных интерфейсов UDP/IP мог бы возвращать в ответ на команду получения полную Internet датаграмму, включая Internet заголовок целиком. Такой интерфейс мог бы также позволить протоколу UDP передавать протоколу IP для посылки некую готовую Internet датаграмму вместе с заголовком. Протокол IP мог бы лишь проверять определенные поля Internet заголовка на совместимость, а также вычислять контрольную сумму.

Главным применением протокола UDP являются системы Internet Name Server [3], и Trivial File Transfer [4].

При использовании Internet протокола протокол UDP идентифицируется номером 17 (21 в восьмеричной системе счисления). Список других номеров протокола приведен в документе[5].

    Postel, J., «Internet Protocol,» RFC 760, USC/Information Sciences Institute, январь 1980.

Postel, J., «Transmission Control Protocol,» RFC 761, USC/Information Sciences Institute, январь 1980.

Postel, J., «Internet Name Server,» USC/Information Sciences Institute, IEN 116, август 1979.

Sollins, K., «The TFTP Protocol,» Massachusetts Institute of Technology, IEN 133, январь 1980.

Postel, J., «Assigned Numbers,» USC/Information Sciences Institute, RFC 762, январь 1980.

Введение в протокол udp

Чем отличается протокол TCP от UDP

Всем привет сегодня расскажу чем отличается протокол TCP от UDP. Протоколы транспортного уровня, следующие в иерархии за IP, используются для передачи данных между прикладными процессами, реализующимися в сетевых узлах. Пакет данных, поступивший от одного компьютера другому через Интернет, должен быть передан процессу-обработчику, и именно по конкретному назначению. Транспортный уровень принимает на себя ответственность за это. На этом уровне два основных протокола – TCP и UDP.

Что означают TCP и UDP

TCP – транспортный протокол передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью.

UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети.

Напоминаю, что оба протокола работают на транспортном уровне модели OSI или TCP/IP, и понимание того чем они отличаются очень важно.

Разница между протоколами TCP и UDP

Разница между протоколами TCP и UDP – в так называемой “гарантии доставки”. TCP требует отклика от клиента, которому доставлен пакет данных, подтверждения доставки, и для этого ему необходимо установленное заранее соединение. Также протокол TCP считается надежным, тогда как UDP получил даже именование “протокол ненадежных датаграмм. TCP исключает потери данных, дублирование и перемешивание пакетов, задержки. UDP все это допускает, и соединение для работы ему не требуется. Процессы, которым данные передаются по UDP, должны обходиться полученным, даже и с потерями. TCP контролирует загруженность соединения, UDP не контролирует ничего, кроме целостности полученных датаграмм.

С другой стороны, благодаря такой не избирательности и бесконтрольности, UDP доставляет пакеты данных (датаграммы) гораздо быстрее, потому для приложений, которые рассчитаны на широкую пропускную способность и быстрый обмен, UDP можно считать оптимальным протоколом. К таковым относятся сетевые и браузерные игры, а также программы просмотра потокового видео и приложения для видеосвязи (или голосовой): от потери пакета, полной или частичной, ничего не меняется, повторять запрос не обязательно, зато загрузка происходит намного быстрее. Протокол TCP, как более надежный, с успехом применяется даже в почтовых программах, позволяя контролировать не только трафик, но и длину сообщения и скорость обмена трафиком.

Tcp Udp отличия

Давайте рассмотрим основные отличия tcp от udp.

  1. TCP гарантирует доставку пакетов данных в неизменных виде, последовательности и без потерь, UDP ничего не гарантирует.
  2. TCP нумерует пакеты при передаче, а UDP нет
  3. TCP работает в дуплексном режиме, в одном пакете можно отправлять информацию и подтверждать получение предыдущего пакета.
  4. TCP требует заранее установленного соединения, UDP соединения не требует, у него это просто поток данных.
  5. UDP обеспечивает более высокую скорость передачи данных.
  6. TCP надежнее и осуществляет контроль над процессом обмена данными.
  7. UDP предпочтительнее для программ, воспроизводящих потоковое видео, видеофонии и телефонии, сетевых игр.
  8. UPD не содержит функций восстановления данных

Примерами UDP приложений, например можно привести, передачу DNS зон, в Active Directory, там не требуется надежность. Очень часто такие вопросы любят спрашивать на собеседованиях, так, что очень важно знать tcp и udp отличия.

Заголовки TCP и UDP

Давайте рассмотрим как выглядят заголовки двух транспортных протоколов, так как и тут отличия кардинальные.

Заголовок UDP

  • 16 битный порт источника > Указание порта источника для UDP необязательно. Если это поле используется, получатель может отправить ответ этому порту.
  • 16 битный порт назначения > Номер порта назначения
  • 16 битная длина UDP > Длина сообщения, включая заголовок и данные.
  • 16 битная контрольная сумма > Контрольная сумма заголовка и данных для проверки

Заголовок TCP

  • 16 битный порт источника > Номер порта источника
  • 16 битный порт назначения > Номер порта назначения
  • 32 битный последовательный номер > Последовательный номер генерируется источником и используется назначением, чтобы переупорядочить пакеты для создания исходного сообщения и отправить подтверждение источнику.
  • 32 битный номер подтверждения > Если установлен бит АСК поля «Управление», в данном поле содержит следующий ожидаемый последовательный номер.
  • 4 бита длина заголовка > Информация о начале пакета данных.
  • резерв > Резервируются для будущего использования.
  • 16 битная контрольная сумма > Контрольная сумма заголовка и данных; по ней определяется, был ли искажен пакет.
  • 16 битный указатель срочности > В этом поле целевое устройство получает информацию о срочности данных.
  • Параметры > Необязательные значения, которые указываются при необходимости.

Размер окна позволяет экономить трафик, рассмотрим когда его значение равно 1, тут на каждый отправленный ответ, отправитель ждет подтверждения, не совсем рационально.

При размере окна 3, отправитель отправляет уже по 3 кадра, и ждет от 4, который подразумевает, что все три кадра у него есть, +1.

Введение в протокол UDP. Сетевые протоколы: понятие, назначение, примеры

Документационное обеспечение управления

1. Протокол, виды протоколов, особенности оформления 4

2. Обработка отправляемой корреспонденции 9

3. Оформить акт списания имущества 11

4. Составить докладную записку 12

Библиографический список 14

1. Протокол, виды протоколов, особенности оформления

Протокол – документ, фиксирующий ход обсуждения и принятия решений на собраниях, совещаниях и заседаниях коллегиальных органов.

Особенностью протокола является то, что он используется для документирования деятельности коллегиальных органов: временных (собрания, конференции, совещания, комиссии) и постоянных (коллегии министерств и комитета, ученых советов научных учреждений, президиумов).

Составление и оформление протоколов возлагается на секретарей соответствующих коллегиальных органов (штатных или избранных в ходе их работы). Секретарь, наряду с председателем коллегиального органа, несет ответственность за достоверность содержащейся в протоколе информации. Протокол составляется на основании рукописных, в том числе стенографических или магнитофонных записей хода заседания, а также документов, подготовленных к заседанию: повестки дня, текстов или тезисов докладов и выступлений, проектов решений.

Основные виды протокола:

Краткий протокол — фиксирует обсуждавшиеся на заседании вопросы, фамилии докладчиков и принятые решения. Его рекомендуется вести в тех случаях, когда заседание носит оперативный характер.

Полный протокол фиксирует не только обсуждавшиеся вопросы, принятые решения и фамилии выступавших, но и достаточно подробно — содержание докладов и выступлений участников заседания.

Стенографический протокол составляется на основе стенографического отчета о заседании (стенограммы) и дословно передает процесс обсуждения каждого вопроса и выработку решения по нему.

Протоколы оформляются на бланках организации и содержат следующие реквизиты: наименование организации, наименование вида документа, дата заседания, номер протокола, место составления протокола (место проведения заседания), заголовок к тексту, текст, подписи, визы ознакомления. Заголовок к тексту протокола – это название протоколируемого мероприятия (совещание, заседание, собрание) и наименование коллегиального органа, работа которого протоколируется.

Текст протокола состоит из двух частей: вводной и основной. Вводная часть текста протокола должна показывать: кто руководил проведением протоколируемого мероприятия; кто вел протокол; кто присутствовал на совещании (заседании, собрании и т.п.) из числа должностных лиц, входящих в состав коллегиального органа, проводящего совещание; кто был приглашен (при необходимости) на совещание из числа сотрудников организации или из других организаций; какие вопросы обсуждались на совещании.

Информация о руководителе совещания, секретаре и присутствовавших включает фамилии и инициалы должностных лиц, указываемые соответственно после слов: «Председатель», «Секретарь», «Присутствовали» (без кавычек). Для лиц, дополнительно приглашенных на совещание из числа сотрудников организации, помимо фамилии и инициалов указывается занимаемая должность, а для специалистов из других организаций — должность и название организации. Сведения о приглашенных на совещание лицах можно включать в раздел «Присутствовали» или в специальный раздел «Приглашенные».

На таких коллективных мероприятиях, как собрания, нередко присутствует большое количество участников, перечисление которых во вводной части текста протокола нецелесообразно. В этом случае составляется отдельный список присутствовавших на собрании, прилагаемый в дальнейшем к протоколу.

В самом протоколе в разделе «Присутствовали» указывается только общее количество присутствовавших со ссылкой на прилагаемый список. Следует подчеркнуть, что разделы «Присутствовали» и «Приглашенные» имеют особое значение по отношению к другим разделам протокола, так как непосредственно влияют на юридическую силу данного документа, показывая правомерность проведения коллективного мероприятия. В этих разделах отражается наличие кворума собрания, т.е. минимально необходимого количества членов коллегиального органа, достаточного для начала работы собрания (заседания, совещания). При отсутствии нормативно установленного для данного коллегиального органа кворума (простое большинство или 2/3) проведение собрания недопустимо, так как его решения будут неправомерны. Слова «Председатель», «Секретарь», «Присутствовали», «Приглашенные» печатаются от нулевого положения печатающего устройства, от 2-го положения ставят тире, фамилии пишут в именительном падеже, затем ставят инициалы. Фамилии присутствующих и приглашенных располагают в алфавитном порядке и печатают через 1 межстрочный интервал.

Рассмотренные на совещании вопросы перечисляются в разделе ПОВЕСТКА ДНЯ. Слова ПОВЕСТКА ДНЯ печатают от нулевого положения печатающего устройства, после них ставится двоеточие. Вопросы повестки дня нумеруются. Каждый новый вопрос печатают от 1-го положения табулятора. Последовательность расположения вопросов определяется степенью их важности. Формулировка вопросов повестки дня должна начинаться с предлогов о (об), наименование должности и фамилию докладчика дают в родительном падеже. Основная часть текста протокола строится в соответствии с вопросами повестки дня. Построение записи обсуждения каждого вопроса повестки дня осуществляется по схеме: СЛУШАЛИ ВЫСТУПИЛИ ПОСТАНОВИЛИ (РЕШИЛИ). Эти слова печатают прописными буквами. Перед словом СЛУШАЛИ ставят номер вопроса повестки дня, после двоеточие. Фамилию докладчика печатают в именительном падеже от 1-го положения печатающего устройства; после фамилии ставят инициалы, затем тире и с прописной буквы пишут содержание доклада в форме прямой речи. Если текст доклада (выступления) застенографирован или представлен докладчиком в письменной форме, то после тире также с прописной буквы пишут «Доклад прилагается» (в протоколе без кавычек).

Обсуждению доклада могут предшествовать вопросы к докладчику, которые вместе с ответами включаются в раздел СЛУШАЛИ. Перед записью каждого вопроса указываются инициалы, фамилия и должность его автора и ставится тире. Содержание вопроса записывается с прописной буквы в форме прямой речи. Перед формулировкой ответа пишется слово «Ответ» (в протоколе без кавычек), ставится тире и записывается ответ в форме прямой речи. Ход обсуждения доклада отражается в разделе ВЫСТУПИЛИ. После слова ВЫСТУПИЛИ ставится двоеточие. Фамилию выступающего пишут в именительном падеже от 1го положения печатающего устройства, затем указывают инициалы и должность выступающего, ставят тире и с прописной буквы печатают содержание выступления в форме косвенной речи.


Принятые решения содержатся в разделе ПОСТАНОВИЛИ (РЕШИЛИ). Если решений несколько, они нумеруются арабскими цифрами с точкой. Как правило, каждое решение сопровождается указанием должности, фамилии и инициалов ответственного за его выполнение и содержит срок исполнения. Принимаемые коллегиально решения нередко требуют голосования. В этом случае после раздела ПОСТАНОВИЛИ указывается: «Голосование» или «Голосовали» (в протоколе без кавычек) и приводятся результаты голосования: единогласно или за. против. воздержались.

В практике часто применяются сокращенная и краткая формы протоколов, когда не требуется подробная запись хода обсуждения вопросов. В сокращенных протоколах после списка присутствующих или приглашенных указывается порядковый номер вопроса по повестке дня и печатается название доклада. Последняя строка названия доклада (пункт повестки дня) подчеркивается, и под чертой (в скобках) печатают фамилии выступающих в порядке их выступления. Название каждого доклада заканчивается протокольным решением или постановлением. В протоколе краткой формы указываются только рассмотренные вопросы и принятые решения. В постановляющей части текста протокола может содержаться пункт об утверждении какого-либо документа. В этом случае утвержденный документ прилагается к протоколу и имеет ссылку на его номер и дату. В практике очень часто приходится делать выписки из протоколов. Выписка из протокола содержит следующие реквизиты:

все реквизиты заголовочной части протокола: наименование организации, наименование вида документа (ВЫПИСКА ИЗ ПРОТОКОЛА), дату (дата заседания), номер протокола (порядковый номер заседания), место составления (место проведения заседания);

заголовок к тексту;

все реквизиты вводной части текста протокола: «Председатель», «Секретарь», «Присутствовали», «Приглашенные», «ПОВЕСТКА ДНЯ»;

отдельные реквизиты основной части текста протокола: «СЛУШАЛИ», «ПОСТАНОВИЛИ», «Голосование»;

реквизиты оформляющей части протокола: реквизит «Подпись», включающей слова «Председатель», «Секретарь», инициалы и фамилии председателя и секретаря (без их личных подписей т.к. выписки, как правило, не подписываются подлинными подписями, а заверяются секретарем); отметку о заверении копии.

Таким образом, из содержательной части протокола берутся только те элементы, которые необходимо довести до сведения заинтересованных должностных лиц. Для подтверждения установленных фактов и событий несколькими лицами составляется акт. Акты составляются по результатам ревизий деятельности предприятия или его структурного подразделения и отдельных должностных лиц, при приеме-передаче дел, подготовке документов к уничтожению, приеме объектов в эксплуатацию .

Не так давно организация локальных сетей требовала обязательного использования правильного протокола. Такой выбор оказывал влияние на то, какие типы компьютеров можно к нему подключить. Сегодня подобная проблема практически исчезла. Современные сетевые заменили все, что существовали ранее. Это универсальное решение, которое можно использовать в любой операционной системе.

Терминология

Сетевой протокол — это установленный язык, на котором происходит общение программ. Пересылка данных представляет собой перемещение какого-то потока битов по кабелю. Для того чтобы он доходил до целевого компьютера и представлялся в нем в виде данных, требуется определенный набор правил. Именно они и прописаны в стандартных протоколах. Про них обычно говорят, что они имеют уровень вложенности. Как это понимать? Есть физический уровень, который представляет собой перечень определений, к примеру, каким может быть сетевой кабель, толщина его жил и прочие параметры. Допустим, речь идет об исправном кабеле. Тогда пакеты данных будут отправляться по нему. Но какой из компьютеров будет их принимать? Тут в работу включается канальный уровень, при этом в заголовке пакетов указывается физический адрес каждой машины — определенное число, вшитое в Его называют MAC-адресом.

Сетевая иерархия

Канальный уровень совпадает с Ethernet. В пакете содержится набор определенных параметров, задающих его тип. Данные находятся в прямой зависимости от этого типа, а их содержание относится к сетевому уровню. Существует два самых распространенных протокола: ARP, который отвечает за преобразование IP-адресов в MAC, и сам IP-протокол. Можно привести структуру IP-пакета. Все данные, которые переносятся с его помощью, уже отправляются на конкретный сетевой адрес. В пакете имеется число в установленном формате, обозначающее тип протокола.

Самыми распространенными являются два типа: TCP и UDP. Между ними имеется определенное отличие, состоящее в том, что первый характеризуется максимальной степенью надежности, ведь при отправке пакета он постоянно отправляет запрос о его получении. Второй сетевой протокол — это удобный инструмент, к примеру, при прослушивании интернет-радио. При этом предполагается отправка пакетов без какой-либо проверки факта их получения. Если он дошел, то вы сможете прослушивать радио, а если нет — то нет смысла в проверке и контроле.

Особенности доставки пакетов

В пакете обязательно указан номер порта, куда осуществляется отправка. Обычно этот параметр определяется типом протокола на прикладном уровне — в зависимости от приложения, которому направлена информация. Можно использовать и нестандартные порты сервисов, никто этого не запрещает. Самыми известными сетевыми протоколами в данном случае являются HTTP и POP3. Получает определенная иерархия вложенности пакетов. В Ethernet-пакет вложен IP, далее TCP или UDP, а потом данные, ориентированные на конкретное приложение.

Отличительные характеристики

Сетевой протокол, в отличие от протоколов не привязывается к определенной аппаратуре. Их реализация происходит на уровне программного обеспечения, поэтому их можно установить и удалить в любой момент.

IP и TCP/IP

Данный сетевой протокол используется не только в сети интернет, но и внутри самой Он представляет транспортный и сетевой уровень, благодаря чему осуществляется передача данных блоками. Очень долгие годы его использовали только в UNIX-сетях, а теперь, когда интернет разросся довольно стремительно, сетевой протокол IP стал использоваться почти в каждом из видов локальных компьютерных сетей. На данный момент он служит в качестве основного протокола для большинства служб, работающих в операционных системах.

Локальные и коммутируемые сети

Старые сетевые протоколы требовали каких-то специфических знаний, а TCP/IP применяется такими пользователями, которые никогда даже не видели сетевые платы. Доступ к интернету при помощи модема или локальной сети обеспечивается при условии использования одного и того же протокола. А процесс его настройки полностью зависит от типа соединения, используемого при этом. Стоит отметить, что протоколы сетевого уровня отличаются от всех остальных, а параметры доступа к локальной сети либо с помощью модема тоже имеют определенные нюансы. Коммутируемое соединение лучше устанавливать с помощью программы автоматической конфигурации, которая поставляется самим провайдером. Иначе требуется вручную вводить все необходимые параметры. Можно рассмотреть основные сетевые протоколы.

Протокол IPX

Данный комплект был разработан компанией Novell с целью использования для собственной ОС NetWare. IPX частично схож с TCP/IP, то есть в него включены некоторые протоколы из данного пакета, но компания защитила его авторскими правами. Однако корпорация Microsoft создала свой протокол, совместимый с этим, предназначенный для операционных систем из семейства Windows. IPX представляет собой сетевой протокол, который в плане функционала аналогичен IP. SPX — это инструмент дл транспортного уровня, который предназначен для обеспечения обмена пакетными данными между отдельными машинами.

На данный момент этот протокол применяют только в сетях с серверами, где установлены старые версии операционной системы NetWare. Часто его используют в комплекте с какими-то другими наборами сетевых протоколов. Теперь компания Nowell полностью перешла на новый универсальный протокол TCP/IP.

NetBEUI

Данный сетевой протокол применяется в сетях малых размеров. Его впервые представили в Windows NT 3.1, а также в нескольких последующих версиях этой системы, где он использовался по умолчанию. В последних версиях систем его место занял уже известный нам TCP/IP. Этот протокол довольно прост, ему не хватает многих функций, используемых в более продвинутых вариантах. Он не подходит для межсетевого обмена данными. Он может пригодиться для простой однако теперь он даже не представлен в качестве стандартного компонента ОС, его требуется устанавливать самостоятельно с диска.

NetBEUI — это удобное средство для создания прямого кабельного подключения, и в этом смысле это минимальный протокол, который требуется для формирования одноранговой сети в версиях Windows 9x.

Выводы

Важно запомнить определенные моменты. На данный момент существует уже не один сетевой протокол. Все они предназначены для осуществления связи, однако у каждого из них совершенно разные задачи, есть преимущества и недостатки в сравнении с остальными. Использование каждого из них предполагает наличие определенных условий работы, которые обычно прописываются самим протоколом. При выборе того или иного решения стоит полагаться именно на этот параметр.

HTTP — это протокол передачи гипертекста между распределёнными системами. По сути, http является фундаментальным элементом современного Web-а. Как уважающие себя веб разработчики, мы должны знать о нём как можно больше.

Давайте взглянем на этот протокол через призму нашей профессии. В первой части пройдёмся по основам, посмотрим на запросы/ответы. В следующей статье разберём уже более детальные фишки, такие как кэширование, обработка подключения и аутентификация.

Также в этой статье я буду, в основном, ссылаться на стандарт RFC 2616 : Hypertext Transfer Protocol — HTTP/1.1.

Основы HTTP

HTTP обеспечивает общение между множеством хостов и клиентов, а также поддерживает целый ряд сетевых настроек.

В основном, для общения используется TCP/IP, но это не единственный возможный вариант. По умолчанию, TCP/IP использует порт 80, но можно заюзать и другие.

Общение между хостом и клиентом происходит в два этапа: запрос и ответ. Клиент формирует HTTP запрос, в ответ на который сервер даёт ответ (сообщение). Чуть позже, мы более подробно рассмотрим эту схему работы.

Текущая версия протокола HTTP — 1.1, в которой были введены некоторые новые фишки. На мой взгляд, самые важные из них это: поддержка постоянно открытого соединения, новый механизм передачи данных chunked transfer encoding, новые заголовки для кэширования. Что-то из этого мы рассмотрим во второй части данной статьи.

Сердцевиной веб-общения является запрос, который отправляется через Единый указатель ресурсов (URL). Я уверен, что вы уже знаете, что такое URL адрес, однако для полноты картины, решил всё-таки сказать пару слов. Структура URL очень проста и состоит из следующих компонентов:

Протокол может быть как http для обычных соединений, так и https для более безопасного обмена данными. Порт по умолчанию — 80. Далее следует путь к ресурсу на сервере и цепочка параметров.

Методы

С помощью URL, мы определяем точное название хоста, с которым хотим общаться, однако какое действие нам нужно совершить, можно сообщить только с помощью HTTP метода. Конечно же существует несколько видов действий, которые мы можем совершить. В HTTP реализованы самые нужные, подходящие под нужды большинства приложений.

GET : получить доступ к существующему ресурсу. В URL перечислена вся необходимая информация, чтобы сервер смог найти и вернуть в качестве ответа искомый ресурс.

POST : используется для создания нового ресурса. POST запрос обычно содержит в себе всю нужную информацию для создания нового ресурса.

PUT : обновить текущий ресурс. PUT запрос содержит обновляемые данные.

DELETE : служит для удаления существующего ресурса.

Данные методы самые популярные и чаще всего используются различными инструментами и фрэймворками. В некоторых случаях, PUT и DELETE запросы отправляются посредством отправки POST, в содержании которого указано действие, которое нужно совершить с ресурсом: создать, обновить или удалить.

Также HTTP поддерживает и другие методы:

HEAD : аналогичен GET. Разница в том, что при данном виде запроса не передаётся сообщение. Сервер получает только заголовки. Используется, к примеру, для того чтобы определить, был ли изменён ресурс.

TRACE : во время передачи запрос проходит через множество точек доступа и прокси серверов, каждый из которых вносит свою информацию: IP, DNS. С помощью данного метода, можно увидеть всю промежуточную информацию.

OPTIONS : используется для определения возможностей сервера, его параметров и конфигурации для конкретного ресурса.

Коды состояния

В ответ на запрос от клиента, сервер отправляет ответ, который содержит, в том числе, и код состояния. Данный код несёт в себе особый смысл для того, чтобы клиент мог отчётливей понять, как интерпретировать ответ:

1xx: Информационные сообщения

Набор этих кодов был введён в HTTP/1.1. Сервер может отправить запрос вида: Expect: 100-continue, что означает, что клиент ещё отправляет оставшуюся часть запроса. Клиенты, работающие с HTTP/1.0 игнорируют данные заголовки.

2xx: Сообщения об успехе

Если клиент получил код из серии 2xx, то запрос ушёл успешно. Самый распространённый вариант — это 200 OK. При GET запросе, сервер отправляет ответ в теле сообщения. Также существуют и другие возможные ответы:

  • 202 Accepted : запрос принят, но может не содержать ресурс в ответе. Это полезно для асинхронных запросов на стороне сервера. Сервер определяет, отправить ресурс или нет.
  • 204 No Content : в теле ответа нет сообщения.
  • 205 Reset Content : указание серверу о сбросе представления документа.
  • 206 Partial Content : ответ содержит только часть контента. В дополнительных заголовках определяется общая длина контента и другая инфа.

Своеобразное сообщение клиенту о необходимости совершить ещё одно действие. Самый распространённый вариант применения: перенаправить клиент на другой адрес.

  • 301 Moved Permanently : ресурс теперь можно найти по другому URL адресу.
  • 303 See Other : ресурс временно можно найти по другому URL адресу. Заголовок Location содержит временный URL.
  • 304 Not Modified : сервер определяет, что ресурс не был изменён и клиенту нужно задействовать закэшированную версию ответа. Для проверки идентичности информации используется ETag (хэш Сущности — Enttity Tag);

4xx: Клиентские ошибки

Данный класс сообщений используется сервером, если он решил, что запрос был отправлен с ошибкой. Наиболее распространённый код: 404 Not Found. Это означает, что ресурс не найден на сервере. Другие возможные коды:

  • 400 Bad Request : вопрос был сформирован неверно.
  • 401 Unauthorized : для совершения запроса нужна аутентификация. Информация передаётся через заголовок Authorization.
  • 403 Forbidden : сервер не открыл доступ к ресурсу.
  • 405 Method Not Allowed : неверный HTTP метод был задействован для того, чтобы получить доступ к ресурсу.
  • 409 Conflict : сервер не может до конца обработать запрос, т.к. пытается изменить более новую версию ресурса. Это часто происходит при PUT запросах.

5xx: Ошибки сервера

Ряд кодов, которые используются для определения ошибки сервера при обработке запроса. Самый распространённый: 500 Internal Server Error. Другие варианты:

  • 501 Not Implemented : сервер не поддерживает запрашиваемую функциональность.
  • 503 Service Unavailable : это может случиться, если на сервере произошла ошибка или он перегружен. Обычно в этом случае, сервер не отвечает, а время, данное на ответ, истекает.

Форматы сообщений запроса/ответа

На следующем изображении вы можете увидеть схематично оформленный процесс отправки запроса клиентом, обработка и отправка ответа сервером.

Давайте посмотрим на структуру передаваемого сообщения через HTTP:

Message = *( ) CRLF [ ] = Request-Line | Status-Line = Field-Name «:» Field-Value

Между заголовком и телом сообщения должна обязательно присутствовать пустая строка. Заголовков может быть несколько:

Тело ответа может содержать полную информацию или её часть, если активирована соответствующая возможность (Transfer-Encoding: chunked). HTTP/1.1 также поддерживает заголовок Transfer-Encoding.

Общие заголовки

Вот несколько видов заголовков, которые используются как в запросах, так и в ответах:

General-header = Cache-Control | Connection | Date | Pragma | Trailer | Transfer-Encoding | Upgrade | Via | Warning

Что-то мы уже рассмотрели в этой статье, что-то подробней затронем во второй части.

Заголовок via используется в запросе типа TRACE, и обновляется всеми прокси-серверами.

Заголовок Pragma используется для перечисления собственных заголовков. К примеру, Pragma: no-cache — это то же самое, что Cache-Control: no-cache. Подробнее об этом поговорим во второй части.

Заголовок Date используется для хранения даты и времени запроса/ответа.

Заголовок Upgrade используется для изменения протокола.

Transfer-Encoding предназначается для разделения ответа на несколько фрагментов с помощью Transfer-Encoding: chunked. Это нововведение версии HTTP/1.1.

Заголовки сущностей

В заголовках сущностей передаётся мета-информация контента:

Entity-header = Allow | Content-Encoding | Content-Language | Content-Length | Content-Location | Content-MD5 | Content-Range | Content-Type | Expires | Last-Modified

Все заголовки с префиксом Content- предоставляют информацию о структуре, кодировке и размере тела сообщения.

Заголовок Expires содержит время и дату истечения сущности. Значение “never expires” означает время + 1 код с текущего момента. Last-Modified содержит время и дату последнего изменения сущности.

С помощью данных заголовков, можно задать нужную для ваших задач информацию.

Формат запроса

Запрос выглядит примерно так:

Request-Line = Method SP URI SP HTTP-Version CRLF Method = «OPTIONS» | «HEAD» | «GET» | «POST» | «PUT» | «DELETE» | «TRACE»

SP — это разделитель между токенами. Версия HTTP указывается в HTTP-Version. Реальный запрос выглядит так:

GET /articles/http-basics HTTP/1.1 Host: www.articles.com Connection: keep-alive Cache-Control: no-cache Pragma: no-cache Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Список возможных заголовков запроса:

Request-header = Accept | Accept-Charset | Accept-Encoding | Accept-Language | Authorization | Expect | From | Host | If-Match | If-Modified-Since | If-None-Match | If-Range | If-Unmodified-Since | Max-Forwards | Proxy-Authorization | Range | Referer | TE | User-Agent

В заголовке Accept определяется поддерживаемые mime типы, язык, кодировку символов. Заголовки From, Host, Referer и User-Agent содержат информацию о клиенте. Префиксы If- предназначены для создания условий. Если условие не прошло, то возникнет ошибка 304 Not Modified.

Формат ответа

Формат ответа отличается только статусом и рядом заголовков. Статус выглядит так:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF


  • HTTP версия
  • Код статуса
  • Сообщение статуса, понятное для человека

Обычный статус выглядит примерно так:

Заголовки ответа могут быть следующими:

Response-header = Accept-Ranges | Age | ETag | Location | Proxy-Authenticate | Retry-After | Server | Vary | WWW-Authenticate

  • Age время в секундах, когда сообщение было создано на сервере.
  • ETag MD5 сущности для проверки изменений и модификаций ответа.
  • Location используется для перенаправления и содержит новый URL адрес.
  • Server определяет сервер, где было сформирован ответ.

Думаю, на сегодня теории достаточно. Теперь давайте взглянем на инструменты, которыми мы можем пользоваться для мониторинга HTTP сообщений.

Инструменты для определения HTTP трафика

Существует множество инструментов для мониторинга HTTP трафика. Вот несколько из них:

Наиболее часто используемый — это Chrome Developers Tools:

Если говорить об отладчике, можно воспользоваться Fiddler :

Для отслеживания HTTP трафика вам потребуется curl, tcpdump и tshark.

Библиотеки для работы с HTTP — jQuery AJAX

Поскольку jQuery очень популярен, в нём также есть инструментарий для обработки HTTP ответов при AJAX запросах. Информацию о jQuery.ajax(settings) можете найти на официальном сайте .

Передав объект настроек (settings), а также воспользовавшись функцией обратного вызова beforeSend, мы можем задать заголовки запроса, с помощью метода setRequestHeader().

Если хотите обработать статус запроса, то это можно сделать так:

Вот такой вот он, тур по основам протокола HTTP. Во второй части будет ещё больше интересных фактов и примеров.

Протокол передачи данных — набор соглашений интерфейса логического уровня , которые определяют обмен данными между различными программами . Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок при взаимодействии программного обеспечения разнесённой в пространстве аппаратуры , соединённой тем или иным интерфейсом.

Сигнальный протокол используется для управления соединением — например, установки, переадресации, разрыва связи. Примеры протоколов: RTSP , SIP . Для передачи данных используются такие протоколы как RTP .

Сетево́й протоко́л — набор правил и действий (очерёдности действий), позволяющий осуществлять соединение и обмен данными между двумя и более включёнными в сеть устройствами.

Разные протоколы зачастую описывают лишь разные стороны одного типа связи . Названия «протокол» и «стек протоколов» также указывают на программное обеспечение , которым реализуется протокол.

Наиболее известные протоколы, используемые в сети Интернет:

  • HTTP (Hyper Text Transfer Protocol) — это протокол передачи гипертекста . Протокол HTTP используется при пересылке Web-страниц между компьютерами, подключенными к одной сети.
  • FTP (File Transfer Protocol) — это протокол передачи файлов со специального файлового сервера на компьютер пользователя. FTP дает возможность абоненту обмениваться двоичными и текстовыми файлами с любым компьютером сети. Установив связь с удаленным компьютером, пользователь может скопировать файл с удаленного компьютера на свой или скопировать файл со своего компьютера на удаленный.
  • POP3 (Post Office Protocol) — это стандартный протокол почтового соединения. Серверы POP обрабатывают входящую почту, а протокол POP предназначен для обработки запросов на получение почты от клиентских почтовых программ.

UDP (User Datagram Protocol, Протокол дейтаграмм пользователя) предназначен для обмена дейтаграммами между процессами компьютеров, входящих в единую сеть с коммутацией пакетов. В качестве протокола нижнего уровня UDP-протокол использует IP.

Протокол UDP предоставляет прикладным программам возможность отправлять сообщения другим приложениям, используя минимальное количество параметров протокола. Этот протокол не обеспечивает достоверность доставки пакетов, защиты дублирования данных или надежности от сбоев в передаче. За исключением параметров приложения — номеров портов отправителя и получателя пакета, UDP практически ничего не добавляет к IP-дейтаграмме.

Протокол UDP намного проще, чем TCP и полезен в ситуациях, когда мощные механизмы обеспечения надежности протокола TCP не требуются или будут только помехой для решения определенного рода задач, например, аутентификации пользователей.

  • Source Port (16 бит) . Порт отправителя. Это поле может содержать номер порта, с которого был отправлен пакет, когда это имеет значение (например отправитель ожидает ответа). Если это поле не используется, оно заполняется нулями.
  • Destination Port (16 бит) . Порт назначения — это порт компьютера, на который пакет будет доставлен.
  • Length (16 бит) . Поле длины. Длина (в байтах) этой дейтаграммы, включая заголовок и данные. (Минимальное значение этого поля равно 8).
  • Checksum (16 бит) . Поле контрольной суммы. Контрольная сумма UDP-пакета представляет собой побитное дополнение 16-битной суммы 16-битных слов (аналогично TCP). В вычислении участвуют: данные пакета, заголовок UDP-пакета, псевдозаголовок (информация от IP-протокола), поля выравнивания по 16-битной границе (нулевые).

Преимущество протокола UDP состоит в том, что он требует минимум установок и параметров для соединения двух процессов между собой. Этот протокол используется при работе Серверов Доменов (Name Servers), при работе протокола TFTP (Trivial File Transfer, Тривиальный протокол передачи данных), работе с SNMP и построении систем аутентификации. Идентификатор UDP в IP-заголовке — число 17.

Более подробное описание протокола UDP можно найти в RFC-768.

Использование сетевых файрволов и систем, эффективно скрывающих организацию внутренней сетевой структуры от внешней сети, такой как Интернет, становится все…

Поскольку тема безопасности важная, и за раз ее не охватишь, мы разбили нашу серию статей на части, и на этот раз (во второй части) рассматриваем настройку фаервола…

Основная задача протокола SMTP (Simple Mail Transfer Protocol) заключается в том, чтобы обеспечивать передачу электронных сообщений (почту). Для работы через протокол SMTP клиент…

Протокол. Введение в протокол UDP

Сетевым протоколом называется набор правил, позволяющий осуществлять соединение и обмен данными между двумя и более включёнными в сеть компьютерами. Фактически разные протоколы зачастую описывают лишь разные стороны одного типа связи; взятые вместе, они образуют так называемый стек протоколов. Названия и также указывают на программное обеспечение, которым реализуется протокол.

  • Прикладной уровень (Application layer). Верхний (7-й) уровень модели, обеспечивает взаимодействие сети и пользователя. Уровень разрешает приложениям пользователя доступ к сетевым службам, таким как обработчик запросов к базам данных, доступ к файлам, пересылке электронной почты. Также отвечает за передачу служебной информации, предоставляет приложениям информацию об ошибках и формирует запросы к уровню представления. Пример: HTTP, POP3, SMTP.
  • Уровень представления (Presentation layer). 6-й уровень отвечает за преобразование протоколов и кодирование/декодирование данных. Запросы приложений, полученные с уровня приложений, он преобразует в формат для передачи по сети, а полученные из сети данные преобразует в формат, понятный приложениям. На уровне представления может осуществляться сжатие/распаковка или кодирование/декодирование данных, а также перенаправление запросов другому сетевому ресурсу, если они не могут быть обработаны локально.
  • Сеансовый уровень (Session layer). 5-й уровень модели отвечает за поддержание сеанса связи, что позволяет приложениям взаимодействовать между собой длительное время. Сеансовый уровень управляет созданием/завершением сеанса, обменом информацией, синхронизацией задач, определением права на передачу данных и поддержанием сеанса в периоды неактивности приложений. Синхронизация передачи обеспечивается помещением в поток данных контрольных точек, начиная с которых возобновляется процесс при нарушении взаимодействия.
  • Транспортный уровень (Transport layer). 4-й уровень модели, предназначен для доставки данных без ошибок, потерь и дублирования в той последовательности, как они были переданы. При этом неважно, какие данные передаются, откуда и куда, то есть он предоставляет сам механизм передачи. Блоки данных он разделяет на фрагменты, размер которых зависит от протокола, короткие объединяет в один, а длинные разбивает. Протоколы этого уровня предназначены для взаимодействия типа точка-точка. Пример: TCP, UDP
  • Сетевой уровень (Network layer). 3-й уровень сетевой модели OSI, предназначен для определения пути передачи данных. Отвечает за трансляцию логических адресов и имён в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию, отслеживание неполадок и заторов в сети. На этом уровне работает такое сетевое устройство, как маршрутизатор.
  • Уровень звена данных (Data Link layer). Часто это уровень называется канальным. Этот уровень предназначен для обеспечения взаимодействия сетей на физическом уровне и контроля за ошибками, которые могут возникнуть. Данные, полученные с физического уровня, он упаковывает во фреймы, проверяет на целостность, если нужно исправляет ошибки и отправляет на сетевой уровень. Канальный уровень может взаимодействовать с одним или несколькими физическими уровнями, контролируя и управляя этим взаимодействием. Спецификация IEEE 802 разделяет этот уровень на 2 подуровня — MAC (Media Access Control) регулирует доступ к разделяемой физической среде, LLC (Logical Link Control) обеспечивает обслуживание сетевого уровня. На этом уровне работают коммутаторы, мосты. В программировании этот уровень представляет драйвер сетевой платы, в операционных системах имеется программный интерфейс взаимодействия канального и сетевого уровней между собой, это не новый уровень, а просто реализация модели для конкретной ОС. Примеры таких интерфейсов: ODI, NDIS
  • Физический уровень (Physical layer). Самый нижний уровень модели, предназначен непосредственно для передачи потока данных. Осуществляет передачу электрических или оптических сигналов в кабель или в радиоэфир и соответственно их приём и преобразование в биты данных в соответствии с методами кодирования цифровых сигналов. Другими словами, осуществляет интерфейс между сетевым носителем и сетевым устройством. На этом уровне работают концентраторы (хабы), повторители (ретрансляторы) сигнала и медиаконверторы. Функции физического уровня реализуются на всех устройствах, подключенных к сети. Со стороны компьютера функции физического уровня выполняются сетевым адаптером или последовательным портом.

Основные протоколы используемые в работе Интернет:

КЛАССИФИКАЦИЯ КС ПО РАЗМЕРУ. НАЗВАНИЕ ТИПОВ КС, ИХ ПРИМЕРНАЯ ПРОТЯЖЕННОСТЬ И ПРИМЕНЕНИЕ .

Локальная сеть – это компьютерная сеть небольшой протяженности: в пределах комнаты, этажа, здания. Обычно такие сети действуют в пределах одного учреждения и имеют небольшой радиус действия: 1-10 км. Она сеть всегда является ведомственной. В настоящее время не существует четких ограничений на территориальный разброс абонентов локальной вычислительной сети. Обычно такая сеть привязана к конкретному месту. К классу локальных сетей относятся сети отдельных предприятий, фирм, банков, офисов и т.д. Локальная сеть обеспечивает высокие скорости передачи данных. А так как в этих сетях среда обычно контролируема, линии связи короткие, элементы структуры однородные, то частота ошибок в них низкая и протоколы обмена упрощены. В локальных сетях обычно не используются средства коммуникации общего назначения (телефонные линии) для организации обмена информацией. Дополнительное преимущество такой сети заключается в значительной экономии ресурсов. Так, вместо того, чтобы иметь принтер для каждого компьютера, можно иметь только один принтер. Любой компьютер в сети мог послать информацию для печати на этот принтер

Основные компоненты локальной сети: несколько ПК, снабженных сетевым адаптером, или сетевой картой; среда передачи, объединяющая необходимые узлы; сетевое программное обеспечение. Для объединения компьютеров в локальную сеть требуется вставить в каждый подключаемый к сети компьютер сетевой адаптер (контроллер), который позволяет компьютеру получать информацию из локальной сети и передавать данные в сеть, а также соединить компьютеры кабелями, по которым происходит передача данных между компьютерами и другими подключенными к сети устройствами (принтерами, сканерами и т.д.). В некоторых типах сетей кабели соединяют компьютеры непосредственно, в других соединение кабелей осуществляется через специальные устройства-концентраторы (или hub), коммутаторы и др. В небольших сетях обычно компьютеры соединяются кабелями с концентратором, который и передает сигналы от одних подключенных к нему компьютеров к другим. Технические средства определяют лишь потенциальные возможности компьютерных сетей. Истинные же ее возможности определяет программное обеспечение. Что же дают локальные сети? экономию места в памяти, т.к. многие пользователи применяют одни и те же программные продукты; хорошую систему защиты при записи информации; обеспечение связи между отдельными пользователями через компьютерную почту.

Региональные сети – это сети, существующие обычно в пределах города, района, области, страны. Они связывают абонентов, расположенных на значительном расстоянии друг от друга. Обычно расстояние между абонентами региональной вычислительной сети составляет десятки-сотни километров. Они являются объединением нескольких локальных сетей и частью некоторой глобальной. Особой спецификой по отношению к глобальной не отличаются. Региональные вычислительные сети имеют много общего с локальными, но они, по многим параметрам, сложнее их. Например, помимо обмена данными и голосового обмена, региональные вычислительные сети могут передавать видео- и аудиоинформацию. Эти сети разработаны для поддержки больших расстояний, чем локальные вычислительные сети. Они могут использоваться для связывания нескольких локальных вычислительных сетей в высокоскоростные интегрированные сетевые системы. Региональные вычислительные сети сочетают лучшие характеристики локальной (низкий уровень ошибок, высокая скорость передачи) с большей географической протяженностью. В последнее время стали еще выделять класс корпоративных сетей. Они охватывают обычно крупные корпорации. Их масштаб и структура определяются потребностями предприятий – владельцев.

Глобальная вычислительная сеть объединяет абонентов, расположенных в различных странах, на различных континентах. Взаимодействие между абонентами такой сети может осуществляться на базе телефонной линии связи, радиосвязи и систем спутниковой связи. Глобальные вычислительные сети позволяют решить проблему объединения информационных ресурсов всего мира и организации доступа к этим ресурсам. Для подключения к удаленным компьютерам и компьютерным сетям используются телефонные сети. Процесс передачи данных по телефонным линиям должен происходить в форме электрических колебаний – аналога звукового сигнала, в то время как в компьютере информация хранится в виде кодов. Для того чтобы передать информацию от компьютера через телефонную линию, коды должны быть преобразованы в электрические колебания. Этот процесс носит название модуляции. Для того чтобы адресат смог почитать на своем компьютере то, что ему отправлено, электрические колебания должны быть обратно превращены в машинные коды – демодуляция. Устройство, которое осуществляет преобразования данных из цифровой формы, в которой они хранятся в компьютере, в аналоговую (электрические колебания), в которой они могут быть переданы по телефонной линии, и обратно, называется модем (сокращенно от МОдулятор ДЕМодуляции). Компьюте, в этом случае, должен иметь специальную телекоммуникационную программу, которая управляет модемом, а также отправляет и получает последовательности сигналов передаваемой информации. Глобальные вычислительные сети создаются путем объединения локальных и региональных вычислительных сетей. Они представляют собой конгломерат различных технологий. По сравнению с локальной вычислительной сетью большинство глобальных отличают медленная скорость передачи и более высокий уровень ошибок. Новые технологии в области глобальных вычислительных сетей нацелены на разрешение этих проблем. Глобальные сети, кроме того, что они охватывают очень большие территории, имеют и ряд других особенностей по сравнению с локальной сетью. Глобальные сети, в основном, используют в качестве каналов связи телефонные линии – это медленные каналы с высоким уровнем ошибок. Однако в настоящее время все более внедряются высокоскоростные оптоволоконные и радиоспутниковые каналы связи.

Илон Маск рекомендует:  Что такое код msession_create

Протокол передачи данных — набор соглашений интерфейса логического уровня , которые определяют обмен данными между различными программами . Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок при взаимодействии программного обеспечения разнесённой в пространстве аппаратуры , соединённой тем или иным интерфейсом.

Сигнальный протокол используется для управления соединением — например, установки, переадресации, разрыва связи. Примеры протоколов: RTSP , SIP . Для передачи данных используются такие протоколы как RTP .

Сетево́й протоко́л — набор правил и действий (очерёдности действий), позволяющий осуществлять соединение и обмен данными между двумя и более включёнными в сеть устройствами.

Разные протоколы зачастую описывают лишь разные стороны одного типа связи . Названия «протокол» и «стек протоколов» также указывают на программное обеспечение , которым реализуется протокол.

Наиболее известные протоколы, используемые в сети Интернет:

  • HTTP (Hyper Text Transfer Protocol) — это протокол передачи гипертекста . Протокол HTTP используется при пересылке Web-страниц между компьютерами, подключенными к одной сети.
  • FTP (File Transfer Protocol) — это протокол передачи файлов со специального файлового сервера на компьютер пользователя. FTP дает возможность абоненту обмениваться двоичными и текстовыми файлами с любым компьютером сети. Установив связь с удаленным компьютером, пользователь может скопировать файл с удаленного компьютера на свой или скопировать файл со своего компьютера на удаленный.
  • POP3 (Post Office Protocol) — это стандартный протокол почтового соединения. Серверы POP обрабатывают входящую почту, а протокол POP предназначен для обработки запросов на получение почты от клиентских почтовых программ.

Выполняет функции транспортного уровня модели OSI .

Когда осуществляется передача от компьютера к компьютеру через Интернет, TCP работает на верхнем уровне между двумя конечными системами, например, браузером и веб-сервером. TCP осуществляет надёжную передачу потока байтов от одного процесса к другому. TCP реализует управление потоком, управление перегрузкой, рукопожатие, надежную передачу.

Заголовок сегмента TCP

Структура заголовка
Бит 0 — 3 4 — 9 10 — 15 16 — 31
Порт источника, Source Port Порт назначения, Destination Port
32 Порядковый номер, Sequence Number (SN)
64 Номер подтверждения,
96 Длина заголовка Зарезервировано Флаги Размер Окна
128 Контрольная сумма Указатель важности
160 Опции (необязательное, но используется практически всегда)
160/192+ Данные

Порт источника, Порт назначения

Эти 16-битные поля содержат номера портов — числа, которые определяются по специальному списку .

Порт источника идентифицирует приложение клиента, с которого отправлены пакеты. Ответные данные передаются клиенту на основании этого номера.

Порт назначения идентифицирует порт, на который отправлен пакет.

Порядковый номер

Порядковый номер выполняет две задачи:

  1. Если установлен флаг SYN, то это изначальный порядковый номер — ISN (Initial Sequence Number), и первый байт данных, которые будут переданы в следующем пакете, будет иметь номер, равный ISN + 1.
  2. В противном случае, если SYN не установлен, первый байт данных, передаваемый в данном пакете, имеет этот порядковый номер

Поскольку поток TCP в общем случае может быть длиннее, чем число различных состояний этого поля, то все операции с порядковым номером должны выполняться по модулю 2 32 . Это накладывает практическое ограничение на использование TCP. Если скорость передачи коммуникационной системы такова, чтобы в течение MSL (максимального времени жизни сегмента) произошло переполнение порядкового номера, то в сети может появиться два сегмента с одинаковым номером, относящихся к разным частям потока, и приёмник получит некорректные данные.

Номер подтверждения

Acknowledgment Number (ACK SN) (32 бита) — если установлен флаг ACK, то это поле содержит порядковый номер октета, который отправитель данного сегмента желает получить. Это означает, что все предыдущие октеты (с номерами от ISN+1 до ACK-1 включительно) были успешно получены.

Длина заголовка (смещение данных)

Длина заголовка (Data offset) занимает 4 бита и указывает значение длины заголовка, измеренное в 32-битовых словах. Минимальный размер составляет 20 байт (пять 32-битовых слов), а максимальный — 60 байт (пятнадцать 32-битовых слов). Длина заголовка определяет смещение полезных данных относительно начала сегмента. Например, Data offset равное 1111 говорит о том, что заголовок занимает пятнадцать 32-битных слова (15 строк*32 бита в каждой строке/8 бит = 60 байт).

Зарезервировано

Зарезервировано (6 бит) для будущего использования и должно устанавливаться в ноль. Из них два (5-й и 6-й) уже определены:

  • CWR (Congestion Window Reduced) — Поле «Окно перегрузки уменьшено» — флаг установлен отправителем, чтобы указать, что получен пакет с установленным флагом ECE (RFC 3168)
  • ECE (ECN-Echo) — Поле «Эхо ECN» — указывает, что данный узел способен на ECN (явное уведомление перегрузки) и для указания отправителю о перегрузках в сети (RFC 3168)

Флаги (управляющие биты)

Это поле содержит 6 битовых флагов:

  • URG — поле «Указатель важности» задействовано (англ. Urgent pointer field is significant )
  • ACK — поле «Номер подтверждения» задействовано (англ. Acknowledgement field is significant )
  • PSH — (англ. Push function ) инструктирует получателя протолкнуть данные, накопившиеся в приёмном буфере, в приложение пользователя
  • RST — оборвать соединения, сбросить буфер (очистка буфера) (англ. Reset the connection )
  • SYN — синхронизация номеров последовательности (англ. Synchronize sequence numbers )
  • FIN (англ. final , бит) — флаг, будучи установлен, указывает на завершение соединения (англ. FIN bit used for connection termination ).

Размер окна

Количество байт данных начиная с последнего номера подтверждения, которые может принять получатель данного пакета. Иначе говоря, получатель пакета располагает для приёма данных буфером длиной «размер окна» байт.

Контрольная сумма

Поле контрольной суммы — это 16-битное дополнение к сумме всех 16-битных слов заголовка (включая псевдозаголовок) и данных. Если сегмент, по которому вычисляется контрольная сумма, имеет длину не кратную 16-ти битам, то длина сегмента увеличивается до кратной 16-ти, за счёт дополнения к нему справа нулевых битов заполнения. Биты заполнения (0) не передаются в сообщении и служат только для расчёта контрольной суммы. При расчёте контрольной суммы значение самого поля контрольной суммы принимается равным 0.

Указатель важности

16-битовое значение положительного смещения от порядкового номера в данном сегменте. Это поле указывает порядковый номер октета, которым заканчиваются важные (urgent) данные. Поле принимается во внимание только для пакетов с установленным флагом URG. Используется для внеполосных данных .

Опции

Могут применяться в некоторых случаях для расширения протокола. Иногда используются для тестирования. На данный момент в опции практически всегда включают 2 байта NOP (в данном случае 0x01) и 10 байт, задающих timestamps . Вычислить длину поля опции можно через значение поля смещения.

Видео по теме

Механизм действия протокола

В отличие от традиционной альтернативы — UDP, который может сразу же начать передачу пакетов, TCP устанавливает соединения, которые должны быть созданы перед передачей данных. TCP соединение можно разделить на 3 стадии:

  • Установка соединения
  • Передача данных
  • Завершение соединения

Состояния сеанса TCP

Состояния сеанса TCP
CLOSED Начальное состояние узла. Фактически фиктивное
LISTEN Сервер ожидает запросов установления соединения от клиента
SYN-SENT Клиент отправил запрос серверу на установление соединения и ожидает ответа
SYN-RECEIVED Сервер получил запрос на соединение, отправил ответный запрос и ожидает подтверждения
ESTABLISHED Соединение установлено, идёт передача данных
FIN-WAIT-1 Одна из сторон (назовём её узел-1) завершает соединение, отправив сегмент с флагом FIN
CLOSE-WAIT Другая сторона (узел-2) переходит в это состояние, отправив, в свою очередь сегмент ACK и продолжает одностороннюю передачу
FIN-WAIT-2 Узел-1 получает ACK, продолжает чтение и ждёт получения сегмента с флагом FIN
LAST-ACK Узел-2 заканчивает передачу и отправляет сегмент с флагом FIN
TIME-WAIT Узел-1 получил сегмент с флагом FIN, отправил сегмент с флагом ACK и ждёт 2*MSL секунд, перед окончательным закрытием соединения
CLOSING Обе стороны инициировали закрытие соединения одновременно: после отправки сегмента с флагом FIN узел-1 также получает сегмент FIN, отправляет ACK и находится в ожидании сегмента ACK (подтверждения на свой запрос о разъединении)

Установка соединения

Процесс начала сеанса TCP (также называемый «рукопожатие» (англ. handshake )), состоит из трёх шагов.

1. Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN.

  • Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента.
    • В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED.
    • В случае неудачи сервер посылает клиенту сегмент с флагом RST.

2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK.

  • Если клиент одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED.
  • Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться.
  • Если клиент не получает ответа в течение 10 секунд, то он повторяет процесс соединения заново.


3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.

  • В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED.

Процесс называется «трёхэтапным согласованием» (англ. three way handshake ), так как несмотря на то что возможен процесс установления соединения с использованием четырёх сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется три сегмента.

Пример базового 3-этапного согласования:

TCP A TCP B 1. CLOSED LISTEN 2. SYN-SENT SYN-RECEIVED 3. ESTABLISHED ESTABLISHED 5. ESTABLISHED Завершение соединения

Завершение соединения можно рассмотреть в три этапа:

  1. Посылка серверу от клиента флага FIN на завершение соединения.
  2. Сервер посылает клиенту флаги ответа ACK , FIN, что соединение закрыто.
  3. После получения этих флагов клиент закрывает соединение и в подтверждение отправляет серверу ACK , что соединение закрыто.

Известные проблемы

Максимальный размер сегмента

TCP требует явного указания максимального размера сегмента (MSS) в случае, если виртуальное соединение осуществляется через сегмент сети, где максимальный размер блока (MTU) менее, чем стандартный MTU Ethernet (1500 байт).

В протоколах туннелирования, таких как GRE , IPIP , а также PPPoE MTU туннель меньше, чем стандартный, поэтому сегмент TCP максимального размера имеет длину пакета больше, чем MTU. Это приводит к фрагментации и уменьшению скорости передачи полезных данных. Если на каком-либо узле фрагментация запрещена, то со стороны пользователя это выглядит как «зависание» соединений. При этом «зависание» может происходить в произвольные моменты времени, а именно тогда, когда отправитель использовал сегменты длиннее допустимого размера. Для решения этой проблемы на маршрутизаторах применяются правила Firewall-а, добавляющие параметр MSS во все пакеты, инициирующие соединения, чтобы отправитель использовал сегменты допустимого размера.

MSS может также управляться параметрами операционной системы.

Обнаружение ошибок при передаче данных

Хотя протокол осуществляет проверку контрольной суммы по каждому сегменту, используемый алгоритм считается слабым . Так, в 2008 году ошибка в передаче одного бита, не обнаруженная сетевыми средствами, привела к остановке серверов системы Amazon Web Services .

В общем случае распределенным сетевым приложениям рекомендуется использовать дополнительные программные средства для гарантирования целостности передаваемой информации .

Атаки на протокол

Недостатки протокола проявляются в успешных теоретических и практических атаках, при которых злоумышленник может получить доступ к передаваемым данным, выдать себя за другую сторону или привести систему в нерабочее состояние.

Реализация

Псевдозаголовок

TCP-заголовок не содержит информации об адресе отправителя и получателя, поэтому даже при совпадении порта получателя нельзя с точностью сказать, что сообщение пришло в нужное место. Поскольку назначением протокола TCP является надёжная доставка сообщений, то этот момент имеет принципиальное значение. Эту задачу можно было решить разными способами. Самый очевидный — добавить информацию об адресе назначения в заголовок TCP, однако это, во-первых, приводит к дублированию информации, что снижает долю полезной информации переносимой TCP-сегментом, а во-вторых, нарушает принцип инкапсуляции модели OSI. Поэтому разработчики протокола пошли другим путём и использовали дополнительный псевдозаголовок.

Протокол — это своего рода отчет, содержащий записи процесса обсуждения вопросов и решений по ним, принятых на заседаниях, деловых встречах и собраниях. Данный документ имеет важное место в системе документооборота организационно-распорядительного типа.

Что такое протокол

Протокол — это отчетный документ, в котором четко зафиксирован ход обсуждения вопросов и принятых решений на официальных мероприятиях. Более полное толкование слова предоставляют словари, определяющие это понятие как документ с записью всего происходящего на определенном мероприятии.

Общая информация

Протоколом можно назвать документ, содержащий определенную информацию. Он включает в себя сведения о течении обсуждения конкретных вопросов. Кроме этого, протокол заседания включает в себя постановления, что дает возможность отнести его к распорядительным документам.

Во время заседания удается сделать лишь черновой вариант протокола. В течение 5 дней составление протокола должно быть завершено полностью.

Оформление

Протокол — это документ, оформленный на базе черновых заготовок. Если в процессе заседания велась стенограмма, то затем она поддается расшифровке, оформляется нужным образом и добавляется к готовому протоколу.

Секретарь несет полную ответственность за процесс подготовки и ведения всего протокола, а также за верность вносимых в него данных. Некоторые виды протоколов необходимо дополнительно утвердить у руководителя компании.

Формы ведения протокола

Применяется 3 формы ведения протокола:

В кратком протоколе фиксируются вопросы, которые были обсуждены. Также вносятся фамилии участников и решения, которые были вынесены. Протокол мероприятия такого типа рекомендовано вести тогда, когда собрание стенографируется, а тексты выступлений и доклады предоставляются ответственному секретарю.

Полный протокол фиксирует не только вышеперечисленные моменты, но и содержит более подробные записи. Полный протокол должен позволять отразить подробную картину мероприятия полностью.

Стенографический протокол проводится ответственным секретарем на основании сделанного стенографического отчета о совещании.

Руководящий состав компании решает то, какая форма протокола будет предпочтительнее для каждого заседания. Все виды такого рода документов должны быть оформлены на фирменномм бланке предприятия (компании) с указанием наименования типа документа — Протокол. Либо на специально оформленном готовом бланке протокола. Обязательные реквизиты любого документа подобного типа — это регистрационный номер, дата, заголовок, текст и подписи ответственных лиц.

Кто ведет протокол

Протокол — это документ, который ведется во время мероприятия. Составлять его должен профессионально подготовленный секретарь. От его уровня квалификации и профессиональных навыков будет зависеть качественность записи выступлений. Поэтому выбор человека, составляющего протокол заседания, является ответственной задачей в подготовке мероприятия.

Как вести протокол: образец протокола

Пример ведения протокола можно посмотреть на фото ниже. Там представлен образец протокола. Если заседание будет проходить в течение нескольких дней, то должна быть указана дата начала заседания и после дефиса дата его окончания. К примеру, 12.03.2020-14.03.16.

В графе «Место заседания» указывается город или населенный пункт, где проходило мероприятие.

Заголовок протокола пишется в родительном падеже и содержит в себе расшифровку вида мероприятия (заседание, собрание, совещание) и название коллегиального органа. Название вида заседания должно согласовываться с названием коллегиального органа. К примеру, «Собрание комитета».

Само текстовое наполнение протокола разделяется на две части:

1. Вводная часть, где указываются фамилия и инициалы председателя, ответственного секретаря, всех присутствующих и тема повестки дня.

2. Основная часть, где описывается сам процесс заседания.

Непосредственно со слова «председатель» начинается протокол, после дефиса указываетя фамилия председателя и инициалы. Точно так же оформляется и слово «секретарь». При проведении срочных и быстрых совещаний эта часть протокола не производится.

Затем оформляется список всех присутствующих. После данного перечня записываются фамилии приглашенных, где указываются и занимаемые ими должности. На длительных конференциях и заседаниях с большим количеством присутствующих их состав должен указываться исключительно количественно, а список с указанием фамилий прилагается к протоколу, о чем делается соответствующего рода запись в самом протоколе. Например: «Присутствовали 42 человека (список прилагается)».

На мероприятиях, где для принятия решения требуется определенное количество человек, в разделе «Присутствовали» указывается количество человек, которое должно было быть, и число пришедших участников.

Затем следует повестка дня. В данной части протокола перечисляются рассмотренные вопросы. Каждый имеет свой номер и начинается с предлога «О» («Об»).

Основополагающая часть текста протокола составляется по разделам, соответствующим пунктам на повестке дня.

По каждому из пунктов могут быть выделены такие части, как:

Каждое из этих слов пишется с новой строчки.

Данные докладчика (ФИО) и всех выступающих пишутся с новой строки.

Заключительная часть раздела по каждому пункту повестки дня — это запись утвержденного по поставленному вопросу решения (постановления). Решения, имеющие несколько разделов, делятся на пункты и подпункты, нумеруемые арабскими цифрами. Постановляющая часть решений должна быть конкретной и содержать составные части: кому что нужно сделать и к какому числу.

При выборе должностных лиц в протоколе отмечаются итоги голосования по каждой из кандидатур отдельно.

В ряду управленческих документов особое место принадлежит протоколам. Они входят в состав унифицированной системы организационно-распорядительной документации.

Протокол документ, фиксирующий ход обсуждения вопросов и принятия решений на собраниях, совещаниях, заседаниях, конференциях.

Нужно иметь в виду, что в деятельности организаций и предприятий часто составляются документы под названием «Протокол», однако они не подпадают под приведенное определение. Так, в области договорных отношений составляются протоколы о намерениях, протоколы разногласий, протоколы согласований; в числе основных документов общего собрания акционеров законодательство называет протоколы счетной комиссии и т.д. Подобные разновидности протоколов сходны по своему назначению с актами: они фиксируют и подтверждают факты или события. Поэтому на них не распространяются правила, о которых говорится в данной статье .

Протоколы составляются в любой организации, где есть временные или постоянно действующие коллегиальные органы, комиссии и т.п. Формой их деятельности является обсуждение тех или иных вопросов на собраниях или заседаниях и совместное принятие решений, часто голосованием.

С появлением в нашей стране акционерных обществ возросло внимание к этому виду документа. Высшие органы управления акционерного общества — коллегиальные, и протоколы, в которых находит отражение их деятельность, становятся одними из важнейших управленческих документов. Речь идет о протоколах общих собраний акционеров, заседаний совета директоров и правления. Не случайно Федеральный закон «Об акционерных обществах» и иные правовые акты уделяют специальное внимание составу информации этих документов, то есть их содержанию. Часть нормативных требований может быть отнесена и к тому, что мы называем оформлением документов. При оформлении протоколов органов управления акционерных обществ следует учитывать как типовые требования к данному виду документов (типовой формуляр протокола), так и те, что закреплены специальными нормами правовых актов и регламентируют документирование деятельности органов управления именно акционерных обществ.

Типовые требования к составлению протокола

В обобщенном виде порядок составления протокола сводится к следующему.

При подготовке к заседанию или собранию:

формулируются вопросы повестки дня, то есть те вопросы, по которым должны быть приняты решения;

определяется состав основных докладчиков;

подбираются соответствующие материалы, например, проекты документов, которые требуют обсуждения и утверждения, тексты докладов и т.п.

Во время заседания секретарем ведется запись хода обсуждения вопросов повестки дня и принимаемых по ним решений. Наиболее важные заседания могут стенографироваться, доклады и выступления — записываться на диктофон. Все эти материалы являются основой для последующего составления протокола.

Заголовочная часть протокола

Протокол оформляется на общем бланке организации или на чистом листе бумаги с реквизитами, которые соответствуют общему бланку. В их составе:

фирменное наименование организации;

название вида документа;

место составления документа.

При оформлении всех реквизитов, включая реквизиты бланка, нужно учитывать определенные правила. Только это может обеспечить документу юридическую силу.

Фирменное наименование — это полное наименование организации на русском языке, закрепленное учредительными документами.

ФЗ «Об акционерных обществах» определил, что общество обязано иметь полное и вправе иметь сокращенное фирменное наименование, включающее, в том числе, указание на тип общества (открытое или закрытое). Таким образом, если общество зарегистрировало наряду с полным и свое сокращенное наименование, оно вправе помещать его на свои бланки (см. Пример 1).

Название вида документа (ПРОТОКОЛ) печатается прописными буквами под наименованием организации и отделяется от него одним ­межстрочным интервалом.

При проставлении даты на протоколе следует иметь в виду, что дата заседания и дата окончательного оформления и подписания документа практически всегда различаются.

По общим требованиям протокол должен оформляться не позднее чем через 5 дней после даты заседания. Но закон «Об акционерных обществах» ввел иные сроки: для протокола заседания совета директоров максимальный период подготовки составляет 3 дня, а для протокола общего собрания акционеров — 15 дней после окончания собрания.

Нужно знать, что во всех случаях на протоколе проставляется дата заседания, а не подписания.

В случае если заседание продолжается не один день, в протоколе следует указывать даты его начала и окончания: «10-12.01.2007», или полностью: «10.01.2007 — 12.01.2007».

Индекс проставляется на одной строке с датой и обозначает порядковый номер заседания в пределах календарного года: «№ 02» или «№ 12».

Порядковые номера присваиваются отдельно по каждой группе протоколов , которые составляются в организации: отдельно нумеруются протоколы общих собраний акционеров ; протоколы заседаний совета директоров ; протоколы заседаний правления и т.д.

Еще одним реквизитом общего бланка (и реквизитом типового формуляра протокола) является «место составления документа». Нужно обратить внимание на то, что в данном случае этот реквизит означает не место нахождения организации, а место, где реально состоялось заседание. Название соответствующего населенного пункта указывают с учетом принятого административно-территориального деления. Кроме того, оно должно включать в себя только общепризнанные сокращения , например:

Расположение всех рассмотренных реквизитов зависит от того, какой бланк протокола используется в данной организации: с продольным (см. Пример 4) или угловым (см. Пример 5) расположением реквизитов. Выбор способа расположения реквизитов остается за организацией и не влияет на юридическую силу составленного на бланке документа.

Закрытое акционерное общество
СТРОИТЕЛЬНЫЕ ТЕХНОЛОГИИ

10.01.2007 № 01
Москва

Заголовок протокола — это важнейший поисковый признак, он призван помогать быстро и с наименьшими затратами находить нужный документ. Государственный стандарт (ГОСТ Р 6.30-2003) трактует понятие «заголовок к тексту» как «краткое содержание документа». В этом случае заголовок отвечает на вопрос «о чем говорится в документе?».

Однако для многих видов документов невозможно сжато определить их краткое содержание, так как они отражают, как правило, несколько разноплановых вопросов. К такой группе документов относится и протокол. Поэтому заголовок к тексту любого протокола отвечает на вопрос «чего?», содержит указание вида коллегиальной деятельности (собрания, заседания и др.) и название коллегиального органа в родительном падеже. Такой заголовок вместе с датой и индексом позволяет быстро находить необходимую информацию.

Текст

Самым главным в любом документе является его содержание (текст).

Текст протокола четко структурирован . Это означает, что независимо от вопросов, включенных в повестку дня заседания или совещания, хода их обсуждения, принимаемых решений текст документа будет состоять из определенных частей, расположенных в одинаковой последовательности.

Текст протокола делится на две части:

вводная часть, в которой указываются фамилии и инициалы председателя и секретаря собрания; сведения о присутствующих на собрании и повестка дня (эти данные предваряют основную часть текста, как бы «вводят» в нее);

основная часть, которая отражает ход обсуждения вопросов повестки дня и фиксирует принимаемые решения.

Итак, вводная часть протокола начинается с указания, кто является председателем и секретарем данного собрания или заседания. Слова «Председатель» и «Секретарь» печатают от границы левого поля через два ­интервала от заголовка к тексту. После тире указывают их инициалы и фамилии:

Далее располагаются сведения о количестве и персональном составе присутствовавших на заседании постоянных членов коллегиального органа. Их фамилии и инициалы помещаются в алфавитном порядке после слова «Присутствовали». Эта информация также располагается от границы левого поля.

Однако таким образом оформляется состав присутствующих, если их количество не превышает 15-ти человек. При оформлении протоколов заседания с числом участников более 15-ти указывают их количественный состав и делают отметку о том, что список (лист регистрации) прилагается к протоколу. Образец такой надписи дан в Примере 9. А в Примере 10 показан лист регистрации (он может называться «Явочный лист» и т.п.) участников заседания (или собрания), который включает и личные подписи присутствующих. При этом количество реальных участников отмечается в итоговой записи.

Для принятия решений на собрании необходим кворум, то есть тот необходимый минимум участников, который делает правомочными принятые решения. Поэтому часто в протоколах делают отметку о наличии кворума, указывая общий количественный состав коллегиального органа и реальное количество присутствующих на собрании, например:

Помимо постоянных членов коллегиального органа, обязанных присутствовать на совещании или заседании, на него могут быть специально приглашены должностные лица, которые по роду деятельности связаны с обсуждаемыми вопросами. Данные о приглашенных на заседание ­обязательно должны быть зафиксированы в протоколе:

Следует обратить внимание на то, что при оформлении рассмотренного блока сведений не указывают должности председателя, секретаря собрания и присутствующих на нем постоянных членов коллегиального органа. Что касается приглашенных, то в Методических рекомендациях по внедрению ГОСТ Р 6.30-2003, изданных автором стандарта, Всероссийским научно-исследовательским институтом документоведения и архивного дела, содержится рекомендация перечислять их фамилии в алфавитном порядке также без указания должностей. Однако традиционно в управленческой практике при оформлении протоколов должности приглашенных, как правило, указывают. Это не случайно, так как упоминание только фамилий не раскрывает всей полноты информации об участ­никах. Вместе с тем часто бывает важно показать, какие именно должностные лица могут или должны участвовать в решении конкретных вопросов.

Вводная часть протокола заканчивается перечнем вопросов, которые обсуждались на заседании. Он начинается словами «Повестка дня:» и ­располагается на два-три интервала ниже списка участников от границы левого поля.

Каждый вопрос повестки дня начинается с предлога «О» («Об») и отвечает на вопрос «О чем?». Вопросы нумеруются арабскими цифрами и содержат указание на докладчиков по каждому вопросу:


Основная часть протокола делится на разделы, которые должны точно соответствовать вопросам повестки дня и так же нумероваться. В свою очередь, текст каждого раздела выстраивается по схеме: СЛУШАЛИ — ­ВЫСТУПИЛИ — ПОСТАНОВИЛИ или РЕШИЛИ.

Перед словом «СЛУШАЛИ» проставляется номер соответствующего раздела (вопроса повестки дня). Остальные части (ВЫСТУПИЛИ, ­ПОСТАНОВИЛИ или РЕШИЛИ) не нумеруются.

В части «СЛУШАЛИ» указывают фамилию и инициалы основного докладчика в соответствии с повесткой дня, далее через тире — содержание его доклада:

Если доклад большой и содержит значительный объем важной информации, предпочтительнее подготовить его текст заранее и передать секретарю собрания. В этом случае текст доклада прикладывается к протоколу, в котором дается ссылка на это приложение. Например:

В части «ВЫСТУПИЛИ» указываются фамилии и инициалы всех выступивших по данному вопросу и краткое содержание их выступлений. По ключевым вопросам важно отразить в протоколе все мнения, весь ход обсуждения. Поэтому если докладчикам и выступающим в прениях задавались вопросы, после каждого выступления они фиксируются вместе с ответами в порядке поступления.

Слово «ВЫСТУПИЛИ», как и слова «СЛУШАЛИ» и «ПОСТАНОВИЛИ» («РЕШИЛИ»), пишется от границы левого поля. Фамилии ­выступающих и содержание выступлений указываются с абзаца с новой строки.

Оформление вопросов четко не установлено. В практике можно ­встретить несколько вариантов:

Сначала пишется слово «Вопрос:» (или «Вопросы:»), далее с новой строки указывается фамилия задавшего вопрос, после тире формулируется сам вопрос и на следующей строке — ответ на него
(см. образец в Примере 16).

После слова «Вопрос:» записывается только сам вопрос без указания фамилии лица, задавшего его (см. образец в Примере 17).

Слово «Вопрос:» не пишется. С красной строки записывается сам вопрос и ниже — ответ на него. В этом случае фамилию задавшего вопрос также допускается не указывать, однако лучше ее все-таки записать. Это позволит отделить вопрос от текста выступления (см. образец в Примере 18).

Однако выступлений, помимо основного доклада, может и не быть. В этом случае часть «ВЫСТУПИЛИ» из текста выпускается, и раздел будет состоять только из двух частей: «СЛУШАЛИ» и «ПОСТАНОВИЛИ» («РЕШИЛИ»).

Завершает каждый раздел принятое решение по данному вопросу. Оно записывается после слова «ПОСТАНОВИЛИ:» или « РЕШИЛИ:». Оба слова являются начальными элементами постановляющей части протокола и имеют равноценное значение.

Записываемые решения должны быть краткими, точными, не допускающими их двоякого толкования. Если решений по одному вопросу несколько, они формулируются как несколько пунктов, каждый из которых нумеруется арабскими цифрами:

Важно обратить внимание на то, что решения носят распорядительный характер. Поэтому они должны формулироваться с использованием модели, характерной для распорядительных документов. Модель состоит из указания на дальнейшие действия, отвечающего на вопрос «что сделать?», ­исполнителя (ответственного за исполнение) и срока исполнения.

Однако не всегда перечисленные составляющие могут или должны использоваться в протоколе. Так, сообщение, сделанное на совещании, может быть просто принято к сведению присутствующими или принимается решение об утверждении какого-либо документа. В этих случаях формулировка решения будет соответствовать модели «Что сделать» (см. Пример 20).

Если же в решении содержится указание на проведение дальнейших дейст­вий, должен быть указан их исполнитель (исполнители) или ­ответст­венный за исполнение и срок исполнения (см. Пример 21).

Есть еще одна важная особенность принятия решений на собраниях или заседаниях, которая обязательно должна учитываться при оформлении протокола: некоторые решения принимаются путем голосования. Так, например, обязательно голосуют за принимаемые решения на заседаниях совета директоров, обязательным является и голосование при определении кандидатуры для занятия выборной должности. В этих случаях в протоколе после соответст­вующего решения указываются результаты голосования (см. Пример 22). Если же все присутствующие проголосовали за принимаемое решение, результаты голосования можно обозначить иначе — см. Пример 23.

Оформляющая часть

Протокол подписывается после того, как его текст окончательно отредактирован, выверен и оформлены все разделы, соответствующие повестке дня собрания. Документ подписывают председатель и секретарь собрания. Подписи располагают от границы левого поля, отделив их от текста двумя- тремя межстрочными интервалами.

Юридическую силу протокол приобретает только при наличии этих двух подписей. Это общепризнанная практика, которая закреплена в ряде законодательных и нормативных актов. В частности, по нормам ФЗ «Об акционерных обществах» протокол общего собрания акционеров составляется в 2-х ­экземплярах и оба они должны быть подписаны председателем и секретарем собрания.

Вместе с тем этот же закон устанавливает иной порядок подписания протокола заседания совета директоров акционерного общества: протокол подписывается только председательствующим на заседании, и он один несет ответственность за правильность составления документа. Такая норма представляется спорной, так как записи, отражающие ход заседания, ведет секретарь, именно он должен грамотно отредактировать их и оформить проект протокола. Из чего следует, что не только председатель, но и секретарь отвечает за составление протокола. Об этом и должна свидетельствовать его подпись под документом.

Протокол является внутренним распорядительным документом, ­поэтому его удостоверения печатью обычно не требуется.

Некоторые разновидности протоколов подлежат утверждению руководителем организации (например, протокол заседания технического совета, экспертной комиссии и т.д.). Утверждение оформляется грифом в верхнем правом углу: после слова «УТВЕРЖДАЮ», наименования должности (без упоминания наименования предприятия, т.к. оно присутствует в заголовочной части документа) проставляется личная подпись, ее расшифровка и дата утверждения.

А теперь предлагаем вашему вниманию образец протокола, ­составленного в соответствии с рассмотренными правилами:

В следующем номере журнала читайте продолжение статьи. Мы расскажем об особенностях оформления протокола общего собрания акционеров и о составе информации, которая в обязательном порядке должна найти свое отражение в этом документе. При изложении материала будут учтены требования таких основополагающих документов, как ФЗ «Об акционерных обществах», постановления ФКЦБ от 31.05.2002 г. № 17/пс и др. Вы увидите, насколько типовой протокол отличается от протокола общего собрания акционеров!

В автор делится своими секретами. Он предлагает пошаговую методику подготовки эффективного совещания (вы узнаете, как формируется повестка дня, как организовать взаимодействие с участниками совещания и приглашенными, как подготовить информационные материалы и помещение для встречи). Предлагается оптимальный регламент обсуждения, который базируется на рекомендациях психологов. Рассмотрены вопросы хода протоколирования, сроков оформления протокола, правил составления его копии и выписки для информирования исполнителей тех решений, которые были приняты на совещании.

1 См. статью Е.Г. Юсиповой «Организационный аспект проведения совещаний на предприятии» на стр. 52 журнала № 1` 2007

2 Общепринятые сокращенные наименования административно-территориальных единиц и перечень субъектов РФ опубликованы на стр. 91-93 журнала
№ 1` 2007

Введение в протокол UDP. Протокол: типовые требования к оформлению и специфика акционерных обществ

UDP (User Datagram Protocol, Протокол дейтаграмм пользователя) предназначен для обмена дейтаграммами между процессами компьютеров, входящих в единую сеть с коммутацией пакетов. В качестве протокола нижнего уровня UDP-протокол использует IP.

Протокол UDP предоставляет прикладным программам возможность отправлять сообщения другим приложениям, используя минимальное количество параметров протокола. Этот протокол не обеспечивает достоверность доставки пакетов, защиты дублирования данных или надежности от сбоев в передаче. За исключением параметров приложения — номеров портов отправителя и получателя пакета, UDP практически ничего не добавляет к IP-дейтаграмме.

Протокол UDP намного проще, чем TCP и полезен в ситуациях, когда мощные механизмы обеспечения надежности протокола TCP не требуются или будут только помехой для решения определенного рода задач, например, аутентификации пользователей.

  • Source Port (16 бит) . Порт отправителя. Это поле может содержать номер порта, с которого был отправлен пакет, когда это имеет значение (например отправитель ожидает ответа). Если это поле не используется, оно заполняется нулями.
  • Destination Port (16 бит) . Порт назначения — это порт компьютера, на который пакет будет доставлен.
  • Length (16 бит) . Поле длины. Длина (в байтах) этой дейтаграммы, включая заголовок и данные. (Минимальное значение этого поля равно 8).
  • Checksum (16 бит) . Поле контрольной суммы. Контрольная сумма UDP-пакета представляет собой побитное дополнение 16-битной суммы 16-битных слов (аналогично TCP). В вычислении участвуют: данные пакета, заголовок UDP-пакета, псевдозаголовок (информация от IP-протокола), поля выравнивания по 16-битной границе (нулевые).

Преимущество протокола UDP состоит в том, что он требует минимум установок и параметров для соединения двух процессов между собой. Этот протокол используется при работе Серверов Доменов (Name Servers), при работе протокола TFTP (Trivial File Transfer, Тривиальный протокол передачи данных), работе с SNMP и построении систем аутентификации. Идентификатор UDP в IP-заголовке — число 17.

Более подробное описание протокола UDP можно найти в RFC-768.

Использование сетевых файрволов и систем, эффективно скрывающих организацию внутренней сетевой структуры от внешней сети, такой как Интернет, становится все…

Поскольку тема безопасности важная, и за раз ее не охватишь, мы разбили нашу серию статей на части, и на этот раз (во второй части) рассматриваем настройку фаервола…

Основная задача протокола SMTP (Simple Mail Transfer Protocol) заключается в том, чтобы обеспечивать передачу электронных сообщений (почту). Для работы через протокол SMTP клиент…

Достаточно часто мне приходиться сопрягаться со специализированным ПО (и железом, хотя в конечном итоге идет сопряжение со вшитым на плату фирмвейром), изготовитель каждого из которых предоставляет свой протокол обмена данными.

Какими свойствами и особенностями обладает хороший, годный грамотный, качественный протокол?

В идеале, протокол должен быть абстрагирован от более нижнего уровня взаимодействия, будь то передача по TCP, UDP, по serial порту, USB, Bluetooth, через цифровой радиосигнал, или даже по голубиной почте . И надо учитывать, что далеко не все из них гарантируют доставку и\или достоверность передающихся данных.

Небольшой дисклеймер: говоря о достоверности данных, я имею ввиду их неискаженность вследствие помех и иных ошибок в среде передачи. В статье я не буду затрагивать темы пласта технологий, связанных с безопасностью в ИТ. Допустим что наши Алиса и Боб могут друг другу доверять, и никакая Ева им помешать не может . (Например у коллег вопрос безопасности решается включением всех территориально разделенных участников взаимодействия в хорошо защищенный VPN, не имеющий в свою очередь доступа наружу)

В большинстве протоколов реализована схема «Вопрос-Ответ». Это можно представить как разговор, в котором на каждую реплику своего собеседника вы реагируете вербально, и в том же смысловом ключе. Таким образом участниками взаимодействия достигается уверенность в том, что их сообщения переданы и адекватно восприняты. Однако эта схема допустима и эффективна не для всех задач: в случаях когда задержка в общении должна быть минимизирована, или ответ на каждую из многочисленных реплик признается избыточным (например для отладочных сообщений), реализуется схема «Старт-Стоп». При получении сообщения на «Старт» ваш собеседник начинает сыпать в вас потоком реплик, и замолкает лишь при слове «Стоп». Сообщения, отправляемые в потоке, обычно имеют инкрементируемый порядковый номер, и если при принятии потока сообщений были проблемы с обработкой\было пропущено одно из них, его можно перезапросить отдельно по этому самому номеру.

Все протоколы можно разделить на две группы, (по представлению данных): символьные и бинарные .
Символьные протоколы, с которыми мне приходилось встречаться, базировались либо на XML, либо на JSON-строках. Из их достоинств можно упомянуть о более простой отладке взаимодействия (вследствие их читаемости), о простоте реализации (наличия готовых парсеров), и пресловутой универсальности.
Теперь о недостатках. Очевидно, что такие протоколы являются крайне избыточными, мизерная доля полезной информации плавает в массивной, неэффективной обёртке. При передаче любой числовой информации приходиться заниматься их конвертацией в строковое представление и обратно. Больным местом является передача бинарных данных (и хорошо, что без них бывает можно обойтись, но в ряде случаев это невозможно). Составители протоколов обычно выкручиваются применением Base64 , или даже просто передачей бинарной строки в её hex-овом представлении, по два символа на байт.
Также хочется отметить, что полная спецификация того же XML крайне обширна, и стандартные парсеры, при всей их полноте возможностей, достаточно громоздки и медлительны, поэтому распространена практика, когда отдел или контора в итоге пишет и пользуется собственным парсером.

Конечно, для определенных задач , символьные протоколы являются, если не наиболее эффективным, то по крайней мере вполне приемлимым вариантом, но мы с вами идём дальше.

Теперь бинарные протоколы. Сразу же надо вспомнить о Гулливерских войнах тупоконечников и остроконечников . Лично я симпатизирую big-endian, т.к. не считаю неявную типизацию little-endian «чем-то хорошим», да и в моей среде разработки big-endian является нативным.
Бинарные протоколы (не все, но те, которые я отношу к грамотным) можно разделить на два уровня: уровень контейнера и уровень данных. На плечи первого уровня ложится ответственность за целостность и достоверность передачи данных, а так же за доступность обнаружения сообщения в байтовом потоке, и, само собой, за хранение в себе сообщения уровня данных. Второй уровень должен содержать информацию, ради которой всё сетевое взаимодействие и затевалось, в удобном для обработки формате. Его структура в основном зависит от решаемых задач, но и по нему есть общие рекомендации (о которых ниже).

Размеры сообщений (дискретных пакетов байт, которые можно обрабатывать независимо от предыдущих и последующих принимаемых данных) бывают фиксированными и переменными . Понятно, что с фиксированным размером сообщений всё проще — вычитается, начиная с заголовка (о нём позже), определенное количество байт и отправляется на обработку. Зачастую, для обеспечения гибкости, составители таких протоколов включают в сообщение область фиксированного размера (иногда до 80% от общего объема), зарезервированное под модификации нынешнего протокола. На мой взгляд, это не самый эффективный путь обеспечения гибкости, зато избыточность появляется еще какая.
Рассмотрим сообщения переменной длины.
Тут уже можно подробней поговорить о непременном атрибуте бинарного сообщения в любом протоколе — о заголовке (Это вышеупомянутый уровень контейнера).
Обычно заголовки начинаются с константной части, позволяющей, с определенной вероятностью обнаружить начало сообщения в непрерывном байтовом потоке. Очевидно, что имеется риск появления такой константы в произвольном потоке байт, и, хотя увеличение объема этот риск снижает (я встречал константы вида 0123456789VASIA9876543210), целесообразней использовать проверки на основе подсчета контрольной суммы .
За константой обычно следует номер версии протокола, который дает нам понять, в каком формате должно происходить дальнейшее считывание (и имеем ли мы вообще возможность обработать это сообщение — вдруг такая версия нам неизвестна). Следующая важная часть заголовка: информация о самом содержимом контейнера. Указывается тип содержимого (по факту, тот же номер версии протокола для уровня данных), его длина и контрольная сумма. Имея эту информацию, можно уже без проблем и опасений считать содержимое и приступить к его разбору.
Но не прямо сразу! Заголовок должна заключать контрольная сумма его самого (исключая из расчета конечно саму контрольную сумму) — только так мы можем быть уверены в том, что считали только что не белиберду, а валидный заголовок, за которым следуют предназначенные нам данные. Не совпала контрольная сумма? Придётся искать следующее начало нового заголовка дальше по потоку…

Представим, что мы дошли до этапа, что получили наконец неискаженное сообщение уровня данных. Его структура зависит от той области задач той системы, в которой реализован ваш сетевой обмен, однако в общем виде у сообщения тоже бывает быть свой заголовочек , содержащий информацию о типе сообщения. Можно различить как общую специфику сообщения, (например «Запрос Set», «Утвердительный Ответ на Set», «Отрицательный Ответ на Set», «Запрос Get», «Ответ Get», «Потоковое сообщение»), так и конкретную область применение сообщения. Попробую привести пример с потолка:
Тип запроса: Запрос Set (0x01)
Идентификатор модуля-адресата сообщения: PowerSupplyModule (0x0A)
Идентификатор группы сообщений: UPS Management (0x02)
Идентификатор типа сообщения: Reboot (0x01)
Дальше тело сообщения может содержать информацию об адресе ИБП, который Модуль управления энергообеспечением должен перезагрузить, через сколько секунд это сделать и т.п.
На это сообщение мы рассчитываем получить ответное сообщение с типом запроса «Утвердительный Ответ» и последующими 0x0A0201 в заголовке.
Конечно, такое подробное описание типа сообщения может быть избыточным когда межсетевое взаимодействие не предусматривает большого числа команд, так что формировать структуру сообщения надо исходя из требований ТЗ.
Так же будет полезно, если сообщение с «Отрицательным Ответом» будет содержать код ошибки, из-за которой не удалось ответить на команду утвердительно.

Заканчивая своё повествование, добавлю, что тема взаимодействия приложений весьма обширна и порою холиворна(что по факту означает, что в ней нет технологии «серебряной пули»), и отмечу, что те взгляды, что я излагаю, являются лишь компиляцией из опыта по работе с отечественными и зарубежными коллегами. Спасибо за внимание!

upd.
Имел удовольствие пообщаться с критиком своей статьи, и теперь прихожу к осознанию, что я осветил вопрос со своей если можно так выразиться, «байтолюбской», точки зрения. Конечно, раз идет курс на универсальность обработки хранения и передачи данных, то в таком ключе символьные протоколы (в первую очередь говорю об XML) могут дать фору любым другим решениям. Но относительно попытки повсеместного их применения позволю себе процитировать Вирта:
Инструмент должен соответствовать задаче. Если инструмент не соответствует задаче, нужно придумать новый, который бы ей соответствовал, а не пытаться приспособить уже имеющийся.

Документационное обеспечение управления

1. Протокол, виды протоколов, особенности оформления 4

2. Обработка отправляемой корреспонденции 9

3. Оформить акт списания имущества 11

4. Составить докладную записку 12

Библиографический список 14

1. Протокол, виды протоколов, особенности оформления

Протокол – документ, фиксирующий ход обсуждения и принятия решений на собраниях, совещаниях и заседаниях коллегиальных органов.

Особенностью протокола является то, что он используется для документирования деятельности коллегиальных органов: временных (собрания, конференции, совещания, комиссии) и постоянных (коллегии министерств и комитета, ученых советов научных учреждений, президиумов).

Составление и оформление протоколов возлагается на секретарей соответствующих коллегиальных органов (штатных или избранных в ходе их работы). Секретарь, наряду с председателем коллегиального органа, несет ответственность за достоверность содержащейся в протоколе информации. Протокол составляется на основании рукописных, в том числе стенографических или магнитофонных записей хода заседания, а также документов, подготовленных к заседанию: повестки дня, текстов или тезисов докладов и выступлений, проектов решений.

Основные виды протокола:

Краткий протокол — фиксирует обсуждавшиеся на заседании вопросы, фамилии докладчиков и принятые решения. Его рекомендуется вести в тех случаях, когда заседание носит оперативный характер.

Полный протокол фиксирует не только обсуждавшиеся вопросы, принятые решения и фамилии выступавших, но и достаточно подробно — содержание докладов и выступлений участников заседания.

Стенографический протокол составляется на основе стенографического отчета о заседании (стенограммы) и дословно передает процесс обсуждения каждого вопроса и выработку решения по нему.

Протоколы оформляются на бланках организации и содержат следующие реквизиты: наименование организации, наименование вида документа, дата заседания, номер протокола, место составления протокола (место проведения заседания), заголовок к тексту, текст, подписи, визы ознакомления. Заголовок к тексту протокола – это название протоколируемого мероприятия (совещание, заседание, собрание) и наименование коллегиального органа, работа которого протоколируется.

Текст протокола состоит из двух частей: вводной и основной. Вводная часть текста протокола должна показывать: кто руководил проведением протоколируемого мероприятия; кто вел протокол; кто присутствовал на совещании (заседании, собрании и т.п.) из числа должностных лиц, входящих в состав коллегиального органа, проводящего совещание; кто был приглашен (при необходимости) на совещание из числа сотрудников организации или из других организаций; какие вопросы обсуждались на совещании.

Информация о руководителе совещания, секретаре и присутствовавших включает фамилии и инициалы должностных лиц, указываемые соответственно после слов: «Председатель», «Секретарь», «Присутствовали» (без кавычек). Для лиц, дополнительно приглашенных на совещание из числа сотрудников организации, помимо фамилии и инициалов указывается занимаемая должность, а для специалистов из других организаций — должность и название организации. Сведения о приглашенных на совещание лицах можно включать в раздел «Присутствовали» или в специальный раздел «Приглашенные».

На таких коллективных мероприятиях, как собрания, нередко присутствует большое количество участников, перечисление которых во вводной части текста протокола нецелесообразно. В этом случае составляется отдельный список присутствовавших на собрании, прилагаемый в дальнейшем к протоколу.

В самом протоколе в разделе «Присутствовали» указывается только общее количество присутствовавших со ссылкой на прилагаемый список. Следует подчеркнуть, что разделы «Присутствовали» и «Приглашенные» имеют особое значение по отношению к другим разделам протокола, так как непосредственно влияют на юридическую силу данного документа, показывая правомерность проведения коллективного мероприятия. В этих разделах отражается наличие кворума собрания, т.е. минимально необходимого количества членов коллегиального органа, достаточного для начала работы собрания (заседания, совещания). При отсутствии нормативно установленного для данного коллегиального органа кворума (простое большинство или 2/3) проведение собрания недопустимо, так как его решения будут неправомерны. Слова «Председатель», «Секретарь», «Присутствовали», «Приглашенные» печатаются от нулевого положения печатающего устройства, от 2-го положения ставят тире, фамилии пишут в именительном падеже, затем ставят инициалы. Фамилии присутствующих и приглашенных располагают в алфавитном порядке и печатают через 1 межстрочный интервал.

Рассмотренные на совещании вопросы перечисляются в разделе ПОВЕСТКА ДНЯ. Слова ПОВЕСТКА ДНЯ печатают от нулевого положения печатающего устройства, после них ставится двоеточие. Вопросы повестки дня нумеруются. Каждый новый вопрос печатают от 1-го положения табулятора. Последовательность расположения вопросов определяется степенью их важности. Формулировка вопросов повестки дня должна начинаться с предлогов о (об), наименование должности и фамилию докладчика дают в родительном падеже. Основная часть текста протокола строится в соответствии с вопросами повестки дня. Построение записи обсуждения каждого вопроса повестки дня осуществляется по схеме: СЛУШАЛИ ВЫСТУПИЛИ ПОСТАНОВИЛИ (РЕШИЛИ). Эти слова печатают прописными буквами. Перед словом СЛУШАЛИ ставят номер вопроса повестки дня, после двоеточие. Фамилию докладчика печатают в именительном падеже от 1-го положения печатающего устройства; после фамилии ставят инициалы, затем тире и с прописной буквы пишут содержание доклада в форме прямой речи. Если текст доклада (выступления) застенографирован или представлен докладчиком в письменной форме, то после тире также с прописной буквы пишут «Доклад прилагается» (в протоколе без кавычек).

Обсуждению доклада могут предшествовать вопросы к докладчику, которые вместе с ответами включаются в раздел СЛУШАЛИ. Перед записью каждого вопроса указываются инициалы, фамилия и должность его автора и ставится тире. Содержание вопроса записывается с прописной буквы в форме прямой речи. Перед формулировкой ответа пишется слово «Ответ» (в протоколе без кавычек), ставится тире и записывается ответ в форме прямой речи. Ход обсуждения доклада отражается в разделе ВЫСТУПИЛИ. После слова ВЫСТУПИЛИ ставится двоеточие. Фамилию выступающего пишут в именительном падеже от 1го положения печатающего устройства, затем указывают инициалы и должность выступающего, ставят тире и с прописной буквы печатают содержание выступления в форме косвенной речи.

Принятые решения содержатся в разделе ПОСТАНОВИЛИ (РЕШИЛИ). Если решений несколько, они нумеруются арабскими цифрами с точкой. Как правило, каждое решение сопровождается указанием должности, фамилии и инициалов ответственного за его выполнение и содержит срок исполнения. Принимаемые коллегиально решения нередко требуют голосования. В этом случае после раздела ПОСТАНОВИЛИ указывается: «Голосование» или «Голосовали» (в протоколе без кавычек) и приводятся результаты голосования: единогласно или за. против. воздержались.

В практике часто применяются сокращенная и краткая формы протоколов, когда не требуется подробная запись хода обсуждения вопросов. В сокращенных протоколах после списка присутствующих или приглашенных указывается порядковый номер вопроса по повестке дня и печатается название доклада. Последняя строка названия доклада (пункт повестки дня) подчеркивается, и под чертой (в скобках) печатают фамилии выступающих в порядке их выступления. Название каждого доклада заканчивается протокольным решением или постановлением. В протоколе краткой формы указываются только рассмотренные вопросы и принятые решения. В постановляющей части текста протокола может содержаться пункт об утверждении какого-либо документа. В этом случае утвержденный документ прилагается к протоколу и имеет ссылку на его номер и дату. В практике очень часто приходится делать выписки из протоколов. Выписка из протокола содержит следующие реквизиты:

все реквизиты заголовочной части протокола: наименование организации, наименование вида документа (ВЫПИСКА ИЗ ПРОТОКОЛА), дату (дата заседания), номер протокола (порядковый номер заседания), место составления (место проведения заседания);

заголовок к тексту;

все реквизиты вводной части текста протокола: «Председатель», «Секретарь», «Присутствовали», «Приглашенные», «ПОВЕСТКА ДНЯ»;

отдельные реквизиты основной части текста протокола: «СЛУШАЛИ», «ПОСТАНОВИЛИ», «Голосование»;

реквизиты оформляющей части протокола: реквизит «Подпись», включающей слова «Председатель», «Секретарь», инициалы и фамилии председателя и секретаря (без их личных подписей т.к. выписки, как правило, не подписываются подлинными подписями, а заверяются секретарем); отметку о заверении копии.

Таким образом, из содержательной части протокола берутся только те элементы, которые необходимо довести до сведения заинтересованных должностных лиц. Для подтверждения установленных фактов и событий несколькими лицами составляется акт. Акты составляются по результатам ревизий деятельности предприятия или его структурного подразделения и отдельных должностных лиц, при приеме-передаче дел, подготовке документов к уничтожению, приеме объектов в эксплуатацию .

Выполняет функции транспортного уровня модели OSI .

Когда осуществляется передача от компьютера к компьютеру через Интернет, TCP работает на верхнем уровне между двумя конечными системами, например, браузером и веб-сервером. TCP осуществляет надёжную передачу потока байтов от одного процесса к другому. TCP реализует управление потоком, управление перегрузкой, рукопожатие, надежную передачу.

Заголовок сегмента TCP

Структура заголовка
Бит 0 — 3 4 — 9 10 — 15 16 — 31
Порт источника, Source Port Порт назначения, Destination Port
32 Порядковый номер, Sequence Number (SN)
64 Номер подтверждения,
96 Длина заголовка Зарезервировано Флаги Размер Окна
128 Контрольная сумма Указатель важности
160 Опции (необязательное, но используется практически всегда)
160/192+ Данные

Порт источника, Порт назначения

Эти 16-битные поля содержат номера портов — числа, которые определяются по специальному списку .

Порт источника идентифицирует приложение клиента, с которого отправлены пакеты. Ответные данные передаются клиенту на основании этого номера.

Порт назначения идентифицирует порт, на который отправлен пакет.

Порядковый номер

Порядковый номер выполняет две задачи:

  1. Если установлен флаг SYN, то это изначальный порядковый номер — ISN (Initial Sequence Number), и первый байт данных, которые будут переданы в следующем пакете, будет иметь номер, равный ISN + 1.
  2. В противном случае, если SYN не установлен, первый байт данных, передаваемый в данном пакете, имеет этот порядковый номер

Поскольку поток TCP в общем случае может быть длиннее, чем число различных состояний этого поля, то все операции с порядковым номером должны выполняться по модулю 2 32 . Это накладывает практическое ограничение на использование TCP. Если скорость передачи коммуникационной системы такова, чтобы в течение MSL (максимального времени жизни сегмента) произошло переполнение порядкового номера, то в сети может появиться два сегмента с одинаковым номером, относящихся к разным частям потока, и приёмник получит некорректные данные.

Номер подтверждения

Acknowledgment Number (ACK SN) (32 бита) — если установлен флаг ACK, то это поле содержит порядковый номер октета, который отправитель данного сегмента желает получить. Это означает, что все предыдущие октеты (с номерами от ISN+1 до ACK-1 включительно) были успешно получены.

Длина заголовка (смещение данных)

Длина заголовка (Data offset) занимает 4 бита и указывает значение длины заголовка, измеренное в 32-битовых словах. Минимальный размер составляет 20 байт (пять 32-битовых слов), а максимальный — 60 байт (пятнадцать 32-битовых слов). Длина заголовка определяет смещение полезных данных относительно начала сегмента. Например, Data offset равное 1111 говорит о том, что заголовок занимает пятнадцать 32-битных слова (15 строк*32 бита в каждой строке/8 бит = 60 байт).

Зарезервировано

Зарезервировано (6 бит) для будущего использования и должно устанавливаться в ноль. Из них два (5-й и 6-й) уже определены:

  • CWR (Congestion Window Reduced) — Поле «Окно перегрузки уменьшено» — флаг установлен отправителем, чтобы указать, что получен пакет с установленным флагом ECE (RFC 3168)
  • ECE (ECN-Echo) — Поле «Эхо ECN» — указывает, что данный узел способен на ECN (явное уведомление перегрузки) и для указания отправителю о перегрузках в сети (RFC 3168)

Флаги (управляющие биты)


Это поле содержит 6 битовых флагов:

  • URG — поле «Указатель важности» задействовано (англ. Urgent pointer field is significant )
  • ACK — поле «Номер подтверждения» задействовано (англ. Acknowledgement field is significant )
  • PSH — (англ. Push function ) инструктирует получателя протолкнуть данные, накопившиеся в приёмном буфере, в приложение пользователя
  • RST — оборвать соединения, сбросить буфер (очистка буфера) (англ. Reset the connection )
  • SYN — синхронизация номеров последовательности (англ. Synchronize sequence numbers )
  • FIN (англ. final , бит) — флаг, будучи установлен, указывает на завершение соединения (англ. FIN bit used for connection termination ).

Размер окна

Количество байт данных начиная с последнего номера подтверждения, которые может принять получатель данного пакета. Иначе говоря, получатель пакета располагает для приёма данных буфером длиной «размер окна» байт.

Контрольная сумма

Поле контрольной суммы — это 16-битное дополнение к сумме всех 16-битных слов заголовка (включая псевдозаголовок) и данных. Если сегмент, по которому вычисляется контрольная сумма, имеет длину не кратную 16-ти битам, то длина сегмента увеличивается до кратной 16-ти, за счёт дополнения к нему справа нулевых битов заполнения. Биты заполнения (0) не передаются в сообщении и служат только для расчёта контрольной суммы. При расчёте контрольной суммы значение самого поля контрольной суммы принимается равным 0.

Указатель важности

16-битовое значение положительного смещения от порядкового номера в данном сегменте. Это поле указывает порядковый номер октета, которым заканчиваются важные (urgent) данные. Поле принимается во внимание только для пакетов с установленным флагом URG. Используется для внеполосных данных .

Опции

Могут применяться в некоторых случаях для расширения протокола. Иногда используются для тестирования. На данный момент в опции практически всегда включают 2 байта NOP (в данном случае 0x01) и 10 байт, задающих timestamps . Вычислить длину поля опции можно через значение поля смещения.

Видео по теме

Механизм действия протокола

В отличие от традиционной альтернативы — UDP, который может сразу же начать передачу пакетов, TCP устанавливает соединения, которые должны быть созданы перед передачей данных. TCP соединение можно разделить на 3 стадии:

  • Установка соединения
  • Передача данных
  • Завершение соединения

Состояния сеанса TCP

Состояния сеанса TCP
CLOSED Начальное состояние узла. Фактически фиктивное
LISTEN Сервер ожидает запросов установления соединения от клиента
SYN-SENT Клиент отправил запрос серверу на установление соединения и ожидает ответа
SYN-RECEIVED Сервер получил запрос на соединение, отправил ответный запрос и ожидает подтверждения
ESTABLISHED Соединение установлено, идёт передача данных
FIN-WAIT-1 Одна из сторон (назовём её узел-1) завершает соединение, отправив сегмент с флагом FIN
CLOSE-WAIT Другая сторона (узел-2) переходит в это состояние, отправив, в свою очередь сегмент ACK и продолжает одностороннюю передачу
FIN-WAIT-2 Узел-1 получает ACK, продолжает чтение и ждёт получения сегмента с флагом FIN
LAST-ACK Узел-2 заканчивает передачу и отправляет сегмент с флагом FIN
TIME-WAIT Узел-1 получил сегмент с флагом FIN, отправил сегмент с флагом ACK и ждёт 2*MSL секунд, перед окончательным закрытием соединения
CLOSING Обе стороны инициировали закрытие соединения одновременно: после отправки сегмента с флагом FIN узел-1 также получает сегмент FIN, отправляет ACK и находится в ожидании сегмента ACK (подтверждения на свой запрос о разъединении)

Установка соединения

Процесс начала сеанса TCP (также называемый «рукопожатие» (англ. handshake )), состоит из трёх шагов.

1. Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN.

  • Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента.
    • В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED.
    • В случае неудачи сервер посылает клиенту сегмент с флагом RST.

2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK.

  • Если клиент одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED.
  • Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться.
  • Если клиент не получает ответа в течение 10 секунд, то он повторяет процесс соединения заново.

3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.

  • В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED.

Процесс называется «трёхэтапным согласованием» (англ. three way handshake ), так как несмотря на то что возможен процесс установления соединения с использованием четырёх сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется три сегмента.

Пример базового 3-этапного согласования:

TCP A TCP B 1. CLOSED LISTEN 2. SYN-SENT SYN-RECEIVED 3. ESTABLISHED ESTABLISHED 5. ESTABLISHED Завершение соединения

Завершение соединения можно рассмотреть в три этапа:

  1. Посылка серверу от клиента флага FIN на завершение соединения.
  2. Сервер посылает клиенту флаги ответа ACK , FIN, что соединение закрыто.
  3. После получения этих флагов клиент закрывает соединение и в подтверждение отправляет серверу ACK , что соединение закрыто.

Известные проблемы

Максимальный размер сегмента

TCP требует явного указания максимального размера сегмента (MSS) в случае, если виртуальное соединение осуществляется через сегмент сети, где максимальный размер блока (MTU) менее, чем стандартный MTU Ethernet (1500 байт).

В протоколах туннелирования, таких как GRE , IPIP , а также PPPoE MTU туннель меньше, чем стандартный, поэтому сегмент TCP максимального размера имеет длину пакета больше, чем MTU. Это приводит к фрагментации и уменьшению скорости передачи полезных данных. Если на каком-либо узле фрагментация запрещена, то со стороны пользователя это выглядит как «зависание» соединений. При этом «зависание» может происходить в произвольные моменты времени, а именно тогда, когда отправитель использовал сегменты длиннее допустимого размера. Для решения этой проблемы на маршрутизаторах применяются правила Firewall-а, добавляющие параметр MSS во все пакеты, инициирующие соединения, чтобы отправитель использовал сегменты допустимого размера.

MSS может также управляться параметрами операционной системы.

Обнаружение ошибок при передаче данных

Хотя протокол осуществляет проверку контрольной суммы по каждому сегменту, используемый алгоритм считается слабым . Так, в 2008 году ошибка в передаче одного бита, не обнаруженная сетевыми средствами, привела к остановке серверов системы Amazon Web Services .

В общем случае распределенным сетевым приложениям рекомендуется использовать дополнительные программные средства для гарантирования целостности передаваемой информации .

Атаки на протокол

Недостатки протокола проявляются в успешных теоретических и практических атаках, при которых злоумышленник может получить доступ к передаваемым данным, выдать себя за другую сторону или привести систему в нерабочее состояние.

Реализация

Псевдозаголовок

TCP-заголовок не содержит информации об адресе отправителя и получателя, поэтому даже при совпадении порта получателя нельзя с точностью сказать, что сообщение пришло в нужное место. Поскольку назначением протокола TCP является надёжная доставка сообщений, то этот момент имеет принципиальное значение. Эту задачу можно было решить разными способами. Самый очевидный — добавить информацию об адресе назначения в заголовок TCP, однако это, во-первых, приводит к дублированию информации, что снижает долю полезной информации переносимой TCP-сегментом, а во-вторых, нарушает принцип инкапсуляции модели OSI. Поэтому разработчики протокола пошли другим путём и использовали дополнительный псевдозаголовок.

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 69. Протокол UDP. Создание UDP-сервера и клиента с помощью библиотеки UIPEthernet.

В уроке научимся передавать данные, используя протокол UDP. Создадим несколько программ, реализующих функции сервера и клиента с UDP протоколом.

Наконец я возвращаюсь к основной на данный момент теме уроков – обмен данными между устройствами в системе Ардуино.

Скорее всего, дальнейшая последовательность уроков на основную тему будет продолжать хаотично прерываться уроками по совершенно другим вопросам. Иного выхода не вижу. Время не течет в обратную сторону, нельзя переписать историю, переставить объекты прошлого. Постараюсь написать подряд несколько уроков об обмене данными, хотя уже накопились очень интересные другие темы.

Протокол UDP.

UDP – это простой протокол передачи данных без предварительной организации соединения абонентов. Протокол ориентирован на передачу датаграмм – отдельных небольших пакетов данных. Датаграммы передаются в одном направлении без проверки готовности приемного устройства и без подтверждения доставки.

Примерно так мы передаем в сотовых сетях короткие сообщения (SMS). Если еще отключить подтверждение о доставке, то совсем похоже получится.

В протоколе TCP:

  • происходит соединение;
  • затем передаются данные;
  • данные проверяются с помощью контрольных кодов;
  • если необходимо, данные автоматически повторяются;
  • соединение разрывается.

Пользователю остается только передавать данные, все остальное делает библиотека реализации протокола.

В отличие от TCP, протокол UDP не гарантирует ничего. Он не гарантирует, что данные будут доставлены, что придут правильные данные, что пакеты будут доставляться в той же последовательности, как при передаче. Контрольным кодом защищен только заголовок UDP-пакета. Поэтому, единственное, что гарантирует протокол, это то, что данные не попадут по неправильному адресу.

Пользователю необходимо самому побеспокоиться о целостности информации, о повторной передачи данных, о склеивании пакетов и т.п.

Но зато передача UDP-данных происходит значительно быстрее, чем через TCP. Именно поэтому протокол UDP предпочитают многие приложения.

К тому же во многих задачах вполне допустимо искажение или потеря части информации. Например, при просмотре фильма лучше потерять несколько кадров, чем ждать, когда они будут заново переданы.

Мы выполняем задачи на микроконтроллерах невысокой производительности. Поэтому для нас особенно важно, что реализация протокола UDP требует меньше вычислительных ресурсов, чем TCP.

Лично я предпочитаю именно UDP. Все можно сделать оптимально своей задаче. Не надо ждать соединений, минимальная нагрузка на контроллер и т.п.

Я не буду рассказывать о формате данных протокола. Нам это не надо. Пакеты данных при передаче и приеме будет формировать библиотека. Но необходимо твердо понимать, что:

  • UDP – протокол без установления предварительных соединений;
  • его задача – доставлять отдельные пакеты данных (датаграммы) между IP адресами;
  • в сети Ethernet максимальный размер датаграммы 1500 байт;
  • протокол не гарантирует, что данные будут доставлены;
  • данные могут быть искажены при передаче, средств определения такой ситуации нет;
  • протокол не сообщит отправителю, доставлены ли данные и не повторит передачу пакета;
  • пакеты данных могут быть доставлены не в той последовательности, как при передаче;
  • у UDP протокола высокая скорость передачи данных, он требует для реализации минимальных вычислительных ресурсов.

Библиотека для реализации обмена по UDP-протоколу UIPEthernet.

В предыдущем уроке по теме обмена информацией я рассказывал о библиотеке UIPEthernet и мы использовали ее для реализации TCP протокола. Я даже создал небольшой справочник по функциям UIPEthernet.

Я повторю ссылки на справочную информацию по функциям библиотеки для реализации UDP протокола. Все остальное будет ясно на примерах.

Класс EthernetUDP – поддерживает UDP протокол.
begin() beginPacket() stop()
read() endPacket() remoteIP()
peek() parsePacket() remotePort()
write() available() flush()

Я использую эту версию библиотеки UIPEthernet-2.0.6.

Общая постановка задачи.

Остальная часть урока будет построена аналогично уроку 64. Программы будут выполнять те же функции, только с использованием UDP.

Повторю формализованную задачу.

  • У нас есть плата Ардуино с подключенным к ней модулем ENC28J60, т.е. сетевое Ардуино-устройство или локальный контроллер.
  • Образована локальная сеть Ethernet из контроллера и компьютера. Попросту говоря, Ардуино-устройство через роутер подключено к компьютеру.
  • Задача состоит в том, чтобы от компьютера предать данные Ардуино-устройству и считать данные из Ардуино в компьютер.

Все аппаратные средства, схемы, подключения совершенно такие же, как в уроке 64.

Для отладки и проверки будем использовать мои программы верхнего уровня и программу TCP/IP Builder 1.9

Мы уже пользовались ею в уроке 64.

UDP сервер.

При использовании TCP-протокола мы создавали программные объекты отдельно для сервера и клиента.

EthernetServer server(2000); // создаем сервер, порт 2000
EthernetClient client; // создаем клиента

В UDP-протоколе мы просто передаем данные с одного IP-адреса на другой. Поэтому программно клиент и сервер не выделяются. Часто такие программы называют UDP-приемник и передатчик.

Сервер или клиент определяются по признакам более высокого уровня: кто предоставляет услуги, кто постоянно включен, кто инициирует соединение. А с точки зрения программной реализации обмена клиент и сервер — равнозначные устройства. Вы это прочувствуете ниже.

  • Первый вариант UDP-сервера выполняет следующие действия:
  • Проверяет, пришел ли новый пакет от клиента.
  • Выводит в последовательный порт сообщение Server address: с IP-адресом сервера.
  • Передает принятые данные обратно клиенту.

Загрузить скетч можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

// UDP сервер, возвращает клиенту полученные данные,
// выводит их в последовательный порт

#define SERV_PORT 2000 // порт сервера

char receivingBuffer[100]; // приемный буфер Udp-пакета
EthernetUDP udp; // создаем экземпляр Udp

void setup() <
Ethernet.begin(mac, ip); // инициализируем контроллер
udp.begin(SERV_PORT); // включаем прослушивание порта
Serial.begin(9600);
Serial.print(«Server address:»);
Serial.println(Ethernet.localIP()); // выводим IP-адрес контроллера
>

void loop() <
int size = udp.parsePacket(); // считываем размер принятого пакета
if (size) <
// есть пакет Udp, выводим информацию о пакете
Serial.print(«Received packet from «);
IPAddress ipFrom = udp.remoteIP();
Serial.println(ipFrom);
Serial.print(«Size «);
Serial.print(size);
Serial.print(«, port «);
Serial.println(udp.remotePort());

// чтение Udp-пакета и передача в последовательный порт
udp.read(receivingBuffer, size);
receivingBuffer[size]=0;
Serial.println(«——————-«);
Serial.println(receivingBuffer);
Serial.println();

В бесконечном цикле loop() проверяется, пришел ли новый пакет:

int size = udp.parsePacket(); // считываем размер принятого пакета
if (size) <
// есть пакет Udp


Если есть новый пакет, то выводится информация о нем в последовательный порт и данные считываются в буфер.

Затем данные выводятся в последовательный порт и передаются клиенту UDP-пакетом:

// ответ клиенту
udp.beginPacket(udp.remoteIP(), udp.remotePort());
udp.write(receivingBuffer);
udp.endPacket();

Для проверки надо загрузить скетч и открыть монитор последовательного порта. В окне монитора появится сообщение

Адрес сервера задается в строчке

Роль клиента будет выполнять компьютер.

  • Запустите программу TCP/IP Builder.
  • В строке Local IP уже должен быть адрес компьютера. Надо добавить порт, для программы урока 2000. Хотя, после того, как я заменил роутер, программа перестала правильно определять адрес сетевой платы компьютера. Раньше был 192.168.1.2, а с новым роутером стал 192.168.1.100. Лучше посмотрите сетевой адрес вашего компьютера. Как это сделать написано в уроке 62.
  • Выберите UDP.
  • Нажмите кнопку Create Socket (Создать соккет).
  • В строке IP укажите IP адрес локального контроллера и порт (те, что в плате Ардуино).
  • Нажмите Connect (Подключиться).
  • В результате на компьютере появится клиент.

Теперь можно посылать данные из окна Send data на сервер. Полученные от сервера данные будут появляться в окне Receive data.

Заметьте, что кнопка Connect (Соединение) для UDP не активна. В UDP-обмене не бывает соединений.

Я передал сообщение на сервер и получил его в ответ.

Оно же появилось в мониторе последовательного порта с данными об отправителе.

Для работы с UDP-устройствами я написал свою программу. Назвал ее UDP client, хотя она выполняет и роль сервера. Загрузить можно по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Программа позволяет посылать UDP-пакеты по IP-адресу и принимать UDP-датаграммы.

  • Поле IP адрес это IP-адрес по которому будет послано сообщение. (Для этой программы адрес сервера.)
  • Удаленный порт – порт получателя. (Порт сервера).
  • Локальный порт- порт приема сообщений. (Порт клиента.)
  • IP-адрес получателя (клиента) формируется автоматически. Это сетевой адрес компьютера. Его можно посмотреть, нажав кнопку Конфигурация сети.
  • Большое окно слева для приема сообщений (от сервера).
  • Поле ниже для посылаемых сообщений (от клиента серверу).
  • Кнопка Послать собственно инициирует посылку данных (на сервер).
  • Кнопкой конфигурация сети можно узнать сетевой адрес компьютера (клиента).

Заметьте, что локальный порт можно задавать любой. Программа сервера выведет его в мониторе порта и перешлет клиенту обратно данные именно на этот порт. Удаленный порт может быть только тот, который задан в программе сервера (2000).

Проверка такая же: послать на сервер сообщение и получить ответ.

Если используется роутер с WiFi, то можно проверить работу сервера с мобильным Андроид устройством. Я установил программу UDP terminal, она первая попалась в Google Play Market.

Задал адреса и порты.

Послал сообщение на сервер. Получил ответ.

Сообщение с параметрами отправителя появилось и в мониторе последовательного порта.

Давайте, по аналогии с уроком 64 создадим UDP-сервер, который:

  • Под управлением клиента включает и выключает светодиод, подключенный к выводу 2 платы Ардуино;
  • В качестве ответа клиенту передает время, прошедшее с начала запуска программы Ардуино (включения платы).

Вот скетч такого сервера:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

// UDP сервер, управляет светодиодом, передает клиенту время

#define SERV_PORT 2000 // порт сервера

char receivingBuffer[100]; // приемный буфер Udp-пакета
EthernetUDP udp; // создаем экземпляр Udp

void setup() <
Ethernet.begin(mac, ip); // инициализируем контроллер
udp.begin(SERV_PORT); // включаем прослушивание порта
pinMode(2, OUTPUT); // вывод светодиода
>

void loop() <
int size = udp.parsePacket(); // считываем размер принятого пакета

if (size) <
// есть новый пакет
udp.read(receivingBuffer, size); // чтение Udp-пакета

// управление светодиодом
if(receivingBuffer[0] == ‘0’) digitalWrite(2, LOW); // если пришел 0, гасим светодиод
if(receivingBuffer[0] == ‘1’) digitalWrite(2, HIGH); // если пришла 1, зажигаем светодиод
receivingBuffer[0]=0;

// посылка клиенту в ответ времени
udp.beginPacket(udp.remoteIP(), udp.remotePort());
udp.println(millis());
udp.endPacket();
>
>

Логика работы программы:

  • Если от клиента приходит символ 0 светодиод гасится.
  • Если поступает символ 1 светодиод зажигается.
  • При приходе от клиента любого символа в ответ передается время работы программы.

Проверим его работу с помощью программы UDP client.

При посылке 1 светодиод загорается, при 0 – гасится.

В качестве примера я написал специализированную программу клиента для управления этим сервером.

Светодиод гасится и зажигается ”птичкой”, время выводится в ”человеческом” виде.

Программу можно загрузить по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

DHCP сервер.

В предыдущих программах урока мы задавали IP адрес сервера явно. Применяли статические IP адреса. Все современные сети имеют возможность автоматического распределения адресов. Сервер, использующий этот способ назначения IP адресов, называется DHCP сервером. Об этом написано в уроке 62. Такой сервер мы создавали в уроке 64.

Для получения динамического IP-адреса достаточно при инициализации контроллера указать только один аргумент – mac адрес.

Чтобы первую программу урока перевести на использование динамических IP-адресов необходимо заменить в ней блок setup() на такой:

void setup() <
Serial.begin(9600);
Serial.println(«Getting IP address using DHCP»);
if (Ethernet.begin(mac) == 0) <
Serial.println(«Failed to configure using DHCP»);
while(true) ; // зависаем по ошибке
>
Serial.print(«Server address:»);
Serial.println(Ethernet.localIP()); // выводим IP-адрес контроллера

udp.begin(SERV_PORT); // включаем прослушивание порта
>

Полностью программу с DHCP UDP-сервером можно загрузить по ссылке:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Проверка отличается от предыдущей методики только тем, что до запуска сервера мы не знаем какой адрес указать при обращении к нему. Неизвестно какой адрес будет ему присвоен.

Загружаем программу в плату Ардуино. В мониторе последовательного порта появляется сообщение.

Указанный адрес сервера заносим в программу клиента и проверяем, как проходят сообщения.

У меня все работает.

UDP клиент.

Выше я писал, что с программной точки зрения в UDP-протоколе невозможно выделить сервер и клиент. Скорее мы разработаем приемо-передатчик UDP-сообщений. Он будет:

  • Данные, которые передаются монитором последовательного порта посылать серверу.
  • Выводить в последовательный порт сообщение о передаче с параметрами получателя.
  • Данные, поступающие от сервера выводить в монитор последовательного порта с параметрами передатчика.

Попросту говоря, сообщения с монитора последовательного порта он будет передавать серверу, а сообщения с сервера выводить в монитор порта.

Вот ссылка для загрузки скетча:

Зарегистрируйтесь и оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

В цикле loop() два программных блока.

  • принимает данные с UART в буфер;
  • ждет пока встретится символ с кодом 10 (перевод строки);
  • выводит параметры приемника в последовательный порт.

// собираем данные из UART в пакет
if( Serial.available() > 0 ) <
transmitBuffer[ii] = Serial.read();
if( transmitBuffer[ii] == 10 ) <
transmitBuffer[ii+1]= 0;
ii=0;
// передача UDP пакета
udp.beginPacket(ipServ, SERV_PORT);
udp.write(transmitBuffer);
udp.endPacket();
// сообщение в последовательный порт
Serial.print(«UDP-packet transmission to «);
Serial.print(udp.remoteIP());
Serial.print(» Port: «);
Serial.println(udp.remotePort());
>
else <
ii++;
if(ii >= 100) ii=0;
>
>

  • проверяет есть ли новый пакет UDP-данных;
  • выводит в последовательный порт сообщение с параметрами передатчика.

// проверка есть ли новые UDP-пакеты
int size = udp.parsePacket(); // считываем размер принятого пакета
if (size) <
// есть пакет Udp, выводим информацию о пакете
Serial.print(«Received packet from «);
IPAddress ipFrom = udp.remoteIP();
Serial.println(ipFrom);
Serial.print(«Size «);
Serial.print(size);
Serial.print(«, port «);
Serial.println(udp.remotePort());

// чтение Udp-пакета и передача в последовательный порт
udp.read(receivingBuffer, size);
receivingBuffer[size]=0;
Serial.println(«——————-«);
Serial.println(receivingBuffer);
Serial.println();
>

Проверка клиента с помощью разных программ.

Загружаем sketch_69_4 в плату Ардуино.

Запускаем мою программу UDP client.

Набираем сообщение в мониторе последовательного порта, нажимаем Отправить.

Видим в мониторе сообщение о посылке.

В программе UDP client появляется сообщение.

Набираем сообщение в UDP client. Нажимаем кнопку Послать.

Видим, что сообщение появилось в окне монитора.

Обмениваемся нескольким сообщениями.

Проверяем с помощью TCP/IP Builder.

Теперь мобильное Андроид-устройство и программа UDP terminal.

Это все. Не знаю кому как, а мне UDP-протокол для управления небольшим системами кажется намного предпочтительнее TCP.

В следующем уроке будем создавать веб-сервер.

16. Лекция: Введение в сетевые протоколы

16. Лекция: Введение в сетевые протоколы

Завершает курс лекция, в которой рассматриваются возможности построения сетевых приложений. Сначала дается краткое введение в сетевые протоколы, семиуровневую модель OSI, стек протоколов TCP/IP и описываются основные утилиты, предоставляемые операционной системой для мониторинга сети. Эти значения необходимы, поскольку библиотека java.net, по сути, является интерфейсом для работы с этими протоколами. Рассматриваются классы для соединений через высокоуровневые протоколы, протоколы TCP и UDP.

Основы модели OSI

В течение последних нескольких десятилетий размеры и количество сетей значительно выросли. В 80-х годах существовало множество типов сетей. И практически каждая из них была построена на своем типе оборудования и программного обеспечения, зачастую не совместимых между собой. Это приводило к значительным трудностям при попытке соединить несколько сетей (например, различный тип адресации делал эти попытки практически безнадежными).

Эта проблема была рассмотрена Всемирной организацией по стандартизации (International Organization for Standardization, ISO) и было принято решение разработать модель сети, которая могла бы помочь разработчикам и производителям сетевого оборудования и программного обеспечения действовать сообща. В результате в 1984 г. была создана модель OSI – модель взаимодействия открытых систем (Open Systems Interconnected). Она состоит из семи уровней, на которые разделяется задача организации сетевого взаимодействия. Схематично они представлены в таблице 16.1.

Таблица 16.1. Уровни модели OSI.

Уровень передачи данных

Хотя сегодня существуют разнообразные модели сетей, большинство разработчиков придерживается именно этой общепризнанной схемы.

Рассмотрим процесс передачи информации между двумя компьютерами. Программное обеспечение формирует сообщение на уровне 7 (приложений), состоящее из заголовка и полезных данных. В заголовке содержится служебная информация, которая необходима уровню приложений адресата для обработки пересылаемой информации (например, это может быть информация о файле, который необходимо передать, или операции, которую нужно выполнить). После того, как сообщение было сформировано, уровень приложений направляет его «вниз» на представительский уровень (layer 6). Полученное сообщение, состоящее из служебной информации уровня 7 и полезных данных, для уровня 6 представляется как одно целое (хотя уровень 6 может считывать служебную информацию уровня 7). Протокол представительского уровня выполняет необходимые действия на основании данных, полученных из заголовка уровня приложений, и добавляет заголовок своего уровня, в котором содержится информация для соответствующего (6-го) уровня адресата. Полученное в результате сообщение передается далее «вниз» сеансовому уровню, где также добавляется служебная информация. Дополненное сообщение передается на следующий транспортный уровень и т.д. на каждом последующем уровне (схематично это представлено на рис.16.1). При этом служебная информация может добавляться не только в начало сообщения, но и в конец (например, на 3-м уровне, рис.16.2). В итоге получается сообщение, содержащее служебную информацию всех семи уровней.

Рис. 16.1. Инкапсуляция и декапсуляция пакета.

Рис. 16.2. Добавление служебной информации в начало и конец пакета.

Процесс «обертывания» передаваемых данных служебной информацией называется инкапсуляцией ( encapsulation ).

Далее это сообщение передается через сеть в виде битов. Бит – это минимальная порция информации, которая может принимать значение 0 или 1. Таким образом, все сообщение кодируется в виде набора нулей и единиц, например, 010110101. В простейшем случае на физическом уровне для передачи формируется электрический сигнал, состоящий из серии электрических импульсов ( 0 — нет сигнала, 1 — есть сигнал). Именно эта единица принята для измерения скорости передачи информации. Современные сети обычно предоставляют каналы с производительностью в десятки и сотни Кбит/с и Мбит/с.

Получатель на физическом уровне получает сообщение в виде электрического сигнала (рис.16.3). Далее происходит процесс, обратный инкапсуляции,– декапсуляция ( decapsulation ). На каждом уровне происходит разбор служебной информации. После декапсуляции сообщения на первом уровне (считывания и обработки служебной информации 1-го уровня) это сообщение, содержащее служебную информацию второго уровня и данные в виде полезных данных и служебной информации вышестоящих уровней, передается на следующий уровень. На канальном (2-м) уровне снова происходит анализ системной информации и сообщение передается на следующий уровень. И так до тех пор, пока сообщение не дойдет до уровня приложений, где в виде конечных данных передается принимающему приложению.

Рис. 16.3. Представление данных в виде электрического импульса.

В качестве примера можно привести обращение браузера к web-серверу. Приложение клиента – браузер – формирует запрос для получения web-страницы. Этот запрос передается приложением на уровень 7 и далее последовательно на каждый уровень модели OSI. Достигнув физического уровня, наш первоначальный запрос «обрастает» служебной информацией каждого уровня. После этого он передается по физической сети (кабелям) в виде электрических импульсов на сервер. На сервере происходит разбор соответствующей системной информации каждого уровня, в результате чего посланный запрос достигает приложения web-сервера. Там он обрабатывается, после чего клиенту отправляется ответ. Процесс отправки ответа аналогичен отправке запроса – за исключением того, что сообщение посылает сервер, а получает клиент.

Так как каждый уровень модели OSI стандартизирован, потребители могут использовать совместно оборудование и программное обеспечение различных производителей. В результате web-сервер под управлением операционной системы Sun Solaris может передать HTML-страницу пользователю MS Windows.


Разумеется, совместимость можно обеспечить лишь до некоторого уровня. Если одна машина передает данные в виде радиоволн, а другая в виде световых импульсов, то их взаимодействие без использования дополнительного оборудования невозможно. Поэтому было введено понятие сете-независимых и сете-зависимых уровней.

Три нижних уровня – физический, канальный и сетевой – являются сете-зависимыми. Например, смена Ethernet на ATM влечет за собой полную смену протокола физического и канального уровней.

Три верхних уровня – приложений, представительский и сессионный – ориентированы на прикладные задачи и практически не зависят от физической технологии построения сети. Так, переход от Token Ring на Ethernet не требует изменений в перечисленных уровнях.

Транспортный уровень является промежуточным между сете-зависимыми и сете-независимыми уровнями. Он скрывает все детали функционирования нижних уровней от верхних. Это позволяет разработчику приложений не задумываться о технических средствах реализации транспортировки сетевых сообщений.

Вместе с названием сообщение ( message ) в стандартах ISO для обозначения единицы данных используют термин протокольный блок данных ( Protocol Data Unit, PDU ). В разных протоколах применяются и другие названия, закрепленные стандартами, или просто традиционные. Например, в семействе протоколов TCP/IP протокол TCP разделяет поток данных на сегменты, протокол UDP работает с датаграммами (или дейтаграммами, от datagram), сам протокол IP использует термин пакеты. Часто так же говорят о кадрах или фреймах.

Для более глубокого понимания принципов работы сети рассмотрим каждый уровень по отдельности.

Physical layer (layer 1)

Как видно из общей схемы расположения уровней в модели OSI, физический уровень ( Physical layer ) самый первый. Этот уровень описывает среду передачи данных. Стандартизируются физические устройства, отвечающие за передачу электрических сигналов (разъемы, кабели и т.д.) и правила формирования этих сигналов. Рассмотрим по порядку все составляющие этого уровня.

Большая часть сетей строится на кабельной структуре (хотя существуют сети, основанные на передаче информации с помощью, например, радиоволн). Сейчас существуют различные типы кабелей. Наиболее распространенные из них:

Телефонный кабель начал использоваться для передачи данных со времен появления первых компьютеров. Главным преимуществом телефонных линий было наличие уже созданной и развитой инфраструктуры. С ее помощью можно передавать данные между компьютерами, находящимися на разных материках, так же легко, как и вести разговор людям, которые находятся за много тысяч километров друг от друга. На сегодняшний день использование телефонных линий также остается популярным. Пользователи, которых устраивает небольшая скорость передачи данных, могут получить доступ к Internetу со своих домашних компьютеров. Основными недостатками использования телефонного кабеля является небольшая скорость передачи, т.к. соединение происходит не напрямую, а через телефонные станции. При этом требование к качеству передаваемого сигнала при передаче данных значительно выше, чем при передаче «голоса». А так как большинство аналоговых АТС не справляется с этой задачей (уровень «шума», или помех, и качество сигнала оставляет желать лучшего), то скорость передачи данных очень низкая. Хотя при подключении к современным цифровым АТС можно получить высокую и надежную скорость связи.

Коаксиальный кабель использовался в сетях еще несколько лет назад, но сегодня это большая редкость. Такой тип кабеля по строению практически идентичен обычному телевизионному коаксиальному кабелю – центральная медная жила отделена слоем изоляции от оплетки. Некоторые отличия есть в электрических характеристиках (в телевизионном кабеле используется кабель с волновым сопротивлением 75 Ом, в сетевом – 50 Ом).

Основными недостатками этого кабеля является низкая скорость передачи данных (до 10 Мбит/с), подверженность воздействиям внешних помех. Кроме того, подключение компьютеров в таких сетях происходит параллельно, а значит, максимальная возможная скорость пропускания делится на всех пользователей. Но, по сравнению с телефонным кабелем, коаксиал позволяет объединять близко расположенные компьютеры с намного лучшим качеством связи и более высокой скоростью передачи данных.

Витая пара (» twisted pair «) – наиболее распространенное средство для передачи данных между компьютерами. В данном типе кабеля используется медный попарно скрученный провод, что позволяет уменьшить количество помех и наводок, как при передаче сигнала по самому кабелю, так и при воздействии внешних помех.

Существует несколько категорий этого кабеля. Перечислим основные из них. Cat 3 – был стандартизирован в 1991 г., электрические характеристики позволяли поддерживать частоты передачи до 16 МГц, использовался для передачи данных и голоса. Более высокая категория – Cat 5, была специально разработана для поддержки высокоскоростных протоколов. Поэтому его электрические характеристики лежат в пределах до 100Мгц. На таком типе кабеля работают протоколы передачи данных 10, 100, 1000 Мбит/с. На сегодняшний день кабель Cat5 практически вытеснил Cat 3. Основное преимущество витой пары перед телефонными и коаксиальными кабелями – более высокая скорость передачи данных. Также использование Cat 5 в большинстве случаев позволяет, не меняя кабельную структуру, повысить производительность сети (переходом от 10 к 100 и от 100 к 1000 Мбит/с).

Оптоволокно используется для соединения больших сегментов сети, которые располагаются далеко друг от друга, или в сетях, где требуется большая полоса пропускания, помехоустойчивость. Оптический кабель состоит из центрального проводника света (сердцевины) – стеклянного волокна, окруженного другим слоем стекла – оболочкой, обладающей меньшим показателем преломления, чем сердцевина. Распространяясь по сердцевине, лучи света не выходят за ее пределы, отражаясь от покрывающего слоя оболочки. Световой луч обычно формируется полупроводниковым или диодным лазером . В зависимости от распределения показателя преломления и от величины диаметра сердечника различают:

Понятие «мода» описывает режим распространения световых лучей в сердечнике кабеля. В одномодовом кабеле используется проводник очень малого диаметра, соизмеримого с длиной волны света. В многомодовом кабеле применяются более широкие сердечники, которые легче изготовить. В этих кабелях в сердечнике одновременно существует несколько световых лучей, отражающихся от оболочки под разными углами. Угол отражения луча называется модой луча. Оптоволокно обладает следующими преимуществами: устойчивость к электромагнитным помехам, высокие скоростные характеристики на больших расстояниях. Основным недостатком является как дороговизна самого кабеля, так и трудоемкость монтажных работ, так как все работы выполняются на дорогостоящем высокоточном оборудовании.

Физический уровень также отвечает за преобразование сигналов между различными средами передачи данных. Например, при необходимости соединить сегменты сети, построенные на оптоволокне и витой паре, применяют так называемые конверторы (в данном случае они преобразуют световой импульс в электрический).

Для включения компьютера в сеть используется специальное устройство – сетевой адаптер ( Network adapter ), позволяющий обмениваться наборами битов, представленными электрическими сигналами. Сетевая карта (так чаще называют сетевой адаптер ) обычно имеет шину ISA или PCI для подключения в компьютер и соответствующий разъем для подключения к среде передачи данных (например, для витой пары, коаксиал и т.п.).

Теперь, когда мы знаем, как происходит соединение компьютеров в одну сеть, рассмотрим варианты физической схемы такой сети, или, другими словами, физической топологии (структуры локальной сети).

Топология «шина» (bus) показана на рис. 16.4.

Рис. 16.4. Топология «шина» (bus).

Все компьютеры и сетевые устройства подсоединены к одному проводу и фактически напрямую соединены между собой.

Топология «кольцо» (ring) показана на рис. 16.5.

Рис. 16.5. Топология «кольцо» (ring).

Кольцо состоит из сетевых устройств и кабелей между ними, образующих одно замкнутое кольцо.

Топология «звезда» показана на рис. 16.6.

Рис. 16.6. Топология «звезда» (star).

Все компьютеры и сетевые устройства подключены к одному центральному устройству.

Топология «расширенная звезда» (extended star) показана на рис. 16.7.

Рис. 16.7. Топология «расширенная звезда»(extended star).

Такая схема практически аналогична топологии «звезда», за одним исключением. Каждое устройство соединено с локальным центральным устройством, а оно, в свою очередь, соединено с центром другой «звезды».

Data layer (layer 2)

Физический уровень пересылает просто набор сигналов – битов. При этом не учитывается, что несколько компьютеров, подключенных к одной среде передачи данных (например, к одному кабелю), могут начать одновременно передавать информацию в виде электрических импульсов, что, очевидно, приведет к смешению сигналов. Поэтому одной из задач Data layer (канальный уровень) является проверка доступности среды передачи. Также этот уровень отвечает за доставку фреймов между источником и адресатом в пределах сети с одной топологией. Для обеспечения такой функциональности Data layer разделяют на два подуровня:

* логическая передача данных ( Logical Link Control, LLC );

* управление доступом к среде ( Media Access Control, MAC ).

LLC отвечает за переход со второго уровня на более высший – третий сетевой уровень.

MAC отвечает за передачу данных на более низкий уровень – Physical layer.

Рассмотрим эти подуровни более подробно.

LLC sublayer

Этот подуровень был создан для обеспечения независимости от существующих технологий. Он обеспечивает обмен данными с сетевым (третьим) уровнем вне зависимости от физической среды передачи данных. LLC получает данные с сетевого уровня, добавляет в них служебную информацию и передает пакет для последующей инкапсуляции и обработки протоколом уровня MAC. Например, это может быть Ethernet, Token Ring, Frame Relay.

MAC sublayer

Этот подуровень обеспечивает доступ к физическому уровню. Для передачи пакетов по сети необходимо организовать идентификацию компьютеров в сети. Для этого у каждого компьютера на канальном уровне определен уникальный адрес, который еще иногда называют физическим адресом, или MAC-адресом.

Он записан в энергонезависимой памяти сетевой карты и задается производителем. Длина MAC-адреса 48 бит, или 6 байт (каждый байт состоит из 8 бит), которые записываются в шестнадцатеричном формате. Первые 3 байта называются OUI (Organizational Unique Identifier), организационный уникальный идентификатор. Этот номер выдается каждому производителю сетевого оборудования международной организацией IEEE (Institute of Electrical and Electronic Engineers, Институт инженеров по электротехнике и радиоэлектронике, источник многих стандартов и спецификаций). Последние 3 байта являются идентификационным номером самой сетевой карты. Производитель гарантирует, что все его адаптеры имеют различные номера. Такая система адресов гарантирует, что в сети не будет двух компьютеров с одинаковыми физическими адресами.

Записываться физический адрес может в разных форматах, например: 00:00:B4:90:4C:8C, 00-00-B4-90-4C-8C, 0000.B490.4C8C – разные производители используют разные стандарты. Рассмотрим, например, адрес 0000.1c12.3456. Здесь 0000.1с – идентификатор производителя, а 12.3456 – идентификатор сетевой карты.

Один из самых распространенных протоколов MAC-уровня – протокол Ethernet. В сетях, построенных на его основе, применяется специальный метод для организации доступа к среде передачи данных – CSMA/CD (carrier sense multiple access/collision detect, коллективный доступ с опознаванием несущей и обнаружением коллизий ). Предполагается, что основой сети является общая шина (например, коаксиальный кабель ), к которой подключены все компьютеры. В результате сообщение, отправленное одной машиной, доставляется всем подключенным сетевым устройствам. CSMA/CD описывает целый комплекс мер, необходимых для предотвращения и корректной обработки коллизий (collision), то есть ситуаций, когда несколько компьютеров одновременно начали передачу данных. Очевидно, что в таком случае никто не сможет получить корректную информацию из сети.

Рассмотрим более подробно процесс передачи данных на Data layer. Пусть один компьютер собирается послать данные другому. Во время процесса инкапсуляции MAC-адрес этой машины и MAC-адрес получателя будут записаны в служебные поля. Сгенерированное сообщение по правилам протокола Ethernet отсылается через общую шину всем машинам, подключенным к этому участку сети.

Каждый компьютер, получивший сообщение, проверяет, кому оно было адресовано. Если MAC-адрес, указанный во фрейме, и MAC-адрес, записанный в сетевом адаптере получателя, совпадают, то пакет принимается и передается на вышестоящий уровень для дальнейшей обработки. Если же адрес в пакете не совпадает с адресом сетевой карты, то такой пакет отбрасывается.

Иногда бывает необходимо послать сообщение, которое должно быть получено всеми узлами локальной сети. В этом случае в пакете указывается MAC-адрес получателя в виде FF-FF-FF-FF-FF-FF. Этот адрес используется для широковещания ( broadcast ), которое примут все сетевые устройства и передадут на вышестоящий уровень.

Рассмотрим устройства, применяемые для построения сетей в разных топологиях.

Топология шина («bus») описывает общую среду передачи данных, которая уже рассматривалась для иллюстрации протокола Ethernet. Специальных устройств для построения такой сети не используется (впрочем, конкретные технологии могут предъявлять специфические требования; например, концы коаксиального кабеля должны подключаться к особому устройству – терминатору, но это не влияет на структуру сети).

На топологии кольцо («ring») основывается протокол Token Ring. Физически сеть представляет собой замкнутое кольцо, в котором каждый компьютер двумя отрезками кабеля соединяется со своими соседями. В отличие от сети, работающей на основе Ethernet, здесь используется более сложная схема. Передача ведется последовательно по кольцу в одном направлении. В сети циркулирует кадр специального формата – маркер (token). Если машина не имеет данных для передачи, она при получении маркера передает его дальше по кольцу. В противном случае она изымает его из обращения, что дает ей доступ к сети, и затем отправляет пакет с адресом получателя, который начинает передаваться по кольцу. Когда он доходит до адресата, тот делает пометку, что пакет получен. Машина-отправитель, получив подтверждение, отправляет соседу новый маркер для обеспечения возможности другим станциям сети передавать данные. Хотя этот алгоритм более сложен, он обеспечивает свойства отказоустойчивости.

При построении сети на основе топологии «звезда» нужно использовать, кроме сетевых карт в компьютере, дополнительное сетевое оборудование в центре, куда подключаются все «лучи звезды». Например, в качестве такого устройства может применяться концентратор (hub). В этом случае каждый компьютер подключается к нему с помощью кабеля » витая пара «. Алгоритм работы концентратора очень прост – получив пакет на один из своих портов, он пересылает его на все остальные. В результате снова получается общая шина, точнее, – логическая общая шина, поскольку физическая структура сети звездно-образная. Технология Ethernet позволяет снизить количество коллизий с помощью CSMA/CD. Недостатком концентратора является то, что пользователи сети могут «прослушивать» чужой трафик (в том числе перехватить пароль, если он передается в открытом виде). Общая максимальная скорость делится между всеми подключенными пользователями. То есть, если скорость передачи данных составляет 10 Мбит/с, то в среднем на каждого пользователя может приходиться всего 2 Мбит/с.

Более дорогим, но и более производительным решением является использование коммутатора (switch). Коммутатор, в отличие от концентратора, имеет в памяти таблицу, сопоставляющую номера его портов и MAC-адреса подключенных к нему компьютеров. Он анализирует у каждого пересылаемого фрейма адрес отправителя, пытаясь определить, какие машины подключены к каждому из его портов. Таким образом коммутатор заполняет свою таблицу. Далее при прохождении очередного фрейма он проверяет адрес получателя, и если он знает, к какому порту подключена эта машина, он посылает фрейм только на один этот порт. Если адрес получателя коммутатору неизвестен, то он отправляет фрейм на все порты, кроме того, с которого этот пакет пришел. Таким образом, получается, что если два компьютера обмениваются данными между собой, то они не перегружают своими пакетами другие порты и, соответственно, их пакеты практически невозможно перехватить.

Построенные таким образом сети могут охватывать несколько сотен машин и иметь протяженность в несколько километров. Как правило, такая сеть охватывает одно или несколько зданий одного предприятия, а потому называется локальной сетью (Local area network, LAN).

Network layer (layer 3)

В предыдущей лекции мы рассмотрели второй уровень в модели OSI. Одним из ограничений этого уровня является использование «плоской» одноуровневой модели адресации. При попытке построить большую сеть, применяя для идентификации компьютеров MAC-адреса, мы получим огромное количество broadcast -трафика. Протокол, который поддерживается третьим уровнем, задействует иерархическую структуру для уникальной идентификации компьютеров.

Для примера представим себе телефонную сеть. Она также имеет иерархическую адресацию. Например, в номере +7-095-101-12-34 первая цифра обозначает код страны, далее идет код области/города( 095 ), а затем указывается сам телефон (101-12-34). Последний номер также является составным. 101 – это код станции, куда подключен телефон, а 12-34 определяет местоположение телефона. Благодаря такой иерархической структуре мы можем определить расположение требуемого абонента с наименьшими затратами. Иерархическая адресация для компьютерной сети также должна позволять устанавливать связь между разрозненными и удаленными сетями.

На сетевом уровне (Network layer) существует несколько протоколов, которые позволяют передавать данные между сетями. Наиболее распространенным из них на сегодняшний день является IP. Его предшественник, протокол IPX, сейчас уже практически не используется в публичных сетях, но его можно найти в частных, закрытых сетях.

Основное устройство, применяемое на 3-м уровне, называется роутером (router), или маршрутизатором. Он соединяет удаленные локальные сети (LAN), образуя глобальную сеть (Wide area network, WAN). Роутер имеет два или более сетевых интерфейса и таким образом подключен сразу к нескольким локальным сетям. Получив пакет с локального устройства или компьютера, принадлежащего к одной из LAN, роутер просматривает заголовок третьего уровня. На основании полученной информации роутер принимает решение, что делать с пакетом. Если получатель пакета находится в той же локальной сети, что и отправитель, роутер игнорирует его, поскольку сообщение, как уже рассматривалось, доставляется средствами более низкоуровневых протоколов (например, Ethernet ).

В противном случае пакет нужно передать в одну из других LAN, к которым подключен роутер. Основная задача этого устройства – выбор пути, по которому будет пересылаться сообщение. Поскольку может существовать множество связей между некоторыми двумя сетями отправителя и получателя, роутер должен выбрать наиболее оптимальный путь. Пересылка пакета от одного узла сети к следующему называется hop (дословно – прыжок, скачок). Выбор очередного узла, которому роутер перешлет сообщение, может зависеть от многих факторов – загрузка сети, наименьший путь до получателя, стоимость трафика по различным маршрутам и т.д.

Новая система адресации, вводимая на сетевом уровне, должна облегчать роутеру определение пути для доставки пакета через глобальные сети. Рассмотрим реализацию наиболее популярного на сегодняшний день протокола IP более подробно.

При прохождении данных с верхних уровней на нижние на сетевом уровне к пакету добавляется служебный заголовок этого уровня. В заголовке IP-пакета содержится необходимая для дальнейшей передачи информация, такая как адреса отправителя и получателя. Понятие IP-адреса очень важно для понимания работы глобальных сетей, поэтому остановимся на нем более подробно.

IP-адрес

IP-адрес представляется 32-битным бинарным числом, которое часто записывают в виде 4 десятичных чисел, от 0 до 255 каждое. Например: 60.13.54.11, 130.154.201.1, 194.11.3.200. Логически он состоит из двух частей – адреса машины (host) и адреса сети (network). Сетевая часть IP-адреса показывает, к какой сети принадлежит адресат, а хост-часть (host) идентифицирует сетевое устройство в этой сети. Компьютеры с одинаковой сетевой частью находятся в одной локальной сети, а потому могут легко обмениваться данными. Если же у них различные network-ID, то, даже находясь в одном физическом сегменте, они обычно не могут «увидеть» друг друга.

Так как IP-адрес состоит из 4-х октетов (так называют эти числа, поскольку 256=2 8 ), один, два или три первых октета могут использоваться для определения сетевого адреса, остальные задают host-части. Для удобства выделения адресов пользователям (ведь, как правило, организации требуется их сразу несколько), было введено 5 классов адресов. Их обозначают латинскими буквами от A до E. В открытых сетях используются первые три из них.

В таблице 16.2 дано примерное разбиение IP-адресов на сетевую (N) и машинную (H) части в зависимости от класса сети.

Таблица 16.2. Примерное разбиение IP-адресов.

Введение в протокол udp

UDP простой, ориентированный на передачу датаграмм, протокол транспортного уровня: за один раз процесс выдает одну UDP датаграмму, в результате чего передается одна IP датаграмма. Это отличается от поток-ориентированных протоколов, таких как TCP, где количество данных, которое выдается приложением, практически не имеет отношения к количеству отправленных IP датаграмм.

На рисунке 11.1 показана инкапсуляция UDP датаграммы в IP датаграмму.

Рисунок 11.1 UDP инкапсуляция.

Официальная спецификация UDP приведена в RFC 768 [ Postel 1980].

UDP является ненадежным протоколом: он отправляет датаграммы, которые приложение пишет в IP уровень, однако не существует гарантии того, что они достигнут конечного пункта назначения. С точки зрения надежности может возникнуть предположение, что стоит избегать использовать UDP и всегда пользоваться надежными протоколами, такими как TCP. После того как TCP будет описан в главе 17, мы вернемся к этой теме и посмотрим, какие типы приложений могут использовать UDP.

Приложениям нет необходимости беспокоиться о размере получившейся в результате IP датаграммы. Если она по размеру больше, чем MTU для данной сети (см. главу 2, раздел «MTU»), IP датаграмма будет фрагментирована. Это применимо к каждой сети, через которую пройдет датаграмма по пути от источника до пункта назначения, кроме первой сети, к которой подключен посылающий хост. (Мы определили понятие транспортного MTU в разделе «Транспортный MTU» главы 2.) Более подробно IP фрагментация будет рассмотрена в разделе «Фрагментация IP» этой главы.

На рисунке 11.2 показаны поля, присутствующие в UDP заголовке.

Рисунок 11.2 UDP заголовок.

Номера портов (port numbers) указывают на отправляющий и принимающий процессы. На рисунке 1.8 показано, что TCP и UDP используют номер порта назначения для демультиплексирования данных, поступающих от IP. Так как IP осуществляет демультиплексирование входящих IP датаграмм для TCP и UDP (с использованием значения протокола в IP заголовке), TCP просматривает номера портов TCP, а UDP — номера портов UDP. Номера портов TCP независимы от номеров портов UDP.

Несмотря на подобную независимость, если зарезервированный сервис предоставляется обоими TCP и UDP, обычно выбирается один и тот же номер порта для обоих транспортных уровней. Это сделано для удобства, а не по требованию протоколов.

Поле длины UDP содержит длину в байтах UDP заголовка и UDP данных. Минимальное значение для этого поля составляет 8 байт. (Не произойдет ничего страшного, если будет отправлена UDP датаграмма с нулевой длиной данных.) Параметр UDP длины — избыточный. IP датаграмма содержит свою полную длину в байтах, поэтому длина UDP датаграммы это полная длина минус длина IP заголовка (которая указана в поле длины заголовка на рисунке 3.1).

Контрольная сумма UDP

Контрольная сумма UDP охватывает UDP заголовок и UDP данные. Вспомним, что контрольная сумма в IP заголовке охватывает только IP заголовок — она не охватывает данные, находящиеся в IP датаграмме. И UDP, и TCP содержат контрольные суммы в своих заголовках, которые охватывают как заголовок, так и данные. Для UDP контрольная сумма необязательна, но для TCP она обязательна.

Контрольная сумма UDP рассчитывается точно так же, как (глава 3, раздел «IP заголовок») контрольная сумма IP заголовка (сумма 16-битных слов с переполнением), хотя существуют и отличия. Во-первых, UDP датаграмма может состоять из нечетного количества байт, тогда как при расчете контрольной суммы складываются 16-битные слова. При этом в конец датаграммы добавляются нулевые байты заполнения, если это необходимо для расчета контрольной суммы. (Байты заполнения не передаются.)

В UDP и TCP существуют 12-байтовые псевдозаголовки (в UDP датаграммах и TCP сегментах) только для расчета контрольной суммы. Псевдозаголовки содержат в себе определенные поля из IP заголовка. Все это сделано для двойной проверки того, что данные достигли того пункта назначения, которому предназначались (IP не принимает датаграммы, которые не адресованы для данного хоста, и не сможет передать UDP датаграммы, предназначенные для другого верхнего уровня). На рисунке 11.3 показан псевдозаголовок и UDP датаграмма.

Рисунок 11.3 Поля, используемые для расчета контрольной суммы UDP.

На этом рисунке мы специально показали датаграмму с нечетной длиной, в этом случае требуется дополнительный байт для расчета контрольной суммы. Обратите внимание на то, что длина UDP датаграммы, при расчете контрольной суммы, появляется дважды.

Если рассчитанная контрольная сумма равна 0, она хранится как все единичные биты (65535), эти значения эквивалентны в арифметике с поразрядным дополнением (дополнение единицы) (ones-complement). Если переданная контрольная сумма равна 0, это означает, что отправитель не рассчитал контрольную сумму.

Если отправитель все же рассчитал контрольную сумму, а получатель определил наличие ошибки, UDP датаграмма молча уничтожается, сообщение об ошибке не генерируется. (То же самое происходит, если IP уровень обнаружил ошибку в контрольной сумме IP заголовка.)

Контрольная сумма UDP рассчитывается отправителем и проверяется получателем. Она позволяет определить любые изменения в UDP заголовке или данных, которые произошли на пути между отправителем и получателем.

Несмотря на то, что для контрольная сумма UDP — необязательный параметр, она должна рассчитываться всегда. В конце 1980-х годов некоторые производители компьютеров стали по умолчанию отключать расчет контрольной суммы UDP, чтобы увеличить скорость работы сетевой файловой системы (NFS — Network File System), которая использует UDP. Это может быть допустимым в одной локальной сети, где рассчитывается циклический избыточный код для фреймов на канальном уровне (фреймы Ethernet или Token ring), с помощью которого можно определить повреждение фрейма, когда датаграмма проходит через маршрутизаторы. Поверите Вы или нет, но существуют маршрутизаторы, у которых есть ошибки в программном или аппаратном обеспечении и которые изменяют биты в датаграммах, которые они маршрутизируют. Эти ошибки не могут быть выявлены в UDP датаграммах, если отключена опция контрольной суммы. Также необходимо отметить, что некоторые протоколы канального уровня (например, SLIP) не имеют каких-либо форм расчета контрольной суммы для данных в канале.

Требования к хостам Host Requirements RFC требуют, чтобы расчет контрольной суммы UDP был включен по умолчанию. Также они требуют, чтобы принятая контрольная сумма обязательно проверялась, если ее рассчитал отправитель (в том случае, если принятая контрольная сумма не нулевая). Некоторые реализации игнорируют это и проверяют принятую контрольную сумму в том случае, если включена опция расчета исходящей контрольной суммы.

Вывод команды tcpdump

Довольно сложно определить, включена ли опция расчета контрольной суммы UDP на конкретной системе. Обычно приложение не имеет доступа к полю контрольной суммы принятого UDP заголовка. Чтобы решить эту проблему, автор добавил еще одну опцию к программе tcpdump, после чего та стала выдавать полученные контрольные суммы UDP. Если полученное значение равно 0, это означает, что отправитель не рассчитал контрольную сумму.

На рисунке 11.4 показан вывод к трем системам и от тех же трех различных систем в нашей сети. Мы запустили программу sock (приложение С), послав единственную UDP датаграмму с 9 байтами данных на стандартный эхо сервер.

1 0.0 sun.1900 > gemini.echo: udp 9 (UDP cksum=6e90)
2 0.303755 ( 0.3038) gemini.echo > sun.1900: udp 9 (UDP cksum=0)

3 17.392480 (17.0887) sun.1904 > aix.echo: udp 9 (UDP cksum=6e3b)
4 17.614371 ( 0.2219) aix.echo > sun.1904: udp 9 (UDP cksum=6e3b)

5 32.092454 (14.4781) sun.1907 > solaris.echo: udp 9 (UDP cksum=6e74)
6 32.314378 ( 0.2219) solaris.echo > sun.1907: udp 9 (UDP cksum=6e74)

Рисунок 11.4 Вывод tcpdump, с помощью которого можно определить, включена ли опция контрольной суммы UDP на конкретном хосте.

Отсюда мы видим, что у двух из трех систем опция контрольной суммы UDP включена.

Также обратите внимание на то, что исходящая датаграмма имеет такую же контрольную сумму, как и входящая датаграмма (строки 3 и 4, 5 и 6). На рисунке 11.3, можно заметить, что два IP адреса поменяны местами, так же, как и два номера порта. Другие поля в псевдозаголовке и заголовке UDP остались те же, так как данные были отражены эхом. Это подтверждает, что контрольная сумма UDP (а в действительности, и все контрольные суммы в семействе протоколов TCP/IP) это простая 16-битовая сумма. С ее помощью невозможно определить ошибку, которая заключается в перемене мест двух 16-битных значений.

Автор также направил DNS запрос на каждый из восьми корневых серверов DNS, описанных в разделе «Основы DNS» главы 14. DNS использует UDP, и только на двух из восьми была включена опция расчета контрольной суммы UDP!

[ Mogul 1992] предоставляет некоторую статистическую информацию о появлении ошибок контрольных сумм на довольно загруженном NFS сервере, который работал в течение 40 дней. На рисунке 11.5 приведены статистические данные.

Количество ошибок в контрольных суммах


Приблизительное количество пакетов

Рисунок 11.5 Статистика поврежденных пакетов, определенных с использованием контрольных сумм.

В последней колонке приведено приблизительное количество пакетов, так как и другие протоколы используют Ethernet и IP уровень. Например, не все Ethernet фреймы используются IP датаграммами, ARP также использует Ethernet. Не все IP датаграммы используются UDP или TCP, так как ICMP также использует IP.

Обратите внимание на то, что выявлено значительно больше ошибок контрольных сумм TCP, чем UDP. Это скорее всего вызвано тем, что с помощью TCP обычно устанавливаются «дальние» соединения (которые проходят через много маршрутизаторов, мостов и так далее), тогда как UDP траффик обычно локальный.

Поэтому ошибки, приведенные в нижней строке, не всегда имеют отношение к канальному уровню (Ethernet, Token ring). При передаче данных следует всегда включать опцию контрольную сумму в оконечных точках. Однако, если передаваемые данные представляют определенную ценность, не стоит полностью доверять контрольным суммам UDP или TCP, так как это простые контрольные суммы, и они не гарантируют, что защитят данные от всех возможных ошибок.

Мы воспользуемся программой sock, чтобы сгенерировать несколько UDP датаграмм, которые мы просмотрим с использованием tcpdump:

>bsdi % sock -v -u -i -n4 svr4 discard
connected on 140.252.13.35.1108 to 140.252.13.34.9

bsdi % sock -v -u -i -n4 -w0 svr4 discard
connected on 140.252.13.35.1110 to 140.252.13.34.9

В первом случае запуска программы установлен отладочный режим ( -v), при этом можно просмотреть номера динамически назначаемых портов, указан UDP ( -u) вместо TCP по умолчанию и установлен режим источника, опция ( -i) , это означает, что мы будем посылать данные, а не будем читать из стандартного ввода или писать в стандартный вывод. Опция -n4 сообщает о необходимости выдать 4 датаграммы (вместо того, чтобы выдавать по умолчанию 1024) на хост назначения svr4. Сервис discard описан в разделе «Стандартные простые сервисы» главы 1. Мы используем размер вывода по умолчанию в 1024 байта на одну запись.

Второй раз мы запустили программу, указав -w0, при этом будут выдаваться датаграммы нулевой длины. На рисунке 11.6 показан вывод команды tcpdump для двух примеров.

1 0.0 bsdi.1108 > svr4.discard: udp 1024
2 0.002424 ( 0.0024) bsdi.1108 > svr4.discard: udp 1024
3 0.006210 ( 0.0038) bsdi.1108 > svr4.discard: udp 1024
4 0.010276 ( 0.0041) bsdi.1108 > svr4.discard: udp 1024

5 41.720114 (41.7098) bsdi.1110 > svr4.discard: udp 0
6 41.721072 ( 0.0010) bsdi.1110 > svr4.discard: udp 0
7 41.722094 ( 0.0010) bsdi.1110 > svr4.discard: udp 0
8 41.723070 ( 0.0010) bsdi.1110 > svr4.discard: udp 0

Рисунок 11.6 Вывод команды tcpdump для случая, когда UDP датаграммы посылаются в одном направлении.

В выводе показаны четыре датаграммы размером 1024 байта, за которыми следуют четыре датаграммы нулевой длинны. Каждая датаграмма следует за предыдущей с интервалом в несколько миллисекунд. (Для того чтобы ввести вторую команду, потребовалась 41 секунда.)

До того как была отправлена первая датаграмма, соединения между отправителем и получателем не существовало. (В главе 17, где рассказывается о TCP, мы покажем, что перед тем как будет отправлен первый байт данных, должно быть установлено соединение.) Необходимо отметить, что получатель не выдает подтверждение, когда получает данные. Отправитель, в этом примере, не имеет представления о том, получены ли данные на удаленном конце.

И в завершение, обратите внимание, что номер порта источника UDP меняется каждый раз при запуске программы. Сначала порт был 1108, затем 1110. В разделе «Номера портов» главы 1 мы показали, что номера динамически назначаемых портов, используемых клиентами, обычно находятся в диапазоне от 1024 до 5000.

Как мы указали в разделе «MTU» главы 2, физический сетевой уровень обычно имеет ограничение максимального размера фрейма, который может быть передан. Когда IP уровень получает IP датаграмму, которую необходимо отправить, он определяет, на какой локальнй интерфейс отправляется датаграмма (или маршрутизируется), и запрашивает интерфейс, чтобы тот сообщил размер своего MTU. IP сравнивает MTU с размером датаграммы и, если необходимо, осуществляет фрагментацию. Фрагментация может быть осуществлена как на отправляющем хосте, так и на промежуточном маршрутизаторе.

Когда IP датаграмма фрагментирована, она не собирается вновь до тех пор, пока не достигнет конечного пункта назначения. (Для некоторых других сетевых протоколов процесс повторной сборки отличается от описанного выше, при этом повторная сборка осуществляется на маршрутизаторе следующей пересылки, а не в конечном пункте назначения.) На уровне IP сборка осуществляется в конечном пункте назначения. Это сделано для того, чтобы сделать фрагментацию и повторную сборку прозрачной для транспортных уровней (TCP и UDP), хотя это может вести к некоторой потере производительности. Существует вероятность, что фрагмент датаграммы будет снова фрагментирован (возможно даже несколько раз). Информации, которая содержится в IP заголовке вполне достаточно для фрагментации и повторной сборки.

Вернемся снова к IP заголовку (см. рисунок 3.1) и рассмотрим, какие поля используются в процессе фрагментации. Поле идентификации содержит значение уникальное для каждой отправленной IP датаграммы. Это значение копируется в каждый фрагмент конкретной датаграммы. В поле флагов один бит означает, что «дальше следуют еще фрагменты» (more fragments). Этот бит устанавливается в единицу для каждого фрагмента, кроме последнего. Поле смещения фрагмента (fragment offset) содержит смещение этого фрагмента от начала исходной датаграммы. Когда датаграмма фрагментируется, поле полной длины каждого фрагмента изменяется, так чтобы соответствовать размеру фрагмента.

И в заключение, один из битов в поле флагов называется «не фрагментировать» (don’t fragment). Если этот бит установлен в единицу, IP не будет фрагментировать датаграмму. Вместо этого датаграмма уничтожается, а отправителю посылается ICMP ошибка «фрагментация необходима, однако установлен бит не фрагментировать» (fragmentation needed but don’t fragment bit set). Мы рассмотрим эту ошибку более подробно в следующем разделе.

Когда IP датаграмма фрагментируется, каждый фрагмент становится пакетом, с собственным IP заголовком, и маршрутизируется независимо от других пакетов. Поэтому становится возможным, что датаграммы прибудет в конечный пункт назначения в другом порядке, нежели они были исходно отправлены и фрагментированы. Однако, в IP заголовке хранится достаточно информации для того, чтобы датаграмма была собрана корректно.

Несмотря на то, что процесс фрагментации IP выглядит довольно прозрачным, существует одна особенность, которая делает его не всегда желательным: если один фрагмент потерялся, датаграмма должна быть целиком повторно передана. Это объясняется тем, что IP не имеет тайм-аутов и не осуществляет повторной передачи — за это несут ответственность верхние уровни. (TCP осуществляет тайм-аут и повторную передачу, UDP — нет. Некоторые UDP приложения осуществляют тайм-аут и повторную передачу самостоятельно.) Когда потерялся фрагмент из TCP сегмента, TCP отработает тайм-аут и повторно передаст TCP сегмент целиком (IP датаграмма). Не существует способа повторно передать только один фрагмент датаграммы. И действительно, если фрагментация была осуществлена промежуточным маршрутизатором, а не отправляющей системой, отправляющая система не сможет знать как датаграмма была фрагментирована в процессе передачи. Именно по этой причине (всего одной) фрагментации стараются избежать. [Kent and Mogul 1987] приводят аргументы, которые доказывают необходимость избегать фрагментации.

С использованием UDP довольно легко добиться IP фрагментации. (Позже мы увидим, что TCP старается избежать фрагментации, и для приложения практически невозможно заставить TCP отправлять сегменты, которые нуждаются в фрагментации. То есть, другими словами, отправить сегмент такого размера, для которого потребуется фрагментация, практически невозможно.) Мы воспользуемся программой sock, чтобы увеличить размер датаграммы, с таким расчетом, чтобы была осуществлена фрагментация. Максимальный размер данных во фрейме Ethernet составляет 1500 байт (рисунок 2.1), при этом 1472 байта предназначены для пользовательских данных, 20 байт отводится под IP заголовок и 8 байт под UDP заголовок. Запустим программу sock с размером данных 1471, 1472, 1473 и 1474 байта. Мы ожидаем, что в двух последних случаях произойдет фрагментация:

>bsdi % sock -u -i -n1 -w1471 svr4 discard
bsdi % sock -u -i -n1 -w1472 svr4 discard
bsdi % sock -u -i -n1 -w1473 svr4 discard
bsdi % sock -u -i -n1 -w1474 svr4 discard

На рисунке 11.7 показан соответствующий вывод команды tcpdump.

1 0.0 bsdi.1112 > svr4.discard: udp 1471
2 21.008303 (21.0083) bsdi.1114 > svr4.discard: udp 1472

3 50.449704 (29.4414) bsdi.1116 > svr4.discard: udp 1473 (frag 26304:1480@0+)
4 50.450040 ( 0.0003) bsdi > svr4: (frag 26304:1@1480)

5 75.328650 (24.8786) bsdi.1118 > svr4.discard: udp 1474 (frag 26313:1480@0+)
6 75.328982 ( 0.0003) bsdi > svr4: (frag 26313:2@1480)

Рисунок 11.7 Наблюдения за фрагментацией UDP датаграмм.

Первые две UDP датаграммы (строки 1 и 2) помещаются в Ethernet фреймы и не фрагментируются. Однако, длина IP датаграммы, в которую необходимо записать 1473 байта данных, составляет 1501 байт, поэтому она должна быть фрагментирована (строка 3 и 4). Точно так же, длина датаграммы, в которую необходимо записать 1474 байта данных, будет составлять 1502 байта, и она также должна быть фрагментирована (строки 5 и 6).

Когда IP датаграмма фрагментирована, tcpdump выводит дополнительную информацию. Во-первых, выводится флаг frag 26304 (строки 3 и 4) и флаг frag 26313 (строки 5 и 6), который указывает на значение поля идентификации в IP заголовке.

Число 1480 в строке 3 (между двоеточием и символом @), это размер, за исключением IP заголовка. Первые фрагменты обеих датаграмм содержит 1480 байт данных: 8 байт UDP заголовока и 1472 байта пользовательских данных. (Если добавить 20 байт IP заголовка, получится точно размер пакета — 1500 байт.) Второй фрагмент первой датаграммы (строка 4) содержит 1 байт данных — оставшийся байт пользовательских данных. Второй фрагмент второй датаграммы (строка 6) содержит 2 оставшихся байта пользовательских данных.

При фрагментации требуется, чтобы порция данных генерируемых фрагментов (за исключением IP заголовока) была кратна 8 байтам для всех фрагментов за исключением последнего. В этом примере, число 1480 кратно восьми.

Число, следующее за символом @, это смещение данных во фрагменте от начала датаграммы. Первый фрагмент обеих датаграмм начинается с нуля (строки 3 и 5), а второй фрагмент обеих датаграмм начинается со смещения в 1480 байт (строки 4 и 6). Символ плюс, который следует за смещением и напечатан для первых фрагментов обеих датаграмм, означает, что в данной датаграмме присутствуют еще фрагменты. Знак плюс соответствует биту «дальше следуют еще фрагменты» (more fragments) в 3-битовом поле флагов IP заголовка. Назначение этого бита заключается в том, чтобы сообщить принимающему о том, что сборка всех фрагментов датаграммы полностью завершена.

И в завершение, обратите внимание на то, что в строках 4 и 6 (не первые фрагменты) не указан протокол (UDP), а также порты источника и назначения. Протокол должен быть напечатан, так как он находится в IP заголовке, который копируется в каждый фрагмент. А номера портов находятся в UDP заголовке, который присутствует только в первом фрагменте. На рисунке 11.8 показано, что произойдет с третьей датаграммой (которая содержит 1473 байта пользовательских данных). Здесь мы видим подтверждение того, что заголовок любого транспортного уровня присутствует только в первом фрагменте.

Хочется обратить внимание на терминологию: IP датаграмма (IP datagram) это блок, который передается от одного конца IP уровня к другому концу IP уровня (перед фрагментацией и после повторной сборки), тогда как пакет (packet) это блок данных, который передается между IP уровнем и канальным уровнем. Пакет может быть полной IP датаграммой или всего лишь фрагментом IP датаграммы.

Рисунок 11.8 Пример UDP фрагментации.

ICMP ошибки о недоступности (требуется фрагментация)

Необходимо обсудить еще одну ICMP ошибку о недоступности. Она генерируется, когда маршрутизатор принимает датаграмму, которую необходимо фрагментировать, однако в IP заголовке установлен флаг «не фрагментировать» (DF). Эта ошибка может быть использована программой, которой необходимо определить минимальный MTU в маршруте до пункта назначения — что называется механизмом определения транспортного MTU (path MTU discovery) (глава 2, раздел «Транспортный MTU»).

На рисунке 11.9 показан формат ICMP ошибки о недоступности для данного случая. Он отличается от формата, приведенного на рисунке 6.10, потому что биты 16-31 во втором 32-битном слове могут содержать MTU следующей пересылки, вместо того чтобы быть установленными в 0.

Рисунок 11.9 ICMP ошибка о недоступности, когда необходима фрагментация, однако установлен бит «не фрагментировать».

Если маршрутизатор не поддерживает этот новый формат ICMP ошибки, MTU следующей пересылки устанавливается в 0.

Новые требования к маршрутизаторам Router Requirements RFC [ Almquist 1993] указывают на то, что маршрутизатор должен генерировать эту новую форму, когда выдает ICMP сообщение о недоступности.

Проблема, которую мы обсудим, возникла при получении ICMP ошибки при попытке определить MTU SLIP канала с дозвоном между маршрутизатором netb и хостом sun. Мы знаем MTU этого канала от sun к netb, так как, во-первых, это указывается при конфигурации SLIP на хосте sun, во-вторых, мы видели MTU при запуске команды netstat в разделе «Команда netstat» главы 3. А сейчас мы хотим определить MTU в другом направлении. (В главе 25 рассказывается как определить MTU с использованием SNMP.) Для каналов точка-точка нет необходимости, чтобы MTU был одним и тем же в обоих направлениях.

Для определения использована следующая техника. Мы запустили ping с хоста solaris на хост bsdi, увеличивая размер пакета данных до тех пор, пока к пакетам не была применена фрагментация. Процесс показан на рисунке 11.10.

Рисунок 11.10 Системы, которые были использованы для определения MTU SLIP канала между netb и sun.

На хосте sun была запущена программа tcpdump, которая позволила посмотреть, как осуществляется фрагментация в SLIP канале. Фрагментация не появлялась и все было отлично до тех пор, пока размер данных в пакете ping не возрос от 500 байт до 600. Входящие эхо запросы были видны (как будто фрагментации не было), однако эхо отклики исчезли.

Чтобы лучше разобраться в происходящем, программа tcpdump также была запущена на bsdi, после чего стало видно, что отправляется и что принимается. На рисунке 11.11 показан вывод.

1 0.0 solaris > bsdi: icmp: echo request (DF)
2 0.000000 (0.0000) bsdi > solaris: icmp: echo reply (DF)
3 0.000000 (0.0000) sun > bsdi: icmp: solaris unreachable —
need to frag, mtu = 0 (DF)

4 0.738400 (0.7384) solaris > bsdi: icmp: echo request (DF)
5 0.748800 (0.0104) bsdi > solaris: icmp: echo reply (DF)
6 0.748800 (0.0000) sun > bsdi: icmp: solaris unreachable —
need to frag, mtu = 0 (DF)

Рисунок 11.11 Вывод программы tcpdump от ping на bsdi от solaris с IP датаграммой размером в 600 байт.

Во-первых, выражение (DF) в каждой строке означает, что в единицу установлен бит «не фрагментировать» в IP заголовке. Это означает, что Solaris 2.2 нормально устанавливает этот бит в единицу, что является частью механизма определения транспортного MTU.

Строка 1 указывает, что эхо запрос проходит через маршрутизатор netb к sun без фрагментации и с установленным битом DF, поэтому можно сделать вывод, что критичный размер MTU для SLIP хоста netb еще не достигнут.

Также, заметьте из строки номер 2, что DF флаг копируется в каждый эхо отклик. Как раз это и вызвало проблему. Эхо отклик того же размера, что и эхо запрос (чуть больше 600 байт), однако MTU исходящего SLIP интерфейса хоста sun равен 552. Эхо отклик должен быть фрагментирован, однако установлен флаг DF. Это заставляет sun генерировать ICMP ошибку о недоступности и отправлять ее к bsdi (где она уничтожается).

Именно поэтому мы не видели эхо отклики от solaris. Отклики не проходили через sun. На рисунке 11.12 показан путь прохождения пакетов.

Рисунок 11.12 Обмен пакетами для данного примера.

И в завершение, отметим, что выражение mtu=0 в строках 3 и 6 на рисунке 11.11 указывает на то, что sun не возвращает MTU для исходящего интерфейса в ICMP сообщении о недоступности, как показано на рисунке 11.9. (В разделе «Дополнительные примеры» главы 25 мы решим эту проблему с использованием SNMP и убедимся в том, что MTU SLIP интерфейса netb равен 1500.)

Определение транспортного MTU с использованием Traceroute

Так как большинство систем не поддерживают функцию определения транспортного MTU, мы доработаем программу traceroute (глава 8) так, чтобы она могла определять транспортный MTU. Мы отправим пакет с установленным битом «не фрагментировать» (don’t fragment). Размер первого отправляемого пакета будет равен MTU исходящего интерфейса. Когда вернется ICMP ошибка «не могу фрагментировать» (can’t fragment), мы уменьшим размер пакета. Если маршрутизатор, отправивший ICMP ошибку, поддерживает новую версию, которая включает MTU исходящего интерфейса в ICMP сообщение, мы используем полученное значение; иначе мы попробуем следующий меньший MTU. Как утверждает RFC 1191 [ Mogul and Deering 1990], существует ограниченное количество значений MTU, наша программа имеет таблицу возможных значений и просто перейдет на следующее меньшее значение.

Попробуем подобный алгоритм с хоста sun на хост slip, зная, что SLIP канал имеет MTU равный 296:

sun % traceroute.pmtu slip
traceroute to slip (140.252.13.65), 30 hops max
outgoing MTU = 1500
1 bsdi (140.252.13.35) 15 ms 6 ms 6 ms
2 bsdi (140.252.13.35) 6 ms
fragmentation required and DF set, trying new MTU = 1492
fragmentation required and DF set, trying new MTU = 1006
fragmentation required and DF set, trying new MTU = 576
fragmentation required and DF set, trying new MTU = 552
fragmentation required and DF set, trying new MTU = 544
fragmentation required and DF set, trying new MTU = 512
fragmentation required and DF set, trying new MTU = 508
fragmentation required and DF set, trying new MTU = 296
2 slip (140.252.13.65) 377 ms 377 ms 377 ms

В этом примере маршрутизатор bsdi не вернул MTU исходящего интерфейса в ICMP сообщении, поэтому мы перейдем на следующее меньшее значение MTU. Первая строка вывода для TTL равного 2 сообщает имя хоста bsdi, однако это происходит из-за того, оно было возвращено маршрутизатором в ICMP ошибке. Последняя строка вывода для TTL равного 2 это как раз то, что мы ожидали.

Не составляет труда модифицировать ICMP код на bsdi, чтобы получить MTU исходящего интерфейса. И если мы сделаем это и вернемся к нашей программе, то получим следующий вывод:

sun % traceroute.pmtu slip
traceroute to slip (140.252.13.65), 30 hops max
outgoing MTU = 1500
1 bsdi (140.252.13.35) 53 ms 6 ms 6 ms
2 bsdi (140.252.13.35) 6 ms
fragmentation required and DF set, next hop MTU = 296
2 slip (140.252.13.65) 377 ms 378 ms 377 ms

Здесь нам нет смысла перебирать восемь различных значений MTU, маршрутизатор сообщил нужное значение.

Модифицированная версия traceroute была запущена несколько раз на различные хосты по всему миру. С ее помощью было достигнуто 15 стран (включая Антарктику), при этом были использованы различные трансатлантические и транстихоокеанские каналы. Однако, до того как сделать это, мы увеличили MTU SLIP канала с дозвоном между нашей подсетью и маршрутизатором netb (рисунок 11.12) до 1500, как в Ethernet.

Из 18 раз, когда была запущена программа, только в двух случаях траспортный MTU был меньше чем 1500. Один трансатлантический канал имел MTU равный 572 (странное значение, которое даже не приведено в списке в RFC 1191), и маршрутизатор не вернул ICMP ошибку в новом формате. Еще один канал между двумя маршрутизаторами в Японии не обрабатывал фреймы размером 1500 байт, также маршрутизатор не вернул ICMP ошибку в новом формате. После того как MTU было уменьшено до 1006, все заработало.

Вывод, который мы можем сделать из этих экспериментов, заключается в том, что большинство (но не все) глобальных сетей в настоящее время могут обрабатывать пакеты больше чем 512 байт. Использование характеристики поиска транспортного MTU позволяет приложениям работать значительно продуктивнее, пользуясь большими MTU.

Определение транспортного MTU при использовании UDP

Давайте рассмотрим взаимодействие между приложением, использующим UDP, и механизмом определения транспортного MTU. Нам необходимо посмотреть, что произойдет в том случае, когда приложение отправляет датаграмму, которая слишком велика для некоторого промежуточного канала.

Так как единственная система, которая поддерживает механизм определения транспортного MTU, это Solaris 2.x, мы используем ее как хост источник, чтобы отправить датаграмму размером 650 байт на slip. Так как хост slip находится позади SLIP канала с MTU равным 296, любая UDP датаграмма больше чем 268 байт (296 — 20 — 8) с установленным битом «не фрагментировать» должна вызвать ICMP ошибку «не могу фрагментировать» с маршрутизатора bsdi. На рисунке 11.13 показана топология и MTU каналов.

Рисунок 11.13 Системы, использованные для определения транспортного MTU с использованием UDP.

Следующая команда генерирует десять UDP датаграмм размером 650 байт с интервалом в 5 секунд:

>solaris % sock -u -i -n10 -w650 -p5 slip discard

На рисунке 11.14 показан вывод команды tcpdump. Когда этот пример был запущен, маршрутизатор bsdi был сконфигурирован таким образом, чтобы не возвращать MTU следующей пересылки как часть ICMP ошибки «не могу фрагментировать».

Первая посланная датаграмма с установленным битом DF (строка 1) генерирует ожидаемую ошибку от маршрутизатора bsdi (строка 2). Что интересно, следующая датаграмма, также посланная с установленным битом DF (строка 3), генерирует ту же самую ICMP ошибку (строка 4). Мы ожидали, что эта датаграмма будет послана с выключенным битом DF.

В строке 5 IP наконец понял, что датаграммы в этот пункт назначения не должны посылаться с установленным битом DF, после чего стал фрагментировать датаграммы на хосте источнике. Это поведение отличается от того, что было показано в ранних примерах, где IP отправлял датаграммы, которые он получал от UDP, и при этом маршрутизаторам с более маленькими MTU (bsdi в данном случае) позволялось осуществлять фрагментацию.

1 0.0 solaris.38196 > slip.discard: udp 650 (DF)
2 0.004218 (0.0042) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 0 (DF)

3 4.980528 (4.9763) solaris.38196 > slip.discard: udp 650 (DF)
4 4.984503 (0.0040) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 0 (DF)

5 9.870407 (4.8859) solaris.38196 > slip.discard: udp 650 (frag 47942:552@0+)
6 9.960056 (0.0896) solaris > slip: (frag 47942:106@552)

7 14.940338 (4.9803) solaris.38196 > slip.discard: udp 650 (DF)
8 14.944466 (0.0041) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 0 (DF)

9 19.890015 (4.9455) solaris.38196 > slip.discard: udp 650 (frag 47944:552@0+)
10 19.950463 (0.0604) solaris > slip: (frag 47944:106@552)

11 24.870401 (4.9199) solaris.38196 > slip.discard: udp 650 (frag 47945:552@0+)
12 24.960038 (0.0896) solaris > slip: (frag 47945:106@552)

13 29.880182 (4.9201) solaris.38196 > slip.discard: udp 650 (frag 47946:552@0+)
14 29.940498 (0.0603) solaris > slip: (frag 47946:106@552)

15 34.860607 (4.9201) solaris.38196 > slip.discard: udp 650 (frag 47947:552@0+)
16 34.950051 (0.0894) solaris > slip: (frag 47947:106@552)

17 39.870216 (4.9202) solaris.38196 > slip.discard: udp 650 (frag 47948:552@0+)
18 39.930443 (0.0602) solaris > slip: (frag 47948:106@552)

19 44.940485 (5.0100) solaris.38196 > slip.discard: udp 650 (DF)
20 44.944432 (0.0039) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 0 (DF)

Рисунок 11.14 Определение транспортного MTU с использованием UDP.

Так как ICMP сообщение «не могу фрагментировать» не содержит MTU следующей пересылки, это означает, что IP решил что всех устраивает MTU равный 576. Первый фрагмент (строка 5) содержит 544 байта UDP данных, 8 байт UDP заголовка и 20 байт IP заголовка, полный размер IP датаграммы составляет 572 байта. Второй фрагмент (строка 6) содержит оставшиеся 106 байт UDP данных и 20-байтный IP заголовок.

К сожалению, следующая датаграмма, строка 7, имеет установленный бит DF, поэтому она отбрасывается bsdi, после чего возвращается ICMP ошибка. Здесь произошло следующее: истек IP таймер, который сообщил IP о необходимости проверить, не увеличился ли транспортный MTU, путем повторной установки бита DF. Мы увидим, что это произойдет снова в строках 19 и 20. Сравнивая времена в строках 7 и 19, где DF бит устанавливается в единицу, мы видим, что проверка на увеличение транспортного MTU осуществляется каждые 30 секунд.

Этот 30-секундный таймер слишком мал. RFC 1191 рекомендует установить значение таймера в 10 минут. Величину таймера можно изменить с помощью параметра ip_ire_pathmtu_interval (приложение E, раздел «Solaris 2.2»). В Solaris 2.2 не существует способа выключить определение транспортного MTU для одного UDP приложения или для всех UDP приложений. Оно может быть включено или выключено только для всей системы в целом с помощью изменения параметра ip_path_mtu_discovery. Как мы видим из данного примера, включение характеристики определения транспортного MTU, когда UDP приложения отправляют датаграммы, которые, возможно, будут фрагментированы, приведет к тому, что датаграмма может быть отброшена.

Максимальный размер датаграммы, воспринимаемый IP уровнем на solaris (576 байт), неверен. На рисунке 11.13 мы видели, что реальный MTU составляет 296 байт. Это означает, что фрагменты, генерируемые solaris, снова фрагментируются на bsdi. На рисунке 11.15 показан вывод tcpdump, полученный на хосте назначения (slip) для первой прибывшей датаграммы (строки 5 и 6 на рисунке 11.14).

1 0.0 solaris.38196 > slip.discard: udp 650 (frag 47942:272@0+)
2 0.304513 (0.3045) solaris > slip: (frag 47942:272@272+)
3 0.334651 (0.0301) solaris > slip: (frag 47942:8@544+)
4 0.466642 (0.1320) solaris > slip: (frag 47942:106@552)

Рисунок 11.15 Первая датаграмма, прибывшая на хост slip от solaris.

В этом примере хост solaris не должен фрагментировать исходящие датаграммы, однако должен выключить бит DF и позволить маршрутизатору с меньшим MTU осуществить фрагментацию.

Сейчас мы запустим тот же самый пример, однако изменим поведение маршрутизатора bsdi так, чтобы тот возвращал MTU следующей пересылки в ICMP сообщении «не могу фрагментировать». На рисунке 11.16 показаны первые шесть строк вывода tcpdump.

1 0.0 solaris.37974 > slip.discard: udp 650 (DF)
2 0.004199 (0.0042) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 296 (DF)

3 4.950193 (4.9460) solaris.37974 > slip.discard: udp 650 (DF)
4 4.954325 (0.0041) bsdi > solaris: icmp:
slip unreachable — need to frag, mtu = 296 (DF)

5 9.779855 (4.8255) solaris.37974 > slip.discard: udp 650 (frag 35278:272@0+)
6 9.930018 (0.1502) solaris > slip: (frag 35278:272@272+)
7 9.990170 (0.0602) solaris > slip: (frag 35278:114@544)

Рисунок 11.16 Определение транспортного MTU с использованием UDP.

И снова мы видим, что две первые датаграммы отправлены с установленным битом DF, на обе получены ICMP ошибки. Сейчас в ICMP ошибке указывается MTU следующей пересылки, который равен 296.

В строках 5, 6 и 7 мы видим, что хост источник осуществляет фрагментацию, как на рисунке 11.14. Если известен MTU следующей пересылки, генерируются только три фрагмента, по сравнению с четырьмя фрагментами, которые генерируются маршрутизатором bsdi на рисунке 11.15.


Взаимодействие между UDP и ARP

Используя UDP, мы можем рассмотреть очень интересное взаимодействие между UDP и типичной реализацией ARP.

Мы используем программу sock, чтобы сгенерировать одну UDP датаграмму с 8192 байтами данных. Мы ожидаем, что в этом случае будет сгенерировано шесть Ethernet фрагментов (см. упражнение 3 главы 11). Также, перед запуском программы, мы убедимся в том, что ARP кэш пуст, поэтому перед тем как будет отправлен первый фрагмент, должен произойти обмен ARP запросом и откликом.

bsdi % arp -a проверяем, что ARP кэш пуст
bsdi % sock -u -i -n1 -w8192 svr4 discard

Мы ожидаем, что первая датаграмма вызовет отправку ARP запроса. Следующие пять фрагментов, которые генерируются IP, ставят перед нами два вопроса, на которые мы можем ответить, только воспользовавшись tcpdump: будут ли готовы к отправке оставшиеся фрагменты, перед тем как будет получен ARP отклик, если так, что будет делать ARP с этими несколькими пакетами направляемыми на конкретный пункт назначения, пока ожидается ARP отклик? На рисунке 11.17 показан вывод программы tcpdump.

1 0.0 arp who-has svr4 tell bsdi
2 0.001234 (0.0012) arp who-has svr4 tell bsdi
3 0.001941 (0.0007) arp who-has svr4 tell bsdi
4 0.002775 (0.0008) arp who-has svr4 tell bsdi
5 0.003495 (0.0007) arp who-has svr4 tell bsdi
6 0.004319 (0.0008) arp who-has svr4 tell bsdi
7 0.008772 (0.0045) arp reply svr4 is-at 0:0:c0:c2:9b:26
8 0.009911 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26
9 0.011127 (0.0012) bsdi > svr4: (frag 10863:800@7400)
10 0.011255 (0.0001) arp reply svr4 is-at 0:0:c0:c2:9b:26
11 0.012562 (0.0013) arp reply svr4 is-at 0:0:c0:c2:9b:26
12 0.013458 (0.0009) arp reply svr4 is-at 0:0:c0:c2:9b:26
13 0.014526 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26
14 0.015583 (0.0011) arp reply svr4 is-at 0:0:c0:c2:9b:26

Рисунок 11.17 Обмен пакетами при отправке по Ethernet UDP датаграммы размером 8192 байта.

Этот вывод достаточно неожидан. Во-первых, перед тем как получен первый ARP отклик, генерируются шесть ARP запросов. Как можно догадаться, IP быстро генерирует шесть фрагментов, и для каждого отправляется ARP запрос.

Затем, когда получен первый ARP отклик (строка 7), отправляется только последний фрагмент (строка 9)! Это означает, что первые пять фрагментов были отброшены. В действительности, это пример обычного функционирования ARP. Большинство реализаций держат только последний пакет, который должен быть отправлен на хост назначения, пока ожидается ARP отклик.

Требования к хостам Host Requirements RFC требуют от реализаций, чтобы они предотвращали лавинообразную рассылку ARP запросов (повторная отправка ARP запросов для одного и того же IP адреса с большой частотой). Рекомендуемая максимальная частота составляет один раз в секунду. Здесь мы видим шесть ARP запросов в течение 4,3 миллисекунды. Требования к хостам Host Requirements RFC требуют, чтобы ARP сохранил по крайней мере один пакет, и это должен быть самый последний пакет. Это как раз то, что мы видели здесь.

Следующая необъяснимая аномальность заключается в том, что svr4 отправил назад семь ARP откликов, а не шесть.

И последнее, про что хочется сказать, tcpdump работал еще 5 минут после того, как вернулся последний ARP отклик, ожидая увидеть, как svr4 пошлет назад ICMP ошибку «время истекло в течение повторной сборки» (time exceeded during reassembly). ICMP сообщение так и не появилось. (Мы показали формат этого сообщения на рисунке 8.2. Поле код, установленное в 1, указывает на то, что время истекло в течение повторной сборки датаграммы.)

IP уровень должен запустить таймер, когда появляется первый фрагмент датаграммы. Здесь «первый» означает первый из прибывших фрагментов для данной датаграммы, а не просто первый фрагмент (со смещением фрагмента равным 0). Обычное значение тайм-аута находится в диапазоне от 30 до 60 секунд. Если все фрагменты для этой датаграммы не прибыли за время до истечения таймера, все фрагменты отбрасываются. Если этого не сделать, фрагменты, которые уже никогда не прибудут (как мы видели в этом примере), могут вызвать переполнение приемного буфера.

Существуют две причины, по которым мы не увидели ICMP сообщение. Во-первых, большинство реализаций Berkeley никогда не генерируют эту ошибку! Эти реализации устанавливают таймер и отбрасывают все фрагменты, когда таймер истечет, однако ICMP ошибка не генерируется. Во-вторых, первый фрагмент — фрагмент со смещением равным 0, содержащий UDP заголовок, не был принят. (Это был первый из пяти пакетов, отброшенных ARP.) Реализация не требует генерировать ICMP ошибку, если первый фрагмент не был принят. Причина заключается в том, что приемник ICMP ошибки не может сказать, который пользовательский процесс отправил датаграмму, которая была отброшена, потому что недоступен заголовок транспортного уровня. А высший уровень (либо TCP приложение, либо UDP приложение) отработает тайм-аут и повторит передачу.

В этом разделе мы использовали IP фрагментацию, чтобы посмотреть, как осуществляется взаимодействие между UDP и ARP. Это взаимодействие можно увидеть, если отправитель быстро отправит несколько UDP датаграмм. Мы воспользовались фрагментацией, потому что пакеты быстро генерируются с помощью IP, что значительно быстрее, чем генерация нескольких пакетов пользовательским процессом.

Максимальный размер UDP датаграммы

Теоретически максимальный размер IP датаграммы может составлять 65535 байт, что ограничивается 16-битным полем полной длины в IP заголовке (см. рисунок 3.1). При длине IP заголовка равной 20 байтам и длине UDP заголовка равной 8 байтам в UDP датаграмме для пользовательских данных остается максимум 65507 байт. В большинстве реализаций, однако, используются датаграммы значительно меньшего размера.

Обычно играют роль два ограничения. Во-первых, программа приложение может быть ограничена программным интерфейсом. Сокеты API (глава 1, раздел «Интерфейсы прикладного программирования») предоставляют функцию, которая может быть вызвана приложением, чтобы установить размер буферов ввода и вывода. Для UDP сокета этот размер напрямую связан с максимальным размером UDP датаграммы, которая может быть прочитана и записана UDP. В настоящее время большинство систем предоставляют по умолчанию максимальный размер UDP датаграммы, которая может быть прочитана или записана, равный 8192 байтам. (Эта значение установлено в 8192, потому что именно столько по умолчанию читается и записывается системой NFS.)

Следующее ограничение определяется реализацией ядра TCP/IP. Могут существовать характеристики реализации (или ошибки), которые ограничивают размер UDP датаграммы значением меньшим, чем 65535 байт.

Автор экспериментировал с различными размерами UDP датаграмм, используя программу sock. С использованием loopback интерфейса под SunOS 4.1.3, максимальный размер UDP датаграммы был 32767 байт. Использовать большее значение не удавалось. При передаче по Ethernet от BSD/386 к SunOS 4.1.3, максимальный размер IP датаграммы, которую мог принять Sun, составлял 32786 (при этом пользовательских данных было 32758 байт). С использованием loopback интерфейса в Solaris 2.2 максимальный размер IP датаграммы, которая могла быть отправлена и принята, составлял 65535 байт. При передаче от Solaris 2.2 к AIX 3.2.2 удалось передать IP датаграмму максимального размера в 65535 байт.

В разделе «IP заголовок» главы 3 мы упомянули, что хосту необходимо получать IP датаграммы размером по меньшей мере 576 байт. Большинство приложений UDP разработаны таким образом, чтобы ограничивать свои приложения в размере 512 байт данных или меньше, чтобы уложиться в это ограничение. В разделе «RIP: протокол обмена информацией о маршрутизации» главы 10, например, мы видели, что RIP всегда посылает в датаграмме меньше чем 512 байт. Это же самое ограничение мы найдем и в других UDP приложениях: DNS (глава 14), TFTP (глава 15), BOOTP (глава 16) и SNMP (глава 25).

Из того что IP может отправлять и принимать датаграммы определенного размера, не следует, что принимающее приложение готово прочитать датаграммы этого размера. Программный интерфейс UDP позволяет приложениям указывать максимальное количество байт, которые будут обработаны за один раз. Что произойдет, если принятая датаграмма по размеру больше, чем датаграмма, которую готово принять приложение?

К сожалению, ответ зависит от программного интерфейса и реализации.

Традиционные версии Berkeley сокет API обрезают датаграммы, отбрасывая любые непоместившиеся данные. Будет ли приложение поставлено в известность, зависит от версии. ( 4.3 BSD Reno и более поздние версии могут уведомить приложение о том, что датаграмма была обрезана.) API сокеты под SVR4 (включая Solaris 2.x) не обрезают датаграммы. Любые непоместившиеся данные последовательно считываются. Приложение не уведомляется о нескольких циклах считывания и ему будет передана одна UDP датаграмма. TLI API не отбрасывают данные. Вместо этого возвращается флаг, указывающий на то, что данных больше, чем можно считать за один раз, поэтому приложение начинает последовательно считывать оставшуюся датаграмму.

Когда мы будем обсуждать TCP, то увидим, что этот протокол предоставляет последовательные потоки байт, направляемые в приложение, без каких-либо ограничений. TCP передает в приложение данные любого размера, которые требуются для приложения — причем данные на этом интерфейсе никогда не теряются.

ICMP ошибка подавления источника

Воспользовавшись UDP, можно сгенерировать ICMP ошибку «подавление источника» (source quench). Эта ошибка может быть сгенерирована системой (маршрутизатором или хостом), когда она принимает датаграммы быстрее, чем эти датаграммы могут быть обработаны. Обратите внимание на выражение «могут быть». Система не требует послать подавление источника, даже если буферы переполнены и датаграммы отбрасываются.

На рисунке 11.18 показан формат ICMP ошибки подавления источника. Мы имеем идеальную возможность сгенерировать подобную ошибку в нашей тестовой сети. Мы можем посылать датаграммы с bsdi на маршрутизатор sun по Ethernet, причем эти датаграммы должны быть смаршрутизированы через SLIP канал. Так как SLIP канал примерно в тысячу раз медленнее чем Ethernet, мы легко можем переполнить буфер. Следующая команда посылает 100 датаграмм размером 1024 байта с хоста bsdi через маршрутизатор sun на solaris. Мы отправляем датаграммы на стандартный discard сервис, где они будут игнорированы:

>bsdi % sock -u -i -w1024 -n100 solaris discard

Рисунок 11.18 ICMP ошибка подавления источника.

На рисунке 11.19 показан вывод команды tcpdump, соответствующий этой команде.

1 0.0 bsdi.1403 > solaris.discard: udp 1024
26 строк не показано
27 0.10 (0.00) bsdi.1403 > solaris.discard: udp 1024
28 0.11 (0.01) sun > bsdi: icmp: source quench

29 0.11 (0.00) bsdi.1403 > solaris.discard: udp 1024
30 0.11 (0.00) sun > bsdi: icmp: source quench
142 строки не показано
173 0.71 (0.06) bsdi.1403 > solaris.discard: udp 1024
174 0.71 (0.00) sun > bsdi: icmp: source quench

Рисунок 11.19 ICMP подавление источника от маршрутизатора sun.

Из этого вывода мы удалили множество строк. Первые 26 датаграмм приняты без ошибок: мы показали вывод только для первой. Начиная с 27-й датаграммы, каждый раз, когда отправляется датаграмма, мы получаем ошибку подавление источника. Всего было 26+(74х2)=174 строк вывода.

Из нашего расчета пропускной способности последовательной линии, приведенного в разделе «Вычисление загруженности последовательной линии» главы 2, видно, что на передачу датаграммы размером 1024 байта со скоростью 9600 бит/сек потребуется больше одной секунды. (В нашем примере для этого потребуется больше времени, так как датаграмма размером 20+8+1024 байт будет фрагментирована, потому что MTU SLIP канала от sun к netb составляет 552 байта.) Однако, из показателей времени, приведенных на рисунке 11.19, мы видим, что маршрутизатор sun получил все 100 датаграмм за время меньше чем одна секунда, перед тем как первая была отправлена в SLIP канал. При этом понятно, что мы использовали множество его буферов.

Несмотря на то, что RFC 1009 [Braden and Postel 1987] требует, чтобы маршрутизатор генерировал ошибки подавления источника, когда переполняются его буферы, новые требования к маршрутизаторам Router Requirements RFC [ Almquist 1993] меняют это положение и говорят, что маршрутизатор не должен генерировать ошибки подавления источника.

Следующий момент, на который необходимо обратить внимание в примере, заключается в том, что программа sock никогда не получала уведомлений о том, что источник подавлен, или если и получала их, то игнорировала. Это говорит о том, что реализации BSD обычно игнорируют полученные сообщения о подавлении источника в случае использования протокола UDP. (В случае TCP, при получении уведомления передача данных по соединению, для которого сгенерировано подавление источника, замедляется. Мы это обсудим в разделе «ICMP ошибки» главы 21.) Проблема заключается в том, что процесс, который сгенерировал данные, которые, в свою очередь, вызвали подавление источника, может уже завершиться, когда будет принято сообщение о подавлении источника. И действительно, если мы используем программу time в Unix, чтобы оценить, как долго работает программа sock, то узнаем, что она проработала всего лишь около 0,5 секунды. Однако на рисунке 11.19 мы видели, что некоторые сообщения о подавлении источника были получены через 0,71 секунды после отправки первой датаграммы, то есть уже после того, как процесс прекратил работу. Что произойдет, если наша программа выдаст 100 датаграмм и завершится. Не все 100 датаграмм будут посланы — некоторые из них будут стоять в выходной очереди.

Этот пример доказывает, что UDP — ненадежный протокол и показывает важность контроля за потоком данных (flow control). Несмотря на то, что программа sock успешно выдала в сеть 100 датаграмм, только 26 достигли пункта назначения. Остальные 74 скорее всего были отброшены промежуточным маршрутизатором. Если приложение не поддерживает какую-либо форму уведомлений, отправитель не знает, принял ли получатель данные.

Существует несколько особенностей использования UDP, которые отражаются на разработке и реализации сервера. Разработка и реализация клиентов обычно легче, чем реализация серверов. Именно поэтому здесь мы обсудим разработку сервера, а не разработку клиента. Серверы обычно взаимодействуют с операционной системой, и большинство серверов требуют, чтобы существовал какой-либо способ, позволяющий обработать запросы от нескольких клиентов одновременно.

Обычно когда клиент стартует, он сразу же устанавливает соединение с одним сервером. Сервера, с другой стороны, стартуют и затем «засыпают», ожидая прибытия запроса от клиента. В случае UDP, сервер «просыпается», когда прибывает датаграмма от клиента, эта датаграмма может содержать запрос в какой-либо форме.

Мы не будем рассматривать аспекты программирования клиентов и серверов ([Stevens 1990] описывает все более подробно), однако рассмотрим характеристики протокола UDP, которые оказывают влияние на разработку и реализацию сервера, использующего UDP. (Мы обсудим подробности TCP сервера в разделе «Реализация TCP сервера» главы 18.) Некоторые характеристики мы обсудим в зависимости от реализаций UDP, которые будут использоваться, а также рассмотрим характеристики, которые являются общими для большинства реализаций.

IP адрес клиента и номер порта

От клиента прибывает UDP датаграмма. IP заголовок содержит IP адреса источника и назначения, а UDP заголовок содержит номера портов UDP источника и назначения. Когда приложение получает UDP датаграмму, операционная система должна сообщить ему, кто послал сообщение — IP адрес источника и номер порта.

Эта характеристика позволяет одному UDP серверу обрабатывать несколько клиентов. Каждый отклик отправляется тому клиенту, который послал запрос.

IP адрес назначения

Некоторым приложениям необходимо знать, кому предназначена датаграмма, то есть IP адрес назначения. Например, требования к хостам Host Requirements RFC определяют, что TFTP сервер должен игнорировать принятые датаграммы, которые рассылаются на широковещательный адрес. (Мы опишем широковещательную адресацию в главе 12, а TFTP в главе 15.)

Это означает, что операционная система должна передать IP адрес назначения из принятой UDP датаграммы в приложение. К сожалению, не все реализации предоставляют эту возможность.

Сокеты API предоставляют эту возможность с использованием опции IP_RECVDSTADDR. Из систем, которые описываются в тексте, только BSD/386, 4.4BSD и AIX 3.2.2 поддерживают эту опцию. SVR4, SunOS 4.x и Solaris 2.x не поддерживают.

Входная очередь UDP

В разделе «Модель клиент-сервер» главы 1 мы говорили, что большинство UDP серверов могут обслуживать все запросы к клиентам с использованием одного UDP порта (заранее известные порты серверов).

Обычно размер входной очереди, связанный с каждым UDP портом, который используется приложением, ограничен. Это означает, что запросы, которые прибывают в одно и то же время от различных клиентов, автоматически ставятся в очередь UDP. Принятые UDP датаграммы передаются приложению (когда оно требует следующую датаграмму) в том порядке, в каком они были приняты.

Однако существует вероятность, в случае если очередь переполнена, что модуль UDP в ядре отбросит входящие датаграммы. Мы можем пронаблюдать это с помощью следующего эксперимента. Стартуем нашу программу sock на хосте bsdi, запустив таким образом UDP сервер:

bsdi % sock -s -u -v -E -R256 -r256 -P30 6666
from 140.252.13.33, to 140.252.13.63: 1111111111 от sun на широковещательный адрес
from 140.252.13.34, to 140.252.13.35: 4444444444444 от svr4 на персональный адрес

Мы использовали следующие флаги : -s, запускает программу в роли сервера, -u для UDP, -v, печатает IP адрес клиента, и -E печатает IP адрес назначения (в данном случае система это позволяет). В дополнение, мы установили приемный буфер UDP для этого порта в 256 байт ( -R), вместе с размером, который может быть прочитан каждым приложением ( -r). Флаг -P30 сообщает о необходимости подождать 30 секунд после очистки UDP порта, перед считыванием первой датаграммы. Это дает нам время стартовать клиентов на двух других хостах, послать некоторые датаграммы и посмотреть, как работает очередь приема.

После того как сервер стартован и прошла 30-секундная пауза, мы стартуем одного клиента на хосте sun и посылаем три датаграммы:

sun % sock -u -v 140.252.13.63 6666 на широковещательный адрес Ethernet
connected on 140.252.13.33.1252 to 140.252.13.63.6666
1111111111 11 байт данных (с символом новой строки)
222222222 10 байт данных (с символом новой строки)
33333333333 12 байт данных (с символом новой строки)

Адрес назначения это широковещательный адрес (140.252.13.63). Затем мы стартовали еще одного клиента на хосте svr4 и послали еще три датаграммы:

svr4 % sock -u -v bsdi 6666
connected on 0.0.0.0.1042 to 140.252.13.35.6666
4444444444444 14 байт данных (с символом новой строки)
555555555555555 16 байт данных (с символом новой строки)
66666666 9 байт данных (с символом новой строки)

Первое, на что необходимо обратить внимание в интерактивном выводе, показанном ранее на bsdi, что только две датаграммы были приняты приложением: первая от sun, состоящая из всех единиц, и первая от svr4, состоящая из всех четверок. Остальные четыре датаграммы были отброшены.

Вывод команды tcpdump на рисунке 11.20 показывает, что все шесть датаграмм были доставлены к хосту назначения. Датаграммы прибыли от двух клиентов в обратном порядке: первая от sun, затем от svr4 и так далее. Также мы можем заметить, что все шесть были доставлены примерно за 12 секунд, в течение 30-секундного периода пока сервер «спал».

1 0.0 sun.1252 > 140.252.13.63.6666: udp 11
2 2.499184 (2.4992) svr4.1042 > bsdi.6666: udp 14
3 4.959166 (2.4600) sun.1252 > 140.252.13.63.6666: udp 10
4 7.607149 (2.6480) svr4.1042 > bsdi.6666: udp 16
5 10.079059 (2.4719) sun.1252 > 140.252.13.63.6666: udp 12
6 12.415943 (2.3369) svr4.1042 > bsdi.6666: udp 9

Рисунок 11.20 Вывод tcpdump для UDP датаграмм, посланных двумя клиентами.

Также необходимо отметить, что c опцией -E сервер может узнать IP адрес назначения каждой датаграммы. Сервер может выбирать, что сделать с первой принятой датаграммой, которая была отправлена на широковещательный адрес.

В этом примере необходимо обратить внимание еще на некоторые особенности. Во-первых, приложение не сообщило, когда была переполнена входная очередь. Лишние датаграммы UDP просто отбросил. Также в выводе tcpdump мы видим, что ничего не было отправлено клиенту обратно, чтобы сообщить ему о том, что датаграммы были отброшены. Не было послано ничего похожего на ICMP сообщение подавления источника, абсолютно ничего. И в заключение, хочется отметить, что входная очередь UDP функционирует по принципу FIFO (первый вошел, первый вышел), тогда как, что мы видели в разделе «Взаимодействие между UDP и ARP» этой главы, входная очередь ARP — LIFO (последний зашел, первый вышел).

Ограничение локального IP адреса

Большинство UDP серверов используют символы подстановки для своих IP адресов, когда создают конечные точки UDP. Это означает, что входящая UDP датаграмма, направляющаяся на порт сервера, будет принята любым локальным интерфейсом. Например, мы можем стартовать UDP сервер на порте 7777:

>sun % sock -u -s 7777

Затем мы воспользуемся командой netstat, чтобы посмотреть состояние этой конечной точки:

sun % netstat -a -n -f inet
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp 0 0 *.7777 *.*

В этом выводе мы удалили много строк и оставили только те, которые нам интересны. Флаг -a сообщает о всех конечных точках сети. Флаг -n печатает IP адреса в десятичном представлении, вместо того чтобы использовать DNS и конвертировать адреса в имена, а также печатает номера портов вместо имен сервисов. Опция -f inet сообщает только о точках TCP и UDP.

Локальный адрес напечатан как *.7777, где звездочка означает, что в качестве локального IP адреса может быть подставлен любой адрес.

Когда сервер создает свою конечную точку, он может указать один из локальных IP адресов хоста, включая один из его широковещательных адресов в качестве локального IP адреса конечной точки. При этом входящая UDP датаграмма будет передана на конечную точку только в том случае, если IP адрес назначения совпадет с указанным локальным адресом. С помощью программы sock можно указать IP адрес перед номером порта, и этот IP адрес становится локальным IP адресом для конечной точки. Например,

>sun % sock -u -s 140.252.1.29 7777

из датаграмм, прибывающих на SLIP интерфейс, выбирает датаграммы с адресом 140.252.1.29. Вывод команды netstat будет выглядеть следующим образом:

Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp 0 0 140.252.1.29.7777 *.*

Если мы постараемся послать на этот сервер датаграмму с хоста bsdi, адрес которого 140.252.13.35, по Ethernet, вернется ICMP ошибка о недоступности порта. Сервер никогда не увидит эту датаграмму. На рисунке 11.21 это показано более подробно.

1 0.0 bsdi.1723 > sun.7777: udp 13
2 0.000822 (0.0008) sun > bsdi: icmp: sun udp port 7777 unreachable

Рисунок 11.21 Отказ обработки UDP датаграммы, вызванный несовпадением локального адреса сервера.

Существует возможность запустить другие сервера для этого же порта, каждый с собственным локальным IP адресом. Однако, приложение должно разрешить системе повторно использовать тот же самый номер порта.

Должна быть указана опция сокета в API SO_REUSEADDR. Это делается нашей программой sock с помощью опции -A.

На хосте sun мы можем стартовать пять различных серверов на одном и том же UDP порте (8888):

sun % sock -u -s 140.252.1.29 8888 для канала SLIP
sun % sock -u -s -A 140.252.13.33 8888 для Ethernet
sun % sock -u -s -A 127.0.0.1 8888 для loopback интерфейса
sun % sock -u -s -A 140.252.13.63 8888 для широковещательных запросов Ethernet
sun % sock -u -s -A 8888 для всего остального (метасимволы в IP адресе)

Ожидалось, что первый из серверов будет запущен с флагом -A, который сообщает системе о том, что можно повторно использовать тот же самый номер порта. Вывод команды netstat показывает следующие пять серверов:

Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp 0 0 *.8888 *.*
udp 0 0 140.252.13.63.8888 *.*
udp 0 0 127.0.0.1 8888 *.*
udp 0 0 140.252.13.33 8888 *.*
udp 0 0 140.252.1.29 8888 *.*

В этом сценарии только датаграммы, направляющиеся на адрес 140.252.1.255, будут попадать на сервер с символами подстановки, используемыми в качестве локального IP адреса, потому что другие четыре сервера охватывают все возможные адреса.

При использовании подстановки IP адресов используется система приоритетов. Конечная точка с указанным IP адресом, который совпадает с IP адресом назначения, всегда будет выбрана раньше, чем адрес с символами подстановки. Конечная точка с символами подстановки используется только в том случае, когда не найдено совпадение с указанным адресом.

Ограничение внешних IP адресов

Во всех выводах команды netstat, которую мы показывали ранее, удаленные IP адреса и удаленные номера портов показаны как *.*. Это означает, что конечная точка воспримет входящие UDP датаграммы с любого IP адреса и любого номера порта. В большинстве реализаций конечным точкам UDP позволяется ограничивать удаленные адреса.

Другими словами, конечная точка может воспринимать только UDP датаграммы от указанного IP адреса и номера порта. Наша программа sock использует опцию -f, чтобы указать удаленный IP адрес и номер порта:

>sun % sock -u -s -f 140.252.13.35.4444 5555

При этом удаленный IP адрес устанавливается в 140.252.13.35 (наш хост bsdi), а удаленный номер порта в 4444. Заранее-известный порт сервера 5555. Если мы запустим netstat, то увидим, что локальный IP адрес также установлен, даже если мы не указывали его непосредственно:

Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp 0 0 140.252.13.33.5555 140.252.13.35.4444

Это побочный эффект указания удаленного IP адреса и удаленного номера порта в системах Berkeley: если локальный IP адрес не был выбран при установке удаленного адреса, локальный адрес выбирается автоматически. В качестве локального IP адреса устанавливается IP адрес интерфейса, который выбирается с помощью IP маршрутизации для достижения указанного удаленного IP адреса. И действительно, в этом примере IP адрес sun для Ethernet, который подключен к удаленному адресу, это 140.252.13.33.

На рисунке 11.22 приведены три типа адресов и портов, которые UDP сервер может установить для самого себя.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Введение в IP-сети. Глава 5. Протокол доставки пользовательских дейтаграмм UDP

Задачей протокола транспортного уровня UDP (User Datagram Protocol) является передача данных между прикладными процессами без гарантий доставки, поэтому его пакеты могут быть потеряны, продублированы или прийти не в том порядке, в котором они были отправлены.

Зарезервированные и доступные порты UDP

В то время, как задачей сетевого уровня является передача данных между произвольными узлами сети, задача транспортного уровня заключается в передаче данных между любыми прикладными процессами , выполняющимися на любых узлах сети. Действительно, после того, как пакет средствами протокола IP доставлен в компьютер-получатель, данные необходимо направить конкретному процессу-получателю. Каждый компьютер может выполнять несколько процессов, более того, прикладной процесс тоже может иметь несколько точек входа, выступающих в качестве адреса назначения для пакетов данных.

Пакеты, поступающие на транспортный уровень, организуются операционной системой в виде множества очередей к точкам входа различных прикладных процессов. В терминологии TCP/IP такие системные очереди называются портами . Таким образом, адресом назначения, который используется на транспортном уровне, является идентификатор (номер) порта прикладного сервиса. Номер порта, задаваемый транспортным уровнем, в совокупности с номером сети и номером компьютера, задаваемыми сетевым уровнем, однозначно определяют прикладной процесс в сети.

Назначение номеров портов прикладным процессам осуществляется либо централизовано, если эти процессы представляют собой популярные общедоступные сервисы, типа сервиса удаленного доступа к файлам TFTP (Trivial FTP) или сервиса удаленного управления telnet, либо локально для тех сервисов, которые еще не стали столь распространенными, чтобы за ними закреплять стандартные (зарезервированные) номера.

Централизованное присвоение сервисам номеров портов выполняется организацией Internet Assigned Numbers Authority . Эти номера затем закрепляются и опубликовываются в стандартах Internet. Например, упомянутому выше сервису удаленного доступа к файлам TFTP присвоен стандартный номер порта 69.

Локальное присвоение номера порта заключается в том, что разработчик некоторого приложения просто связывает с ним любой доступный, произвольно выбранный числовой идентификатор, обращая внимание на то, чтобы он не входил в число зарезервированных номеров портов. В дальнейшем все удаленные запросы к данному приложению от других приложений должны адресоваться с указанием назначенного ему номера порта.

Мультиплексирование и демультиплексирование прикладных протоколов с помощью протокола UDP

Протокол UDP ведет для каждого порта две очереди: очередь пакетов, поступающих в данный порт из сети, и очередь пакетов, отправляемых данным портом в сеть.

Процедура обслуживания протоколом UDP запросов, поступающих от нескольких различных прикладных сервисов, называется мультиплексированием .

Распределение протоколом UDP поступающих от сетевого уровня пакетов между набором высокоуровневых сервисов, идентифицированных номерами портов, называется демультиплексированием (рисунок 5.1).

Хотя к услугам протокола UDP может обратиться любое приложение, многие из них предпочитают иметь дело с другим, более сложным протоколом транспортного уровня TCP. Дело в том, что протокол UDP выступает простым посредником между сетевым уровнем и прикладными сервисами, и, в отличие от TCP, не берет на себя никаких функций по обеспечению надежности передачи. UDP является дейтаграммным протоколом, то есть он не устанавливает логического соединения, не нумерует и не упорядочивает пакеты данных.

С другой стороны, функциональная простота протокола UDP обуславливает простоту его алгоритма, компактность и высокое быстродействие. Поэтому те приложения, в которых реализован собственный, достаточно надежный, механизм обмена сообщениями, основанный на установлении соединения, предпочитают для непосредственной передачи данных по сети использовать менее надежные, но более быстрые средства транспортировки, в качестве которых по отношению к протоколу TCP и выступает протокол UDP. Протокол UDP может быть использован и в том случае, когда хорошее качество каналов связи обеспечивает достаточный уровень надежности и без применения дополнительных приемов типа установления логического соединения и квитирования передаваемых пакетов.

Формат сообщений UDP

Единица данных протокола UDP называется UDP-пакетом или пользовательской дейтаграммой (user datagram). UDP-пакет состоит из заголовка и поля данных, в котором размещается пакет прикладного уровня. Заголовок имеет простой формат и состоит из четырех двухбайтовых полей:

  • UDP source port — номер порта процесса-отправителя,
  • UDP destination port — номер порта процесса-получателя,
  • UDP message length — длина UDP-пакета в байтах,
  • UDP checksum — контрольная сумма UDP-пакета

Не все поля UDP-пакета обязательно должны быть заполнены. Если посылаемая дейтаграмма не предполагает ответа, то на месте адреса отправителя могут помещаться нули. Можно отказаться и от подсчета контрольной суммы, однако следует учесть, что протокол IP подсчитывает контрольную сумму только для заголовка IP-пакета, игнорируя поле данных.

Илон Маск рекомендует:  Что такое код fbsql_field_len
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL