Отображение IP-пространства на политическую карту мира

Курсовая работа Глюковой Татьяны (2003)

Содержание
Введение

"Internet - это глобальная сеть сетей, взаимно связанных протоколами TCP/IP и другими коммуникационными протоколами" (д-р Винтон Серф, президент Сообщества Internet).

Согласно спецификации TCP/IP протокола, каждому узлу в ip-сети должен быть присвоен уникальный ip-адрес. Ip-сеть - это набор ip-адресов. Существует организация, отвечающая за распределение ip-адресов - IANA (Internet Assigned Numbers Authority). Эта организация разработала иерархическую систему распространения ip-адресов: поделила мир на региональные группы, и в каждом из этих регионов образовалась региональная регистрирующая компания (APNIC, ARIN, LACNIC, RIPE NCC). APNIC - отвечает за распределение ip-адресов в некоторых странах Азии и Африки, островах Тихого океана, ARIN - в странах Америки, некоторых странах Европы и Африки, LACNIC - в странах Латинской Америки, RIPE NCC - в странах Ближнего Востока, Европы и Африки. Региональные регистрирующие компании, в свою очередь, поделили "свои" регионы на меньшие регионы с локальными регистрирующими компаниями и т. д. Нет жесткой привязки ip-адресов к географической области: например, компании, которая является провайдером Internet в России и на Украине, выделили блок ip-адресов, она может часть отдать Украине, а часть России. Когда создавалась сеть Internet, не учитывались никакие геополитические границы. Сети, из которых состоит Интернет, могут быть расположены в нескольких городах (необязательно одной страны), странах, или даже континентах (сети международных организаций). Но все же существует географическая привязка ip-адресов, так как Internet построена на автономных системах (автономная система - сеть или набор сетей, имеющих единую администрацию и общую маршрутную политику). Локальные сети уже существовали к тому времени, когда появился Интернет, и, чтобы подключится к нему, владельцам локальных сетей не надо было никуда переезжать. Они получали адреса, оставаясь на своих местах, как, например, Уральский Государственный Университет. Так что для большинства адресов все-таки можно определить страну.

Если существует географическая привязка адресов, то можно отобразить адресное пространство на политическую карту мира, представив ее в виде множества стран.

К содержанию...
Немного истории..

В 1961 году по заказу министерства обороны США DARPA (Defense Advanced Research Projects Agency) приступила к проекту по созданию экспериментальной сети передачи пакетов данных (но не только они в этой области вели разработки). Эта сеть, названная ARPANET, была предназначена для изучения методов обеспечения надежной связи между компьютерами различных типов. В 1969 году министерство обороны США утвердило ARPANET в качестве ведущей организации для исследования в области компьютерных технологий. В 1970 году хосты ARPANET стали использовать для передачи данных NCP (Network Control Protocol). В 1972 была создана группа для разработки адресации, необходимой для согласования различных протоколов. Первые международные подключения были осуществлены в 1973 году (присоединились машины из Англии и Норвегии). В 1975 году ARPANET превратилась из экспериментальной в рабочую сеть. Администрирование этой сети взяло на себя Defence Communication Agency (сейчас - Defence Information Systems Agency). В 1983 году мин. обороны США объявило TCP/IP своим стандартом, из ARPANET выделилась MILNET (относилась к Defence Data Network мин. обороны США). В 1984 году была введена Domain Name System (DNS). В 1988 году сеть NSFNET (сеть, основанная на пяти "суперкомпьютерах") стала использовать канал T1(1,544 Мбит/с.). К NSFNET подключились Канада, Исландия, Дания, Норвегия, Франция Финляндия и Швеция. В 1989 году к Cети подключились Великобритания, Япония, Германия, Австрия, Израиль, Италия, Мексика, Новая Зеландия, Нидерланды. Россия подключилась к СЕТИ в 1990 году. И хотя в 1991 году ARPANET прекратила свое существование, сеть Internet не умерла вместе с ней, она стала еще больше, ее размеры намного превысили первоначальные, так как она объединила множество сетей во всем мире. Сеть NSFNET стала использовать каналы T3 (44,736 Мбит/c.) В 1993 году по инициативе NSF(National Science Foundation) был создан InterNIC для регистрации доменных имен. C 1995 года регистрация доменных имен стала платной. NSFNET перестала существовать и была установлена коммерческая система. B 1999 году вошла в строй новая глобальная сеть - Internet2. Internet Assigned Numbers Authority (IANA), оказывающая основное воздействие на организацию технической базы функционирования глобальной сети, одобрила вариант перехода на новую систему IP-адресов…

К содержанию...
Организации, "курирующие" Интернет
ISOC - Internet Society
IAB - Internet Architecture Board
IETF - Internet Engineering Task Force
IRTF - Internet Research Task Force
ICANN - Internet Corporation for Assigned Names and Numbers
IANA - Internet Assigned Numbers Authority
и другие..
Организации, курирующие Интернет

Круг задач, связанных с общим управлением Интернетом, достаточно широк: координирование научных разработок в области Интернета, подготовка и публикация стандартов, контроль за выполнением некоторых обязательных технических условий ключевыми узлами Сети, текущие работы по поддержанию единой адресации и др. Этим занимается целый ряд организаций как чисто американского, чисто европейского, так и интернационального происхождения. Сколько таких организаций - сложно сказать, так как чуть ли не каждый день возникают и исчезают какие-то комитеты, ассоциации. Но организации приведенной схемы, пожалуй, составляют основу иерархии. Хотя и здесь не все хорошо - между организациями возникают какие-то ссоры, рождаются новые рабочие группы, комитеты и распадаются старые. В прошлом (до 1999 года), деятельность IANA как организации (IANA, по сути - название контракта между Университетом Южной Калифорнии и Правительством США) поддерживалась правительством Соединенных Штатов. В дальнейшем - это стало финансово невозможно и этически недопустимо. Поэтому пришлось "слегка переделать" IANA. Новая независимая IANA, как организация, ответственна за три взаимосвязанные области: IP адреса, доменные имена и параметры протокола, включая также и управление системой корневого сервера (root server system management), а также продолжает уже выполненную к настоящему времени существующим IANA работу. Управление и обслуживание IANA раньше осуществлял Университет Института Информатики Южной Калифорнии (при непосредственном участии Джона Постела). Новая IANA будет управляться Правлением Директоров с представительством всех избирательных округов и обязательным участием международного представительства. (материал взят с сайта http://www.iana.org/ ).

Имена доменов

IANA, как и ICANN, занимается созданием и распределением доменов первого уровня (Top Level Domains, TLD). Домены первого уровня бывают двух видов - основные (generic TLD) и домены, образованные от двухбуквенного кода страны согласно стандарту ISO (Country Code Top Level Domains, ccTLD). Регистрант домена первого уровня может быть только один (исключая .com , .net и .org). IANA ведет соответствующие базы данных и ведет разработку новых доменов первого уровня (generic TLD).

Основные параметры протоколов

Это все, начиная от назначения стандартных TCP/UDP портов для Интернет приложений и заканчивая регистрацией кодовых таблиц, в компетенции организации IANA (раньше эта информация содержалась в документе RFC1700 Assigned Numbers, а теперь там работа приостановлена и все изменения публикуются на http://www.iana.org/numbers.html).

Распределение IP адресов

Как известно, правильное функционирование Internet Protocol (IP) возможно лишь в том случае, если все объекты сети, будь то хост или маршрутизатор, принтер или другое какое-нибудь устройство, имеют уникальный адрес. IANA разработала иерархическую схему распределения IP-адресов. Иерархия выглядит следующим образом:

RIRs and LIRs

IANA распределила все адресное пространство на региональные группы, и в каждом из этих регионов образовалась региональная регистрирующая компания (APNIC, ARIN, LACNIC, RIPE NCC). В свою очередь, каждая из RIR выделяет блоки адресов компаниям и организациям стран "своего" региона. Эти компании (после уплаты взносов) получают статус локальной регистрирующей структуры, и распределяют адреса в своем регионе. Количество LIR жестко не ограничено, поэтому любая компания, отвечающая ряду условий и имеющая достаточно денег, может позволить себе этот статус. Как правило, крупными локальными регистрантами становятся провайдеры Интернет, владельцы крупных корпоративных, научных или образовательных сетей. Другими словами, существуют автономные системы, которым распределяют адреса. Автономной системой (AS) называют такую локальную сеть или систему сетей, которые имеют единую администрацию и общую маршрутную политику. Пользователь, связанный только с одним сервис-провайдером, должен принадлежать к общей с ним AS. Автономная система должна обязательно создаваться, когда оператор сети связан с более чем одной AS с отличной от его маршрутной политикой. Если же пользователь обращается к услугам двух или более сервис-провайдеров, придерживающихся различных маршрутных политик, то он должен создать свою независимую AS. То есть адреса, выделенные одной автономной системе, маршрутизируются только через нее. Внедрение идеологии автономных систем сделали возможным существенно облегчить процедуру маршрутизации, сократить требуемое число IP-адресов и создать гибкую и эффективную схему описания маршрутной политики.

Каждый RIR в своем регионе выполняет и другие действия для полноценной работы провайдеров. Их целью также является обеспечение и гарантирование административной и технической координации, необходимой для предоставления возможностей ведения оперирования в сети, распределение и регистрация IP адресов - IPv4 и IPv6, Автономных Систем и т.п.

APNIC (Asia Pacific Network Information Centre)
http://www.apnic.net/
ftp://www.apnic.net/
ARIN (American Registry for Internet Numbers)
http://www.arin.net/
ftp://www.arin.net/
LACNIC (The Latin America and Caribbean Internet Addresses Registry)
http://lacnic.net/
RIPE NCC (Reseaux IP Europeens Network Coordination Centre)
http://www.ripe.net/
ftp://ftp.ripe.net/

RIPE NCC действует как Региональный Регистр Интернет (RIR) в Европе. Результатом координирующих действий и усилий RIPE является то, что индивидуальные конечные пользователи получают унифицированное обслуживание непосредственно на своих рабочих местах, безотносительно того, к каким сетям они присоединены. Большинство работ выполняется в самых различных рабочих группах:

  • Anti-Spam Working Group. Fighting the problem of "spam" on the internet
  • Database Working Group. Aspects of the RIPE network management database.
  • DNS Working Group. Domain Name System questions and issues.
  • European Internet Exchange Working Group. European Internet Exchange's related issues and problems.
  • European Operators Forum Working Group. European technical network operation related issues and problems.
  • MBONE Working Group. Multi-cast backbone related issues
  • IP version 6 Working Group. IPv6 related Issues and questions.
  • Local IR Working Group. Issues and questions related to registration services and Local IRs.
  • European NetNews Working Group. Net News related topics.
  • Routing Working Group. Issues dealing with routing architecture for the European Internet.
  • Test-Traffic Working Group. Discussion of the Test Traffic project.
  • TLD Working Group. Discussion of all TLD related matters.

Материалы взяты с сайта.

Russian Institute for Public Networks (RIPN)
http://www.ripn.net/

Это LIR, зарегистрированный RIPE NCC. Российский институт общественных сетей - организация, образована в 1992 году Комитетом высшей школы России, Российским исследовательским центром "Курчатовский Институт", Компьютерным центром Курчатовского института. В рамках Центра Сетевой Информации (Network Information Centre, NIC) он выполняет следующие задачи:

  • регистрация IP адресов из блока, выделенного для RIPN Европейским координационным центром RIPE
  • Администрация корневого домена "ru"
  • Сопровождение документации по Internet
  • Поддержка каталога персон и организаций

Провайдеры города Екатеринбурга
Название Год основания Рейтинг трафика ИспользованиеADSL СЦК Основная технология Автономная зона
Адаптекс19961нетDial-Upнет
Баско19981нетDial-Upнет
Эквант19964естьTDM/FRесть
Drive ISP20021нетEthernetнет
Компания Етел19963естьDial-Up, ADSLнет
Инсис19991естьADSL, Ethernetнет
Интернет-телеком (ITC)20002естьEthernetнет
КабInet19983нетEthernetнет
Конвекс19972естьEthernetнет
Корус ИСП19913естьEthernetесть
Лацерта19982нетEthernetнет
Лион-инвест (г. Березовский)20011нетDial-up, Ethernetнет
Медиальт19992естьADSL, Ethernetнет
Новатор20011нетADSL, Ethernetнет
Сайт19982нетDial-Upесть
Skynet-On Line19973естьDial-Up, Ethernetесть
Смарт Коммуникейшенз19982естьADSL, Dial-Upнет
ОСС Екатеринбург20011естьDial-Upнет
Телеросс (Екатеринбург)19962нетTDM/FRесть
МП Урал19991нетEthernetнет
рал РЕЛКОМ19915естьDial-Up, ADSLесть
УралВЭС19924естьDial-Up, ADSLесть
Уралсмарт20002ЕстьDial-Up, Ethernetнет
УралТелеком19944естьADSLесть
Уральская телефонная компания19993нетDial-Upесть
Уральские мобильные сети19994естьTDM, Dial-Upесть
Фоннет20011естьADSL, Dial-Upнет
Экском-он-лайн19983естьРадиоесть
Экском (002)2002--Dial-Up-
Экстрим19993естьADSL, Ethernetесть

(материалы взяты с сайта http://www.nag.ru)

К содержанию...
Структура IP пространства

Стек протоколов TCP/IP тесно связан с сетью Internet. Создан он был в 1969 году, когда для сети ARPANET понадобился ряд стандартов для объединения в единую сеть компьютеров с различными архитектурами и операционными системами. Вместе с ростом Internet протокол TCP/IP завоевывал позиции и в других сетях. На сегодняшний день этот сетевой протокол используется как для связи компьютеров всемирной сети, так и в подавляющем большинстве корпоративных сетей.

IP - сеть - это некоторое количество IP-адресов. IP-сеть задаётся базовым адресом и маской. IP-адрес входит в сеть, если выполняется равенство: базовый_адрес = (IP - адрес AND маска), где AND - операция побитового умножения.

Согласно спецификации протокола, каждому узлу, подсоединенному к IP-сети, присваивается уникальный номер. Узел может представлять собой компьютер, маршрутизатор, межсетевой экран и др. Если один узел имеет несколько физических подключений к сети, то каждому подключению должен быть присвоен свой уникальный номер.

Классическая адресная схема протокола IP
Класс A0...............................
Класс B10..............................
Класс C110.............................
Класс D1110............................
Класс E1111............................

Сети класса А (префикс /8) очень большие - на сетевую часть отводится 8 битов, а на идентификацию узла остальные 24. Каждая такая сеть может иметь 224 - 2 узла. Два адреса необходимо отнять, поскольку адреса, содержащие в правом октете все нули (идентифицирует указанную сеть) и все единицы (широковещательный адрес) используются в служебных целях и не могут быть присвоены узлам. Самих же сетей "восьмерок" может быть 27-2. Снова мы вычитаем двойку, но это уже две служебных сети: 127/8 и 0/8 (по-старому: 127.0.0.0 и 0.0.0.0). Класс А содержит 231 адресов, или половину всех возможных IP адресов. Класс В (префикс /16) предназначен для сетей большого и среднего размеров. Сетевой префикс класса состоит из шестнадцати бит или первых двух октетов адреса. Поскольку два первых бита сетевого префикса заняты определяющим класс ключом, то можно задать лишь 214 различных сетей. Узлов же в каждой сети можно определить до 216-2. Класс В занимает четверть адресного пространства IP (230). Наконец, самый употребляемый класс сетей - класс С (префикс /24) - имеет 24 битный сетевой префикс, определяется старшими битами, установленными в 110, и может идентифицировать до 221 сетей. Соответственно, класс позволяет адресовать до 28-2 узлов. Занимает восьмую часть адресного пространства протокола TCP/IP. Последние два класса занимают оставшуюся восьмую часть в адресном пространстве и предназначены для служебного (класс D) и экспериментального (класс Е) использования. Для класса D старшие четыре бита адреса установлены в 1110, для класса Е -- 1111. Сегодня класс D используется для групповой передачи информации.

Зарезервированные адреса

Если биты всех октетов адреса равны нулю, то он обозначает адрес того узла, который сгенерировал данный пакет. Это используется в ограниченных случаях, например в некоторых сообщениях протокола IP. Если биты сетевого префикса равны нулю, полагается, что узел назначения принадлежит той же сети, что и источник пакета. Когда биты всех октетов адреса назначения равны двоичной единице, пакет доставляется всем узлам, принадлежащим той же сети, что и отправитель пакета. Такая рассылка называется ограниченным широковещанием. Наконец, если в битах адреса, соответствующих узлу назначения, стоят единицы, то такой пакет рассылается всем узлам указанной сети. Это называется широковещанием. Специальное значение имеет, так же, адреса сети 127/8. Они используются для тестирования программ и взаимодействия процессов в пределах одной машины. Пакеты, отправленные на этот интерфейс, обрабатываются локально, как входящие. Потому адреса из этой сети нельзя присваивать физическим сетевым интерфейсам.

Организация подсетей

Очень редко в локальную вычислительную сеть входит более 100-200 узлов: даже если взять сеть с большим количеством узлов, многие сетевые среды накладывают ограничения, например, в 1024 узла. Исходя из этого, целесообразность использования сетей класса А и В весьма сомнительна. Да и использование класса С для сетей, состоящих из 20-30 узлов, тоже является расточительством. Для решения этих проблем в двухуровневую иерархию IP-адресов (сеть -- узел) была введена новая составляющая -- подсеть. Идея заключается в "заимствовании" нескольких битов из узловой части адреса для определения подсети. Полный префикс сети, состоящий из сетевого префикса и номера подсети, получил название расширенного сетевого префикса. Двоичное число, и его десятичный эквивалент, содержащее единицы в разрядах, относящихся к расширенному сетевому префиксу, а в остальных разрядах -- нули, назвали маской подсети.

Ip-адрес160.160.30.310100000101000000001111000000011
Маска255.255.255.011111111111111111111111100000000
  Сетевой префиксПодсетьУзел

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

Ip-адрес160.160.30.310100000101000000001111000000011
Маска255.255.255.19211111111111111111111111111000000
  Сетевой префиксПодсетьУзел

Очевидно, что намного удобнее обозначать маску в виде "/xx", где xx - количество бит расширенного сетевого префикса. В нашем случае 160.160.30.3/26, вместо 160.160.30.3 и 255.255.255.192.

Непредвиденные ограничения классовой адресации

Первые разработчики адресации никогда не могли представить себе, что сеть Интернет вырастет до таких размеров, какие она имеет на сегодняшний день. Во времена юности Интернет, кажущееся безграничным адресное пространство позволяло распределять IP-адреса между организациями на основе требований, а не реальной необходимости. В результате, адреса назначались свободно тем, кто их запрашивал, без опасений о возможном исчерпании адресного пространства протокола IP. Классовая организация сетей A, B и C с их разделением сетей и узлов в сети на границах байта была легка для понимания и внедрения, но не благоприятствовала эффективному распределению конечного адресного пространства. Отсутствие класса сети, специально разработанного для поддержки средних организаций, также повлекло ряд проблем. Сеть с префиксом /24, поддерживающая 254 узла - слишком мала, в то время как сеть с префиксом /16, поддерживающая 65534 узла - слишком велика. В прошлом, организациям с несколькими сотнями компьютеров назначалась сеть с префиксом /16, вместо пары сетей с префиксом /24. К сожалению, это закончилось преждевременным истощением адресного пространства сетей с префиксом /16. Единственными легко доступными адресами для средних организаций стали сети с префиксом /24, которые, в свою очередь, имеют негативное потенциальное влияние, выражающееся в увеличении размера глобальных таблиц маршрутизации сети Интернет.

К содержанию...
Описание программы

Из всего вышеизложенного следует, что по IP - адресу можно найти его владельца, информацию о местонахождении хоста и т.п. Информация о распределенных адресах общедоступна и находится на сайтах RIR и LIR. Чтобы автоматизировать процесс поиска надо обработать эти базы какой-нибудь СУБД. Максимальное количество записей - 232 = 4294967296. Но все адреса хранить не надо - вычтем зарезервированные адреса, класс D и E, а также учтем "нераспределенные" адреса. Для обработки этих баз вполне подойдет FoxPro - мощная и быстрая среда для разработки приложений баз данных.

Существование автономных систем позволяет определить расположение хоста с точностью до города. Например, возьмем в качестве автономной системы провайдера Интернет. Как было написано выше, пользователь, связанный только с одним сервис - провайдером, должен принадлежать к общей с ним автономной системе. У нас в городе тридцать провайдеров… А что если автономная система расположена в нескольких городах или странах? Тогда найти расположение хоста поможет трассировка : она даст нам цепочку адресов маршрутизаторов, последний из которых будет находится в одном городе с искомым адресом (из-за определения автономной системы). Но таких автономных систем очень мало. Теперь можно приступить к программированию.

Информация от 1 апреля 2003 года.
Данные представлены в следующем виде:
RIR|название страны в двухбуквенном коде|тип адреса|адрес|количество адресов, принадлежащих сети|дата|свойство
ripencc|NL|ipv4|24.132.0.0|32768|1997-10-13|allocated
ripencc|NL|ipv4|24.132.128.0|32768|2000-01-17|allocated
ripencc|IL|ipv4|62.0.0.0|65536|1997-04-28|allocated
ripencc|GR|ipv4|62.1.0.0|65536|2000-02-16|allocated

Занесение данных в таблицу. (ReadFile)

Исходная таблица "Temp" содержит следующие поля:

	Имя    Тип     Ширина
	"Rir" character 8		(название регионального регистранта)
	"c_2" character 2		(название страны в двухбукв. коде)
	"a_type" character 4		(Ipv4)
	"ip" character 15		(dotted decimal ip address)
	"ip_count" numeric 10		(количество адресов, начиная с данного)
	"date" character 10		(дата распределения)
	"property" character 10		(allocated/assigned)

Процедура удаляет лишние записи:
a_type = 'asn' a_type = 'as - номера автономных систем
rir = 'iana' - зарезервированные адреса
Процедура fill_n_ip добавляет еще один столбец "n_ip" numeric 12 , содержащий ip-адреса в десятичной системе счисления (aaa.bbb.ccc.ddd = aaa*2563 + bbb*2562 + ccc*256 + ddd ).На данный момент 51724 записей. Затем следует проверить данные на наличие ошибок, таких как пересечение сетей, и, если такие ошибки есть, исправить их.

Поиск ошибок. (IsIntersect)

Отсортируем данные по номеру сети (поле "n_ip"). Виды ошибок:

Ошибка 1 Ошибка 2

Поля таблицы результатов "res_i":

	 par_rir character 8		(rir предыдущей сети)
	 aff_rir character 8		(rir текущей сети)
	 par_c_2 character 2		(страна предыдущей сети)
	 par_ip  character 15		(ip-адрес предыдущей сети)
	 par_ip_c numeric 10		(количество адресов предыдущей сети)
	 aff_c_2  character 2		(страна текущей сети)
	 aff_ip character1 5		(ip-адрес текущей сети)
	 aff_ip_c numeric 10		(количество адресов текущей сети)
	 property character 10		(equal/inside/imposing)
	

После занесения ошибок в таблицу res_i, можно их исправлять.

Исправление ошибок. (Correction)

Результаты заносятся в промежуточную таблицу "tbase". Если сети не пересекаются, то предыдущую запись заносим в промежуточную таблицу. Если сети равны, то ничего не делаем. Если предыдущая сеть внутри текущей и они находятся в разных странах, то предыдущую запись заносим в промежуточную таблицу, а текущая сеть будет начинаться с конца предыдущей. Если предыдущая внутри текущей и они в одной стране, то объединяем их. Если текущая внутри предыдущей и они в одной стране, то ничего не делаем. Если текущая внутри предыдущей и они в разных странах, то текущую разбиваем на сети :

Исправление ошибок 1

Если сети пересекаются и в одной стране, то объединяем их. Если сети пересекаются и в разных странах, то расширяем меньшую:

Исправление ошибок 2

После исправления ошибок 51202 записей (промежуточная таблица "tbase").

Поля таблицы "tbase" :
	c_2 character 2		
	n_ip numeric 12		
	ip_count numeric 10
	

Чтобы ускорить поиск, можно модифицировать данные - объединить сети, находящиеся в одной стране. Так как все ошибки исправлены, может быть два расположения сетей одной относительно другой.

Объединение сетей Объединение сетей

Сети расположены "рядом", если номер следующей сети = номер предыдущей сети + количество узлов предыдущей сети. Объединяем сети, если они расположены рядом.

Возможное количество сетей после объединения вычисляет процедура "myUnion". Результаты работы этой процедуры заносятся в файл "res_union".

Поля таблицы "res_union" :
	Country character 2		(название страны в двухб. коде)
	Init_count numeric 10		(исходное количество сетей)
	New_count numeric 10		(минимальное количество сетей)

Процедура объединения сетей называется "Associate", которая заносит результаты в файл "ttbase". Таблица "ttbase" является окончательной. В ней около 17000 записей.

Поля таблицы "ttbase" :
	C_2 character 2		(название страны в двухбуквенном коде)
	N_ip numeric 12		(номер сети)
	Ip_count numeric 10		(количество адресов в сети)
Результат

По такой таблице процедура поиска "get_country" работает довольно быстро. В качестве теста была выбрана таблица логов одного WEB-сервера, в которой было зафиксировано около 44000 запросов (то есть адреса, находящиеся там реально существуют). Тесты проводились на компьютере со следующими параметрами: Pentium4 1,6 Гц, 512 Мб RAM под управлением Windows 2000 Service Pack 3. Функция обработала таблицу за 5 секунд, то есть за 1 секунду обрабатывается проядка 10000 записей. Для 1404 адресов страна не была найдена, что составляет около 3,2% от всех адресов таблицы.

К содержанию...
Программа (коды процедур)
Подготовка и оптимизация таблиц

SET SAFETY OFF
SET TALK OFF
create_temp('temp')
ReadFile('d:\tt\whois\lacnic_20030401.txt')
ReadFile('d:\tt\whois\apnic-2003-04-01.txt')
ReadFile('d:\tt\whois\arin_20030401.txt')
ReadFile('d:\tt\whois\ripencc_20030423.txt')
fill_n_ip('temp')
create_res_i()
isIntersect('temp')
Correction('temp')
myUnion('tbase')
Assotiate('tbase')
*----------------------------------------------------------------------
PROCEDURE create_temp(tname)
CREATE TABLE (tname) FREE ;
(rir C(8),; 
c_2 C(2),; 
a_type C(4),;
ip C(15),;
ip_count N(10),;
a_date C(12),;
property C(10))
ENDPROC 
*----------------------------------------------------------------------
PROCEDURE fill_n_ip(tname)
SET TALK OFF 
ALTER TABLE (tname) ADD n_ip N(12)
SCAN 
	m.n = 0
	m.tmp = 1
	m.j = 1
	DO WHILE AT('.',ip,m.j)>0   
	  m.i = AT('.',ip,m.j)
	  m.n = m.n*256 + VAL(SUBSTR(ip,m.tmp,m.i-m.tmp))
	  m.tmp = m.i+1
	  m.j = m.j + 1
	ENDDO 	
	  m.n = m.n * 256+ VAL(SUBSTR(ip,m.tmp))
	REPLACE n_ip WITH m.n 
ENDSCAN 
SET TALK ON 
ENDPROC 
*----------------------------------------------------------------------
PROCEDURE ReadFile(fName)
USE temp ALIAS temp
APPEND FROM (fName) FOR (rir <> 'iana' AND a_type<>'asn' AND a_type<>'as' )DELIMITED WITH CHARACTER |
CLOSE TABLES ALL
ENDPROC 
*---------------------------------------------------------------------
****************************************
PROCEDURE create_res_i()
	CREATE TABLE res_i FREE ;
	(par_rir C(8),;
	 aff_rir C(8),;
	 par_c_2 C(2),;
	 par_ip C(15),;
	 par_ip_c N(10),;
	 aff_c_2 C(2),;
	 aff_ip C(15),;
	 aff_ip_c N(10),;
	 property C(10))
ENDPROC 
****************************************
PROCEDURE ins_intersect(x_rir,x_c_2,x_ip,x_ip_c,msg)
	LOCAL m.cur_rir,m.cur_c_2,m.cur_ip,m.cur_ip_c
m.cur_rir = base.rir
m.cur_c_2 = base.c_2
m.cur_ip = base.ip
m.cur_ip_c = base.ip_count
INSERT INTO res_i (par_rir,aff_rir,par_c_2,par_ip,par_ip_c,aff_c_2,aff_ip,aff_ip_c,property);
values (x_rir,m.cur_rir,x_c_2,x_ip,x_ip_c,m.cur_c_2,m.cur_ip,m.cur_ip_c,msg)
ENDPROC 
****************************************
PROCEDURE isIntersect(tname)
	LOCAL m.pre,m.ip
CLOSE TABLES ALL 
USE res_i ALIAS res_i
ZAP IN res_i
USE (tname) ALIAS base
INDEX ON n_ip TAG n_ip
m.pre = 0
m.ip_pre = 0
m.rir = ''
m.c_2 = ''
m.ip = ''
m.ip_count = 0

SCAN 
IF m.ip_pre = base.n_ip AND m.pre = base.n_ip+base.ip_count-1 THEN 
	ins_intersect(m.rir,m.c_2,m.ip,m.ip_count,'equal')
ELSE 	
	IF m.pre>base.n_ip AND m.pre>=base.n_ip+base.ip_count-1 
		ins_intersect(m.rir,m.c_2,m.ip,m.ip_count,'inside')
	ELSE 
		IF m.ip_pre = base.n_ip AND m.pre < base.n_ip+base.ip_count-1 THEN 
			ins_intersect(m.rir,m.c_2,m.ip,m.ip_count,'inside')
			m.pre = base.n_ip+base.ip_count-1
		ELSE 
			IF  m.pre > n_ip AND m.pre < base.n_ip+base.ip_count-1 THEN 
				ins_intersect(m.rir,m.c_2,m.ip,m.ip_count,'imposing')
				m.pre = base.n_ip+base.ip_count-1
				m.ip_pre = base.n_ip
	 			m.rir = base.rir
				m.c_2 = base.c_2
				m.ip = base.ip
				m.ip_count = base.ip_count				
			ELSE 
				m.pre = base.n_ip+base.ip_count-1
				m.ip_pre = base.n_ip
	 			m.rir = base.rir
				m.c_2 = base.c_2
				m.ip = base.ip
				m.ip_count = base.ip_count				
			ENDIF 
		ENDIF 
	ENDIF 
ENDIF  
ENDSCAN 
ENDPROC  
*-----------------------------------------------------
*****************************
PROCEDURE Create_base(tname)
	CREATE TABLE (tname) FREE;
(c_2 C(2),; 
n_ip N(12),;
ip_count N(10))
ENDPROC 
*****************************
PROCEDURE Ins_Correction(xc_2,xip,xip_c)
	INSERT INTO tbase (c_2,n_ip,ip_count) VALUES (xc_2,xip,xip_c)
ENDPROC 
*****************************
PROCEDURE Correction(tname)
	LOCAL m.ip,m.pre,m.c_2
m.ip = 0	
m.pre = 0	
m.c_2 = ''	
Create_base('tbase')
CLOSE TABLES ALL 
USE tbase ALIAS tt
ZAP IN tt
USE (tname) ALIAS base
INDEX ON n_ip TAG n_ip
SCAN 
DO CASE 
CASE m.pre = 0	
	m.c_2 = base.c_2
	m.ip = base.n_ip
	m.pre = base.n_ip + base.ip_count - 1
CASE m.pre < n_ip	
	Ins_Correction(m.c_2,m.ip,m.pre+1-m.ip)
	m.c_2 = base.c_2
	m.ip = base.n_ip
	m.pre = base.n_ip + base.ip_count - 1
CASE m.ip = base.n_ip AND m.pre < base.n_ip+base.ip_count-1 
	IF m.c_2 = base.c_2 THEN 
		m.pre = base.n_ip + base.ip_count - 1
	ELSE 
		Ins_Correction(m.c_2,m.ip,m.pre+1-m.ip)
		m.ip = m.pre+1
		m.pre = base.n_ip+base.ip_count-1
		m.c_2 = base.c_2
	ENDIF 
CASE m.pre>base.n_ip AND m.pre>=base.n_ip+base.ip_count-1 AND m.c_2 <> base.c_2 
	IF m.ip = base.n_ip AND m.pre>base.n_ip+base.ip_count-1 THEN 
		Ins_Correction(base.c_2,base.n_ip,base.ip_count)
		m.ip = base.n_ip + base.ip_count
	ELSE 
		IF m.ip < base.n_ip AND m.pre>base.n_ip+base.ip_count-1 THEN 
			Ins_Correction(m.c_2,m.ip,base.n_ip-m.ip)
			Ins_Correction(base.c_2,base.n_ip,base.ip_count)
			m.ip = base.n_ip + base.ip_count
		ELSE 
			IF m.pre+1 = base.n_ip+base.ip_count AND m.ip < base.n_ip THEN 
				Ins_Correction(m.c_2,m.ip,base.n_ip-m.ip)
				m.c_2 = base.c_2
				m.ip = base.n_ip
				m.pre = base.n_ip + base.ip_count -1
			ENDIF 
		ENDIF  
	ENDIF 
CASE m.pre>n_ip AND m.pre < base.n_ip+base.ip_count-1
	IF m.c_2 = base.c_2 THEN
		m.pre = base.n_ip+base.ip_count-1
	ELSE 
		IF m.pre+1-m.ip>base.ip_count THEN 
			Ins_Correction(m.c_2,m.ip,base.n_ip-m.ip)
			m.ip = base.n_ip
			m.pre = base.n_ip+base.ip_count-1
			m.c_2 = base.c_2
		ELSE 
			Ins_Correction(m.c_2,m.ip,m.pre+1-m.ip)
			m.ip = m.pre+1
			m.pre = base.n_ip+base.ip_count-1
			m.c_2 = base.c_2
		ENDIF 
	ENDIF  
ENDCASE 
ENDSCAN  
ENDPROC 
*----------------------------------------------------
**********************************
PROCEDURE ins_union(x_c,x_count,x_new)
		INSERT INTO res_union (country,init_count,new_count);
		VALUES (x_c,x_count,x_new)
ENDPROC 
**********************************
PROCEDURE myUnion(tname)
	LOCAL m.c,m.net,m.new,m.pre_ip 
m.c = '  '
m.net = 0
m.new = 0
m.pre_ip = -1
CLOSE TABLES ALL 
USE res_union ALIAS res_union
ZAP IN res_union
USE (tname) ALIAS base
INDEX ON c_2+STR(n_ip) TAG bs
SCAN 
DO CASE
	CASE m.c = '  '
		m.c = base.c_2
		m.net = 1
		m.new = 0
	CASE m.c = c_2
		m.net = m.net+1
		IF m.pre_ip >= n_ip THEN 
		m.new = m.new + 1
		ENDIF 
	CASE NOT m.c = base.c_2
		ins_union(m.c,m.net,m.net-m.new)
		m.c = base.c_2
		m.net = 1
		m.new = 0
ENDCASE   
	m.pre_ip =n_ip + ip_count
ENDSCAN 
ENDPROC 
*----------------------------------------------------
PROCEDURE Assotiate(tname)
	LOCAL m.pre, m.ip, m.c_2
Create_base('ttbase')
CLOSE TABLES ALL 
USE ttbase ALIAS tt
USE tbase ALIAS base
INDEX ON c_2+STR(n_ip) TAG doub_ind
m.pre = 0 
m.ip = 0  
m.c_2 = ' ' 
SCAN 
DO CASE
CASE m.c_2 = ' ' 
	m.ip = base.n_ip
	m.pre = base.n_ip + base.ip_count
	m.c_2 = base.c_2
CASE m.c_2=base.c_2 AND m.pre=base.n_ip 
	m.pre = base.n_ip+base.ip_count
CASE m.c_2 = base.c_2 AND m.pre < base.n_ip 
	INSERT INTO ttbase (c_2,n_ip,ip_count) VALUES (m.c_2,m.ip,m.pre-m.ip)
	m.ip = base.n_ip
	m.pre = base.n_ip + base.ip_count
CASE m.c_2 <> base.c_2
	INSERT INTO ttbase (c_2,n_ip,ip_count) VALUES (m.c_2,m.ip,m.pre-m.ip)
	m.ip = base.n_ip
	m.pre = base.n_ip + base.ip_count
	m.c_2 = base.c_2 
ENDCASE 
ENDSCAN 
ENDPROC
Процедура поиска

FUNCTION get_country(tname,str_ip)
	LOCAL cc 
SET NEAR ON 
cc = 'xx'	&& this is country code
USE (tname) ALIAS base
INDEX ON n_ip TAG n_ip
	m.n = 0
	m.tmp = 1
	m.j = 1
	DO WHILE AT('.',str_ip,m.j)>0   
	  m.i = AT('.',str_ip,m.j)
	  m.n = m.n*256 + VAL(SUBSTR(str_ip,m.tmp,m.i-m.tmp))
	  m.tmp = m.i+1
	  m.j = m.j + 1
	ENDDO 	
	m.n = m.n * 256+ VAL(SUBSTR(str_ip,m.tmp))
SEEK(m.n)
IF base.n_ip<=m.n AND base.n_ip+base.ip_count-1>=m.n THEN 
	cc = base.c_2
ELSE 
	IF m.n < base.n_ip THEN 
		SKIP -1 IN base 
	ELSE 
		IF m.n > base.n_ip+base.ip_count-1 THEN 
			SKIP 1 IN base 
		ENDIF 
	ENDIF 
	IF  base.n_ip<=m.n AND base.n_ip+base.ip_count-1>=m.n THEN 
		cc = base.c_2
	ENDIF 
ENDIF  
RETURN cc
ENDFUNC
К содержанию...
Заключение

Данные о распределенных ip-адресах общедоступны и находятся на сайтах региональных регистрантов (указаны в основной части работы).

Информация, полученная мной 1 апреля 2003 года, заняла в таблице (исходная таблица "temp") около 52000 записей. После исправления ошибок (их виды указаны в основной части), в промежуточной таблице "tbase" осталось около 51000 записей. После объединений сетей внутри каждой страны, в основную таблицу "ttbase" было занесено около 17000 записей.

Всего в таблице "ttbase" 1866074083 адреса, что составляет примерно 43% адресного пространства. То есть для 43% адресов можно узнать географическое расположение.

Используя среду разработки приложений баз данных FoxPro, я создала функцию cc = get_country (table_name,dot_dec_ip), которая по запрашиваемому ip-адресу находит страну, в которой этот адрес находится. В качестве теста была выбрана таблица логов одного WEB-сервера, в которой было зафиксировано чуть больше 44000 запросов (то есть адреса, находящиеся там реально существуют). Тесты проводились на компьютере со следующими параметрами: Pentium4 1,6 Гц, 512 Мб RAM под управлением Windows 2000 Service Pack 3. Функция обработала таблицу за 5 секунд, то есть за 1 секунду обрабатывается проядка 10000 записей. Для 1404 адресов страна не была найдена, что составляет около 3,2% от всех адресов таблицы. Хорошо посещаемый российский WEB-сайт имеет несколько тысяч обращений в день, хорошо "раскрученный" западный WEB-сайт (например, www.microsoft.com ) имеет 2-3 миллиона запросов в месяц (т.е. до 10000 запросов в день)

Эта функция может использоваться любым приложением, поддерживающим ActiveX. Например, можно создать сайт на WEB-сервере, который бы динамически находил страну, из которой идет запрос на сервер. Можно было бы создать статистику о посещении сайта представителями разных стран, и на основе этой статистики соответствующе изменить информацию сайта (например, если сайт создавался для англоязычной публики, а на сайт заходят преимущественно русские, можно было бы создать вариант этого сайта на русском языке, или добавить информацию специально для русскоязычной аудитории).

К содержанию...