NetBIOS

NetBIOS je softwarový interface (API) pro přístup k síťové komunikaci na úrovni relační (session) vrstvy. Jelikož se pohybujeme v relační vrstvě, hovoříme o "dialogu" mezi "logickými jmény". Konkrétní transportní protokol, jakož i fyzické adresy stanic, jsou před programátorem skryty.

NetBIOS vznikl v roce 1984 u firmy IBM a používá se dodnes mj. v produktech PC-Net, PCLP, IBM LAN Server; později jej převzal Microsoft do svých sítí MS-Net (LAN Manager, Windows95 a NT peer-to-peer). Rozhraní NetBIOS poskytují i mnozí jiní výrobci síťových OS (Novell, DEC Pathworks, ...).

Podpora v DOS, Windows (všechny současné verze), OS/2, některé UNIXy.

NetBIOS je především soubor standardních funkcí, ty jsou nezávislé na nižších vrstvách (a tedy formátu paketů). Např. v sítích Microsoft, je pro transport využito protokolu NetBEUI (v rámcích LLC ?), případně TCP/IP a někdy též IPX/SPX.

NetBIOS počítá jak se spojovaným, tak s nespojovaným provozem a umožňuje vysílání datagramů typu unicast, multicast i broadcast. U spojově orientovaného přenosu je garantovaná bezchybnost doručených dat.

Přístup ke službám NetBIOS se děje pomocí jediného vstupního bodu. V MS-DOS je to INT 5Ch, ve Windows funkce NetBiosCall(), v OS/2 NetBIOSSubmit(). Jediným parametrem je ukazatel (v DOS ES:BX) na strukturu NCB (Network Control Block). V NCB je specifikována požadovaná služba a její parametry. Po ukončení služby uloží ovladač NetBIOS do struktury také návratové hodnoty. Návratová hodnota funkce vstupního bodu (resp. registr AX v případě DOS) informuje o případných chybách ve volání NetBIOSu (0=bez chyby). Chyby volání je nutné rozlišovat od chybových kódů generovaných jednotlivými službami - ty jsou ukládány do NCB (položka ncb_retcode).

Formát struktury NCB je následující:

 typedef struct NCB{              
                BYTE     ncb_command;	/* NetBIOS command (see netbios.h) */
                BYTE     ncb_retcode;	/* NetBIOS return code; 0xFF until asynchronous call  finishes */
                BYTE     ncb_lsn;	/* local session number */
                BYTE     ncb_num; 	/* NetBIOS name number */                 
                DWORD    ncb_buffer;	/* transmit/receive buffer */
                WORD     ncb_length;	/* buffer length */
                BYTE     ncb_callName[16];  	/* name of remote node to send datagram or to be connected; */
						/* when listening for connections: name trying to connect  */       
                BYTE     ncb_name[16];	/* local name */       
                BYTE     ncb_rto;	/* receive timeout in 500 ms units;  0=forever */
                BYTE     ncb_sto;	/* send timeout in 500 ms units;  0=default */
                DWORD    ncb_post;	/* ptr to post-processing routine */
					/* (DOS: ES:BX points to NCB when entered. Ends with RETF) */
                BYTE     ncb_lana_num;	/* LAN adapter number; 0-based */
                BYTE     ncb_cmd_cplt;	/* completion status */
                BYTE     ncb_reserved[14];           
         } NCB;

Poznámka: číslo adaptéru může být využito i pro logické adaptéry - tedy v případě, kdy na jeden fyzický adaptér je navázáno více transportních protokolů.

Příkaz je uirčen hodnotou pole ncb_command. Konkrétní hodnoty můžeme vyčíst z hlavičkového souboru netbios.h.

Sada služeb je poskytovaná ve dvou režimech - synchronním a asynchronním. V synchronní variantě se řízení vrátní programu až po dokončení služby, v asynchronní okamžitě s tím, že program sám musí ukončení testovat sledováním položky ncb_cplt (popř. je o něm informován pomocí ISR či semaforu v systému OS/2). Asynchronní varianta příkazů se volí přičtením čísla 128 (tj. nastavením nejvyššího bitu) k číslu požadovaného příkazu.

Adresace, tabulka jmen

Jelikož komunikace pomocí NetBIOS probíhá na relační vrstvě, nepracuje se zde vůbec s adresami uzlů ze síťové vrstvy, které by byly (alespoň v rámci jednoho protokolu) jednoznačné. Namísto toho se využívá logických jmen v podobě řetězců (až 16 znaků), které si mohou stanice libovolně volit a registrovat. Princip spočívá v tom, že stanice, která si hodlá přiřadit určité jméno, informuje o tomto záměru (prostřednictvím rozhraní NetBIOS a s využitím všesměrového vysílání) ostatní stanice sítě. Jestliže tyto nic nenamítají (tj. nepošlou v určeném časovém limitu negativní odpověď), např. proto, že požadované jméno již vlastní, může stanice prohlásit logické jméno za své. Takto si může jedna stanice registrovat několik jmen (počet dán kapacitou vnitřní tabulky jmen). NetBIOS definuje, že na jednom adaptéru smí být zaregistrováno nejvýše logických 254 jmen.

Pokud chce stanice vyslat datagram (nebo navázat relaci) na zadané jméno, postará se ovladač NetBIOS o zjištění konkrétní adresy stanice, jež má toto jméno registrováno, tak, že rozešle broadcast datagram s dotazem. Na tento dotaz odpoví pouze stanice, jež toto jméno vlastní a to datagramem obsahujícím její skutečnou adresu (jejíž formát je pochopitelně závislý na použitém transportním protokolu). Jestliže bylo dotazováno jméno skupinové, příjde odpovědí více.

Mimo jmen jednoznačných, které může být v daném okamžiku přiřazeno jediné stanici, pracuje NetBIOS také se jmény skupinovými (group names). Skupinové jméno může být přiřazeno více stanicím (tj. být současně obsaženo ve více lokálních tabulkách registrovaných jmen) a používá se pro vysílání typu multicast.

Z hlediska implementačního je při registraci každému jménu přiděleno číslo (index do (lokální) tabulky jmen), kterým se na toto jméno odkazujeme při volání ostatních služeb, jež vyžadují jméno jako parametr. Jméno s indexem 1 vždy odpovídá fyzické adrese adaptéru.

Z principu registrace jmen, který zahrnuje všesměrové vysílání, je zřejmé, že NetBIOS nebude možné (alespoň bez zvláštních řešení) použít v sítích WAN.

Služby NetBIOS

Obecné služby

RESET - ruší všechna spojení, vyprázdní tabulku jmen, reset adaptéru
ADAPTER_STATUS - vrátí tabulku registrovaných jmen anaptéru, fyzickou adresu a statistiky adaptéru
CANCEL - zrušení předchozího (asynchronního) příkazu

Příkazy pro práci s tabulkou jmen adaptéru

ADD NAME - registrace jedinečného jména, vrací číslo jména
ADD_GROUP_NAME - registrace skupinového jména, vrací číslo jména
DELETE_NAME - zrušení jména

Dobře napsaná aplikace by před ukončením měla odstranit všechna jména, která zaregistrovala.

Příkazy pro práci s relací

Mezi dvěmi jednoznačnými jmény může být zřízena relace (spojení), která umožní bezchybné duplexní předávání dat (korekci chyb provádí vnitřní protokol). Stanice, jež hodlá čekat na spojení volá LISTEN, zatímco druhá strana aktivně spojení navazuje službou CALL. Po návratu z CALL a LISTEN je do struktury NCB dosazen identifikátor spojení LSN - Local Session Number, kterým se na toto spojení odkazujeme při volání dalších funkcí. LSN má platnost jen v rámci lokální stanice.

CALL - požadavek o zřízení relace s uzlem zadaného jména
LISTEN - příjem žádostí o zřízení spojení (od uzlu zadaného jména nebo od kohokoli (jméno "*")
HANGUP - ukončení relace (v timeout čeká na vyřízení nedokončených požadavků na vysílání)
SEND - vyslání bufferu (až 64kB) na protistanici
RECEIVE - příjem dat od protistanice
RECEIVE_ANY - příjem dat z libovolné relace
SESSION_STATUS - zjištění informací o zadané relaci

Příkazy pro práci s datagramy

Umožňují předávat datagramy do délky 512B, bezchybnost doručení není garantována.

SEND_DATAGRAM - vyslání datagramu na jednoznačné nebo skupinové jméno
SEND_BROADCAST_DATAGRAM - vyslání datagramu na všechna jména
RECEIVE_DATAGRAM - čekání na příjem datagramu pro zadané číslo jména. Je-li číslo 0xFF, akceptují se datagramy na všechna jména
RECEIVE_BROADCAST_DATAGRAM - čekání na příjem broadcast datagramu. Poznamenejme, že NetBIOS negarantuje, že budou přijaty všechny broadcast datagramy na síti

Příklad komunikace s využitím NetBIOS

Prostředí: DOS, jazyk: C, Překladač: Borland C++ 3.1

netbios.h Hlavičkový soubor - definice struktury NCB, konstanty

Protokol

Většině z příkazů odpovídá rámec vyslaný do sítě. Rámce NetBIOS jsou baleny do LLC rámců. Rozlišujeme dva typy rámců: číslované informační (I) a nečíslované infomační (UI). Číslovaných rámců se využívá při výměně informací po navázaní spojení, pro datagramovou službu a navazovaní spojení slouží rámce nečíslované. Využitím číslovaných rámců dosahujeme garantovaného doručení a správného řazení. Rozlišení I a UI rámců, včetně příslušného zacházení s nimi (např. retransmise při výpadku potvrzení I-rámce) se děje na vrstvě LLC. Formát rámců původně zadefinovala IBM takto:

length		Length of NetBIOS frame, includes header and user data
EFFFH		Delimiter

command		NetBIOS protocol command (such as NAME_QUERY)
			Command values 00H to 13H implies UI frame
			Command values 14H to 1FH implies I frame

data1, data2	Optional data depending on the command

xmit/resp		One or two numbers used to associate received responses 
		with transmitted requests

dest		1-byte destination session number in I-frames
		16-byte destination name in UI-frames

src		1-byte source session number in I-frames
		16-byte source name in UI-frames
Pole command může nést hodnotu identifikující jeden z následujících příkazů (resp. odpovědí):

Name registration &  finding

ADD_NAME_QUERY		01H 	UI
ADD_GROUP_NAME_QUERY 	00H 	UI
ADD_NAME_RESPONSE		0DH 	UI
NAME_IN_CONFLICT		02H 	UI

NAME_QUERY 			0AH 	UI 
NAME_RECOGNIZED		0EH 	UI


Sending datagrams

DATAGRAM			08H	UI 
DATAGRAM_BROADCAST		09H	UI

Session management and data exchange

SESSION_INITIALIZE 		19H 	I
SESSION_CONFIRM		17H	I
SESSION_END 			18H	I


DATA_FIRST_MIDDLE 		15H 	I
DATA_ONLY_LAST		16H	I
DATA_ACK			14H 	I



Flow control, keepalives

NO_RECEIVE			1AH	I
RECEIVE_CONTINUE		1CH 	I
RECEIVE_OUTSTANDING		1BH 	I
SESSION_ALIVE 			1FH	I


STATUS_QUERY 			03H	UI
STATUS_RESPONSE		0FH	UI
TERMINATE_TRACE		13H	UI
TERMINATE_TRACE (remote)	07H	UI

Řízení Relace

Zřízení spojení: UI a I rámce, po zřízení I-rámce
Data jsou NetBIOSu předána jako bloky až 64kB, NetBIOS rozděluje do bloků, které lze přenést v I-rámcích (v závislosti na MTU použité sítě).
Data jsou nesena I-rámci s povelem typu DATA_FIRST_MIDDLE, poslední (nebo jediný, lze-li blok umístit do jediného rámce) s povelem DATA_ONLY_LAST. Přijímající strana potvrzuje příjem rámcem DATA_ACK.

Omezení NetBEUI na sítě LAN, přístupy k řešení pro provoz na WAN

Problémy se zahlcování sítě broadcasty a filtrování broadcastů routery.

Registrace a vyhledávání jmen

Režimy pro provoz NetBIOS over TCP/IP definovány v RFC 1001 a RFC 1002:

Poznámka: Windows NT používá především h- a b-node

Test instalace NetBIOS pod MS-DOS

AH=0, INT 2Ah, je-li ovladač NetBIOS instalován, bude v AH nenulová hodnota

Literatura

Sinha,A., Patch,R.: NetBIOS.