NEO 541 Опубликовано: 30 апреля, 2014 У меня есть программа для организации локальной (глобальной) сети Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 30 апреля, 2014 Имею браузер для отображения гипертекста. Попробуем Интернет забацать, когда сервер таки заработает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 3 мая, 2014 Выкладывать обязательно, только оформить аккуратно, пояснить нюансы, или трудно воспринимаемые участки кода, какие-то скрины прикрепить, ссылки на источники, на видеообзор, Википедию, может какая-то литература использовалась, каких авторов. Рабочие и красиво оформленные работы будут увековечены в разделах проекты или в зале славы на радость их авторам и читателям форума! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 4 мая, 2014 http://ridav.oxnull.net/forum/index.php?forums/Библиотека-программ.30/ вот ссылка на тему Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 4 мая, 2014 Мой тебе совет, уходи от serialize-unserialize Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 4 мая, 2014 Мой тебе совет, уходи от serialize-unserializeЛегко.но зачем?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 4 мая, 2014 Функция serialize довольно ресурсоемкая (см. модуль textutils. Рекурсии там и прочее). Если вызывать ее разово, это конечно, ни на чем не сказывается. Но, если десятки роутеров будут только тем и заниматься, что сериалазить, это может здорово подгрузить сервер. Функция unserialize это дыра для хакера поскольку пытается выполнить входящий пакет как строку Lua. Т.е. при желании можно заставить твой роутер выполнить любой код какой только вздумается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 5 мая, 2014 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 Добавьте, пожалуйста описание, что конкретно должна делать программа. Если это маршрутизатор, то где разделение сетей на уровни, как он общается с другим маршрутизатором, как ищет в таблицах путь к нему (причем оптимально короткий). И программку разбейте, пожалуйста, на какие-то кусочки. Чтобы отдельно функция что-то принимала, другая функция занималась буфером, третья что-то отправляла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 6 мая, 2014 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 Добавьте, пожалуйста описание, что конкретно должна делать программа. Если это маршрутизатор, то где разделение сетей на уровни, как он общается с другим маршрутизатором, как ищет в таблицах путь к нему (причем оптимально короткий). И программку разбейте, пожалуйста, на какие-то кусочки. Чтобы отдельно функция что-то принимала, другая функция занималась буфером, третья что-то отправляла. Ок напишу , когда писал роутер был не этим занят Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 6 мая, 2014 смотреть с 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 Кстати сети так и остались уязвимы, что печально. А может и нет.Ходишь с планшетом, играешь на нем в тетрис или просто он в кармане валяется, и он в фоновом режиме пишет весь радиоэфир Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 6 мая, 2014 я вот думаю в роутер свой RSA шифрование внедрить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 7 мая, 2014 Проанализировал код. Подправил описание в соответствии со своим пониманием. Коментарии - в скобках курсивом. Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети 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("") который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 7 мая, 2014 (Т.е. поиск маршрута осуществляется методом волны. Если терминал А отправляет пакет терминалу Б, тот пакет этот обойдет ВЕСЬ Интернет. Причем распространяться будет равномерно во все стороны, отражаясь и переотражаясь. Количество пакетов множиться будет в геометрической прогрессии пока не завалит своей массой игровой сервер. Так именно и будет! Сам смысл, для чего предназначен роутер, здесь пока не реализован. Без таблиц, статических или динамических, не обойтись. А про них нет никакого упоминания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 7 мая, 2014 Не совсем так. Таблица маршрутизации все же есть. Заполняется она динамически при первом прохождении пакета методом волны. Но вот если количество роутеров в сети больше двух (есть вариант ветвления волны) то волна эта никогда не затухнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 7 мая, 2014 Ну это не сильно похоже на таблицы маршрутов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 7 мая, 2014 Так именно и будет! Сам смысл, для чего предназначен роутер, здесь пока не реализован. Без таблиц, статических или динамических, не обойтись. А про них нет никакого упоминания.ты хоть знаешь как работают таблицы,и вообще маршрутизацию?? я так вижу что нет. если хочешь по расуждать заходи в RC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 7 мая, 2014 Проанализировал код. Подправил описание в соответствии со своим пониманием. Коментарии - в скобках курсивом. Роутер - это компьютер и специальное программное обеспечение предназначенные для организации маршрутизации пакетов в сети 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("") который выполняется при каждом получении пакета. А ведь вывод на экран это одна из наиболее медленных операций)так он и возврашяет я уже продумал этот шаг Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 9 мая, 2014 ты хоть знаешь как работают таблицы,и вообще маршрутизацию?? я так вижу что нет. если хочешь по расуждать заходи в RCОтвечу в такой же дерзкой манере: Мне совершенно не интересно, что Вы ты знаешь о маршрутизации, мое замечание касалось лишь программы. Открою тайну, любой школьник с мозгами при нашем доступе к информации может ознакомиться с основными понятиями , положениями и принципами в течении получаса по любым вопросам науки и техники, ну а человек с высшим техническим образованием и подавно. Нюансы, конечно, можно изучать годами. Если ты не собираешься модернизировать программу и свято веришь, что она справляется со всеми задачами маршрутизации, спорить не стану. Не надо так болезненно реагировать на критику, и указывать, где и что писать людям. Форум для того и существует, чтобы что-то обсудить и выслушать любую критику. Р.S. Сам как думаешь, когда случайный человек скачает твою программу, сможет ли он настроить передачу данных между различными сегментами сети ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 мая, 2014 Ребята, давайте не будем спорить о том кто что знает о маршрутизации. Дело в том, что маршрутизация в реальном мире и в мире майнкрафта это две большие разницы. И не нужно переносить свои знания из реала в майн. Давайте лучше подумаем как такую маршрутизацию сделать, во-первых, работоспособной, во-вторых, максимально эффективной. Способ, предложенный Neo, действительно работает в сети из двух роутеров, но над эффективностью нужно еще поработать. Предлагаю для размышления такой способ маршрутизации. Предположим, наша сеть состоит всего из одного роутера и нескольких хостов. Пакет, направляемый хостом-передатчиком в сторону роутера должен содержать адрес хоста-приемника. Роутер извлекает этот адрес и переправляет пакет далее в нужном направлении. Какой должна быть структура ip-адреса в такой сети, если забыть на минутку о реальных ip-адресах? Первое, что приходит в голову, это должно быть одно единственное число, по возможности совпадающее с id хоста. Такую сеть будем называть одноуровневой. Нужна ли в одноуровневой сети таблица маршрутизации? Мне кажется, что нет, поскольку всю необходимую информацию о дальнейшем пути пакета роутер может извлечь из самого пакета. Ну разве что какой либо из пользователей не захочет иметь в качестве адреса число, а захочет иметь строку. Скажем Вася Пупкин, владелец хоста с id 13, ненавидит число 13. Он может обратиться к администратору роутера и тот пропишет вот такую таблицу маршрутизации: v_pupkin 13 Теперь все пакеты с адресом получателя "v_pupkin" будут перенаправляться на id 13. Остальные же пакеты, с числовыми адресами получателей, будут обрабатываться роутером как и прежде. Продолжение следует... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 12 мая, 2014 О структуре ip-адреса и таблицах маршрутизации в сети rednet (продолжение) И всё бы хорошо, но область покрываемая одним роутером ограничена радиусом 64. Если нам нужно покрыть бОльшую область, одним роутером не обойтись. И те роутеры, которыми мы накрыли требуемую область должны быть связаны между собой На рисунке изображены четыре роутера (я их назвал 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 Разумеется, похожие таблицы должны быть составлены и для остальных роутеров сети. Такую сеть будем называть двухуровневой. Каковы недостатки такой сети? При добавлении нового роутера (хоть это бывает и не часто) приходится корректировать таблицы маршрутизации всех остальных роутеров. Так же при отключении одного из ранее работавших роутеров будет наблюдаться потеря пакетов, проходящих через него. Как бороться с этими проблеммами? Мне видится динамическое построение таблиц маршрутизации с периодическим обновлением. Возможно со временем нам удастся решить и эту задачу. Продолжение следует... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах