2009-04-13 5 views
3

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

+1

@suresh: так как это задание колледжа (как вы прокомментировали ниже), пожалуйста, отредактируйте свой вопрос и сообщите нам, что вы думаете делать.Просто спрашивать прямо за ответ не получится. –

+0

Возьмите подсказки/функции из TCP. Такие вещи, как подтверждение полученных пакетов. – Albert

+0

Это может помочь вам определить, что означает «надежный». –

ответ

3

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

+3

Незначительный nitpick, TCP не является слоем поверх UDP, это слой поверх IP. UDP - очень тонкий слой поверх IP. – Michael

+0

Прошло много времени с тех пор, как я был в муках сетевого стека :-) –

+2

+1 Вы * можете * положить целые IP-пакеты поверх UDP, как показано openvpn. НЕТ основной причины, по которой вы не можете этого сделать. –

0

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

+0

Это мое задание в колледже .. я не знаю, как продолжить .. – suresh

+0

-1 для «просто использовать TCP» – ryan0

10

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

Редактировать: Также UDT может быть пригодится. Он основан на UDP, но является надежным.

+0

Это мое задание в колледже .. я не знаю, как продолжить .. – suresh

+5

Как это получилось 10 upvotes? Скачивая чужой код и передавая его в качестве своего собственного задания, вы получите невероятную скорость. – paxdiablo

+1

@paxdiablo: Я не предлагал, чтобы OP использовал этот код для своего задания, но было бы неплохо посмотреть, с чего начать. Я также хотел бороться со всеми сообщениями, которые утверждают, что нет такой вещи, как надежный UDP (конечно, там действительно нет, абстракция «протекает», но она будет такой же надежной, как TCP). – Zifre

-2

Если по какой-либо причине вы ДОЛЖНЫ использовать UDP (серьезно, просто используйте TCP), то некоторые быстрые и простые функции надежности будут представлять собой биение присутствия, acks и xor'ed контрольные суммы.

+3

-1. «Серьезно, просто используйте TCP» - и вы пойдете во время оценки и объясните профессору OPs, почему он решил сделать совершенно несвязанное задание? Мгновенный сбой – paxdiablo

+1

И UDP уже имеет контрольную сумму. – ijw

2

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

Работа по-прежнему продолжается, поэтому вы не можете ожидать, что пользователи получат ее, но если вам это нужно только для компьютеров, которые вы поддерживаете, все должно быть хорошо. Он реализован в various flavors of unix, хотя FreeBSD - это то место, где происходит большая часть работы по разработке. YMMV.

+0

+1 Единственный, кто упомянул SCTP. – Juliano

+0

И -1, поскольку это домашнее задание. Это означает, что OP должен написать свой * собственный *. – paxdiablo

+0

Это было изменено после моего ответа, но, спасибо, спасибо. :) – ojrac

15

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

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

+0

Я голосую за это, но вам, скорее всего, потребуется добавить порядковые номера для корреляции сообщений с ACK. – paxdiablo

3

Я использую UDP много, и главная проблема «надежности» в конечном итоге - потерянные пакеты (особенно в фрагментированных IP-пакетах). Вероятно, вы можете сделать 90% того, что нужно сделать, предотвращая фрагментацию (добавьте слой, который разбивает датаграммы на куски размером с IP), и обнаружив, что recipeint обнаруживает и запрашивает повторную передачу для потерянных «кусков».

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

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

  • Положите один клиент и сервер на выделенной линии Ethernet (возможно переключение между ними, но никаких других систем на их частной локальной сети).
  • Поддерживайте строгий протокол связи клиент-сервер в локальной сети UDP. Серверу никогда не разрешают говорить, кроме как в ответ на клиент.
  • Отключите все отвратительные сетевые мусора на этой UDP-ссылке (Netbios и т. Д.).
  • Сделать записи ARP на обоих концах статическими (поэтому ARP не будет вмешиваться один раз каждые 10 минут).

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

+0

Большая причина, по которой мы используем UDP через TCP, - это количество подключений. У нас есть тысячи устройств, отправляющих небольшие пакеты в одно место для размещения в db, и это число соединений убивает сервер. –

+0

Ну, наше «сетевое топологическое решение» не будет работать для вас Рексом. Для каждого клиента требуется отдельная физическая сеть. Я бы сказал, вам просто нужна менее ограниченная реализация TCP. Грустно, если вам нужно реализовать его самостоятельно, а не настраивать где-нибудь. –

1

Если вы хотите получить дополнительную информацию о том, как изменить ядро ​​Linux, первым моим ответом является «linux kernel» в google и, возможно, даже добавит к нему «socket». Веб-сайт Linux Kernel выглядит так, как будто у него могут быть и другие подсказки.

Мои предложения является то, что

1) Посмотрите, как UDP реализован в Linux
2) Посмотрите, как реализуется RUDP (как кто-то уже упоминалось)
3) ... (вы сделать магии произойдет здесь)
4) Прибыль! err ... Законченное домашнее задание!

+0

У меня есть идея сделать udp надежным .. но dunno, как это сделать с помощью модуля ... как поведение udp по умолчанию изменяется при загрузке модуля ядра .... – suresh

+0

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

3

Методы надежной передачи данных в совокупности называются «ARQ», что означает автоматическое повторение запроса.

Это слишком подробный предмет для объяснения здесь, но страницы с википедии - хорошее место для начала, но немного больше. Я рекомендую вам забрать одну из учебников по компьютерным сетям (например, Tanenbaum или Kurose/Ross) и перейти оттуда. Если вы считаете, что это достаточно для вашего задания, реализуйте базовую остановку и ожидайте ARQ и забудьте о более продвинутых ARQ-схемах, это еще одна работа по созданию.

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

Удачи вам в назначении.

0

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

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

+0

Мне нужно знать, чтобы сделать модуль, чтобы сделать это ... У меня есть идея сделать udp надежным .. но не знаю, как это сделать с помощью модуля ... как по умолчанию поведение udp изменяется при загрузке модуля ядра ... . – suresh

1

Я не уверен, что есть простой способ изменить поведение существующего UDP-кода через новый модуль.

Что было бы проще - взять UDP-код (net/ipv4/udp.c) и создать новый модуль с новым номером IP-протокола и изменить этот код для реализации вашего надежного протокола UDP. Вам нужно будет переименовать все внешние символы, чтобы имена не сталкивались с существующими символами, выясняли, где они регистрируют номер протокола (17) и изменяют это, а затем обновляют Makefile для создания вашего нового модуля и, вероятно, помещают запись в Kconfig.

Просмотрите/etc/protocols, чтобы узнать, какие идентификаторы протокола уже выделены.

Редактировать: похоже, что udp.c не может быть построен как модуль. Вам нужно будет посмотреть некоторые другие протоколы (например, ipip.c или ip_gre.c), чтобы узнать, как сделать свой код в модуле.

3

Я думаю, что вопрос о том, как сделать UDP надежным, может приблизиться к вопросу неправильным образом. UDP является более ненадежным по определению - ipso facto. Вы не собираетесь никуда делать, чтобы реализация протокола на стороне ОС была более «надежной».

Многие приложения, использующие UDP, используют его, потому что им нужен низкий уровень накладных расходов с малой задержкой намного больше, чем им нужна точная надежность TCP. Но почти всем этим приложениям по-прежнему нужен какой-то механизм для проверки сквозного приема определенных типов сообщений и, возможно, даже повторной сборки и/или первоначального подтверждения. Например, подумайте о SIP в VoIP-телефонии; Скрытое трехстороннее рукопожатие TCP и очень постепенное управление перегрузкой на самом деле не приемлемы для достойного времени установления соединения или QoS, но определенная необходимость подтверждения сообщений определенно необходима (для этого используются временные ответы в терминологии SIP). Или различные протоколы, используемые онлайн-играми - та же основная идея.

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

1

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

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

5

Те, кто продолжает говорить бедному парню, что «просто используют TCP», игнорируют, что есть веские причины, по которым надежная реализация UDP будет использоваться по протоколу TCP, - и это не семантика датаграммы (которая была легко удалена для слоя поверх TCP)

первичного законен драйвер для установления соединения связи/между многими узлами, которые могли бы в противном случае требуется проведение чрезмерной множественности соединения

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

+0

UDP лучше для программных механизмов резервирования сети, например, для переключения с двумя каналами. – ryan0

+0

Спасибо! TCP имеет очень – ryan0

0

Если вы хотите надежный UDP, ваш лучший выбор i s для использования SCTP (Stream Control Transmission Protocol). В настоящее время используется повсеместно установленный протокол.

Смежные вопросы