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


Фотография

[CC] Ethernet


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 37

#1 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 30 Апрель 2014 - 18:51

У меня есть программа для организации локальной (глобальной) сети

#2 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 30 Апрель 2014 - 22:12

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

#3 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 03 Май 2014 - 12:01

Выкладывать обязательно, только оформить аккуратно, пояснить нюансы, или трудно воспринимаемые участки кода, какие-то скрины прикрепить, ссылки на источники, на видеообзор, Википедию, может какая-то литература использовалась, каких авторов. Рабочие и красиво оформленные работы будут увековечены в разделах проекты или в зале славы на радость их авторам и читателям форума!

#4 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 04 Май 2014 - 20:26

http://ridav.oxnull....ка-программ.30/ вот ссылка на тему

#5 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 04 Май 2014 - 21:08

Мой тебе совет, уходи от serialize-unserialize

#6 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 04 Май 2014 - 21:18

Мой тебе совет, уходи от serialize-unserialize

Легко.но зачем??

#7 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 05 Май 2014 - 00:17

Функция serialize довольно ресурсоемкая (см. модуль textutils. Рекурсии там и прочее). Если вызывать ее разово, это конечно, ни на чем не сказывается. Но, если десятки роутеров будут только тем и заниматься, что сериалазить, это может здорово подгрузить сервер. Функция unserialize это дыра для хакера поскольку пытается выполнить входящий пакет как строку Lua. Т.е. при желании можно заставить твой роутер выполнить любой код какой только вздумается.

#8 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 05 Май 2014 - 20:28

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

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

#9 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 06 Май 2014 - 08:43

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

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

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

#10 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 06 Май 2014 - 22:09

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

Вот новый АПИ rednet ,для версии 1.63:
CHANNEL_BROADCAST = 65535
CHANNEL_REPEAT = 65533

local tReceivedMessages = {}
local tReceivedMessageTimeouts = {}
local tHostnames = {}

function open( sModem )
    if type( sModem ) ~= "string" then
        error( "expected string", 2 )
    end
    if peripheral.getType( sModem ) ~= "modem" then  
        error( "No such modem: "..sModem, 2 )
    end
    peripheral.call( sModem, "open", os.getComputerID() )
    peripheral.call( sModem, "open", CHANNEL_BROADCAST )
end

function close( sModem )
    if sModem then
        -- Close a specific modem
        if type( sModem ) ~= "string" then
            error( "expected string", 2 )
        end
        if peripheral.getType( sModem ) ~= "modem" then
            error( "No such modem: "..sModem, 2 )
        end
        peripheral.call( sModem, "close", os.getComputerID() )
        peripheral.call( sModem, "close", CHANNEL_BROADCAST )
    else
        -- Close all modems
        for n,sModem in ipairs( peripheral.getNames() ) do
            if isOpen( sModem ) then
                close( sModem )
            end
        end
    end
end

function isOpen( sModem )
    if sModem then
        -- Check if a specific modem is open
        if type( sModem ) ~= "string" then
            error( "expected string", 2 )
        end
        if peripheral.getType( sModem ) == "modem" then
            return peripheral.call( sModem, "isOpen", os.getComputerID() ) and peripheral.call( sModem, "isOpen", CHANNEL_BROADCAST )
        end
    else
        -- Check if any modem is open
        for n,sModem in ipairs( peripheral.getNames() ) do
            if isOpen( sModem ) then
                return true
            end
        end
    end
    return false
end

function send( nRecipient, message, sProtocol )
    -- Generate a (probably) unique message ID
    -- We could do other things to guarantee uniqueness, but we really don't need to
    -- Store it to ensure we don't get our own messages back
    local nMessageID = math.random( 1, 2147483647 )
    tReceivedMessages[ nMessageID ] = true
    tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = nMessageID

    -- Create the message
    local nReplyChannel = os.getComputerID()
    local tMessage = {
        nMessageID = nMessageID,
        nRecipient = nRecipient,
        message = message,
        sProtocol = sProtocol,
    }

    if nRecipient == os.getComputerID() then
        -- Loopback to ourselves
        os.queueEvent( "rednet_message", nReplyChannel, message, sProtocol )

    else
        -- Send on all open modems, to the target and to repeaters
        local sent = false
        for n,sModem in ipairs( peripheral.getNames() ) do
            if isOpen( sModem ) then
                peripheral.call( sModem, "transmit", nRecipient, nReplyChannel, tMessage );
                peripheral.call( sModem, "transmit", CHANNEL_REPEAT, nReplyChannel, tMessage );
                sent = true
            end
        end
    end
end

function broadcast( message, sProtocol )
    send( CHANNEL_BROADCAST, message, sProtocol )
end

function receive( sProtocolFilter, nTimeout )
    -- The parameters used to be ( nTimeout ), detect this case for backwards compatibility
    if type(sProtocolFilter) == "number" and nTimeout == nil then
        sProtocolFilter, nTimeout = nil, sProtocolFilter
    end

    -- Start the timer
    local timer = nil
    local sFilter = nil
    if nTimeout then
        timer = os.startTimer( nTimeout )
        sFilter = nil
    else
        sFilter = "rednet_message"
    end

    -- Wait for events
    while true do
        local sEvent, p1, p2, p3 = os.pullEvent( sFilter )
        if sEvent == "rednet_message" then
            -- Return the first matching rednet_message
            local nSenderID, message, sProtocol = p1, p2, p3
            if sProtocolFilter == nil or sProtocol == sProtocolFilter then
                return nSenderID, message, sProtocol
            end
        elseif sEvent == "timer" then
            -- Return nil if we timeout
            if p1 == timer then
                return nil
            end
        end
    end
end

function host( sProtocol, sHostname )
    if type( sProtocol ) ~= "string" or type( sHostname ) ~= "string" then
        error( "expected string, string", 2 )
    end
    if sHostname == "localhost" then
        error( "Reserved hostname", 2 )
    end
    if tHostnames[ sProtocol ] ~= sHostname then
        if lookup( sProtocol, sHostname ) ~= nil then
            error( "Hostname in use", 2 )
        end
        tHostnames[ sProtocol ] = sHostname
    end
end

function unhost( sProtocol )
    if type( sProtocol ) ~= "string" then
        error( "expected string", 2 )
    end
    tHostnames[ sProtocol ] = nil
end

function lookup( sProtocol, sHostname )
    if type( sProtocol ) ~= "string" then
        error( "expected string", 2 )
    end

    -- Build list of host IDs
    local tResults = nil
    if sHostname == nil then
        tResults = {}
    end

    -- Check localhost first
    if tHostnames[ sProtocol ] then
        if sHostname == nil then
            table.insert( tResults, os.getComputerID() )
        elseif sHostname == "localhost" or sHostname == tHostnames[ sProtocol ] then
            return os.getComputerID()
        end
    end

    if not isOpen() then
        if tResults then
            return unpack( tResults )
        end
        return nil
    end

    -- Broadcast a lookup packet
    broadcast( {
        sType = "lookup",
        sProtocol = sProtocol,
        sHostname = sHostname,
    }, "dns" )

    -- Start a timer
    local timer = os.startTimer( 2 )

    -- Wait for events
    while true do
        local event, p1, p2, p3 = os.pullEvent()
        if event == "rednet_message" then
            -- Got a rednet message, check if it's the response to our request
            local nSenderID, tMessage, sMessageProtocol = p1, p2, p3
            if sMessageProtocol == "dns" and tMessage.sType == "lookup response" then
                if tMessage.sProtocol == sProtocol then
                    if sHostname == nil then
                        table.insert( tResults, nSenderID )
                    elseif tMessage.sHostname == sHostname then
                        return nSenderID
                    end
                end
            end
        else
            -- Got a timer event, check it's the end of our timeout
            if p1 == timer then
                break
            end
        end
    end
    if tResults then
        return unpack( tResults )
    end
    return nil
end

local bRunning = false
function run()
    if bRunning then
        error( "rednet is already running", 2 )
    end
    bRunning = true
  
    while bRunning do
        local sEvent, p1, p2, p3, p4 = os.pullEventRaw()
        if sEvent == "modem_message" then
            -- Got a modem message, process it and add it to the rednet event queue
            local sModem, nChannel, nReplyChannel, tMessage = p1, p2, p3, p4
            if isOpen( sModem ) and ( nChannel == os.getComputerID() or nChannel == CHANNEL_BROADCAST ) then
                if type( tMessage ) == "table" and tMessage.nMessageID then
                    if not tReceivedMessages[ tMessage.nMessageID ] then
                        tReceivedMessages[ tMessage.nMessageID ] = true
                        tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = nMessageID
                        os.queueEvent( "rednet_message", nReplyChannel, tMessage.message, tMessage.sProtocol )
                    end
                end
            end

        elseif sEvent == "rednet_message" then
            -- Got a rednet message (queued from above), respond to dns lookup
            local nSenderID, tMessage, sProtocol = p1, p2, p3
            if sProtocol == "dns" and tMessage.sType == "lookup" then
                local sHostname = tHostnames[ tMessage.sProtocol ]
                if sHostname ~= nil and (tMessage.sHostname == nil or tMessage.sHostname == sHostname) then
                    rednet.send( nSenderID, {
                        sType = "lookup response",
                        sHostname = sHostname,
                        sProtocol = tMessage.sProtocol,
                    }, "dns" )
                end
            end

        elseif sEvent == "timer" then
            -- Got a timer event, use it to clear the event queue
            local nTimer = p1
            local nMessage = tReceivedMessageTimeouts[ nTimer ]
            if nMessage then
                tReceivedMessageTimeouts[ nTimer ] = nil
                tReceivedMessages[ nMessage ] = nil
            end
        end
    end
end

Кстати сети так и остались уязвимы, что печально.:D А может и нет.Ходишь с планшетом, играешь на нем в тетрис или просто он в кармане валяется, и он в фоновом режиме пишет весь радиоэфир ;)

#11 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 06 Май 2014 - 22:17

я вот думаю в роутер свой RSA шифрование внедрить

#12 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 07 Май 2014 - 14:16

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

Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети 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("")
который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)


#13 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 07 Май 2014 - 14:44

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

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

#14 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 07 Май 2014 - 15:22

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

#15 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 07 Май 2014 - 15:40

Ну это не сильно похоже на таблицы маршрутов.

#16 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 07 Май 2014 - 16:46

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

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

#17 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 07 Май 2014 - 16:54

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

Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети 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("")
который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)

так он и возврашяет я уже продумал этот шаг

#18 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 09 Май 2014 - 18:19

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

Отвечу в такой же дерзкой манере:

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

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

Р.S. Сам как думаешь, когда случайный человек скачает твою программу, сможет ли он настроить передачу данных между различными сегментами сети ?

#19 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 12 Май 2014 - 16:48

Ребята, давайте не будем спорить о том кто что знает о маршрутизации. Дело в том, что маршрутизация в реальном мире и в мире майнкрафта это две большие разницы. И не нужно переносить свои знания из реала в майн. Давайте лучше подумаем как такую маршрутизацию сделать, во-первых, работоспособной, во-вторых, максимально эффективной. Способ, предложенный Neo, действительно работает в сети из двух роутеров, но над эффективностью нужно еще поработать. Предлагаю для размышления такой способ маршрутизации. Предположим, наша сеть состоит всего из одного роутера и нескольких хостов. Р1.gif Пакет, направляемый хостом-передатчиком в сторону роутера должен содержать адрес хоста-приемника. Роутер извлекает этот адрес и переправляет пакет далее в нужном направлении. Какой должна быть структура ip-адреса в такой сети, если забыть на минутку о реальных ip-адресах? Первое, что приходит в голову, это должно быть одно единственное число, по возможности совпадающее с id хоста. Такую сеть будем называть одноуровневой. Нужна ли в одноуровневой сети таблица маршрутизации? Мне кажется, что нет, поскольку всю необходимую информацию о дальнейшем пути пакета роутер может извлечь из самого пакета. Ну разве что какой либо из пользователей не захочет иметь в качестве адреса число, а захочет иметь строку. Скажем Вася Пупкин, владелец хоста с id 13, ненавидит число 13. Он может обратиться к администратору роутера и тот пропишет вот такую таблицу маршрутизации: v_pupkin 13 Теперь все пакеты с адресом получателя "v_pupkin" будут перенаправляться на id 13. Остальные же пакеты, с числовыми адресами получателей, будут обрабатываться роутером как и прежде. Р2.gif Продолжение следует...

#20 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 12 Май 2014 - 18:37

О структуре ip-адреса и таблицах маршрутизации в сети rednet (продолжение) И всё бы хорошо, но область покрываемая одним роутером ограничена радиусом 64. Если нам нужно покрыть бОльшую область, одним роутером не обойтись. И те роутеры, которыми мы накрыли требуемую область должны быть связаны между собой Р3.gif На рисунке изображены четыре роутера (я их назвал 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 Разумеется, похожие таблицы должны быть составлены и для остальных роутеров сети. Такую сеть будем называть двухуровневой. Каковы недостатки такой сети? При добавлении нового роутера (хоть это бывает и не часто) приходится корректировать таблицы маршрутизации всех остальных роутеров. Так же при отключении одного из ранее работавших роутеров будет наблюдаться потеря пакетов, проходящих через него. Как бороться с этими проблеммами? Мне видится динамическое построение таблиц маршрутизации с периодическим обновлением. Возможно со временем нам удастся решить и эту задачу. Продолжение следует...

#21 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 12 Май 2014 - 19:04

О структуре 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 обговорим.Обьяснять письмено тяжело

#22 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Май 2014 - 10:53

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

А ты попробуй письменно. Может еще кому интересно будет. Я вон уже сколько букв написал

#23 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Май 2014 - 16:49

О структуре ip-адреса и таблицах маршрутизации в сети rednet (продолжение) А теперь предположим, что наши соседи из другой деревни построили сеть аналогичную нашей. И мы связали эти две сети в одну при помощи цепочки повторителей. Р4.gif На рисунке изображены все имеющиеся в наличии роутеры и только два из всех возможных хостов. Наша деревня отмечена буквой А, соседняя — буквой В. Как теперь должна должна выглядеть таблица маршрутизации роутера first, чтобы пакет, предназначенный для деревни В был направлен в нужном направлении? Как я говорил выше, роутер должен знать пути ко всем остальным роутерам сети. Значит ли это, что в таблице должны быть прописаны пути к роутерам 15, 16, 17 и 18 для каждого в отдельности? Но ведь они все лежат в одном направлении и есть смысл выделить их в одну группу — группу В. А роутеры first, second, third и fourth соответственно в группу А. Таким образом ip-адрес теперь будет состоять из трех составляющих: адрес группы, адрес роутера и адрес хоста. Такая сеть будет трехуровневой. Привожу пример таблицы маршрутизации роутера first: A.first.self 10 – Это что бы отличать свои хосты от чужих A.first.v_pupkin 13 – Уже извеcтный нам хост Васи Пупкина A.second 8 – Пакеты на роутер second A.third 9 – Пакеты на роутер third A.fourth 9 – Пакеты на роутер fourth шлем через роутер third B 8 – Пакеты для роутеров группы В шлем через роутер second Разбор адреса производится в следующем порядке. Анализируется первая составляющая ip-адреса. Если это В — отправляем пакет на id 8. Если нет, анализируем вторую составляющую. Если это second, third или fourth — отправляем пакет на соответствующий id. Если нет, анализируем третью составляющую. Если третья составляющая прописана в таблице — отправляем пакет на соответствующий id. Если нет, интерпритируем третью составляющую как число и отправляем пакет на этот id. Если составляющая адреса не обнаружена в таблице, то такой пакет считается ошибочным и игнорируется. В принципе, таким же образом можно построить четырех- и более уровневую сеть. Но я думаю, мы пока ограничимся тремя уровнями. Если не двумя. Окончание следует.
  • Alex это нравится

#24 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Май 2014 - 18:29

О структуре ip-адреса и таблицах маршрутизации в сети rednet (окончание)
Чтобы все сказанное мной выше не казалось безжизненной теорией приведу пример работающих функций, которые могут помочь в нахождении роутером пути для передачи пакета.
Первая из них loadTable(filename) предназначена для загрузки таблицы маршрутизации из файла.
function loadTable(filename)
  local rTable={}
  local file=fs.open(filename,'r')
  if not file then error('Can not open file '..filename) end
  local line=file.readLine()
  while line do
    local path,id=line:match('^%s-([_%w%.]+)%s+(%d+)')
    if path then
      id=tonumber(id)
      local t=rTable
      for k in path:gmatch('([_%w]+)%.') do
        write(k..'.')
        if not t[k] then t[k]={}
        elseif type(t[k])=='number' then
          t[k]={[0]=t[k]}
        end
        t=t[k]
      end
      local k=path:match('([_%w]+)$')
      t[k]=id
      print(k,'=',id)
    end
    line=file.readLine()
  end
  file.close()
  return rTable
end
В качестве параметра функция принимает строку, содержащую путь к файлу. Возвращает таблицу, в которой данные из файла упакованы в виде удобном для использования. Вызывается один раз в начале работы ПО роутера.

Вторая функция trace(t,path)
function trace(t,ip)
  ip=ip..'.'
  for k in ip:gmatch('([_%w]+)%.') do
    if not t[k] then return tonumber(k) end
    if type(t[k])=='table' then t=t[k]
    else return t[k] end
  end
  return t[0]
end
принимает два параметра: t — таблица, полученная после вызова функции loadTable; ip – строка, содержащая ip-адрес хоста-приемника. Возвращает функция число — id компьютера (хоста или следующего роутера) на который следует передать пакет.

Привожу скриншот работы этих функций для таблицы маршрутизации со следующим содержимым:
A.first               7
A.first.self          7
A.first.v_pupkin      13
A.second              8
A.third               9
A.fourth              9
B                     8
C                     9
trace.JPG

#25 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 785
  • Уровень сигнала: 46,38%
  • В игре: 398 час. 9 мин.

Награды

                 

Отправлено 13 Май 2014 - 20:09

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

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

#26 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 14 Май 2014 - 19:29

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

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

#27 Гость_Nick_Alps_*

Гость_Nick_Alps_*
  • Гости
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 14 Май 2014 - 19:50

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

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

#28 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 14 Май 2014 - 20:32

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

Хорошо.

#29 Оффлайн   Semoro

Semoro
  • Пользователи
  • Сообщений: 17
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 19 Май 2014 - 16:08

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

#30 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 19 Май 2014 - 17:48

Могу присоединится в качестве программиста

Для начала нужно поселиться на сервере недалеко друг от друга и создать небольшую сеть из 3-4 роутеров. По мере необходимости наращивать.
К сожалению, я не смогу в ближайшее время появляться на игровом сервере и буду участвовать только из оффлайна. Часто бываю в РК, все вопросы можно туда.
Вот ПО роутера, которое должно запускаться из стартапа
http://pastebin.com/5T0suSif
Таблица маршрутизации - статическая. Ее нужно поместить в файл rtable в корне диска. Пример таблицы
first               self
second              8
third               9
fourth              9
Первая колонка - имя подсети, вторая - id по которому будет переправляться пакет на данную подсеть. Если во второй колонке self - значит это собственное имя роутера.
Набор функций для хоста
http://pastebin.com/FJqsDgZP
У Neo есть задумка динамической маршрутизации, но я пока не видел достаточно эффективной реализации.




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных