2017. november 29., szerda

Amit a NetBIOS interfészről tudni illik



Az eredeti NetBIOS (Network Basic Input/Output System – hálózati alapvető ki-/beviteli rendszer) az IBM által a PC-khez gyártott LAN adaptereken ROM-ba égetett, a teljes - az OSI modell mind a 7 rétegét lefedő - hálózatkezelést megvalósító interface volt, amit azonban az idők során továbbfejlesztettek és számos kiegészítéssel láttak el.
A NetBIOS egy magas szintű, - kódméret szempontjából  kényelmesen programozható hálózati felület, ami sikerrel működhet akár más protokollokra épülő emuláció formájában is (pl. a Novell NetBIOS emulátora a parancsok végrehajtásánál valójában az IPX-et használja a csomagok átvitelére hálózaton), amely azonban nem alkalmas sebesség-kritikus valamint több hálózati szegmensre is kiterjedő kommunikációra. A NetBIOS napjainkban az Internet és a többszegmenses intranetek térhódításával veszt jelentőségéből, azonban még ma is szinte minden elterjedt hálózati operációs rendszer támogatja használatát.
A NetBIOS lehetőséges nyújt mind kapcsolat-orientált, mind kapcsolat nélküli (üzenetszórásos) adatforgalom bonyolítására a hálózaton névvel azonosított (címzett) csomópontok között.
A NetBIOS nevek 16 bájtos karakterláncok, melyek az alábbi két nagy csoportba oszthatók.
az egyedi nevek (unique names) hálózati csomópontok azonosítására használhatók, melyekből ennek megfelelően mindig csak egy lehet a hálózati szegmensben. A hálózati név regisztrációja során a NetBIOS először mindig ellenőrzi, hogy a név már használatban van -e a hálózaton, ezáltal elkerülve az azonos nevek által okozott címzési konfliktusokat.
a csoportnevek (group names) ezzel szemben akár több állomás által is használhatóak. Segítségükkel lehetőség nyílik a hálózati csomópontok egy jól meghatározott részhalmaza számára üzenetek küldésére. Amikor az üzenet küldése során célcímként egy csoportnevet adunk meg, akkor azt a csomagot minden, a csoportnevet használó munkaállomás megkapja.

Natív (nem emulált) NetBIOS protokoll alkalmazása esetén a kommunikáció során a hálózat minden egyes csomópontja megkap minden elküldött üzenetet, amelyek közül aztán a NetBIOS felső rétegei az egyedi név ill. a “csoport-tagságok” vizsgálatával döntik el, hogy továbbítsák -e a kapott csomagot az alkalmazási réteg felé vagy sem.
Ennek megfelelően minden munkaállomás egy vagy több névvel rendelkezhet melyek között több egyedi és több csoportnév is lehet.
A kommunikációnak szintén alapvetően két fajtája létezik:
a kapcsolat nélküli (connectionless) kommunikáció során diszkrét, egyedi adatcsomagok ún. datagramok küldésére nyílik lehetőség más munkaállomás vagy csoport felé. A csomag vétele esetén a fogadó oldal(ak) semmilyen nyugtázást nem küld(enek) vissza, így nem garantált a csomag megérkezése a célállomásra sem. A csomag küldése során a specifikus (egyetlen állomásnak v. csoportnak szóló) küldési mód mellett lehetőségünk nyílik az IPX-ből már ismert broadcast üzenetek küldésére is, melyet minden – az broadcast üzenetekre figyelő - munkaállomás feltétel nélkül megkap.
ennél jóval magasabb szintű és biztonságosabb (de egyben lassabb) kommunikációra nyújt lehetőséget a kapcsolat-orientált (connection-oriented) üzenetváltási mód. A kapcsolat felépítésének kezdetén a munkaállomásnak egy ún. session-t kell nyitnia két név (egyedi vagy csoportnév) között. A session sikeres megnyitása után mind a két fél küldhet üzenetet egymásnak, melynek megérkezését (vagy a küldés sikertelenségét) a protokoll felügyeli, nyugtázás hiányában hibakódot visszaadva a küldő félnek.

A NetBIOS protokoll lehetőséget nyújt az alkalmazások számára mind szinkron, mind aszinkron kommunikáció megvalósítására. A két mód a NetBIOS parancsok végrehajtásának módjában tér el egymást ól. Szinkron mód alkalmazás a esetén az alkalmazói program a parancsok sikeres végrehajtásáig (v. a timeout-ig) nem kapja vissza a vezérlést az interface-től. Tipikusan szinkron parancs pl. a név hozzáadása, hiszen az alkalmazás futása annak sikerétől v. sikertelenségétől függ. Ezzel szemben aszinkron parancsvégrehajtás esetén a hívás után az interface azonnal visszaadja a vezérlést a hívó alkalmazásnak, míg a parancs végrehajtásáról a későbbiekben gondoskodik. Ez esetben a parancs kiadásakor alkalmazott NCB (NetBIOS Conrol Block – NetBIOS vezérlő-blokk) vizsgálatával, vagy egy speciális ún. POST-rutin segítségével lehet észlelni a parancsvégrehajtásának megtörténtét valamint kimenetelét.
Az interface
Mint arról már szó volt a NetBIOS interface ún. NCB-kel kommunikál az alkalmazásokkal – ezek segítségével nyílik lehetőség a parancsok kiadására. Az NCB felépítése és mezőinek jelentése a következő:

NCB
Offset
Méret
Leírás
 
00h
1
Parancskód
 
01h
1
Visszatérési kód (végrehatási kód szinkron, inicializációs kód aszinkron parancs esetén)
 
02h
1
Helyi session-azonosító (az azonosítót a session megnyitásakor kapjuk meg)
 
03h
1
Helyi név-azonosító (a név hozzáadásakor kapjuk meg)
 
04h
4
Pointer az adat-pufferre
 
08h
2
Adat-puffer mérete
 
0Ah
16
Hívónév (a célállomás v. –csoport azonosítója)
 
1Ah
16
Helyi név (csak név felvételekor v. törlésekor használt)
 
2Ah
1
Fogadási timeout ? másodpercekben (max. ennyi ideig vár egy csomag megérkezésére)
 
2Bh
1
Küldési timeout (? másodpercekben)
 
2Ch
4
POST-rution címe (ha más mint nil, akkor a parancs befejezése után erre a címre adja át a vezérlést)
 
30h
1
Hálózati(-adapter) azonosító (csak több adapter alkalmazása esetén van jelentősége)
 
31h
1
Befejezési kód (aszinkron parancsok esetén FFh a feldolgozás alatt)
 
32h
14
Fenntartva (a hálózati illesztő számára, belső célra)
A NetBIOS parancskódok és jelentéseik a következők:

Kód
Név
Leírás
10h
CALL
Új session nyitása két név között
11h
LISTEN
Várakozás CALL-ra (session nyitására másik fél által)
12h
HANGUP
Session lezárása
14h
SEND
Adat küldése egy session-ön keresztül
15h
RECV
Adat fogadása egy session felől
16h
RECVANY
Adat fogadása bármelyik session felől
17h
SENDCH
Két puffer küldése session-ön keresztül egyetlen paranccsal
20h
SENDDG
Datagram küldése
21h
RECVDG
Datagram fogadása
22h
SENDBRC
Broadcast datagram küldése
23h
RECVBRC
Broadcast datagram fogadása
30h
ADDUNIQ
Egyedi név hozzáadása a helyi név-táblához
31h
DELNAME
Név (egyedi és csoport) törlése a helyi táblából
36h
ADDGRP
Csoportnév hozzáadása a helyi táblához
32h
RESET
Adapter inicializásála és helyi névtáblázat törlése
33h
STATUS
Adapter állapotának és hibastatisztikájának lekérdezése
34h
SESSSTAT
Helyi session-ök állapotának lekérdezése
35h
CANCEL
Végrehajtás alatt álló (aszinkron) parancs visszavonása
37h
ENUM
Adapterek felsorolása
78h
FIND
Név keresése a hálózaton
79h
TRACE
NCB-követés ki-/bekapcsolása
Amennyiben a parancskód 7. bitje 0 (parancskód<128) úgy azt szinkron, míg bekapcsolt állapota mellett aszinkron módon hajtja végre.
Reset
A parancs alaphelyzetbe állítja és konfigurálja a NetBIOS session-réteget. A megengedni kívánt session-ök maximális számát (1-32) az NCB 02h ofszeten elhelyezkedő (helyi session-azonosító) mezőjében, míg az egyeszerre feldolgozás alatt álló parancsok maximális számát (szintén 1-32) a 03h ofszeten lévő (helyi-név azonosító) mezőbe kell tölteni a hívás előtt. A parancs meghívásakor minden session megszakad, a helyi név-tábla törlésre kerül és az összes várakozó állapotú parancs megszakításra kerül. (Amennyiben a NetBIOS fölött az alkalmazásunkon kívül más réteg is elhelyezkedett – pl. a hálózati op. rendszer – akkor az ettől a parancstól természetszerűen “lehal” – ennek megfelelően óvatosan kell bánni ezzel a paranccsal.)
Cancel
A parancs segítségével egy, már feldolgozás alatt álló – a session layer által egy NCB híváson keresztül átvett – de még végre nem hajtott parancsot lehet visszavonni. A parancsot csak szinkron-módban lehet kiadni és a RESET, CANCEL, ADD NAME, ADD GROUP NAME, DELETE NAME, SESSION STATUS, SEND DATAGRAM, SEND BROADCAST parancsok kivételével bármely parancsra alkalmazható. (Érdemes itt megjegyezni, hogy bár a SEND és a CHAIN SEND parancsok is visszavonhatók, de visszavonásuk egyben a session megszakítását (lezárását) is maga után vonja.)
Adater status
E parancs segítségével nyílik lehetőségünk a helyi vagy akár egy távoli NetBIOS session layer hiba-statisztikájának, állapotának és név-táblázatának lekérdezésére. A parancs végrehajtása előtt a lekérdezni kívánt gép egyedi azonosítóját (nevét) vagy a helyi session layer lekérdezése esetén a “*”-ot kell elhelyezni a 0Ah ofszeten kezdődő hívónév mezőbe.
Add unique name
A név-táblázathoz történő egyedi azonosító hozzáadására nyílik lehetősgünk a parancs segítségével. A parancs végrehajtása során a NetBIOS a teljes hálózatot átnézni, hogy a megadott (maximum 16 karakter hosszú) név nincs –e már használatban valahol. Amennyiben talál a megadottal egyező csoport- vagy egyedi nevet, abban az esetben a 0Dh (duplikált név) hibakódot kapjuk, egyébként pedig a név felvétele mellett egy egyedi (1-254) azonosítóval tér vissza a helyi név azonosító (03h) mezőben.
Add group name
Új név-csoport létrehozására vagy egy már létező csoportba történő belépésre nyílik lehetőségünk a parancs segítségével. A parancs sikeres végrehajtásának feltétele, hogy a megadott név ne legyen már egyedi névként regisztrálva a hálózaton (csoportnévként nyilvánvalóan lehet, hiszen a csoport lényege, hogy több gép is bele-tartozhat és a csoportnévnek küldött üzeneteket, minden ilyen csoportnevet definiáló gép megkapja).
Delete name
Egy már regisztrált egyedi vagy csoport-név a helyi név-táblázatból történő törlésére ad módot a parancs. Amennyiben a névet egy vagy több nyitott session használja, úgy az nem azonnal, hanem a csak a session-ök automatikus bezására után került törlésre, de addig is minden e név használatával kiadott parancs a 17h (a név már törlésre került) hibakódot fogja visszaadni.
Call
A parancs segítségével nyílik lehetőségünk egy helyi és egy másik név közötti session létrehozására. A kapcsolat sikeres felépítéséhez a hívónév mezőben megadott gépnek e parancs kiadása (v. a time-out lejárta) előtt egy LISTEN parancsot kell(ett) kiadnia az általunk használt helyi (vagy bármilyen (“*”) ) névre. A sikeres kapcsolatfelépítés esetén visszaadott helyi session-azonosító segítségével küldhetünk ill. fogadhatunk csomagokat a másik gép felől, illetve ennek segítségével tudjuk a session lezárni a HANGUP paranccsal.
Listen
A parancs kiadásával utasítható a session layer egy beérkező session-nyitási kérelem fogadására. A kérelem fogadását egy specifikus vagy bármilyen névhez (“*”) köthetjük, melyet az NCB hívónév mezőjében kell elhelyeznünk. (Amennyiben egyedi nevet adtunk meg, úgy csak egyetlen, a megadott névtól a mi gépünk felé érkező session-nyitási kérelem került fogadásra, minden más session-felépítési próbálkozás sikertelen lesz.) Egy név illetve egy név-pár között akár több session is nyitható melyek egymástól teljesen függetlenül menedzselhetők. (Amennyiben egy bejövő session-nyitási kérelem (CALL) egy specifikus és egy bármilyen névre vonatkozó LISTEN-nek is megfelel, abban az esetben – az esetlegesen eltérő aktiválási sorrendtől függetlenül – a specifikus LISTEN parancs fog végrehajtódni.)
Hangup
A parancs egy már megnyitott session lezárására használható. A session lezárását mind a hívó (aki a CALL-t aktiválta), mind a fogadó (aki a LISTEN-t aktiváltva) fél kezdeményezheti, melynek hatására a másik fél által a szóbanforgó session-re vonatkozó parancsok a 0Ah (session lezárva) hibakóddal fognak visszatérni.
Session status
A parancs egy adott névvel (akár hívó, akár fogadó félként) megnyitott session-ök, illetve azok paramétereinek lekérdezésére használható.
Send
A parancs segítségével nyílik lehetőségünk egy másik géppel megnyitott session-ön keresztül adat-csomag küldésére. A csomag sikeres átviteléhez a célállomásnak legalább egy RECEIVE vagy RECEIVE ANY parancsot kell aktiválnia a parancs kiadása vagy a session megnyitásakor megadott küldési time-out lejárta előtt. A session layer a send parancsokat kiadásuk sorrendjében hajtja végre. Amennyiben egy csomag átvitele sikertelen, a session automatikusan bontásra kerül a küldő fél által.
Receive
A parancs segítségével nyílik lehetőségünk egy másik géppel megnyitott session-ön keresztül adat-csomag fogadására. Amennyiben a session megnyitásakor megadott időn belül a másik oldal nem aktivál egy SEND parancsot, abban az esetben a parancs 05h (time-out) hibakóddal tér vissza. (A fogadási time-out – a küldésivel szemben – nem vonja maga után a session bontását.) A RECEIVE parancsok kiadási sorrendben lesznek teljesítve elegendő számú fogadott csomag esetén, de amennyiben egy csomag egy RECEIVE és egy RECEIVE ANY parancsnak is megfelel, abban az esetben a RECEIVE parancs fogja megkapni. Amennyiben az NCB-ben megadott pufferméret túl kicsi a teljes fogadott csomag eltárolásához úgy a pufferméretnek megfelelő rész-csomag fogadása mellett a parancs 06h (data buffer to shoort) hibakóddal tér vissza.
Receive any
A parancs használatával több vagy az összes nyitott session-ön keresztül érkező adat-csomag fogadására nyílik lehetőségünk. A fogadás feltételeire a RECEIVE parancsnál leírtak érvényesek. Sikeres fogadás esetén az NCB 02h ofszeten kezdődő (helyi session-azonosító) mezője annak a session-nek a számát tartalmazza, amelyiken keresztül a csomag érkezett.
Send datagram
A parancs segítségével kapcsolaton (session-ön) kívül küldhetünk csomagot egy, az NCB 0Ah ofszetén kezdődő (hívó-név) mezőjében meghatározott állomásnak vagy csoportnak. A NetBIOS implementáció nem feltétlenül garantálja a csomag megérkezését a célállomás(ok)ra. Az átvitendő csomag mérete nem haladhatja meg az 512 bájtot. (Bizonyos NetBIOS implementációkban és alkalmazási környezetekben annyira rossz az átviteli biztonság, hogy az e módon elküldött és sikeresen fogadott csomagok aránya az 50%-ot sem éri el.
Receive datagram
A parancs segítségével a kapcsolaton kívül küldött csomagok fogadására nyílik lehetőségünk. Amennyiben a 03h ofszeten elhelyezkedő (helyi név-azonosító) mező 0ffh értéket tartalmaz úgy bármely, egyébként pedig az által meghatározott névre érkező csomagot fogadhatjuk a parancs kiadásával. A parancs nem rendelkezik time-out-tal, így visszavonásáig aktív marad. Sikeres csomag-fogadás esetén a küldő állomás által használt nevet a 0Ah ofszeten kezdődő (hívó-név) mező tartalmazza.
Send broadcast
A parancs segítségével minden aktív RECEIVE BROADCAST paranccsal rendelkezdő állomásnak történő üzenetküldésre nyílik lehetőségünk. A maximális csomagméret nem haladhatja meg az 512 bájtot. A parancs tipukus felhasználása a hálózaton jelenlévő szerverek enumeráltatása, vagy egy specifikus gép keresése.
Receive broadcast
A parancs segítségével a SEND BROADCAST segítségével szétszórt üzenetcsomag fogadására nyílik lehetőségünk. A RECEIVE DATAGRAM-hoz hasonlóan e parancs sem rendelkezik timeout-tal és sikeres fogadás esetén a hívó-név mezőben tartalmazza küldő állomás nevét.
A fent felsorolt parancs- és hibakódokat, valamint struktúrákat a NETBIOS.PAS unit tartalmazza.

Nincsenek megjegyzések:

Megjegyzés küldése