November 30, 2022

A legfontosabb RFC dokumentumok

A legfontosabb RFC dokumentumok

Az itt szereplő részlet egy Interneten elérhető anyagból származik, aminek
címe: Bevezetés a TCP/IP protokollba. Az eredeti dokumentáció:

Original Document Copyright © 1987, Charles L. Hedrick
Computer Science Facilities Group
Rutgers, New Jersey State University
Hungarian translation © 1996, Vincze Tamás.


Az Internet szabványokat RFC-knek hívják, ami a Request For Comments (Hozzászólásra,
megvitatásra készített anyag) kifejezés rövidítése. Ha megszületik egy szabványtervezet,
akkor azt először ajánlásként teszik közzé, és kap egy RFC számot. Ha végül
az ajánlást elfogadják, akkor Hivatalos Internet Protokoll (Official Internet
Protocols) válik belőle, de továbbra is az RFC számmal hivatkoznak rá. Megállapodás
szerint minden RFC új számot kap, ha átdolgozzák. Két fontos RFC, az “Internet
Számok” (RFC 1166) és a “Hivatalos Internet Protokollok” (RFC 1011) a tartalma
miatt nagyon gyakran változik. A legutóbbi verzió száma az rfc-index.txt-ben
található meg. A TCP/IP iránt érdeklődőknek javasolt az IP-t leíró RFC 791 tanulmányozása.
Az RFC 1812, 1716 és 1009 szintén hasznos lehet. Ezekben az NSFnet által használt
átjárók specifikációja, valamint az útvonal-választás
szerepel.

Mint ilyen, rengeteg, TCP/IP technológiával kapcsolatos részt tartalmaz. Érdemes
áttanulmányozni legalább egy alkalmazói protokollt, hogy érezzük a dolog gyakorlati
részét is. Erre talán a legjobb a levelezés leírása (RFC 821/822). A TCP (RFC
793) persze alapműnek számít. A specifikáció eléggé összetett, így ennek tanumányozása
csak akkor javasolt, ha elég idő és türelem áll rendelkezésünkre a figyelmes
olvasáshoz. Szerencsére Jon Postel, a főbb RFC-k szerzője, nagyon jól ír. A
TCP RFC-t sokkal könnyebb olvasni, mint ahogy azt a tartalma alapján gondolnánk.
Idővel a többi RFC-t is bátran nézegessük.

Következzen tehát a felsorolás:


  • rfc-index.txt az összes RFC listája
  • rfc1122/3 Követelmények az Internet hosztok felé. Több protokoll áttekintése.
    A protokollok gyengéinek, a gyártók által elfogadott konvencióknak, a gyakorlatban
    fellépő problémáknak, a problémák megoldásainak a listája. Egy adott protokoll
    tanulmányozása során ne felejtsük el figyelmesen átnézni, mert a protokollokat
    leíró rfc-k ezeket az információkat nem tartalmazzák. Ugyanez vonatkozik az
    rfc1009-re is.
  • rfc1012 az RFC-k teljesebb listája
  • rfc1011 Hivatalos Protokollok. Hasznos az átböngészése, hiszen itt olvasható,
    hogy milyen feladatot látnak el az egyes protokollok. Leírja továbbá, hogy
    melyik RFC vált szabvánnyá.
  • rfc1010 Kiosztott Számok. Az Internet-tel dolgozva gyakran lehet erre
    referenciaként szükség. Olvasni nem olyan izgalmas. A hivatalosan definiált
    jól-ismert számokat és egyebeket listázza. A legutóbbi változata az rfc1700
    Internet Számok nevet viseli.
  • rfc1009 Követelmények az Internet Átjárók felé. Jól használható bevezetést
    nyújt az IP útvonal-választáshoz és az átjárókhoz. (Lásd még: rfc1716, rfc1812.)
  • rfc1001/2 netBIOS: hálózattervezés PC-vel
  • rfc973 tartományok aktualizálása. Ezen a téren sok új információ jelent
    meg. Az rfc1034 és rfc1035 újabb verziót jelölnek. Ezek aktualizálása az rfc1101,
    rfc1876 és az rfc1348, rfc1637, rfc1706.
  • rfc959 FTP (állományátvitel)
  • rfc950 alhálózatok
  • rfc937 POP2: levelek olvasása PC-n
  • rfc894 IP továbbítása Ethernet-en, lásd az rfc826-t is
  • rfc882/3 tartományok (‘hosztnév IP cím’ megfeleltetés, UUCP). Lásd még:
    rfc973.
  • rfc854/5 telnet — a távoli bejelentkezés protokollja
  • rfc826 ARP — Ethernet címek leképezési protokollja (IP címre)
  • rfc821/2 levelezés — ennek legutóbbi verziója az rfc1495. (Lásd még:
    rfc987, rfc1148, rfc1327 és rfc1026, rfc1138.)
  • rfc814 nevek és port-ok — általában az ismertebb port-okról
  • rfc793 TCP
  • rfc792 ICMP
  • rfc791 IP
  • rfc768 UDP
  • rip.doc a legjobban elterjedt útvonal-választási protokoll részletei (—>
    RFC 1058)
  • ien-116 régebbi névkiszolgáló (pár rendszer még használja)
  • ien-48 Catenet modell, a TCP/IP mögötti filozófia általános ismertetése

A következő dokumentumok egy-egy szűkebb területre specializálódtak:

  • rfc813 TCP ablak, és nyugtázási stratégiák
  • rfc815 datagram összerakási technikák
  • rfc816 hibakizárási és -feloldási módszerek
  • rfc817 modularitás és hatékonyság az implementációkban
  • rfc879 a TCP maximális szegmensméret opciója
  • rfc896 torlódásszabályozás
  • rfc827,888,904,975,985 EGP (Exterior Gateway Protocol) és azzal kapcsolatos
    témák
  • rfc968 A ‘Twas the Night Before Start-up című szellemes verset olvashatjuk,
    melyben a szerző a hálózatok telepítésekor felbukkanó problémákat ecseteli.

A legfontosabb RFC-k három kötetes gyűjteménye a DDN Protocol Handbook (DDN
Protokoll Kézikönyv, 1985; ~12 cm vastag), amely a

DDN Network Information Center, SRI International, 333 Ravenswood
Avenue,

Menlo Park,
California 94025, USA (telefon: ++1-800-235-3155)

címen rendelhető. Az RFC-k anonim FTP-vel is elérhetők a NIC.DDN.MIL címen.
A dokumentumok nevei:

RFC:

  • /rfc/rfc-index.txt
  • /rfc/rfcN.txt, ahol N a kért RFC száma

Ajánlott még az InterNIC Directory and Database Services, ds.internic.net kiszolgáló
anonim FTP elérése. A keresett RFC dokumentumok az rfc/rfc####.txt vagy rfc/rfc###.ps
nevek alatt találhatóak, ahol a #### a kért RFC száma (kezdő nullák nincsenek
benne). Ugyanezen kiszolgálótól levélben is kérhető a szolgáltatás. A mailserv@ds.internic.net
címre az alábbi üzenetet kell küldeni:

document-by-name rfcNNNN

Itt az NNNN a kért rfc száma. Amennyiban postscript formátumban kell a szöveg,
akkor a document-by-name rfcNNNN.ps üzenetet kell küldeni. Több RFC esetén azokat
vesszővel válasszuk el, vagy minden kérést új sorba írjunk. Pl.:

document-by-name rfc1791, rfc1792

vagy

document-by-name rfc1791

document-by-name rfc1792

 A rip.doc anonim FTP-vel letölthető a topaz.rutgers.edu címről a /pub/tcp-ip-docs/rip.doc
néven.

 Ajánlott a ftp://www.fsid.cvut.cz/pub/doc/net/
cím ahol a rip.doc-on kívül sok más érdekes, hálózattal kapcsolatos írás is
található. Magyarországon az ftp://sunserv.kfki.hu/pub/documents/rfc/
címen érhetők el a különböző rfc dokumentumok.

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’]) 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) 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();
    ?>