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

[CC] Ethernet

Рекомендуемые сообщения

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Функция unserialize это дыра для хакера поскольку пытается выполнить входящий пакет как строку Lua. Т.е. при желании можно заставить твой роутер выполнить любой код какой только вздумается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

смотреть с 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 А может и нет.Ходишь с планшетом, играешь на нем в тетрис или просто он в кармане валяется, и он в фоновом режиме пишет весь радиоэфир ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ребята, давайте не будем спорить о том кто что знает о маршрутизации. Дело в том, что маршрутизация в реальном мире и в мире майнкрафта это две большие разницы. И не нужно переносить свои знания из реала в майн. Давайте лучше подумаем как такую маршрутизацию сделать, во-первых, работоспособной, во-вторых, максимально эффективной. Способ, предложенный Neo, действительно работает в сети из двух роутеров, но над эффективностью нужно еще поработать.

 

Предлагаю для размышления такой способ маршрутизации.

Предположим, наша сеть состоит всего из одного роутера и нескольких хостов.

post-6-14160783991101_thumb.gif

Пакет, направляемый хостом-передатчиком в сторону роутера должен содержать адрес хоста-приемника. Роутер извлекает этот адрес и переправляет пакет далее в нужном направлении. Какой должна быть структура ip-адреса в такой сети, если забыть на минутку о реальных ip-адресах? Первое, что приходит в голову, это должно быть одно единственное число, по возможности совпадающее с id хоста. Такую сеть будем называть одноуровневой.

 

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

 

v_pupkin 13

 

Теперь все пакеты с адресом получателя "v_pupkin" будут перенаправляться на id 13. Остальные же пакеты, с числовыми адресами получателей, будут обрабатываться роутером как и прежде.

post-6-14160783991308_thumb.gif

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

post-6-14160783991598_thumb.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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...