Перейти к содержимому

NEO

Пользователи
  • Публикации

    1 436
  • Зарегистрирован

  • Посещение

  • Победитель дней

    78

Сообщения, опубликованные пользователем NEO


  1. Кратчайшие пути

    1 Черепаха должна знать где цель

    2 По карте(которую составили другие)должна проверит можно-ли напролом добраться

    3 Если нет,посмотреть возможные пути по журналам движения других черепах(журнал-история движения черепахи)

    Алгоритм Ли подойдет и не надо мучатся

    • Нравится 1

  2. Для начала нужно поселиться на сервере недалеко друг от друга и создать небольшую сеть из 3-4 роутеров. По мере необходимости наращивать.

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

    Вот ПО роутера, которое должно запускаться из стартапа

    http://pastebin.com/5T0suSif

    Таблица маршрутизации - статическая. Ее нужно поместить в файл rtable в корне диска. Пример таблицы

    first               self
    second              8
    third               9
    fourth              9
    Первая колонка - имя подсети, вторая - id по которому будет переправляться пакет на данную подсеть. Если во второй колонке self - значит это собственное имя роутера.

    Набор функций для хоста

    http://pastebin.com/FJqsDgZP

    У Neo есть задумка динамической маршрутизации, но я пока не видел достаточно эффективной реализации.[/qu .

    Хорошо , что люди собираются

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

    Хорошо.

  4. Пропал интерес и угас огонь в глазах.:)

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

    Нет я решил чу-чуть глобальней подойти к теме и создал тему под названием Ethernet (я подумал если создавать сеть то уже полностью , а не только маршрутизатор). Сегодня с Zero мы будем на моём сервере с плоским миром (что бы клиент у зеро не лагал ) тестить и писать ПО для сети , писать документацию и создавать точную модель что бы другой человек мог понять. И извини что нагнал на тебя.

  5. О структуре ip-адреса и таблицах маршрутизации в сети rednet (продолжение)

     

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

    [ATTACH=full]43[/ATTACH]

    На рисунке изображены четыре роутера (я их назвал first, second, third и fourth). К некоторым из них подключены хосты.

    Как теперь пакету от хоста 11 добраться до хоста, скажем, 14? Прямой связи роутера first с хостом 14 нет. Значит пакет нужно направить на один из роутеров 8 или 9. Прописываем таблицу маршрутизации

     

    v_pupkin 13 – Уже известный нам хост Васи Пупкина

    14 9 – Пакеты на 14-й хост шлем через роутер third

     

    Но хостов, подключенных к роутерам second, third и fourth может быть очень много да и добавляться они могут слишком часто. Неужели их всех нужно руками прописывать в таблицу маршрутизации? Давайте пересмотрим структуру ip-адреса. Пусть теперь этот адрес состоит из двух составляющих: адреса роутера, к которому подключен хост и адреса самого хоста разделенных точкой. Пример fourth.14

    Теперь роутеру first не нужно помнить адреса всех хостов сети. Нужно лишь знать пути к роутерам. Вот так выглядит новая таблица маршрутизации.

     

    First.self 10 – Это что бы отличать свои хосты от чужих

    First.v_pupkin 13 – Уже известный нам хост Васи Пупкина

    second 8 – Пакеты на роутер second

    third 9 – Пакеты на роутер third

    fourth 9 – Пакеты на роутер fourth шлем через роутер third

     

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

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

     

    Продолжение следует...

    я уже решил . систему конкретно переделал заходи в RC или Skype обговорим.Обьяснять письмено тяжело

  6. Проанализировал код. Подправил описание в соответствии со своим пониманием. Коментарии - в скобках курсивом.

     

    Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети rednet.

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

    (Роутер это, как правило, редко обслуживаемый компьютер и запуск его программы будет скорее всего из стартапа. А значит никаких read() быть не должно. Используй парамерт запуска либо принимай номер подсети равным id роутера)

     

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

    Такой пакет представляет собой сериализированный массив, состоящий из следующих элементов:

    1. nil, 2. "login"

    (почему команда "login" на втором месте? Логичнее было бы команду ставить вперед)

     

    Когда login-пакет приходит на роутер он проверяет нету ли этого терминала в базе , если нету генерирует в своей подсети случайный ip, проверяет что бы он не совпал с другими ip и отправляет его терминалу

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

     

    ip представляет собой строку состоящую из четырех чисел, разделенных точкой.

    Первое из этих чисел совпадает с номером подсети роутера, а последующие генерируются случайным образом в диапазоне 0-255

    (Какова функциональность такого ip? Поможет ли она скорейшему нахождению маршрута? Если нет, то может не стоит копировать реал, а придумать что то свое?)

     

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

    (А зачем знать свой ip если его знает роутер?)

     

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

    1. ip отправителя, 2. ip получятеля, 3. Передаваемые данные 4. "transport"

    (Опять таки, команду "transport" логичнее вынести на первое место. Она и обрабатывается первой и место ее не меняется по сравнению с "login".

    О сериализации уже говорил. Нужно потихоньку от нее избавляться. Что нам нужно? Слепить четыре строки в одну? Так это не проблема. Потом разлепить? Я помогу, если сложно.)

     

    передача происходит таким способом

    1 пакет попадает на роутер, если этот пакет не от его терминалов , а от роутеров заносит

    в таблицу маршрутизации данные что с роутера такого-то пришел пакет от ip такого-то , это используеться в 4 шаге

    2 роутер проверяет авторизирован ли терминал если да то переходит к 3 шагу

    3 ищет в своей базе ip терминала-получателя, если нет переходит к 4 шагу , если да то отправляет пакет адресату

    4 ищет в своей базе ip адрес адресата и id роутера куда нужно пакет отправить,

    если находит то отправляет на тот роутер что указан в базе,если нет переходит к 5 шагу

    5 отправляет пакет на все роутеры которые прописаны в нём

     

    (Т.е. поиск маршрута осуществляется методом волны. Если терминал А отправляет пакет терминалу Б, тот пакет этот обойдет ВЕСЬ Интернет. Причем распространяться будет равномерно во все стороны, отражаясь и переотражаясь. Количество пакетов множиться буддет в геометрической прогрессии пока не завалит своей массой игровой сервер.

    Следует подумать над следующими вопросами:

    1. Оптимизация поиска маршрута

    2. Ограничение времени жизни пакета для исключения зацикливания

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

    term.clear()
            term.setCursorPos(1,1)
            print("__=Ip list=__")
            for i=1,#ip,1 do
              print("Ip : ",ip[i]," Mac : ",id[i])
            end --for
            for i=1,#router,1 do
              print("__=Router=__"..router[i])
            end
            for i=1,pr,1 do
              print("__=path=__")
              print("ip :",ip_path[i]," router :",router_path[i])
            end
            for i=1,14,1 do
              print()
            end
            write("                                  Programmed By NEO")
            print("")
    
    который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)
    так он и возврашяет я уже продумал этот шаг

  7. :) Так именно и будет! Сам смысл, для чего предназначен роутер, здесь пока не реализован. Без таблиц, статических или динамических, не обойтись. А про них нет никакого упоминания.

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

  8. 1 напиши основу взаимодействия сервера с клиентом

    2 опиши взаимодействия на сервере (типа если пришел пакет от id такого-то на подключение к чату , то проверить залогинен он или нет , если нет то отправить пакет с ошибкой или не отправлять а просто disconnect ему сделать )

    а serialize и unserialize можешь переделать


  9. Не получится регистрировать параллельно, потому что сейчас все данные передаются отдельными пакетами. Я не знаю каким образом разделить строку на несколько переменных, что бы одним пакетом передать. Хотя.. только что дошло, что можно логин и пароль объединять в одну строку и не разделять больше, так и оставить, а вот имя отделить по любому как то надо. Функция RednetProtect именно это и должна делать, я сомневался в том что она делает это правильно, буду использовать таблицу. Код не завершен. Функция логин здесь лишняя, я использовал ее что бы посмотреть как работает параллельный вызов функций

     

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


  10. print("Enter Side :")
    side= read()
    rednet.open(side)
    Так лучше не делать. Представьте, что Вы вставили мышку в USB разъем, а вам Windows говорит, введите стандарт USB, скорость передачи данных, введите имя драйвера для мыши... Я бы комп вместе с таким Windows в окно сразу запустил.:)

     

    Используйте стандартную функцию, где пользователю не надо думать, с какой именно стороны присобачить модем:

    function RednetOpen()
        local sModemSide = nil
            for n,sSide in ipairs( rs.getSides() ) do
                if peripheral.getType( sSide ) == "modem" then  
                    sModemSide = sSide
                    rednet.open(sModemSide)
                    break
                end
            end
            if sModemSide == nil then
                print( "Program stopped.")
                print( "No modem attached." )
                error()
        end
    end

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

    Ок напишу , когда писал роутер был не этим занят
×
×
  • Создать...