Протокол UDP
Почти все уже знакомы с транспортным протоколом TCP. Однако не многие знают о транспортном протоколе UDP. И для этого существуют причины. Почти все данные, будь то данные приложений, данные сессии или другие данные, пересылаются по старому проверенному протоколу TCP. В результате в голове укрепляется мысль, которую я постоянно слышу от многих людей: “Да, TCP гарантирует, что данные придут туда, куда надо”. Однако в действительности, это заявление неправильно.
TCP или Transmission Control Protocol – это протокол ориентированный на соединение. UDP или User Datagram Protocol не требует соединения. Что же это в точности означает? Хорошо, если вы читали мои статьи о TCP, вы должны были заметить, что TCP имеет очень много параметров, включенных в заголовок. Эти самые параметры (номер последовательности TCP, номер подтверждения) делают этот протокол ориентированным на соединение. Наконец, TCP имеет заголовок стандартной длины в 20 байт, вместо 8 у UDP.
Чем отличается UDP?
Хорошо, наш протокол UDP имеет длину заголовка 8 байт. Это на 12 байтов меньше, чем для TCP. В результате этого UDP намного быстрее, т.к. необходимо меньше передавать. Кажется, что 12 байтов это не много, но, умножив их на тысячи пакетов, мы быстро увидим разницу для вашей сети. Но если заголовок UDP намного меньше, то, как тогда он выглядит, вы спросите меня? Хороший вопрос! Посмотрите, пожалуйста, на диаграмму ниже и увидите, как выглядит заголовок UDP.
_____________________________________________________
2 байта номер порта отправителя | 2 байта номер порта получателя
_____________________________________________________
2 байта длина пакета UDP | 2 байта значение контрольной суммы UDP ____________________________________________________
Данные, если таковые имеются
Итак, из диаграммы выше, мы видим, что дополнительные 12 байтов в заголовке могут привести к значительным различиям. В результате этого UDP не ориентирован на соединение. Вы наверно заметили, что в заголовке UDP также имеется контрольная сумма. Сейчас я бы хотел напомнить вам, что все 4 основных протокола - IP, TCP, UDP, ICMP – имеют контрольную сумму. Во всех четырех основных протоколах при наличии данных в заголовке присутствует контрольная сумма. Еще я бы хотел упомянуть о UDP и его контрольной сумме, что ее использование необязательно. По существу, оно не должно использоваться, а в TCP, ICMP, и IP, напротив необходимо.
Это гарантированно?
Хорошо, теперь зная, что UDP не гарантирует доставку, и что он имеет намного меньше встроенных параметров для этого, почему вы хотите его использовать? Это необходимо помнить программистам при выборе транспортного протокола, который они хотят использовать, при разработке нового приложения или протокола другого уровня. Существует большое число мест, при разработке которых необходимо выбирать между скоростью и размером пакета. Если эти факторы важны для разработчика, то ему следует выбрать UDP в качестве транспортного протокола.
Да, все это здорово, но в действительности использует ли какой-нибудь приложение или другой протокол UDP-протокол? Отличный вопрос, и ответ на него положительный. Существует несколько приложений, которые используют в качестве транспорта протокол UDP. Одно из самых известных – это DNS (domain name system – доменная служба имен). Трафик, формируемый DNS, в действительности передается по UDP. DNS – это один из тех протоколов, который использует и UDP и DNS. Однако стоит сказать, что активность DNS в основном складывается из запросов и ответов DNS. Которые, как упоминалось ранее, передаются по UDP.
А мы рассмотрим пакет UDP!
Теперь, когда я чувствую ваше предвкушение узнать строение UDP, мы рассмотрим пакет UDP и различные поля, которые можно видеть в примере.
02:00:04.079943 192.168.1.100.53 > 192.168.1.200.57746: [udp sum ok] 60865 FormErr% [0q] 0/0/0 (12) (DF) (ttl 253, id 9987, len 40)
0x0000 4500 0028 2703 4000 fd11 619a c0a8 0164 E..('.@...a.....
0x0010 c0a8 01c8 0035 e192 0014 ba83 edc1 8091 .....5..........
0x0020 0000 0000 0000 0000 0000 0000 0000 ..............
Теперь, если вы читали все мои статьи, вы понимаете, что есть отличный ресурс для просмотра пакетов. В противном случае загрузите TCP/IP and tcpdump flyer. Он находится в разделе “Additional Resources”. С этим документом мы готовы рассмотреть содержимое пакета байт за байтом.
Один из способов быстро ориентироваться в пакете заключается в том, чтобы перейти к адресу назначения в заголовке IP. Его можно найти в строке 0x0010, и он составляет следующие 4 байта информации - c0a8 01c8. Мы знаем, что если нет настроек в нашем заголовке IP, то этот протокол следует заголовком IP (в этом случае UDP) 11 в шестнадцатиричном коде. 11 можно увидеть на первой строке 0x00 “fd11”. С помощью некоторых параметров заголовка IP можно быстро определить, где начинается протокол.
Итак, на основе того, что было сказано, первый байт нашего заголовка UDP – 0035, находящийся в строке 0x0010. Согласно нашей таблице TCP/IP, первые два байта заголовка UDP относятся к порту источника. Если мы переведем шестнадцатиричное значение 0035, то мы увидим, к какому порту относится данных пакет: это порт 53.
Уже лучше? Теперь после порта источника следующие два байта относятся к порту назначения; как видно это число в шестнадцатиричном коде e192 или более правильно 0xe192. После того, как мы переведем его в десятичный код, мы сможем определить порт назначения.
Замечательно, мы продолжаем рассматривать заголовок нашего UDP пакета! Следующие 2 байта согласно нашей таблице – это длина пакета UDP - 0x0014, после преобразования в десятичный код получаем 20. Так в действительности и должно было быть. Далее идет значение контрольной суммы UDP, которая также занимает 2 байта. В нашем случае значение контрольной суммы 0xba83.
Это конец заголовка UDP, далее следуют данные прикладного уровня. В нашем случае это информация DNS. Как всегда я искренне надеюсь, что эта статья была полезна для вас, и я жду ваших комментариев.
Дон Паркер (Don Parker)