Учитывая степень бесполезности, которую можно было ожидать от обоих руководств.
https://inet.omnetpp.org/docs/tutorials/wireless/doc/step5.html
и справочные страницы:
https://doc.omnetpp.org/omnetpp/manual/#sec:ned-lang:warmup:network
как можно смоделировать столкновение на прикладном уровне?
Его проголосовали за закрытие, вероятно, потому, что он содержал два несвязанных вопроса. Кроме того, название немного вводит в заблуждение, потому что вы имеете в виду «обнаружение столкновения», а в последующем обсуждении выясняется, что в вашей симуляции никогда не бывает столкновений. То, что вы ищете, - это определить, вышел ли узел «за пределы диапазона» приемника. На прикладном уровне (и во многих протоколах маршрутизации, где необходимо обнаруживать обрыв связи) это делается путем периодической отправки сообщения, а на принимающей стороне с помощью таймера, чтобы увидеть, не получили ли вы что-то в течение этого периода таймера.
Вы не нашли туториал о том, как смоделировать столкновение на прикладном уровне просто потому, что на прикладном уровне столкновений не происходит.
Как правило, коллизия может произойти, когда к какой-либо среде (или слою) не могут получить одновременный доступ многие элементы. Однако для прикладного уровня такого ограничения нет. Приложение может отправить пакет в любое время, упакованный пакет будет обработан транспортным уровнем (TCP или UDP), а затем отправлен на сетевой уровень. Сетевой уровень имеет буфер, поэтому в ситуации, когда два и более приложения отправляют пакеты одновременно, конфликта не возникнет.
Согласно деталям, представленным в вашем вопросе:
hostSink
не может определить, отправляет ли hostA
пакеты. Моделирование отражает поведение реальной сети, и в реальной сети узел не знает, отправляет ли другой узел пакеты.Дискретно-событийная система — это система, в которой изменения состояния (события) происходят в дискретные моменты времени, а события происходят за нулевое время.
Это означает, что симуляция внутренне поддерживает переменную с именем currentSimtime
. В начале currentSimtime=0
. Когда первое событие (например, отправка пакета ARP) запланировано, например, на t=0,003 с, currentSimtime
устанавливается на 0,003 с и выполняется отправка пакета ARP.
> Ответ: hostSink не может определить, отправляет ли еще hostA пакеты. Моделирование отражает поведение реальной сети, и в реальном сетевом узле неизвестно, отправляет ли еще другой узел пакеты. Это ни в коем случае не может быть правдой. Если оба хоста отправляют пакеты, даже если они "сталкиваются", они должны дойти до прикладного уровня приемника...
... Даже если поступление происходит не по порядку, ОБА пакета должны быть получены и отброшены приемником. Сток умеет записывать время приема и ставить таймер (логически, по крайней мере). Если пакет получен от любого хоста до истечения времени, то да, хосты все еще отправляют пакеты в приемник.
1. даже если они "сталкиваются", они должны добраться до прикладного уровня стока - не всегда. В своем вопросе вы упомянули UDP и помните, что UDP — ненадежный протокол. И когда в канале частота битовых ошибок больше 0, пакет может быть удален на физическом уровне. UDP не гарантирует, что каждый отправленный пакет достигнет пункта назначения.
Я использую среду без шума/помех; пакет не должен быть поврежден. Или?
2. _Если пакет получен от любого хоста до истечения времени, _ - да, таким образом можно определить, что отправитель все еще активен. Но в своем вопросе вы не упомянули, что пакеты отправляются через определенные промежутки времени и что получатель знает значение периода.
Но я не уверен, как настроить таймер; ясно, что время моделирования =/= фактическое время (ОС). Как я могу создать таймер, который ждет X OMNET секунд?
Я использую среду без шума/помех; пакет не должен быть поврежден. Или? Ну, в большинстве случаев его не следует отбрасывать. Но помните, что, как и в реальной сети, буфер на сетевом уровне имеет конечный размер, буфер в MAC тоже.
Время моделирования полностью отличается от времени операционной системы! Я настоятельно рекомендую вам пройти TicToc Tutorial.
Да, буфер имеет конечный размер, но я могу контролировать скорость ввода пакетов; отправка пакетов с интервалом 200 мс с максимум 6 узлов не так уж и много (реально буфер никогда не может быть заполнен)
Теперь, в вашем вопросе есть несколько вопросов. Согласно правилам SO, один вопрос должен поднимать только одну проблему. Предлагаю разделить этот вопрос на несколько вопросов. В противном случае я бы проголосовал за закрытие этого вопроса.
Да, в туториале показаны только таймеры, установленные в ned-файле docs.omnetpp.org/tutorials/tictoc/part7. Мне нужен более тонкий контроль
Сделанный! Но, пожалуйста, перестаньте ссылаться на эти учебники. Их полезность на практике довольно низка, а лучше сказать, неприменима.
Я бы не сказал, что неприменимы. По крайней мере, шаг 3.6 TicToc «Моделирование задержки обработки» четко описывает, как реализовать таймеры в коде C++: docs.omnetpp.org/tutorials/tictoc/part3/… в вопросе, они действительно не связаны с вашей проблемой.
Зачем закрывать вопрос? Понятно, что понятно, о чем спрашивают. Лол, даже ответили.