Történelem, dióhéjban

Hálózati kezdetek

Az 1960-as években a kutatók elkezdtek kísérletezni a számítógépeknek egymáshoz és az emberekhez való kapcsolásával a telefonhálózaton keresztül, a U.S. Defense Department's Advanced Research Projects Agency (ARPA) anyagi támogatásával. Az ARPA szerette volna tudni, hogy vajon a különböző helyeken levő számítógépek összekapcsolhatók-e a csomagkapcsolásnak nevezett új technológia segítségével. Ettől a technológiától – melynél az adatsorozatot kis csomagokra bontják, és ezek mindegyike kap egy “rendeltetési címet” – azt remélték, hogy egyszerre több felhasználó is tudja majd ugyanazt a kommunikációs vonalat használni. Az is fontos volt, legalábbis az ARPA szempontjából, hogy így egy olyan hálózatot lehetett létrehozni, melyben az adatfolyamot automatikusan tudják átirányítani, ha egyes vonalszakaszok vagy számítógépek megszûnnek mûködni. Az ARPA célja nem a mai, nemzetközi számítógép-használó közösség létrehozása volt, hanem egy olyan adathálózat kiépítése, ami túléli az atomtámadást is.
A korábbi számítógép-hálózati kísérletek mindegyikénél egy külön vonalra volt szükség a hálózatban levő minden gép között, hasonlóan egy egyvágányú vasúthálózathoz. A csomagkapcsolt rendszerrel egy olyan adat-országutat lehetett kiépíteni, amelyen nagyszámú jármû tud gyakorlatilag ugyanabban a sávban közlekedni. Minden adatcsomag megkapja egy térkép és egy postabélyegző számítógépes megfelelőjét, s így útjára indítható a célállomása felé, ahol azután ezek a csomagok összerakhatók az eredeti, a számítógép vagy az ember számára használható üzenetté.
A rendszer lehetővé tette a számítógépeknek, hogy adatokat cseréljenek, a kutatóknak pedig, hogy elektronikus levelezést (e-mail) folytassanak. Az e-mail önmagában is forradalmi jelentőségû dolog volt: részletes leveleket lehetett küldeni a telefonhívás sebességével.
Ahogy ez az ARPANet néven ismertté vált rendszer növekedett, néhány vállalkozó szellemû egyetemi hallgató (és egy főiskolás) kifejlesztett egy módszert online konferenciák tartására. Ezek kezdetben tudományos témájú megbeszélések voltak, de rövidesen elágaztak szinte minden más témakör irányába is, ahogy az emberek felfedezték azt a hatalmas lehetőséget, hogy emberek százaival vagy akár ezreivel lehet így “beszélgetni” szerte az országban.
A hetvenes években az ARPA segített a különböző szabályok, vagyis protokollok kifejlesztésében, melyek a különböző típusú számítógépes hálózatok között is megoldják az adatok átvitelét. Ezek az “Internet” (a név az “internetworking” rövidítése) protokollok lehetővé tették a ma ismert világméretû Hálózat létrehozását, ami már mindenféle számítógépet összeköt az országhatárokon keresztül. A hetvenes évek végére kiépültek a kapcsolatok az ARPANet és többi országban neki megfelelő más hálózatok között. A világot ettől kezdve egy globális számítógépes háló fonja be.
Az 1980-as évtizedben a hálózatoknak ez a hálózata, melyet időközben összefoglaló néven Internetnek kezdtek nevezni, elképesztő ütemben növekedett. Százasával, majd ezresével kezdték csatlakoztatni a számítógépeiket ehhez a világméretû Hálózathoz az egyetemek, a kutatóintézetek és az állami hivatalok. Néhány vállalkozó szellemû számítógépes amatőr és vállalat, nem akarván fizetni az Internet csatlakozás magas költségeit (vagy mert nem felelt meg a hozzáférésre vonatkozó szigorú kormányzati szabályoknak), megtanulta, hogy hogyan kapcsolja a rendszerét az Internethez, még ha így “csak” az e-mailt és az elektronikus konferenciákat tudta is használni. Közülük egyesek elkezdték a kapcsolat lehetőségét felkínálni a nagyközönségnek is. Most már bárki, egy számítógéppel és egy modemmel hozzákötheti magát a világhoz.

Hogyan működik?

A világméretû Hálózat valójában sok kisebb, helyi hálózat bonyolult rendszere. Hogy könnyebben megértsük, képzeljünk el egy modern, az egész kontinensre kiterjedő úthálózatot, melyben autópályák kötik össze a nagyvárosokat. Ezekből a városokból kisebb gyorsforgalmi utak és autóutak indulnak ki, hogy a kisebb helységeket is összekössék, melyek lakosai lassabb és szûkebb helyi utakon közlekednek.
A Hálózat autópálya rendszere a nagysebességű Internet. Ehhez olyan számítógépek kapcsolódnak, melyek egy speciális rendszert használnak a nagy sebességen történő adatátvitelhez. Az USA-ban a fő Internet “gerincvezeték” elméletileg 45 millió bit/másodperc sebességgel tudja mozgatni az adatokat (hasonlítsa össze ezt az átlagos otthoni modemekkel, melyeknek a csúcssebessége nagyjából 9,600-tól 54,400 bps-ig terjed). A gerincvezetéken levő számítógépekhez kisebb hálózatok csatlakoznak, melyek egy bizonyos földrajzi körzetet szolgálnak ki. Ezek általában kb. 1.5 millió bit/másodperc sebességgel továbbítják az adatokat. Rajtuk pedig további, még kisebb hálózatok vagy egyes számítógépek “lógnak”.
Szemben az olyan kereskedelmi hálózatokkal, mint a CompuServe vagy a Prodigy, az Internetnél nincs központi üzemeltető számítógép vagy számítógépek – ezek erőforrásait elosztották az ezernyi, önálló számítógép között. Ez a megoldás adja az Internet legnagyobb erejét, de ez jelenti a leggyengébb pontját is. Ebből a megközelítésből az következik, hogy szinte lehetetlen, hogy az egész Hálózat egyszerre összeomoljon – ha valamelyik gép le is áll, a többiek átveszik a munkát. Ez a szervezési elv továbbá csökkenti az egyének vagy az intézmények számára a hálózatba való bekapcsolás költségeit is. De az összekapcsolt számítógépek ezrei megnehezítik a navigálást a Hálózaton, és azt is, hogy megtalálja, amit keres – különösen, hogy a különböző gépeken esetleg különböző parancsokat kell használni az információforrások megcsapolásához. Csak a legutóbbi időben kezdtek a Hálózat használói olyan navigációs eszközöket és “térképeket” kifejleszteni, amikkel az újoncok is csatangolhatnak a hálózaton, anélkül, hogy eltévednének.
Senki sem tudja, hogy pontosan mennyi számítógép és helyi- vagy magánhálózat alkotja a Hálózatot. Egyes becslések szerint jelenleg nem kevesebb, mint 12,000 hálózat kapcsol össze csaknem 4 millió számítógépet, s több mint 20 millió embert az egész világon. Bármekkorák is a pontos számok, az biztos, hogy ezek állandóan növekednek.
A Hálózat több mint csak egy technikai csoda. Valójában itt emberi kommunikációról van szó. A sebesség ugyan valamivel nagyobb, ahogyan az üzenetek néhány másodperc alatt végigszáguldanak a földgolyón, de az egész nem sokban különbözik egy nagy és érdekes társasági összejöveteltől. A kibervilágban találkozik majd olyan dolgokkal, amelyek megnevettetik és olyanokkal is, amiktől dühös lesz. Olvas majd értelmetlen semmiségeket és olyan új ötleteket, amelyek elgondolkodtatják. Szert tesz majd új barátokra és találkozik olyan emberekkel is, akikről úgy érzi, hogy jobb lenne, ha nem lennének ott. És ez az egész egy olyan társadalomban zajlik, ami semmibe vesz minden létező országhatárt.
A nagy hálózati szolgáltatók tovább dolgoznak olyan módszereken, melyekkel meg lehet könnyíteni az egyik hálózat felhasználói számára, hogy kommunikáljanak egy másikkal. Dolgoznak egy olyan rendszer kifejlesztésén is, amit egyfajta globális “telefonkönyvként” lehet majd használni, melyben az ember például megnézheti bárkinek az elektronikus postacímét. A különböző rendszerek összekapcsolására irányuló törekvések várhatóan tovább erősödnek az elkövetkező években, mert a felhasználók egyre inkább követelik a zökkenőmentes hálózati kapcsolatokat, ugyanúgy, ahogy a telefonhálózat használója ma már szinte a világ bármely részét felhívhatja anélkül, hogy törődnie kellene azzal, ténylegesen hány telefontársaságnak kellett ehhez a híváshoz összekapcsolódnia.
Ahogyan egyre könnyebbé válik a használata, egyre több és több ember csatlakozik ahhoz a világméretű közösséghez, amit Hálózatnak hívunk. A Hálózathoz való kapcsolódás többet jelent, mint csupán az elektronikus konferenciák üzeneteinek olvasását és elmentését a saját gépére; ez azt is jelenti, hogy kérdéseket tesz föl, és kérdésekre válaszol, véleményeket cserél – vagyis belemerül ebbe a világba.
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>